diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index b0a5b42a7..5fa56b167 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -83,9 +83,9 @@ class AccountController < ApplicationController else @user = User.new(params[:user]) @user.admin = false - @user.status = User::STATUS_REGISTERED + @user.register if session[:auth_source_registration] - @user.status = User::STATUS_ACTIVE + @user.activate @user.login = session[:auth_source_registration][:login] @user.auth_source_id = session[:auth_source_registration][:auth_source_id] if @user.save @@ -116,8 +116,8 @@ class AccountController < ApplicationController token = Token.find_by_action_and_value('register', params[:token]) redirect_to(home_url) && return unless token and !token.expired? user = token.user - redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED - user.status = User::STATUS_ACTIVE + redirect_to(home_url) && return unless user.registered? + user.activate if user.save token.destroy flash[:notice] = l(:notice_account_activated) @@ -170,7 +170,7 @@ class AccountController < ApplicationController user.mail = registration['email'] unless registration['email'].nil? user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil? user.random_password - user.status = User::STATUS_REGISTERED + user.register case Setting.self_registration when '1' @@ -241,7 +241,7 @@ class AccountController < ApplicationController # Pass a block for behavior when a user fails to save def register_automatically(user, &block) # Automatic activation - user.status = User::STATUS_ACTIVE + user.activate user.last_login_on = Time.now if user.save self.logged_user = user diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6e5634dbc..c00b6ba42 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -218,6 +218,10 @@ class ApplicationController < ActionController::Base end end + def back_url + params[:back_url] || request.env['HTTP_REFERER'] + end + def redirect_back_or_default(default) back_url = CGI.unescape(params[:back_url].to_s) if !back_url.blank? diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 8b5d73fa3..7fb4148ed 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -20,7 +20,7 @@ class IssuesController < ApplicationController default_search_scope :issues before_filter :find_issue, :only => [:show, :edit, :update, :reply] - before_filter :find_issues, :only => [:bulk_edit, :move, :destroy] + before_filter :find_issues, :only => [:bulk_edit, :move, :perform_move, :destroy] before_filter :find_project, :only => [:new, :create, :update_form, :preview, :auto_complete] before_filter :authorize, :except => [:index, :changes, :preview, :context_menu] before_filter :find_optional_project, :only => [:index, :changes] @@ -264,15 +264,9 @@ class IssuesController < ApplicationController moved_issues = [] @issues.each do |issue| issue.reload - changed_attributes = {} - [:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute| - unless params[valid_attribute].blank? - changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute]) - end - end issue.init_journal(User.current) call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy }) - if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => changed_attributes}) + if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)}) moved_issues << r else unsaved_issue_ids << issue.id @@ -293,6 +287,11 @@ class IssuesController < ApplicationController end render :layout => false if request.xhr? end + + # TODO: more descriptive name? move to separate controller like IssueMovesController? + def perform_move + move + end def destroy @hours = TimeEntry.sum(:hours, :conditions => ['issue_id IN (?)', @issues]).to_f @@ -349,7 +348,7 @@ class IssuesController < ApplicationController @priorities = IssuePriority.all.reverse @statuses = IssueStatus.find(:all, :order => 'position') - @back = params[:back_url] || request.env['HTTP_REFERER'] + @back = back_url render :layout => false end @@ -485,4 +484,14 @@ private return false end end + + def extract_changed_attributes_for_move(params) + changed_attributes = {} + [:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute| + unless params[valid_attribute].blank? + changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute]) + end + end + changed_attributes + end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e40758969..2c334b7f0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -103,6 +103,23 @@ module ApplicationHelper link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision)) end + # Generates a link to a project if active + # Examples: + # + # link_to_project(project) # => link to the specified project overview + # link_to_project(project, :action=>'settings') # => link to project settings + # link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options + # link_to_project(project, {}, :class => "project") # => html options with default url (project overview) + # + def link_to_project(project, options={}, html_options = nil) + if project.active? + url = {:controller => 'projects', :action => 'show', :id => project}.merge(options) + link_to(h(project), url, html_options) + else + h(project) + end + end + def toggle_link(name, id, options={}) onclick = "Element.toggle('#{id}'); " onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ") @@ -368,12 +385,12 @@ module ApplicationHelper ancestors = (@project.root? ? [] : @project.ancestors.visible) if ancestors.any? root = ancestors.shift - b << link_to(h(root), {:controller => 'projects', :action => 'show', :id => root, :jump => current_menu_item}, :class => 'root') + b << link_to_project(root, {:jump => current_menu_item}, :class => 'root') if ancestors.size > 2 b << '…' ancestors = ancestors[-2, 2] end - b += ancestors.collect {|p| link_to(h(p), {:controller => 'projects', :action => 'show', :id => p, :jump => current_menu_item}, :class => 'ancestor') } + b += ancestors.collect {|p| link_to_project(p, {:jump => current_menu_item}, :class => 'ancestor') } end b << h(@project) b.join(' » ') @@ -393,6 +410,19 @@ module ApplicationHelper end end + # Returns the theme, controller name, and action as css classes for the + # HTML body. + def body_css_classes + css = [] + if theme = Redmine::Themes.theme(Setting.ui_theme) + css << 'theme-' + theme.name + end + + css << 'controller-' + params[:controller] + css << 'action-' + params[:action] + css.join(' ') + end + def accesskey(s) Redmine::AccessKeys.key_for s end @@ -592,8 +622,7 @@ module ApplicationHelper end when 'project' if p = Project.visible.find_by_id(oid) - link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p}, - :class => 'project' + link = link_to_project(p, {:only_path => only_path}, :class => 'project') end end elsif sep == ':' @@ -635,8 +664,7 @@ module ApplicationHelper end when 'project' if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}]) - link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p}, - :class => 'project' + link = link_to_project(p, {:only_path => only_path}, :class => 'project') end end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 044ccfb77..3b089c111 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -72,7 +72,7 @@ module ProjectsHelper end classes = (ancestors.empty? ? 'root' : 'child') s << "
  • " + - link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}") + link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}") s << "
    #{textilizable(project.short_description, :project => project)}
    " unless project.description.blank? s << "
    \n" ancestors << project diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 594c8a79a..26be63693 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -50,7 +50,7 @@ module QueriesHelper when 'User' link_to_user value when 'Project' - link_to(h(value), :controller => 'projects', :action => 'show', :id => value) + link_to_project value when 'Version' link_to(h(value), :controller => 'versions', :action => 'show', :id => value) when 'TrueClass' diff --git a/app/models/mailer.rb b/app/models/mailer.rb index f39c53209..8f50b1b7b 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -80,7 +80,7 @@ class Mailer < ActionMailer::Base def reminder(user, issues, days) set_language_if_valid user.language recipients user.mail - subject l(:mail_subject_reminder, issues.size) + subject l(:mail_subject_reminder, :count => issues.size, :days => days) body :issues => issues, :days => days, :issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc') diff --git a/app/models/query.rb b/app/models/query.rb index f697a721d..b1f784528 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -187,7 +187,7 @@ class Query < ActiveRecord::Base if project user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] } else - project_ids = User.current.projects.collect(&:id) + project_ids = Project.all(:conditions => Project.visible_by(User.current)).collect(&:id) if project_ids.any? # members of the user's projects user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] } @@ -219,6 +219,12 @@ class Query < ActiveRecord::Base @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } } end add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true})) + # project filter + project_values = Project.all(:conditions => Project.visible_by(User.current), :order => 'lft').map do |p| + pre = (p.level > 0 ? ('--' * p.level + ' ') : '') + ["#{pre}#{p.name}",p.id.to_s] + end + @available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values} end @available_filters end diff --git a/app/models/user.rb b/app/models/user.rb index db18db49e..c5c638f93 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -164,6 +164,30 @@ class User < Principal self.status == STATUS_LOCKED end + def activate + self.status = STATUS_ACTIVE + end + + def register + self.status = STATUS_REGISTERED + end + + def lock + self.status = STATUS_LOCKED + end + + def activate! + update_attribute(:status, STATUS_ACTIVE) + end + + def register! + update_attribute(:status, STATUS_REGISTERED) + end + + def lock! + update_attribute(:status, STATUS_LOCKED) + end + def check_password?(clear_password) if auth_source_id.present? auth_source.authenticate(self.login, clear_password) diff --git a/app/views/admin/_menu.rhtml b/app/views/admin/_menu.rhtml index a8de88850..bd3abebe1 100644 --- a/app/views/admin/_menu.rhtml +++ b/app/views/admin/_menu.rhtml @@ -1,20 +1,5 @@
    - +
    diff --git a/app/views/admin/projects.rhtml b/app/views/admin/projects.rhtml index dc7bb97ed..46b68e4cc 100644 --- a/app/views/admin/projects.rhtml +++ b/app/views/admin/projects.rhtml @@ -27,7 +27,7 @@ <% project_tree(@projects) do |project, level| %> <%= css_project_classes(project) %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> - <%= project.active? ? link_to(h(project.name), :controller => 'projects', :action => 'settings', :id => project) : h(project.name) %> + <%= link_to_project(project, :action => 'settings') %> <%= textilizable project.short_description, :project => project %> <%= checked_image project.is_public? %> <%= format_date(project.created_on) %> diff --git a/app/views/issues/_list_simple.rhtml b/app/views/issues/_list_simple.rhtml index 38823765e..dd7f48946 100644 --- a/app/views/issues/_list_simple.rhtml +++ b/app/views/issues/_list_simple.rhtml @@ -14,7 +14,7 @@ <%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %> <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %> - <%= link_to(h(issue.project), :controller => 'projects', :action => 'show', :id => issue.project) %> + <%= link_to_project(issue.project) %> <%=h issue.tracker %> <%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>) diff --git a/app/views/issues/_relations.rhtml b/app/views/issues/_relations.rhtml index 83a78b1c8..71eaaa673 100644 --- a/app/views/issues/_relations.rhtml +++ b/app/views/issues/_relations.rhtml @@ -1,6 +1,6 @@
    <% if authorize_for('issue_relations', 'new') %> - <%= toggle_link l(:button_add), 'new-relation-form'%> + <%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %> <% end %>
    diff --git a/app/views/issues/move.rhtml b/app/views/issues/move.rhtml index 47388c36b..c216cba7c 100644 --- a/app/views/issues/move.rhtml +++ b/app/views/issues/move.rhtml @@ -6,7 +6,7 @@ <% end -%> -<% form_tag({}, :id => 'move_form') do %> +<% form_tag({:action => 'perform_move'}, :id => 'move_form') do %> <%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
    diff --git a/app/views/layouts/base.rhtml b/app/views/layouts/base.rhtml index 9521457d6..2daae7cb9 100644 --- a/app/views/layouts/base.rhtml +++ b/app/views/layouts/base.rhtml @@ -19,7 +19,7 @@ <%= yield :header_tags -%> - +
    diff --git a/app/views/news/_news.rhtml b/app/views/news/_news.rhtml index e95e8a557..8f481f09c 100644 --- a/app/views/news/_news.rhtml +++ b/app/views/news/_news.rhtml @@ -1,4 +1,4 @@ -

    <%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless @project %> +

    <%= link_to_project(news.project) + ': ' unless @project %> <%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
    diff --git a/app/views/news/index.rhtml b/app/views/news/index.rhtml index 11a39232c..8b7cc66e1 100644 --- a/app/views/news/index.rhtml +++ b/app/views/news/index.rhtml @@ -28,7 +28,7 @@

    <%= l(:label_no_data) %>

    <% else %> <% @newss.each do |news| %> -

    <%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless news.project == @project %> +

    <%= link_to_project(news.project) + ': ' unless news.project == @project %> <%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>

    <%= authoring news.created_on, news.author %>

    diff --git a/app/views/projects/_form.rhtml b/app/views/projects/_form.rhtml index 30848e4cd..fbc6714c8 100644 --- a/app/views/projects/_form.rhtml +++ b/app/views/projects/_form.rhtml @@ -2,14 +2,14 @@
    -

    <%= f.text_field :name, :required => true %>
    <%= l(:text_caracters_maximum, 30) %>

    +

    <%= f.text_field :name, :required => true, :maxlength => 30 %>
    <%= l(:text_caracters_maximum, 30) %>

    <% unless @project.allowed_parents.compact.empty? %>

    <%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %>

    <% end %>

    <%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %>

    -

    <%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %> +

    <%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen?, :maxlength => 20 %> <% unless @project.identifier_frozen? %>
    <%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %> <% end %>

    diff --git a/app/views/users/_memberships.rhtml b/app/views/users/_memberships.rhtml index 70921f4ab..441294708 100644 --- a/app/views/users/_memberships.rhtml +++ b/app/views/users/_memberships.rhtml @@ -14,7 +14,9 @@ <% @user.memberships.each do |membership| %> <% next if membership.new_record? %> - <%=h membership.project %> + + <%= link_to_project membership.project %> + <%=h membership.roles.sort.collect(&:to_s).join(', ') %> <% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership }, diff --git a/app/views/users/show.rhtml b/app/views/users/show.rhtml index 82634b010..df5aec825 100644 --- a/app/views/users/show.rhtml +++ b/app/views/users/show.rhtml @@ -24,7 +24,7 @@

    <%=l(:label_project_plural)%>

      <% for membership in @memberships %> -
    • <%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %> +
    • <%= link_to_project(membership.project) %> (<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)
    • <% end %>
    diff --git a/app/views/welcome/index.rhtml b/app/views/welcome/index.rhtml index a0ada7cce..6ac09c153 100644 --- a/app/views/welcome/index.rhtml +++ b/app/views/welcome/index.rhtml @@ -20,7 +20,7 @@ <% for project in @projects %> <% @project = project %>
  • - <%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>) + <%= link_to_project project %> (<%= format_time(project.created_on) %>) <%= textilizable project.short_description, :project => project %>
  • <% end %> diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 051bbdaf2..8b2b23704 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -704,7 +704,7 @@ bg: text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted." label_and_its_subprojects: "{{value}} and its subprojects" mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:" - mail_subject_reminder: "{{count}} issue(s) due in the next days" + mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days" text_user_wrote: "{{value}} wrote:" label_duplicated_by: duplicated by setting_enabled_scm: Enabled SCM diff --git a/config/locales/bs.yml b/config/locales/bs.yml index d3fe0a128..3d476ae13 100644 --- a/config/locales/bs.yml +++ b/config/locales/bs.yml @@ -184,7 +184,7 @@ bs: mail_body_account_information: Informacija o vašem korisničkom računu mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa" mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:" - mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim danima" + mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim {{days}} danima" mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:" gui_validation_error: 1 greška diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 5f54930d1..1e47d3d66 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -166,7 +166,7 @@ ca: mail_body_account_information: Informació del compte mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}" mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:" - mail_subject_reminder: "%d assumptes venceran els següents {{count}} dies" + mail_subject_reminder: "{{count}} assumptes venceran els següents {{days}} dies" mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:" gui_validation_error: 1 error diff --git a/config/locales/cs.yml b/config/locales/cs.yml index b00527956..de4ad44c5 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -710,7 +710,7 @@ cs: text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány." label_and_its_subprojects: "{{value}} a jeho podprojekty" mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):" - mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní" + mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní ({{days}})" text_user_wrote: "{{value}} napsal:" label_duplicated_by: duplicated by setting_enabled_scm: Povoleno SCM diff --git a/config/locales/da.yml b/config/locales/da.yml index 069674685..b241a52d8 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -791,7 +791,7 @@ da: permission_browse_repository: Gennemse repository permission_manage_repository: Administrér repository permission_manage_members: Administrér medlemmer - mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage" + mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage ({{days}})" permission_add_issue_notes: Tilføj noter permission_edit_messages: Redigér beskeder permission_view_issue_watchers: Se liste over overvågere diff --git a/config/locales/de.yml b/config/locales/de.yml index 05d5d9630..f7f9043c4 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -207,7 +207,7 @@ de: mail_body_account_information: Ihre Konto-Informationen mail_subject_account_activation_request: "Antrag auf {{value}} Kontoaktivierung" mail_body_account_activation_request: "Ein neuer Benutzer ({{value}}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:" - mail_subject_reminder: "{{count}} Tickets müssen in den nächsten Tagen abgegeben werden" + mail_subject_reminder: "{{count}} Tickets müssen in den nächsten {{days}} Tagen abgegeben werden" mail_body_reminder: "{{count}} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten {{days}} Tagen abgegeben werden:" mail_subject_wiki_content_added: "Wiki-Seite '{{page}}' hinzugefügt" mail_body_wiki_content_added: "Die Wiki-Seite '{{page}}' wurde von {{author}} hinzugefügt." diff --git a/config/locales/el.yml b/config/locales/el.yml index 6176a6c8e..a9146a611 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -171,7 +171,7 @@ el: mail_body_account_information: Πληροφορίες του λογαριασμού σας mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού {{value}}" mail_body_account_activation_request: "'Ένας νέος χρήστης ({{value}}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:" - mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες ημέρες" + mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες {{days}} ημέρες" mail_body_reminder: "{{count}}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες {{days}} ημέρες:" mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki {{page}}' " mail_body_wiki_content_added: "Η σελίδα wiki '{{page}}' προστέθηκε από τον {{author}}." diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 42f173b82..2872df15e 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -180,7 +180,7 @@ en-GB: mail_body_account_information: Your account information mail_subject_account_activation_request: "{{value}} account activation request" mail_body_account_activation_request: "A new user ({{value}}) has registered. The account is pending your approval:" - mail_subject_reminder: "{{count}} issue(s) due in the next days" + mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days" mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:" mail_subject_wiki_content_added: "'{{page}}' wiki page has been added" mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}." diff --git a/config/locales/en.yml b/config/locales/en.yml index 4ba6df5c5..b3d87515d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -183,7 +183,7 @@ en: mail_body_account_information: Your account information mail_subject_account_activation_request: "{{value}} account activation request" mail_body_account_activation_request: "A new user ({{value}}) has registered. The account is pending your approval:" - mail_subject_reminder: "{{count}} issue(s) due in the next days" + mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days" mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:" mail_subject_wiki_content_added: "'{{page}}' wiki page has been added" mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}." diff --git a/config/locales/es.yml b/config/locales/es.yml index 0a7a38a9c..bc345dcb5 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -662,7 +662,7 @@ es: mail_subject_account_activation_request: "Petición de activación de cuenta {{value}}" mail_subject_lost_password: "Tu contraseña del {{value}}" mail_subject_register: "Activación de la cuenta del {{value}}" - mail_subject_reminder: "{{count}} peticion(es) finalizan en los próximos días" + mail_subject_reminder: "{{count}} peticion(es) finalizan en los próximos {{days}} días" notice_account_activated: Su cuenta ha sido activada. Ya puede conectarse. notice_account_invalid_creditentials: Usuario o contraseña inválido. notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña. diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 9f08652fc..741d3298f 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -180,7 +180,7 @@ eu: mail_body_account_information: Zure kontuaren informazioa mail_subject_account_activation_request: "{{value}} kontu gaitzeko eskaera" mail_body_account_activation_request: "Erabiltzaile berri bat ({{value}}) erregistratu da. Kontua zure onarpenaren zain dago:" - mail_subject_reminder: "{{count}} arazo hurrengo egunetan amaitzen d(ir)a" + mail_subject_reminder: "{{count}} arazo hurrengo {{days}} egunetan amaitzen d(ir)a" mail_body_reminder: "Zuri esleituta dauden {{count}} arazo hurrengo {{days}} egunetan amaitzen d(ir)a:" mail_subject_wiki_content_added: "'{{page}}' wiki orria gehitu da" mail_body_wiki_content_added: "{{author}}-(e)k '{{page}}' wiki orria gehitu du." diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 5556252cf..b6b48bac0 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -740,7 +740,7 @@ fi: text_subprojects_destroy_warning: "Tämän aliprojekti(t): {{value}} tullaan myös poistamaan." label_and_its_subprojects: "{{value}} ja aliprojektit" mail_body_reminder: "{{count}} sinulle nimettyä tapahtuma(a) erääntyy {{days}} päivä sisään:" - mail_subject_reminder: "{{count}} tapahtuma(a) erääntyy lähipäivinä" + mail_subject_reminder: "{{count}} tapahtuma(a) erääntyy {{days}} lähipäivinä" text_user_wrote: "{{value}} kirjoitti:" label_duplicated_by: kopioinut setting_enabled_scm: Versionhallinta käytettävissä diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ce247d24c..8eb82ad73 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -200,7 +200,7 @@ fr: mail_body_account_information: Paramètres de connexion de votre compte mail_subject_account_activation_request: "Demande d'activation d'un compte {{value}}" mail_body_account_activation_request: "Un nouvel utilisateur ({{value}}) s'est inscrit. Son compte nécessite votre approbation :" - mail_subject_reminder: "{{count}} demande(s) arrivent à échéance" + mail_subject_reminder: "{{count}} demande(s) arrivent à échéance ({{days}})" mail_body_reminder: "{{count}} demande(s) qui vous sont assignées arrivent à échéance dans les {{days}} prochains jours :" mail_subject_wiki_content_added: "Page wiki '{{page}}' ajoutée" mail_body_wiki_content_added: "La page wiki '{{page}}' a été ajoutée par {{author}}." diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 0652ce9e4..2a1d97ed7 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -639,7 +639,7 @@ gl: mail_subject_account_activation_request: "Petición de activación de conta {{value}}" mail_subject_lost_password: "O teu contrasinal de {{value}}" mail_subject_register: "Activación da conta de {{value}}" - mail_subject_reminder: "{{count}} petición(s) rematarán nos próximos días" + mail_subject_reminder: "{{count}} petición(s) rematarán nos próximos {{days}} días" notice_account_activated: A súa conta foi activada. Xa pode conectarse. notice_account_invalid_creditentials: Usuario ou contrasinal inválido. notice_account_lost_email_sent: Enviouse un correo con instrucións para elixir un novo contrasinal. diff --git a/config/locales/he.yml b/config/locales/he.yml index f84fd01fe..532c60195 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -192,7 +192,7 @@ he: mail_body_account_information: פרטי החשבון שלך mail_subject_account_activation_request: "בקשת הפעלה לחשבון {{value}}" mail_body_account_activation_request: "משתמש חדש ({{value}}) נרשם. החשבון שלו מחכה לאישור שלך:" - mail_subject_reminder: "{{count}} נושאים מיעדים להגשה בימים הקרובים" + mail_subject_reminder: "{{count}} נושאים מיעדים להגשה בימים הקרובים ({{days}})" mail_body_reminder: "{{count}} נושאים שמיועדים אליך מיועדים להגשה בתוך {{days}} ימים:" mail_subject_wiki_content_added: "דף ה־wiki ‏'{{page}}' נוסף" mail_body_wiki_content_added: דף ה־wiki ‏'{{page}}' נוסף ע"י {{author}}. diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 424fc7dc5..728a6d8e9 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -176,7 +176,7 @@ hr: mail_body_account_information: Vaši korisnički podaci mail_subject_account_activation_request: "{{value}} predmet za aktivaciju korisničkog računa" mail_body_account_activation_request: "Novi korisnik ({{value}}) je registriran. Njegov korisnički račun čeka vaše odobrenje:" - mail_subject_reminder: "{{count}} predmet(a) dospijeva sljedećih dana" + mail_subject_reminder: "{{count}} predmet(a) dospijeva sljedećih {{days}} dana" mail_body_reminder: "{{count}} vama dodijeljen(ih) predmet(a) dospijeva u sljedećih {{days}} dana:" mail_subject_wiki_content_added: "'{{page}}' wiki page has been added" mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}." diff --git a/config/locales/hu.yml b/config/locales/hu.yml index a62d07327..088027f1a 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -737,7 +737,7 @@ enumeration_doc_categories: Dokumentum kategóriák enumeration_activities: Tevékenységek (idő rögzítés) mail_body_reminder: "{{count}} neked kiosztott feladat határidős az elkövetkező {{days}} napban:" - mail_subject_reminder: "{{count}} feladat határidős az elkövetkező napokban" + mail_subject_reminder: "{{count}} feladat határidős az elkövetkező {{days}} napokban" text_user_wrote: "{{value}} írta:" label_duplicated_by: duplikálta setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése diff --git a/config/locales/id.yml b/config/locales/id.yml index 5a14cda55..ec6688e5d 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -177,7 +177,7 @@ id: mail_body_account_information: Informasi akun anda mail_subject_account_activation_request: "Permintaan aktivasi akun {{value}} " mail_body_account_activation_request: "Pengguna baru ({{value}}) sudan didaftarkan. Akun tersebut menunggu persetujuan anda:" - mail_subject_reminder: "{{count}} masalah harus selesai pada hari berikutnya" + mail_subject_reminder: "{{count}} masalah harus selesai pada hari berikutnya ({{days}})" mail_body_reminder: "{{count}} masalah yang ditugaskan pada anda harus selesai dalam {{days}} hari kedepan:" mail_subject_wiki_content_added: "'{{page}}' halaman wiki sudah ditambahkan" mail_body_wiki_content_added: "The '{{page}}' halaman wiki sudah ditambahkan oleh {{author}}." diff --git a/config/locales/it.yml b/config/locales/it.yml index 758928f2a..bab1c6a91 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -717,7 +717,7 @@ it: text_subprojects_destroy_warning: "Anche i suoi sottoprogetti: {{value}} verranno eliminati." label_and_its_subprojects: "{{value}} ed i suoi sottoprogetti" mail_body_reminder: "{{count}} segnalazioni che ti sono state assegnate scadranno nei prossimi {{days}} giorni:" - mail_subject_reminder: "{{count}} segnalazioni in scadenza nei prossimi giorni" + mail_subject_reminder: "{{count}} segnalazioni in scadenza nei prossimi {{days}} giorni" text_user_wrote: "{{value}} ha scritto:" label_duplicated_by: duplicato da setting_enabled_scm: SCM abilitato diff --git a/config/locales/ja.yml b/config/locales/ja.yml index dc69c9792..c82155b8e 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -214,7 +214,7 @@ ja: mail_body_account_information: アカウント情報 mail_subject_account_activation_request: "{{value}} アカウントの承認要求" mail_body_account_activation_request: "新しいユーザ {{value}} が登録されました。このアカウントはあなたの承認待ちです:" - mail_subject_reminder: "{{count}}件のチケットが期日間近です" + mail_subject_reminder: "{{count}}件のチケットが{{days}}期日間近です" mail_body_reminder: "{{count}}件の担当チケットの期日が{{days}}日以内に到来します:" mail_subject_wiki_content_added: "Wikiページ {{page}} が追加されました" mail_body_wiki_content_added: "{{author}} によってWikiページ {{page}} が追加されました。" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 6ba93edc3..d79c86cb9 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -228,7 +228,7 @@ ko: mail_subject_account_activation_request: "{{value}} 계정 활성화 요청" mail_body_account_activation_request: "새 사용자({{value}})가 등록되었습니다. 관리자님의 승인을 기다리고 있습니다.:" mail_body_reminder: "당신이 맡고 있는 일감 {{count}}개의 완료 기한이 {{days}}일 후 입니다." - mail_subject_reminder: "내일이 만기인 일감 {{count}}개" + mail_subject_reminder: "내일이 만기인 일감 {{count}}개 ({{days}})" mail_subject_wiki_content_added: "위키페이지 '{{page}}'이(가) 추가되었습니다." mail_subject_wiki_content_updated: "'위키페이지 {{page}}'이(가) 수정되었습니다." mail_body_wiki_content_added: "{{author}}이(가) 위키페이지 '{{page}}'을(를) 추가하였습니다." diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 675c3a14b..9bcafc71b 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -237,7 +237,7 @@ lt: mail_body_account_information: Informacija apie Jūsų paskyrą mail_subject_account_activation_request: "{{value}} paskyros aktyvavimo prašymas" mail_body_account_activation_request: "Užsiregistravo naujas vartotojas ({{value}}). Jo paskyra laukia jūsų patvirtinimo:" - mail_subject_reminder: "{{count}} darbas(ai) po kelių dienų" + mail_subject_reminder: "{{count}} darbas(ai) po kelių {{days}} dienų" mail_body_reminder: "{{count}} darbas(ai), kurie yra jums priskirti, baigiasi po {{days}} dienų(os):" mail_subject_wiki_content_added: "'{{page}}' pridėtas wiki puslapis" mail_body_wiki_content_added: "The '{{page}}' wiki puslapi pridėjo {{author}}." diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 4d49bd120..351f8528e 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -172,7 +172,7 @@ lv: mail_body_account_information: Jūsu konta informācija mail_subject_account_activation_request: "{{value}} konta aktivizācijas pieprasījums" mail_body_account_activation_request: "Jauns lietotājs ({{value}}) ir reģistrēts. Lietotāja konts gaida Jūsu apstiprinājumu:" - mail_subject_reminder: "{{count}} uzdevums(i) sagaidāms(i) tuvākajās dienās" + mail_subject_reminder: "{{count}} uzdevums(i) sagaidāms(i) tuvākajās {{days}} dienās" mail_body_reminder: "{{count}} uzdevums(i), kurš(i) ir nozīmēts(i) Jums, sagaidāms(i) tuvākajās {{days}} dienās:" mail_subject_wiki_content_added: "'{{page}}' Wiki lapa pievienota" mail_body_wiki_content_added: "The '{{page}}' Wiki lapu pievienojis {{author}}." diff --git a/config/locales/mn.yml b/config/locales/mn.yml index 63e808024..568e1f341 100644 --- a/config/locales/mn.yml +++ b/config/locales/mn.yml @@ -176,7 +176,7 @@ mn: mail_body_account_information: Таны дансны тухай мэдээлэл mail_subject_account_activation_request: "{{value}} дансыг идэвхжүүлэх хүсэлт" mail_body_account_activation_request: "Шинэ хэрэглэгч ({{value}}) бүртгүүлсэн байна. Таны баталгаажуулахыг хүлээж байна:" - mail_subject_reminder: "Дараагийн өдрүүдэд {{count}} асуудлыг шийдэх хэрэгтэй" + mail_subject_reminder: "Дараагийн өдрүүдэд {{count}} асуудлыг шийдэх хэрэгтэй ({{days}})" mail_body_reminder: "Танд оноогдсон {{count}} асуудлуудыг дараагийн {{days}} өдрүүдэд шийдэх хэрэгтэй:" mail_subject_wiki_content_added: "'{{page}}' wiki page has been added" mail_body_wiki_content_added: "The '{{page}}' wiki page has been added by {{author}}." diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e24d5cbb5..4472a19d7 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -601,7 +601,7 @@ nl: mail_subject_account_activation_request: "{{value}} accountactivatieverzoek" mail_subject_lost_password: "uw {{value}} wachtwoord" mail_subject_register: "uw {{value}} accountactivatie" - mail_subject_reminder: "{{count}} issue(s) die voldaan moeten zijn in de komende dagen." + mail_subject_reminder: "{{count}} issue(s) die voldaan moeten zijn in de komende {{days}} dagen." notice_account_activated: uw account is geactiveerd. u kunt nu inloggen. notice_account_invalid_creditentials: Incorrecte gebruikersnaam of wachtwoord notice_account_lost_email_sent: Er is een e-mail naar u verstuurd met instructies over het kiezen van een nieuw wachtwoord. diff --git a/config/locales/no.yml b/config/locales/no.yml index 53bac51be..7d49537df 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -163,7 +163,7 @@ mail_body_account_information: Informasjon om din konto mail_subject_account_activation_request: "{{value}} kontoaktivering" mail_body_account_activation_request: "En ny bruker ({{value}}) er registrert, og avventer din godkjenning:" - mail_subject_reminder: "{{count}} sak(er) har frist de kommende dagene" + mail_subject_reminder: "{{count}} sak(er) har frist de kommende {{days}} dagene" mail_body_reminder: "{{count}} sak(er) som er tildelt deg har frist de kommende {{days}} dager:" gui_validation_error: 1 feil diff --git a/config/locales/pl.yml b/config/locales/pl.yml index efa2415de..2dadc8478 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -640,7 +640,7 @@ pl: mail_subject_account_activation_request: "Zapytanie aktywacyjne konta {{value}}" mail_subject_lost_password: "Twoje hasło do {{value}}" mail_subject_register: "Aktywacja konta w {{value}}" - mail_subject_reminder: "Uwaga na terminy, masz zagadnienia do obsłużenia w ciągu następnych {{count}} dni!" + mail_subject_reminder: "Uwaga na terminy, masz zagadnienia do obsłużenia w ciągu następnych {{count}} dni! ({{days}})" notice_account_activated: Twoje konto zostało aktywowane. Możesz się zalogować. notice_account_invalid_creditentials: Zły użytkownik lub hasło notice_account_lost_email_sent: Email z instrukcjami zmiany hasła został wysłany do Ciebie. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9365505d0..a66f23718 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -196,7 +196,7 @@ pt-BR: mail_body_account_information: Informações sobre sua conta mail_subject_account_activation_request: "{{value}} - Requisição de ativação de conta" mail_body_account_activation_request: "Um novo usuário ({{value}}) se registrou. A conta está aguardando sua aprovação:" - mail_subject_reminder: "{{count}} tarefa(s) com data prevista para os próximos dias" + mail_subject_reminder: "{{count}} tarefa(s) com data prevista para os próximos {{days}} dias" mail_body_reminder: "{{count}} tarefa(s) para você com data prevista para os próximos {{days}} dias:" gui_validation_error: 1 erro diff --git a/config/locales/pt.yml b/config/locales/pt.yml index c8dafd847..615f31645 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -181,7 +181,7 @@ pt: mail_body_account_information: Informação da sua conta mail_subject_account_activation_request: "Pedido de activação da conta {{value}}" mail_body_account_activation_request: "Um novo utilizador ({{value}}) registou-se. A sua conta está à espera de aprovação:" - mail_subject_reminder: "{{count}} tarefa(s) para entregar nos próximos dias" + mail_subject_reminder: "{{count}} tarefa(s) para entregar nos próximos {{days}} dias" mail_body_reminder: "{{count}} tarefa(s) que estão atribuídas a si estão agendadas para estarem completas nos próximos {{days}} dias:" gui_validation_error: 1 erro diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 5733ddebb..45fdd1eaa 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -164,7 +164,7 @@ ro: mail_body_account_information: Informații despre contul dumneavoastră mail_subject_account_activation_request: "Cerere de activare a contului {{value}}" mail_body_account_activation_request: "S-a înregistrat un utilizator nou ({{value}}). Contul așteaptă aprobarea dumneavoastră:" - mail_subject_reminder: "{{count}} tichete trebuie rezolvate în următoarele zile" + mail_subject_reminder: "{{count}} tichete trebuie rezolvate în următoarele {{days}} zile" mail_body_reminder: "{{count}} tichete atribuite dumneavoastră trebuie rezolvate în următoarele {{days}} zile:" gui_validation_error: o eroare diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 645db4de8..ee9ee37a1 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -755,7 +755,7 @@ ru: mail_subject_account_activation_request: "Запрос на активацию пользователя в системе {{value}}" mail_subject_lost_password: "Ваш {{value}} пароль" mail_subject_register: "Активация учетной записи {{value}}" - mail_subject_reminder: "{{count}} назначенных на Вас задач в ближайшие дни" + mail_subject_reminder: "{{count}} назначенных на Вас задач в ближайшие {{days}} дни" notice_account_activated: Ваша учетная запись активирована. Вы можете войти. notice_account_invalid_creditentials: Неправильное имя пользователя или пароль diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 22f5799f7..0b2351e6b 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -708,7 +708,7 @@ sk: text_subprojects_destroy_warning: "Jeho podprojekt(y): {{value}} budú takisto vymazané." label_and_its_subprojects: "{{value}} a jeho podprojekty" mail_body_reminder: "{{count}} úloha(y), ktorá(é) je(sú) vám priradený(é), ma(jú) byť hotova(é) za {{days}} dní:" - mail_subject_reminder: "{{count}} úloha(y) ma(jú) byť hotova(é) za pár dní" + mail_subject_reminder: "{{count}} úloha(y) ma(jú) byť hotova(é) za pár {{days}} dní" text_user_wrote: "{{value}} napísal:" label_duplicated_by: duplikovaný setting_enabled_scm: Zapnúť SCM diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 77a155757..aac2e4331 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -167,7 +167,7 @@ sl: mail_body_account_information: Informacije o vašem računu mail_subject_account_activation_request: "{{value}} zahtevek za aktivacijo računa" mail_body_account_activation_request: "Registriral se je nov uporabnik ({{value}}). Račun čaka na vašo odobritev:" - mail_subject_reminder: "{{count}} zahtevek(zahtevki) zapadejo v naslednjih dneh" + mail_subject_reminder: "{{count}} zahtevek(zahtevki) zapadejo v naslednjih {{days}} dneh" mail_body_reminder: "{{count}} zahtevek(zahtevki), ki so vam dodeljeni bodo zapadli v naslednjih {{days}} dneh:" gui_validation_error: 1 napaka diff --git a/config/locales/sr-CY.yml b/config/locales/sr-CY.yml index 11f558470..39cc5dcb8 100644 --- a/config/locales/sr-CY.yml +++ b/config/locales/sr-CY.yml @@ -178,7 +178,7 @@ sr-CY: mail_body_account_information: Информације о вашем налогу mail_subject_account_activation_request: "Захтев за активацију налога {{value}}" mail_body_account_activation_request: "Нови корисник ({{value}}) је регистрован. Налог чека на ваше одобрење:" - mail_subject_reminder: "{{count}} проблема доспева наредних дана" + mail_subject_reminder: "{{count}} проблема доспева наредних {{days}} дана" mail_body_reminder: "{{count}} проблема додељених вама доспева у наредних {{days}} дана:" mail_subject_wiki_content_added: "'{{page}}' wiki страна је додато" mail_body_wiki_content_added: "{{author}} је додао '{{page}}' wiki страна." diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 50140b7d8..f52d9e063 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -178,7 +178,7 @@ sr: mail_body_account_information: Informacije o vašem nalogu mail_subject_account_activation_request: "Zahtev za aktivaciju naloga {{value}}" mail_body_account_activation_request: "Novi korisnik ({{value}}) je registrovan. Nalog čeka na vaše odobrenje:" - mail_subject_reminder: "{{count}} problema dospeva narednih dana" + mail_subject_reminder: "{{count}} problema dospeva narednih {{days}} dana" mail_body_reminder: "{{count}} problema dodeljenih vama dospeva u narednih {{days}} dana:" mail_subject_wiki_content_added: "'{{page}}' wiki strana je dodato" mail_body_wiki_content_added: "{{author}} je dodao '{{page}}' wiki strana." diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 23450007a..35ebc1053 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -234,7 +234,7 @@ sv: mail_body_account_information: Din kontoinformation mail_subject_account_activation_request: "{{value}} begäran om kontoaktivering" mail_body_account_activation_request: "En ny användare ({{value}}) har registrerat sig och avvaktar ditt godkännande:" - mail_subject_reminder: "{{count}} ärende(n) har deadline under de kommande dagarna" + mail_subject_reminder: "{{count}} ärende(n) har deadline under de kommande {{days}} dagarna" mail_body_reminder: "{{count}} ärende(n) som är tilldelat dig har deadline under de {{days}} dagarna:" mail_subject_wiki_content_added: "'{{page}}' wikisida has lagts till" mail_body_wiki_content_added: The '{{page}}' wikisida has lagts till av {{author}}. diff --git a/config/locales/th.yml b/config/locales/th.yml index 5f68696eb..2c127f3de 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -707,7 +707,7 @@ th: enumeration_activities: กิจกรรม (ใช้ในการติดตามเวลา) label_and_its_subprojects: "{{value}} and its subprojects" mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:" - mail_subject_reminder: "{{count}} issue(s) due in the next days" + mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days" text_user_wrote: "{{value}} wrote:" label_duplicated_by: duplicated by setting_enabled_scm: Enabled SCM diff --git a/config/locales/tr.yml b/config/locales/tr.yml index bc7bcbf7e..db4330924 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -749,7 +749,7 @@ tr: text_user_wrote: "{{value}} wrote:" setting_mail_handler_api_enabled: Enable WS for incoming emails label_and_its_subprojects: "{{value}} and its subprojects" - mail_subject_reminder: "{{count}} issue(s) due in the next days" + mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days" setting_mail_handler_api_key: API key setting_commit_logs_encoding: Commit messages encoding general_csv_decimal_separator: '.' diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 5ab983325..1a590dc0b 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -706,7 +706,7 @@ uk: text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted." label_and_its_subprojects: "{{value}} and its subprojects" mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:" - mail_subject_reminder: "{{count}} issue(s) due in the next days" + mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days" text_user_wrote: "{{value}} wrote:" label_duplicated_by: duplicated by setting_enabled_scm: Enabled SCM diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 9d2af5e86..f8ca507bf 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -226,7 +226,7 @@ vi: mail_body_account_information: Thông tin về tài khoản mail_subject_account_activation_request: "{{value}}: Yêu cầu chứng thực tài khoản" mail_body_account_activation_request: "Người dùng ({{value}}) mới đăng ký và cần bạn xác nhận:" - mail_subject_reminder: "{{count}} vấn đề hết hạn trong các ngày tới" + mail_subject_reminder: "{{count}} vấn đề hết hạn trong các {{days}} ngày tới" mail_body_reminder: "{{count}} vấn đề gán cho bạn sẽ hết hạn trong {{days}} ngày tới:" gui_validation_error: 1 lỗi diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index fc5f557d1..5a08041c2 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -273,7 +273,7 @@ mail_body_account_information: 您的 Redmine 帳號資訊 mail_subject_account_activation_request: Redmine 帳號啟用需求通知 mail_body_account_activation_request: "有位新用戶 ({{value}}) 已經完成註冊,正等候您的審核:" - mail_subject_reminder: "您有 {{count}} 個項目即將到期" + mail_subject_reminder: "您有 {{count}} 個項目即將到期 ({{days}})" mail_body_reminder: "{{count}} 個指派給您的項目,將於 {{days}} 天之內到期:" mail_subject_wiki_content_added: "'{{page}}' wiki 頁面已被新增" mail_body_wiki_content_added: "The '{{page}}' wiki 頁面已被 {{author}} 新增。" diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 5aef09692..eeac629a1 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -200,7 +200,7 @@ zh: mail_body_account_information: 您的帐号信息 mail_subject_account_activation_request: "{{value}}帐号激活请求" mail_body_account_activation_request: "新用户({{value}})已完成注册,正在等候您的审核:" - mail_subject_reminder: "{{count}} 个问题需要尽快解决" + mail_subject_reminder: "{{count}} 个问题需要尽快解决 ({{days}})" mail_body_reminder: "指派给您的 {{count}} 个问题需要在 {{days}} 天内完成:" mail_subject_wiki_content_added: "'{{page}}' wiki页面已添加" mail_body_wiki_content_added: "'{{page}}' wiki页面已由 {{author}} 添加。" diff --git a/config/routes.rb b/config/routes.rb index 58e620eab..2e8a145cb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -124,7 +124,7 @@ ActionController::Routing::Routes.draw do |map| issues_actions.connect 'projects/:project_id/issues/gantt', :controller => 'gantts', :action => 'show' issues_actions.connect 'projects/:project_id/issues/calendar', :controller => 'calendars', :action => 'show' issues_actions.connect 'issues/:id/quoted', :action => 'reply', :id => /\d+/ - issues_actions.connect 'issues/:id/:action', :action => /edit|move|destroy/, :id => /\d+/ + issues_actions.connect 'issues/:id/:action', :action => /edit|perform_move|destroy/, :id => /\d+/ issues_actions.connect 'issues.:format', :action => 'create', :format => /xml/ end issues_routes.with_options :conditions => {:method => :put} do |issues_actions| diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 4a100bfce..4e6be6a27 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -6,151 +6,151 @@ http://www.redmine.org/ == 2010-07-18 v1.0.0 (Release candidate) -#443: Adds context menu to the roadmap issue lists -#443: Subtasking -#741: Description preview while editing an issue -#1131: Add support for alternate (non-LDAP) authentication -#1214: REST API for Issues -#1223: File upload on wiki edit form -#1755: add "blocked by" as a related issues option -#2420: Fetching emails from an POP server -#2482: Named scopes in Issue and ActsAsWatchable plus some view refactoring (logic extraction). -#2924: Make the right click menu more discoverable using a cursor property -#2985: Make syntax highlighting pluggable -#3201: Workflow Check/Uncheck All Rows/Columns -#3359: Update CodeRay 0.9 -#3706: Allow assigned_to field configuration on Issue creation by email -#3936: configurable list of models to include in search -#4480: Create a link to the user profile from the administration interface -#4482: Cache textile rendering -#4572: Make it harder to ruin your database -#4573: Move github gems to Gemcutter -#4664: Add pagination to forum threads -#4732: Make login case-insensitive also for PostgreSQL -#4812: Create links to other projects -#4819: Replace images with smushed ones for speed -#4945: Allow custom fields attached to project to be searchable -#5121: Fix issues list layout overflow -#5169: Issue list view hook request -#5208: Aibility to edit wiki sidebar -#5281: Remove empty ul tags in the issue history -#5291: Updated basque translations -#5328: Automatically add "Repository" menu_item after repository creation -#5415: Fewer SQL statements generated for watcher_recipients -#5416: Exclude "fields_for" from overridden methods in TabularFormBuilder -#5573: Allow issue assignment in email -#5595: Allow start date and due dates to be set via incoming email -#5752: The projects view (/projects) renders ul's wrong -#5781: Allow to use more macros on the welcome page and project list -Fixed #1288: Unable to past escaped wiki syntax in an issue description -Fixed #1334: Wiki formatting character *_ and _* -Fixed #1416: Inline code with less-then/greater-than produces @lt; and @gt; respectively -Fixed #2473: Login and mail should not be case sensitive -Fixed #2990: Ruby 1.9 - wrong number of arguments (1 for 0) on rake db:migrate -Fixed #3089: Text formatting sometimes breaks when combined -Fixed #3690: Status change info duplicates on the issue screen -Fixed #3691: Redmine allows two files with the same file name to be uploaded to the same issue -Fixed #3764: ApplicationHelperTest fails with JRuby -Fixed #4265: Unclosed code tags in issue descriptions affects main UI -Fixed #4745: Bug in index.xml.builder (issues) -Fixed #4852: changing user/roles of project member not possible without javascript -Fixed #4857: Week number calculation in date picker is wrong if a week starts with Sunday -Fixed #4883: Bottom "contextual" placement in issue with associated changeset -Fixed #4918: Revisions r3453 and r3454 broke On-the-fly user creation with LDAP -Fixed #4935: Navigation to the Master Timesheet page (time_entries) -Fixed #5043: Flash messages are not displayed after the project settings[module/activity] saved -Fixed #5081: Broken links on public/help/wiki_syntax_detailed.html -Fixed #5104: Description of document not wikified on documents index -Fixed #5108: Issue linking fails inside of []s -Fixed #5199: diff code coloring using coderay -Fixed #5233: Add a hook to the issue report (Summary) view -Fixed #5265: timetracking: subtasks time is added to the main task -Fixed #5343: acts_as_event Doesn't Accept Outside URLs -Fixed #5440: UI Inconsistency : Administration > Enumerations table row headers should be enclosed in -Fixed #5463: 0.9.4 INSTALL and/or UPGRADE, missing session_store.rb -Fixed #5524: Update_parent_attributes doesn't work for the old parent issue when reparenting -Fixed #5548: SVN Repository: Can not list content of a folder which includes square brackets. -Fixed #5589: "with subproject" malfunction -Fixed #5676: Search for Numeric Value -Fixed #5696: Redmine + PostgreSQL 8.4.4 fails on _dir_list_content.rhtml -Fixed #5698: redmine:email:receive_imap fails silently for mails with subject longer than 255 characters -Fixed #5700: TimelogController#destroy assumes success -Fixed #5751: developer role is mispelled -Fixed #5769: Popup Calendar doesn't Advance in Chrome -Fixed #5771: Problem when importing git repository -Fixed #5823: Error in comments in plugin.rb +* #443: Adds context menu to the roadmap issue lists +* #443: Subtasking +* #741: Description preview while editing an issue +* #1131: Add support for alternate (non-LDAP) authentication +* #1214: REST API for Issues +* #1223: File upload on wiki edit form +* #1755: add "blocked by" as a related issues option +* #2420: Fetching emails from an POP server +* #2482: Named scopes in Issue and ActsAsWatchable plus some view refactoring (logic extraction). +* #2924: Make the right click menu more discoverable using a cursor property +* #2985: Make syntax highlighting pluggable +* #3201: Workflow Check/Uncheck All Rows/Columns +* #3359: Update CodeRay 0.9 +* #3706: Allow assigned_to field configuration on Issue creation by email +* #3936: configurable list of models to include in search +* #4480: Create a link to the user profile from the administration interface +* #4482: Cache textile rendering +* #4572: Make it harder to ruin your database +* #4573: Move github gems to Gemcutter +* #4664: Add pagination to forum threads +* #4732: Make login case-insensitive also for PostgreSQL +* #4812: Create links to other projects +* #4819: Replace images with smushed ones for speed +* #4945: Allow custom fields attached to project to be searchable +* #5121: Fix issues list layout overflow +* #5169: Issue list view hook request +* #5208: Aibility to edit wiki sidebar +* #5281: Remove empty ul tags in the issue history +* #5291: Updated basque translations +* #5328: Automatically add "Repository" menu_item after repository creation +* #5415: Fewer SQL statements generated for watcher_recipients +* #5416: Exclude "fields_for" from overridden methods in TabularFormBuilder +* #5573: Allow issue assignment in email +* #5595: Allow start date and due dates to be set via incoming email +* #5752: The projects view (/projects) renders ul's wrong +* #5781: Allow to use more macros on the welcome page and project list +* Fixed #1288: Unable to past escaped wiki syntax in an issue description +* Fixed #1334: Wiki formatting character *_ and _* +* Fixed #1416: Inline code with less-then/greater-than produces @lt; and @gt; respectively +* Fixed #2473: Login and mail should not be case sensitive +* Fixed #2990: Ruby 1.9 - wrong number of arguments (1 for 0) on rake db:migrate +* Fixed #3089: Text formatting sometimes breaks when combined +* Fixed #3690: Status change info duplicates on the issue screen +* Fixed #3691: Redmine allows two files with the same file name to be uploaded to the same issue +* Fixed #3764: ApplicationHelperTest fails with JRuby +* Fixed #4265: Unclosed code tags in issue descriptions affects main UI +* Fixed #4745: Bug in index.xml.builder (issues) +* Fixed #4852: changing user/roles of project member not possible without javascript +* Fixed #4857: Week number calculation in date picker is wrong if a week starts with Sunday +* Fixed #4883: Bottom "contextual" placement in issue with associated changeset +* Fixed #4918: Revisions r3453 and r3454 broke On-the-fly user creation with LDAP +* Fixed #4935: Navigation to the Master Timesheet page (time_entries) +* Fixed #5043: Flash messages are not displayed after the project settings[module/activity] saved +* Fixed #5081: Broken links on public/help/wiki_syntax_detailed.html +* Fixed #5104: Description of document not wikified on documents index +* Fixed #5108: Issue linking fails inside of []s +* Fixed #5199: diff code coloring using coderay +* Fixed #5233: Add a hook to the issue report (Summary) view +* Fixed #5265: timetracking: subtasks time is added to the main task +* Fixed #5343: acts_as_event Doesn't Accept Outside URLs +* Fixed #5440: UI Inconsistency : Administration > Enumerations table row headers should be enclosed in +* Fixed #5463: 0.9.4 INSTALL and/or UPGRADE, missing session_store.rb +* Fixed #5524: Update_parent_attributes doesn't work for the old parent issue when reparenting +* Fixed #5548: SVN Repository: Can not list content of a folder which includes square brackets. +* Fixed #5589: "with subproject" malfunction +* Fixed #5676: Search for Numeric Value +* Fixed #5696: Redmine + PostgreSQL 8.4.4 fails on _dir_list_content.rhtml +* Fixed #5698: redmine:email:receive_imap fails silently for mails with subject longer than 255 characters +* Fixed #5700: TimelogController#destroy assumes success +* Fixed #5751: developer role is mispelled +* Fixed #5769: Popup Calendar doesn't Advance in Chrome +* Fixed #5771: Problem when importing git repository +* Fixed #5823: Error in comments in plugin.rb == 2010-07-07 v0.9.6 -Fixed: Redmine.pm access by unauthorized users +* Fixed: Redmine.pm access by unauthorized users == 2010-06-24 v0.9.5 -Linkify folder names on revision view -"fiters" and "options" should be hidden in print view via css -Fixed: NoMethodError when no issue params are submitted -Fixed: projects.atom with required authentication -Fixed: External links not correctly displayed in Wiki TOC -Fixed: Member role forms in project settings are not hidden after member added -Fixed: pre can't be inside p -Fixed: session cookie path does not respect RAILS_RELATIVE_URL_ROOT -Fixed: mail handler fails when the from address is empty +* Linkify folder names on revision view +* "fiters" and "options" should be hidden in print view via css +* Fixed: NoMethodError when no issue params are submitted +* Fixed: projects.atom with required authentication +* Fixed: External links not correctly displayed in Wiki TOC +* Fixed: Member role forms in project settings are not hidden after member added +* Fixed: pre can't be inside p +* Fixed: session cookie path does not respect RAILS_RELATIVE_URL_ROOT +* Fixed: mail handler fails when the from address is empty == 2010-05-01 v0.9.4 -Filters collapsed by default on issues index page for a saved query -Fixed: When categories list is too big the popup menu doesn't adjust (ex. in the issue list) -Fixed: remove "main-menu" div when the menu is empty -Fixed: Code syntax highlighting not working in Document page -Fixed: Git blame/annotate fails on moved files -Fixed: Failing test in test_show_atom -Fixed: Migrate from trac - not displayed Wikis -Fixed: Email notifications on file upload sent to empty recipient list -Fixed: Migrating from trac is not possible, fails to allocate memory -Fixed: Lost password no longer flashes a confirmation message -Fixed: Crash while deleting in-use enumeration -Fixed: Hard coded English string at the selection of issue watchers -Fixed: Bazaar v2.1.0 changed behaviour -Fixed: Roadmap display can raise an exception if no trackers are selected -Fixed: Gravatar breaks layout of "logged in" page -Fixed: Reposman.rb on Windows -Fixed: Possible error 500 while moving an issue to another project with SQLite -Fixed: backslashes in issue description/note should be escaped when quoted -Fixed: Long text in
     disrupts Associated revisions
    -Fixed: Links to missing wiki pages not red on project overview page
    -Fixed: Cannot delete a project with subprojects that shares versions
    -Fixed: Update of Subversion changesets broken under Solaris
    -Fixed: "Move issues" permission not working for Non member
    -Fixed: Sidebar overlap on Users tab of Group editor
    -Fixed: Error on db:migrate with table prefix set (hardcoded name in principal.rb)
    -Fixed: Report shows sub-projects for non-members
    -Fixed: 500 internal error when browsing any Redmine page in epiphany
    -Fixed: Watchers selection lost when issue creation fails
    -Fixed: When copying projects, redmine should not generate an email to people who created issues
    -Fixed: Issue "#" table cells should have a class attribute to enable fine-grained CSS theme
    -Fixed: Plugin generators should display help if no parameter is given
    +* Filters collapsed by default on issues index page for a saved query
    +* Fixed: When categories list is too big the popup menu doesn't adjust (ex. in the issue list)
    +* Fixed: remove "main-menu" div when the menu is empty
    +* Fixed: Code syntax highlighting not working in Document page
    +* Fixed: Git blame/annotate fails on moved files
    +* Fixed: Failing test in test_show_atom
    +* Fixed: Migrate from trac - not displayed Wikis
    +* Fixed: Email notifications on file upload sent to empty recipient list
    +* Fixed: Migrating from trac is not possible, fails to allocate memory
    +* Fixed: Lost password no longer flashes a confirmation message
    +* Fixed: Crash while deleting in-use enumeration
    +* Fixed: Hard coded English string at the selection of issue watchers
    +* Fixed: Bazaar v2.1.0 changed behaviour
    +* Fixed: Roadmap display can raise an exception if no trackers are selected
    +* Fixed: Gravatar breaks layout of "logged in" page
    +* Fixed: Reposman.rb on Windows
    +* Fixed: Possible error 500 while moving an issue to another project with SQLite
    +* Fixed: backslashes in issue description/note should be escaped when quoted
    +* Fixed: Long text in 
     disrupts Associated revisions
    +* Fixed: Links to missing wiki pages not red on project overview page
    +* Fixed: Cannot delete a project with subprojects that shares versions
    +* Fixed: Update of Subversion changesets broken under Solaris
    +* Fixed: "Move issues" permission not working for Non member
    +* Fixed: Sidebar overlap on Users tab of Group editor
    +* Fixed: Error on db:migrate with table prefix set (hardcoded name in principal.rb)
    +* Fixed: Report shows sub-projects for non-members
    +* Fixed: 500 internal error when browsing any Redmine page in epiphany
    +* Fixed: Watchers selection lost when issue creation fails
    +* Fixed: When copying projects, redmine should not generate an email to people who created issues
    +* Fixed: Issue "#" table cells should have a class attribute to enable fine-grained CSS theme
    +* Fixed: Plugin generators should display help if no parameter is given
     
     
     == 2010-02-28 v0.9.3
     
    -Adds filter for system shared versions on the cross project issue list
    -Makes project identifiers searchable
    -Remove invalid utf8 sequences from commit comments and author name
    -Fixed: Wrong link when "http" not included in project "Homepage" link
    -Fixed: Escaping in html email templates
    -Fixed: Pound (#) followed by number with leading zero (0) removes leading zero when rendered in wiki
    -Fixed: Deselecting textile text formatting causes interning empty string errors
    -Fixed: error with postgres when entering a non-numeric id for an issue relation
    -Fixed: div.task incorrectly wrapping on Gantt Chart
    -Fixed: Project copy loses wiki pages hierarchy
    -Fixed: parent project field doesn't include blank value when a member with 'add subproject' permission edits a child project
    -Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects
    -Fixed: Duplicated project name for subproject version on gantt chart
    -Fixed: roadmap shows subprojects issues even if subprojects is unchecked
    -Fixed: IndexError if all the :last menu items are deleted from a menu
    -Fixed: Very high CPU usage for a long time when fetching commits from a large Git repository
    +* Adds filter for system shared versions on the cross project issue list
    +* Makes project identifiers searchable
    +* Remove invalid utf8 sequences from commit comments and author name
    +* Fixed: Wrong link when "http" not included in project "Homepage" link
    +* Fixed: Escaping in html email templates
    +* Fixed: Pound (#) followed by number with leading zero (0) removes leading zero when rendered in wiki
    +* Fixed: Deselecting textile text formatting causes interning empty string errors
    +* Fixed: error with postgres when entering a non-numeric id for an issue relation
    +* Fixed: div.task incorrectly wrapping on Gantt Chart
    +* Fixed: Project copy loses wiki pages hierarchy
    +* Fixed: parent project field doesn't include blank value when a member with 'add subproject' permission edits a child project
    +* Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects
    +* Fixed: Duplicated project name for subproject version on gantt chart
    +* Fixed: roadmap shows subprojects issues even if subprojects is unchecked
    +* Fixed: IndexError if all the :last menu items are deleted from a menu
    +* Fixed: Very high CPU usage for a long time when fetching commits from a large Git repository
     
     
     == 2010-02-07 v0.9.2
    diff --git a/lib/redmine.rb b/lib/redmine.rb
    index 238ee110a..4196a5d7a 100644
    --- a/lib/redmine.rb
    +++ b/lib/redmine.rb
    @@ -69,7 +69,7 @@ Redmine::AccessControl.map do |map|
         map.permission :add_issue_notes, {:issues => [:edit, :update, :reply]}
         map.permission :edit_issue_notes, {:journals => :edit}, :require => :loggedin
         map.permission :edit_own_issue_notes, {:journals => :edit}, :require => :loggedin
    -    map.permission :move_issues, {:issues => :move}, :require => :loggedin
    +    map.permission :move_issues, {:issues => [:move, :perform_move]}, :require => :loggedin
         map.permission :delete_issues, {:issues => :destroy}, :require => :member
         # Queries
         map.permission :manage_public_queries, {:queries => [:new, :edit, :destroy]}, :require => :member
    @@ -157,7 +157,22 @@ Redmine::MenuManager.map :application_menu do |menu|
     end
     
     Redmine::MenuManager.map :admin_menu do |menu|
    -  # Empty
    +  menu.push :projects, {:controller => 'admin', :action => 'projects'}, :caption => :label_project_plural
    +  menu.push :users, {:controller => 'users'}, :caption => :label_user_plural
    +  menu.push :groups, {:controller => 'groups'}, :caption => :label_group_plural
    +  menu.push :roles, {:controller => 'roles'}, :caption => :label_role_and_permissions
    +  menu.push :trackers, {:controller => 'trackers'}, :caption => :label_tracker_plural
    +  menu.push :issue_statuses, {:controller => 'issue_statuses'}, :caption => :label_issue_status_plural,
    +            :html => {:class => 'issue_statuses'}
    +  menu.push :workflows, {:controller => 'workflows', :action => 'edit'}, :caption => :label_workflow
    +  menu.push :custom_fields, {:controller => 'custom_fields'},  :caption => :label_custom_field_plural,
    +            :html => {:class => 'custom_fields'}
    +  menu.push :enumerations, {:controller => 'enumerations'}
    +  menu.push :settings, {:controller => 'settings'}
    +  menu.push :ldap_authentication, {:controller => 'ldap_auth_sources', :action => 'index'},
    +            :html => {:class => 'server_authentication'}
    +  menu.push :plugins, {:controller => 'admin', :action => 'plugins'}, :last => true
    +  menu.push :info, {:controller => 'admin', :action => 'info'}, :caption => :label_information_plural, :last => true
     end
     
     Redmine::MenuManager.map :project_menu do |menu|
    diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb
    index d15bce1af..0857d9047 100644
    --- a/lib/redmine/scm/adapters/git_adapter.rb
    +++ b/lib/redmine/scm/adapters/git_adapter.rb
    @@ -114,12 +114,12 @@ module Redmine
             def revisions(path, identifier_from, identifier_to, options={})
               revisions = Revisions.new
     
    -          cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw --date=iso --pretty=fuller"
    -          cmd << " --reverse" if options[:reverse]
    -          cmd << " --all" if options[:all]
    +          cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw --date=iso --pretty=fuller "
    +          cmd << " --reverse " if options[:reverse]
    +          cmd << " --all " if options[:all]
               cmd << " -n #{options[:limit]} " if options[:limit]
    -          cmd << " #{shell_quote(identifier_from + '..')} " if identifier_from
    -          cmd << " #{shell_quote identifier_to} " if identifier_to
    +          cmd << "#{shell_quote(identifier_from + '..')}" if identifier_from
    +          cmd << "#{shell_quote identifier_to}" if identifier_to
               cmd << " --since=#{shell_quote(options[:since].strftime("%Y-%m-%d %H:%M:%S"))}" if options[:since]
               cmd << " -- #{path}" if path && !path.empty?
     
    diff --git a/lib/tasks/ci.rake b/lib/tasks/ci.rake
    new file mode 100644
    index 000000000..092575317
    --- /dev/null
    +++ b/lib/tasks/ci.rake
    @@ -0,0 +1,41 @@
    +desc "Run the Continous Integration tests for Redmine"
    +task :ci do
    +  # RAILS_ENV and ENV[] can diverge so force them both to test
    +  ENV['RAILS_ENV'] = 'test'
    +  RAILS_ENV = 'test'
    +  Rake::Task["ci:setup"].invoke
    +  Rake::Task["ci:build"].invoke
    +  Rake::Task["ci:teardown"].invoke
    +end
    +
    +# Tasks can be hooked into by redefining them in a plugin
    +namespace :ci do
    +  desc "Setup Redmine for a new build."
    +  task :setup do
    +    Rake::Task["ci:dump_environment"].invoke
    +    Rake::Task["db:create"].invoke
    +    Rake::Task["db:migrate"].invoke
    +    Rake::Task["db:schema:dump"].invoke
    +  end
    +
    +  desc "Build Redmine"
    +  task :build do
    +    Rake::Task["test"].invoke
    +  end
    +
    +  # Use this to cleanup after building or run post-build analysis.
    +  desc "Finish the build"
    +  task :teardown do
    +  end
    +
    +  desc "Dump the environment information to a BUILD_ENVIRONMENT ENV variable for debugging"
    +  task :dump_environment do
    +
    +    ENV['BUILD_ENVIRONMENT'] = ['ruby -v', 'gem -v', 'gem list'].collect do |command|
    +      result = `#{command}`
    +      "$ #{command}\n#{result}"
    +    end.join("\n")
    +    
    +  end
    +end
    +
    diff --git a/lib/tasks/yardoc.rake b/lib/tasks/yardoc.rake
    index c98f3bd4f..aa6c5eeb0 100644
    --- a/lib/tasks/yardoc.rake
    +++ b/lib/tasks/yardoc.rake
    @@ -2,7 +2,17 @@ begin
       require 'yard'
     
       YARD::Rake::YardocTask.new do |t|
    -    t.files = ['lib/**/*.rb', 'app/**/*.rb', 'vendor/plugins/**/*.rb']
    +    files = ['lib/**/*.rb', 'app/**/*.rb']
    +    files << Dir['vendor/plugins/**/*.rb'].reject {|f| f.match(/test/) } # Exclude test files
    +    t.files = files
    +
    +    static_files = ['doc/CHANGELOG',
    +                    'doc/COPYING',
    +                    'doc/INSTALL',
    +                    'doc/RUNNING_TESTS',
    +                    'doc/UPGRADING'].join(',')
    +
    +    t.options += ['--output-dir', './doc/app', '--files', static_files]
       end
     
     rescue LoadError
    diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
    index 59a2c3edd..520ed8371 100644
    --- a/public/stylesheets/application.css
    +++ b/public/stylesheets/application.css
    @@ -287,8 +287,8 @@ fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
     .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
     
     div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
    -div#issue-changesets .changeset { padding: 4px;}
    -div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
    +div#issue-changesets div.changeset { padding: 4px;}
    +div#issue-changesets div.changeset { border-bottom: 1px solid #ddd; }
     div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
     
     div#activity dl, #search-results { margin-left: 2em; }
    diff --git a/test/functional/auth_sources_controller_test.rb b/test/functional/auth_sources_controller_test.rb
    index bd97844ed..348e0e098 100644
    --- a/test/functional/auth_sources_controller_test.rb
    +++ b/test/functional/auth_sources_controller_test.rb
    @@ -1,4 +1,4 @@
    -require 'test_helper'
    +require File.dirname(__FILE__) + '/../test_helper'
     
     class AuthSourcesControllerTest < ActionController::TestCase
       fixtures :all
    diff --git a/test/functional/calendars_controller_test.rb b/test/functional/calendars_controller_test.rb
    index 79cfe28a0..ad047c669 100644
    --- a/test/functional/calendars_controller_test.rb
    +++ b/test/functional/calendars_controller_test.rb
    @@ -1,4 +1,4 @@
    -require 'test_helper'
    +require File.dirname(__FILE__) + '/../test_helper'
     
     class CalendarsControllerTest < ActionController::TestCase
       fixtures :all
    diff --git a/test/functional/gantts_controller_test.rb b/test/functional/gantts_controller_test.rb
    index 4c27de7cd..24c84f2ae 100644
    --- a/test/functional/gantts_controller_test.rb
    +++ b/test/functional/gantts_controller_test.rb
    @@ -1,4 +1,4 @@
    -require 'test_helper'
    +require File.dirname(__FILE__) + '/../test_helper'
     
     class GanttsControllerTest < ActionController::TestCase
       fixtures :all
    diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb
    index 670fb2d7e..92e6fd30a 100644
    --- a/test/functional/issues_controller_test.rb
    +++ b/test/functional/issues_controller_test.rb
    @@ -1038,22 +1038,22 @@ class IssuesControllerTest < ActionController::TestCase
         assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
       end
     
    -  def test_move_one_issue_to_another_project
    +  def test_perform_move_one_issue_to_another_project
         @request.session[:user_id] = 2
    -    post :move, :id => 1, :new_project_id => 2, :tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
    +    post :perform_move, :id => 1, :new_project_id => 2, :tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
         assert_redirected_to :action => 'index', :project_id => 'ecookbook'
         assert_equal 2, Issue.find(1).project_id
       end
     
    -  def test_move_one_issue_to_another_project_should_follow_when_needed
    +  def test_perform_move_one_issue_to_another_project_should_follow_when_needed
         @request.session[:user_id] = 2
    -    post :move, :id => 1, :new_project_id => 2, :follow => '1'
    +    post :perform_move, :id => 1, :new_project_id => 2, :follow => '1'
         assert_redirected_to '/issues/1'
       end
     
    -  def test_bulk_move_to_another_project
    +  def test_bulk_perform_move_to_another_project
         @request.session[:user_id] = 2
    -    post :move, :ids => [1, 2], :new_project_id => 2
    +    post :perform_move, :ids => [1, 2], :new_project_id => 2
         assert_redirected_to :action => 'index', :project_id => 'ecookbook'
         # Issues moved to project 2
         assert_equal 2, Issue.find(1).project_id
    @@ -1063,9 +1063,9 @@ class IssuesControllerTest < ActionController::TestCase
         assert_equal 2, Issue.find(2).tracker_id
       end
      
    -  def test_bulk_move_to_another_tracker
    +  def test_bulk_perform_move_to_another_tracker
         @request.session[:user_id] = 2
    -    post :move, :ids => [1, 2], :new_tracker_id => 2
    +    post :perform_move, :ids => [1, 2], :new_tracker_id => 2
         assert_redirected_to :action => 'index', :project_id => 'ecookbook'
         assert_equal 2, Issue.find(1).tracker_id
         assert_equal 2, Issue.find(2).tracker_id
    @@ -1075,19 +1075,19 @@ class IssuesControllerTest < ActionController::TestCase
         @request.session[:user_id] = 2
         assert_difference 'Issue.count', 2 do
           assert_no_difference 'Project.find(1).issues.count' do
    -        post :move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}
    +        post :perform_move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}
           end
         end
         assert_redirected_to 'projects/ecookbook/issues'
       end
     
    -  context "#move via bulk copy" do
    +  context "#perform_move via bulk copy" do
         should "allow not changing the issue's attributes" do
           @request.session[:user_id] = 2
           issue_before_move = Issue.find(1)
           assert_difference 'Issue.count', 1 do
             assert_no_difference 'Project.find(1).issues.count' do
    -          post :move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
    +          post :perform_move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
             end
           end
           issue_after_move = Issue.first(:order => 'id desc', :conditions => {:project_id => 2})
    @@ -1104,7 +1104,7 @@ class IssuesControllerTest < ActionController::TestCase
           @request.session[:user_id] = 2
           assert_difference 'Issue.count', 2 do
             assert_no_difference 'Project.find(1).issues.count' do
    -          post :move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => 4, :status_id => 3, :start_date => '2009-12-01', :due_date => '2009-12-31'
    +          post :perform_move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => 4, :status_id => 3, :start_date => '2009-12-01', :due_date => '2009-12-31'
             end
           end
     
    @@ -1122,7 +1122,7 @@ class IssuesControllerTest < ActionController::TestCase
       
       def test_copy_to_another_project_should_follow_when_needed
         @request.session[:user_id] = 2
    -    post :move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :follow => '1'
    +    post :perform_move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :follow => '1'
         issue = Issue.first(:order => 'id DESC')
         assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
       end
    diff --git a/test/integration/routing_test.rb b/test/integration/routing_test.rb
    index f8476df56..51f8e71f6 100644
    --- a/test/integration/routing_test.rb
    +++ b/test/integration/routing_test.rb
    @@ -86,7 +86,7 @@ class RoutingTest < ActionController::IntegrationTest
         should_route :get, "/projects/23/issues/64/copy", :controller => 'issues', :action => 'new', :project_id => '23', :copy_from => '64'
     
         should_route :get, "/issues/1/move", :controller => 'issues', :action => 'move', :id => '1'
    -    should_route :post, "/issues/1/move", :controller => 'issues', :action => 'move', :id => '1'
    +    should_route :post, "/issues/1/perform_move", :controller => 'issues', :action => 'perform_move', :id => '1'
         
         should_route :post, "/issues/1/quoted", :controller => 'issues', :action => 'reply', :id => '1'
     
    diff --git a/test/unit/helpers/application_helper_test.rb b/test/unit/helpers/application_helper_test.rb
    index 90d342898..6fd21fe37 100644
    --- a/test/unit/helpers/application_helper_test.rb
    +++ b/test/unit/helpers/application_helper_test.rb
    @@ -597,4 +597,16 @@ EXPECTED
         t = link_to_user(user)
         assert_equal ::I18n.t(:label_user_anonymous), t
       end
    +
    +  def test_link_to_project
    +    project = Project.find(1)
    +    assert_equal %(eCookbook),
    +                 link_to_project(project)
    +    assert_equal %(eCookbook),
    +                 link_to_project(project, :action => 'settings')
    +    assert_equal %(eCookbook),
    +                 link_to_project(project, {:only_path => false, :jump => 'blah'})
    +    assert_equal %(eCookbook),
    +                 link_to_project(project, {:action => 'settings'}, :class => "project")
    +  end
     end
    diff --git a/test/unit/lib/redmine/menu_manager/menu_item_test.rb b/test/unit/lib/redmine/menu_manager/menu_item_test.rb
    index 835e154d8..ab17d4a4b 100644
    --- a/test/unit/lib/redmine/menu_manager/menu_item_test.rb
    +++ b/test/unit/lib/redmine/menu_manager/menu_item_test.rb
    @@ -24,7 +24,7 @@ module RedmineMenuTestHelper
       end
     end
     
    -class Redmine::MenuManager::MenuItemTest < Test::Unit::TestCase
    +class Redmine::MenuManager::MenuItemTest < ActiveSupport::TestCase
       include RedmineMenuTestHelper
     
       Redmine::MenuManager.map :test_menu do |menu|
    diff --git a/test/unit/lib/redmine/menu_manager_test.rb b/test/unit/lib/redmine/menu_manager_test.rb
    index 0c01ca323..200ed3976 100644
    --- a/test/unit/lib/redmine/menu_manager_test.rb
    +++ b/test/unit/lib/redmine/menu_manager_test.rb
    @@ -17,7 +17,7 @@
     
     require File.dirname(__FILE__) + '/../../../test_helper'
     
    -class Redmine::MenuManagerTest < Test::Unit::TestCase
    +class Redmine::MenuManagerTest < ActiveSupport::TestCase
       context "MenuManager#map" do
         should "be tested"
       end
    @@ -25,8 +25,4 @@ class Redmine::MenuManagerTest < Test::Unit::TestCase
       context "MenuManager#items" do
         should "be tested"
       end
    -
    -  should "be tested" do
    -    assert true
    -  end
     end
    diff --git a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
    index 2dc5d3e8e..6b716b9cd 100644
    --- a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
    +++ b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
    @@ -16,6 +16,10 @@ class GitAdapterTest < ActiveSupport::TestCase
           assert_equal 13, @adapter.revisions('',nil,nil,:all => true).length
         end
         
    +    def test_getting_certain_revisions
    +      assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
    +    end
    +    
         def test_annotate
           annotate = @adapter.annotate('sources/watchers_controller.rb')
           assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
    diff --git a/test/unit/lib/redmine_test.rb b/test/unit/lib/redmine_test.rb
    index 5150da1f2..2d32abdcb 100644
    --- a/test/unit/lib/redmine_test.rb
    +++ b/test/unit/lib/redmine_test.rb
    @@ -33,7 +33,7 @@ module RedmineMenuTestHelper
       end
     end
     
    -class RedmineTest < Test::Unit::TestCase
    +class RedmineTest < ActiveSupport::TestCase
       include RedmineMenuTestHelper
     
       def test_top_menu
    diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb
    index f1fc2502f..a5932d325 100644
    --- a/test/unit/mailer_test.rb
    +++ b/test/unit/mailer_test.rb
    @@ -352,6 +352,7 @@ class MailerTest < ActiveSupport::TestCase
         mail = ActionMailer::Base.deliveries.last
         assert mail.bcc.include?('dlopper@somenet.foo')
         assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
    +    assert_equal '1 issue(s) due in the next 42 days', mail.subject
       end
       
       def last_email
    diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb
    index 26cba2a5e..12ab5d932 100644
    --- a/test/unit/query_test.rb
    +++ b/test/unit/query_test.rb
    @@ -33,6 +33,15 @@ class QueryTest < ActiveSupport::TestCase
         assert query.available_filters['fixed_version_id'][:values].detect {|v| v.last == '2'}
       end
       
    +  def test_project_filter_in_global_queries
    +    query = Query.new(:project => nil, :name => '_')
    +    project_filter = query.available_filters["project_id"]
    +    assert_not_nil project_filter
    +    project_ids = project_filter[:values].map{|p| p[1]}
    +    assert project_ids.include?("1")  #public project
    +    assert !project_ids.include?("2") #private project user cannot see
    +  end
    +  
       def find_issues_with_query(query)
         Issue.find :all,
           :include => [ :assigned_to, :status, :tracker, :project, :priority ], 
    @@ -351,4 +360,13 @@ class QueryTest < ActiveSupport::TestCase
         assert !q.editable_by?(manager)
         assert !q.editable_by?(developer)
       end
    +
    +  context "#available_filters" do
    +    should "include users of visible projects in cross-project view" do
    +      query = Query.new(:name => "_")
    +      users = query.available_filters["assigned_to_id"]
    +      assert_not_nil users
    +      assert users[:values].map{|u|u[1]}.include?("3")
    +    end
    +  end
     end