Merge branch 'master' into backbone.ws

This commit is contained in:
Kolan Sh 2012-06-15 00:12:40 +04:00
commit 1e908da66c
64 changed files with 5412 additions and 3042 deletions

1
.gitignore vendored
View File

@ -31,3 +31,4 @@ doc/app
/.rvmrc* /.rvmrc*
/*.iml /*.iml
/.idea /.idea
.rbx

34
.travis.yml Normal file
View File

@ -0,0 +1,34 @@
language: ruby
rvm:
- 1.8.7
- 1.9.2
- 1.9.3
- rbx-18mode
env:
- "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
- "RAILS_ENV=test DB=mysql2 BUNDLE_WITHOUT=rmagick:mysql:postgres:sqlite"
- "RAILS_ENV=test DB=postgres BUNDLE_WITHOUT=rmagick:mysql:mysql2:sqlite"
- "RAILS_ENV=test DB=sqlite BUNDLE_WITHOUT=rmagick:mysql:mysql2:postgres"
matrix:
exclude:
- rvm: 1.9.2
env: "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
- rvm: 1.9.3
env: "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
- rvm: rbx-18mode
env: "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
allow_failures:
- rvm: rbx-18mode
before_script:
- "sudo apt-get --no-install-recommends install bzr cvs darcs git mercurial subversion"
- "rake ci:travis:prepare"
branches:
only:
- unstable
- master
- stable
- /^stable-.*$/
- /^release-.*$/
notifications:
email: false
irc: "irc.freenode.org#chiliproject"

View File

@ -9,6 +9,7 @@ gem "rubytree", "~> 0.5.2", :require => 'tree'
gem "rdoc", ">= 2.4.2" gem "rdoc", ">= 2.4.2"
gem "liquid", "~> 2.3.0" gem "liquid", "~> 2.3.0"
gem "acts-as-taggable-on", "= 2.1.0" gem "acts-as-taggable-on", "= 2.1.0"
gem 'gravatarify', '~> 3.0.0'
# Needed only on RUBY_VERSION = 1.8, ruby 1.9+ compatible interpreters should bring their csv # Needed only on RUBY_VERSION = 1.8, ruby 1.9+ compatible interpreters should bring their csv
gem "fastercsv", "~> 1.5.0", :platforms => [:ruby_18, :jruby, :mingw_18] gem "fastercsv", "~> 1.5.0", :platforms => [:ruby_18, :jruby, :mingw_18]
# need for automatic encoding detection in diff,annotate and cat # need for automatic encoding detection in diff,annotate and cat
@ -17,6 +18,8 @@ gem "tzinfo", "~> 0.3.31" # Fixes #903. Not required for Rails >= 3.2
group :test do group :test do
gem 'shoulda', '~> 2.10.3' gem 'shoulda', '~> 2.10.3'
# Shoulda doesn't work nice on 1.9.3 and seems to need test-unit explicitely…
gem 'test-unit', :platforms => [:mri_19]
gem 'edavis10-object_daddy', :require => 'object_daddy' gem 'edavis10-object_daddy', :require => 'object_daddy'
gem 'mocha' gem 'mocha'
gem 'capybara' gem 'capybara'
@ -54,7 +57,7 @@ end
# orders of magnitude compared to their native counterparts. You have been # orders of magnitude compared to their native counterparts. You have been
# warned. # warned.
platforms :mri, :mingw do platforms :mri, :mingw, :rbx do
group :mysql2 do group :mysql2 do
gem "mysql2", "~> 0.2.7" gem "mysql2", "~> 0.2.7"
end end
@ -76,7 +79,7 @@ platforms :mri_18, :mingw_18 do
end end
end end
platforms :mri_19, :mingw_19 do platforms :mri_19, :mingw_19, :rbx do
group :sqlite do group :sqlite do
gem "sqlite3" gem "sqlite3"
end end

View File

@ -77,7 +77,7 @@ class AdminController < ApplicationController
def info def info
@db_adapter_name = ActiveRecord::Base.connection.adapter_name @db_adapter_name = ActiveRecord::Base.connection.adapter_name
@checklist = [ @checklist = [
[:text_default_administrator_account_changed, User.find(:first, :conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?], [:text_default_administrator_account_changed, !User.find_by_login("admin").try(:check_password?, "admin")],
[:text_file_repository_writable, File.writable?(Attachment.storage_path)], [:text_file_repository_writable, File.writable?(Attachment.storage_path)],
[:text_plugin_assets_writable, File.writable?(Engines.public_directory)], [:text_plugin_assets_writable, File.writable?(Engines.public_directory)],
[:text_rmagick_available, Object.const_defined?(:Magick)] [:text_rmagick_available, Object.const_defined?(:Magick)]

View File

@ -31,18 +31,6 @@ class ApplicationController < ActionController::Base
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['_chiliproject_session'] && cookies['_chiliproject_session'] !~ /--/
cookies.delete '_chiliproject_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
before_filter :params_filter before_filter :params_filter

View File

@ -85,7 +85,7 @@ class DocumentsController < ApplicationController
if attachments.present? && attachments[:files].present? && Setting.notified_events.include?('document_added') if attachments.present? && attachments[:files].present? && Setting.notified_events.include?('document_added')
# TODO: refactor # TODO: refactor
attachments.first.container.recipients.each do |recipient| @document.recipients.each do |recipient|
Mailer.deliver_attachments_added(attachments[:files], recipient) Mailer.deliver_attachments_added(attachments[:files], recipient)
end end
end end

View File

@ -17,7 +17,7 @@ require 'cgi'
module ApplicationHelper module ApplicationHelper
include Redmine::I18n include Redmine::I18n
include GravatarHelper::PublicMethods include Gravatarify::Helper
extend Forwardable extend Forwardable
def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter
@ -954,6 +954,19 @@ module ApplicationHelper
(@has_content && @has_content[name]) || false (@has_content && @has_content[name]) || false
end end
# Returns the gravatar image tag for the given email
# +email+ is a string with an email address
def gravatar(email, options={})
gravatarify_options = {}
gravatarify_options[:secure] = options.delete :ssl
[:default, :size, :rating, :filetype].each {|key| gravatarify_options[key] = options.delete key}
# Default size is 50x50 px
gravatarify_options[:size] ||= 50
options[:class] ||= 'gravatar'
gravatarify_options[:html] = options
gravatar_tag email, gravatarify_options
end
# Returns the avatar image tag for the given +user+ if avatars are enabled # Returns the avatar image tag for the given +user+ if avatars are enabled
# +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>') # +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>')
def avatar(user, options = { }) def avatar(user, options = { })

View File

@ -712,7 +712,7 @@ class Issue < ActiveRecord::Base
# The default assumption is that journals have the same permissions # The default assumption is that journals have the same permissions
# as the journaled object, issue notes have separate permissions though # as the journaled object, issue notes have separate permissions though
def journal_editable_by?(journal, user) def journal_editable_by?(journal, user)
return true if journal.author == user && user.allowed_to?(:edit_own_issue_notes, project) return true if journal.user == user && user.allowed_to?(:edit_own_issue_notes, project)
user.allowed_to? :edit_issue_notes, project user.allowed_to? :edit_issue_notes, project
end end

View File

@ -41,7 +41,6 @@ class Message < ActiveRecord::Base
acts_as_watchable acts_as_watchable
attr_protected :locked, :sticky
validates_presence_of :board, :subject, :content validates_presence_of :board, :subject, :content
validates_length_of :subject, :maximum => 255 validates_length_of :subject, :maximum => 255
@ -51,7 +50,7 @@ class Message < ActiveRecord::Base
:conditions => Project.allowed_to_condition(args.first || User.current, :view_messages) } } :conditions => Project.allowed_to_condition(args.first || User.current, :view_messages) } }
safe_attributes 'subject', 'content' safe_attributes 'subject', 'content'
safe_attributes 'locked', 'sticky', safe_attributes 'locked', 'sticky', 'board_id',
:if => lambda {|message, user| :if => lambda {|message, user|
user.allowed_to?(:edit_messages, message.project) user.allowed_to?(:edit_messages, message.project)
} }
@ -81,9 +80,15 @@ class Message < ActiveRecord::Base
end end
def after_destroy def after_destroy
parent.reset_last_reply_id! if parent
board.reset_counters! board.reset_counters!
end end
def reset_last_reply_id!
clid = children.present? ? children.last.id : nil
self.update_attribute(:last_reply_id, clid)
end
def sticky=(arg) def sticky=(arg)
write_attribute :sticky, (arg == true || arg.to_s == '1' ? 1 : 0) write_attribute :sticky, (arg == true || arg.to_s == '1' ? 1 : 0)
end end

View File

@ -27,7 +27,7 @@ class Version < ActiveRecord::Base
validates_presence_of :name validates_presence_of :name
validates_uniqueness_of :name, :scope => [:project_id] validates_uniqueness_of :name, :scope => [:project_id]
validates_length_of :name, :maximum => 60 validates_length_of :name, :maximum => 60
validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true validates_format_of :start_date, :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true
validates_inclusion_of :status, :in => VERSION_STATUSES validates_inclusion_of :status, :in => VERSION_STATUSES
validates_inclusion_of :sharing, :in => VERSION_SHARINGS validates_inclusion_of :sharing, :in => VERSION_SHARINGS
@ -37,6 +37,7 @@ class Version < ActiveRecord::Base
safe_attributes 'name', safe_attributes 'name',
'description', 'description',
'start_date',
'effective_date', 'effective_date',
'due_date', 'due_date',
'wiki_page_title', 'wiki_page_title',

View File

@ -1,6 +1,6 @@
<h2><%=l(:label_register)%> <%=link_to l(:label_login_with_open_id_option), signin_url if Setting.openid? %></h2> <h2><%=l(:label_register)%> <%=link_to l(:label_login_with_open_id_option), signin_url if Setting.openid? %></h2>
<% form_tag({:action => 'register'}, :class => "tabular") do %> <% form_tag({:action => 'register'}, :class => "tabular", :autocomplete => :off) do %>
<%= error_messages_for 'user' %> <%= error_messages_for 'user' %>
<div class="box"> <div class="box">

View File

@ -3,8 +3,7 @@
<div class="autoscroll"> <div class="autoscroll">
<table class="list issues"> <table class="list issues">
<thead><tr> <thead><tr>
<th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;', <th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th> </th>
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %> <%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
<% query.columns.each do |column| %> <% query.columns.each do |column| %>

View File

@ -3,5 +3,4 @@
<%= call_hook(:view_issues_sidebar_planning_bottom) %> <%= call_hook(:view_issues_sidebar_planning_bottom) %>
<%= render_sidebar_queries %>
<%= call_hook(:view_issues_sidebar_queries_bottom) %> <%= call_hook(:view_issues_sidebar_queries_bottom) %>

View File

@ -1,3 +1,3 @@
<p><%= l(:mail_body_wiki_content_added, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url), <p><%= l(:mail_body_wiki_content_added, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url),
:author => h(@wiki_content.author)) %><br /> :author => h(@wiki_content.author)) %><br />
<em><%=h @wiki_content.comments %></em></p> <em><%=h @wiki_content.last_journal.notes %></em></p>

View File

@ -1,5 +1,5 @@
<%= l(:mail_body_wiki_content_added, :id => h(@wiki_content.page.pretty_title), <%= l(:mail_body_wiki_content_added, :id => h(@wiki_content.page.pretty_title),
:author => h(@wiki_content.author)) %> :author => h(@wiki_content.author)) %>
<%= @wiki_content.comments %> <%= @wiki_content.last_journal.notes %>
<%= @wiki_content_url %> <%= @wiki_content_url %>

View File

@ -1,6 +1,6 @@
<p><%= l(:mail_body_wiki_content_updated, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url), <p><%= l(:mail_body_wiki_content_updated, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url),
:author => h(@wiki_content.author)) %><br /> :author => h(@wiki_content.author)) %><br />
<em><%=h @wiki_content.comments %></em></p> <em><%=h @wiki_content.last_journal.notes %></em></p>
<p><%= l(:label_view_diff) %>:<br /> <p><%= l(:label_view_diff) %>:<br />
<%= link_to h(@wiki_diff_url), @wiki_diff_url %></p> <%= link_to h(@wiki_diff_url), @wiki_diff_url %></p>

View File

@ -1,6 +1,6 @@
<%= l(:mail_body_wiki_content_updated, :id => h(@wiki_content.page.pretty_title), <%= l(:mail_body_wiki_content_updated, :id => h(@wiki_content.page.pretty_title),
:author => h(@wiki_content.author)) %> :author => h(@wiki_content.author)) %>
<%= @wiki_content.comments %> <%= @wiki_content.last_journal.notes %>
<%= @wiki_content.page.pretty_title %>: <%= @wiki_content.page.pretty_title %>:
<%= @wiki_content_url %> <%= @wiki_content_url %>

View File

@ -115,4 +115,78 @@ module ActionController
end end
end end
end end
# Backported fix for
# 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
#
# TODO: Remove this once we are on Rails >= 3.2.6
require 'action_controller/request'
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
# Backported fix for CVE-2012-2695
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/9782f44c4540cf59
# TODO: Remove this once we are on Rails >= 3.2.6
require 'active_record/base'
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

View File

@ -983,22 +983,22 @@ bg:
description_choose_project: Проекти description_choose_project: Проекти
description_date_from: Въведете начална дата description_date_from: Въведете начална дата
label_deleted_custom_field: (изтрито потребителско поле) label_deleted_custom_field: (изтрито потребителско поле)
field_custom_filter: Custom LDAP filter field_custom_filter: Потребителски LDAP филтър
text_display_subprojects: Display subprojects text_display_subprojects: Показване на подпроекти
text_current_project: Current project text_current_project: Текущ проект
label_toc: Contents label_toc: Съдържание
search_input_placeholder: search ... search_input_placeholder: търсене ...
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email setting_mail_handler_confirmation_on_success: Изпращане на е-мейл за потвърждение при успешен входен е-мейл
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}" label_mail_handler_confirmation: "Потвърждение на изпратено с е-мейл: %{subject}"
label_mail_handler_errors_with_submission: "There were errors with your email submission:" label_mail_handler_errors_with_submission: "Има грешки във вашия е-мейл:"
label_document_watchers: Watchers label_document_watchers: Наблюдатели
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email setting_mail_handler_confirmation_on_failure: Изпращане на е-мейл за потвърждение при неуспешен входен е-мейл
label_between: between label_between: between
label_mail_handler_failure: "Failed email submission: %{subject}" label_mail_handler_failure: "Пропаднал е-мейл: %{subject}"
notice_not_authorized_action: You are not authorized to perform this action. notice_not_authorized_action: Вие нямате разрешение да изпълните това действие.
text_mail_handler_confirmation_successful: Your email has been successful added at the following url text_mail_handler_confirmation_successful: Вашият е-мейл беше успешно добавен на следващия адрес
field_issue_summary: Issue summary field_issue_summary: Заглавие на задачата
field_new_saved_query: New saved query field_new_saved_query: Нова записана заявка
field_issue_view_all_open: View all open issues field_issue_view_all_open: Разглеждане на всички отворени задачи
label_subtask_add: Add a subtask label_subtask_add: Добавяне на подзадача
label_issue_hierarchy: Issue hierarchy label_issue_hierarchy: Йерархия на задачите

File diff suppressed because it is too large Load Diff

View File

@ -963,28 +963,28 @@ de:
notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max}) notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max})
setting_gantt_items_limit: Maximale Anzahl von Aufgaben die im Gantt-Chart angezeigt werden. setting_gantt_items_limit: Maximale Anzahl von Aufgaben die im Gantt-Chart angezeigt werden.
text_powered_by: Powered by %{link} text_powered_by: Powered by %{link}
label_cvs_module: Module label_cvs_module: Modul
label_filesystem_path: Root directory label_filesystem_path: Wurzelverzeichnis
label_darcs_path: Root directory label_darcs_path: Wurzelverzeichnis
label_bazaar_path: Root directory label_bazaar_path: Wurzelverzeichnis
label_cvs_path: CVSROOT label_cvs_path: CVSROOT
label_git_path: Path to .git directory label_git_path: Pfad zum .git Verzeichnis
label_mercurial_path: Root directory label_mercurial_path: Wurzelverzeichnis
label_my_queries: My custom queries label_my_queries: Meine benutzerdefinierten Abfragen
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee label_additional_workflow_transitions_for_assignee: Zusätzliche Workflow-Übergänge wenn das Ticket an den Benutzer zugewiesen ist
text_journal_changed_no_detail: "%{label} updated" text_journal_changed_no_detail: "%{label} aktualisiert"
button_expand_all: Expand all button_expand_all: Alles ausklappen
button_collapse_all: Collapse all button_collapse_all: Alles einklappen
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_additional_workflow_transitions_for_author: Zusätzliche Workflow-Übergänge wenn der Benutzer der Autor ist
field_effective_date: Due date field_effective_date: Abshlussdatum
label_news_comment_added: Comment added to a news label_news_comment_added: "Kommentar erfolgreich hinzugefügt"
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text field_warn_on_leaving_unsaved: "Warnen wenn eine Seite mit ungespeichertem Text verlassen wird"
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. text_warn_on_leaving_unsaved: "Die aktuelle Seite enthält ungespeicherten Text er verloren geht wenn Sie diese Seite verlassen."
text_default_encoding: "Default: UTF-8" text_default_encoding: "Standard: UTF-8"
text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) text_git_repo_example: Ein lokales "bare Repository" (z.B. /gitrepo, c:\gitrepo)
label_notify_member_plural: Email issue updates label_notify_member_plural: Benachrichtigungen verschicken
label_path_encoding: Path encoding label_path_encoding: Pfadkodierung
text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) text_mercurial_repo_example: Lokales Projektarchiv (z.B. /hgrepo, c:\hgrepo)
label_diff: diff label_diff: diff
description_filter: Filter description_filter: Filter
description_search: Suchfeld description_search: Suchfeld
@ -1003,19 +1003,19 @@ de:
description_date_range_interval: Zeitraum durch Start- und Enddatum festlegen description_date_range_interval: Zeitraum durch Start- und Enddatum festlegen
description_date_from: Startdatum eintragen description_date_from: Startdatum eintragen
description_date_to: Enddatum eintragen description_date_to: Enddatum eintragen
field_custom_filter: Custom LDAP filter field_custom_filter: Benutzerdefinierter LDAP-Filter
label_toc: "Inhaltsverzeichnis" label_toc: "Inhaltsverzeichnis"
text_display_subprojects: Display subprojects text_display_subprojects: Unterprojekte anzeigen
text_current_project: Current project text_current_project: Aktuelles Project
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email setting_mail_handler_confirmation_on_success: Bestätigungs-E-Mail bei erfolgreich eingegangenen E-Mails versenden
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}" label_mail_handler_confirmation: "Bestätigung der E-Mail-Verarbeitung: %{subject}"
label_mail_handler_errors_with_submission: "There were errors with your email submission:" label_mail_handler_errors_with_submission: "Es traten Fehler bei der E-Mail verarbeitung auf:"
label_document_watchers: Watchers label_document_watchers: Beobachter
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email setting_mail_handler_confirmation_on_failure: Bestätigungs-E-Mail bei fehlgeschlagenen eingehenden E-Mails versenden
label_between: between label_between: zwischen
label_mail_handler_failure: "Failed email submission: %{subject}" label_mail_handler_failure: "E-Mail-Versand fehlgeschlagen: %{subject}"
notice_not_authorized_action: You are not authorized to perform this action. notice_not_authorized_action: Sie sind für diese Aktion nicht autorisiert.
text_mail_handler_confirmation_successful: Your email has been successful added at the following url text_mail_handler_confirmation_successful: Ihre E-Mil wurde erfolgreich zu folgender URL hinzugefügt
field_issue_summary: Issue summary field_issue_summary: Ticketübersicht
field_new_saved_query: New saved query field_new_saved_query: Neue gespeicherte Abfrage
field_issue_view_all_open: View all open issues field_issue_view_all_open: Alle offen Tickets

View File

@ -1,7 +1,8 @@
# French translations for Ruby on Rails # French translations for Ruby on Rails and ChiliProject
# by Christian Lescuyer (christian@flyingcoders.com) # by Christian Lescuyer (christian@flyingcoders.com)
# contributor: Sebastien Grosjean - ZenCocoon.com # contributor: Sebastien Grosjean - ZenCocoon.com
# contributor: Thibaut Cuvelier - Developpez.com # contributor: Thibaut Cuvelier - Developpez.com
# contributor: Sébastien Santoro aka Dereckson
fr: fr:
direction: ltr direction: ltr
@ -174,8 +175,8 @@ fr:
notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible. notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
notice_not_authorized: "Vous n'êtes pas autorisé à accéder à cette page." notice_not_authorized: "Vous n'êtes pas autorisé à accéder à cette page."
notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé. notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé.
notice_email_sent: "Un email a été envoyé à %{value}" notice_email_sent: "Un e-mail a été envoyé à %{value}"
notice_email_error: "Erreur lors de l'envoi de l'email (%{value})" notice_email_error: "Erreur lors de l'envoi de l'e-mail (%{value})"
notice_feeds_access_key_reseted: "Votre clé d'accès aux flux RSS a été réinitialisée." notice_feeds_access_key_reseted: "Votre clé d'accès aux flux RSS a été réinitialisée."
notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}." notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}."
notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour." notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour."
@ -223,7 +224,7 @@ fr:
field_is_required: Obligatoire field_is_required: Obligatoire
field_firstname: Prénom field_firstname: Prénom
field_lastname: Nom field_lastname: Nom
field_mail: "Email " field_mail: "E-mail "
field_filename: Fichier field_filename: Fichier
field_filesize: Taille field_filesize: Taille
field_downloads: Téléchargements field_downloads: Téléchargements
@ -253,12 +254,12 @@ fr:
field_fixed_version: Version cible field_fixed_version: Version cible
field_user: Utilisateur field_user: Utilisateur
field_role: Rôle field_role: Rôle
field_homepage: "Site web " field_homepage: "Site Web "
field_is_public: Public field_is_public: Public
field_parent: Sous-projet de field_parent: Sous-projet de
field_is_in_roadmap: Demandes affichées dans la roadmap field_is_in_roadmap: Demandes affichées dans la feuille de route
field_login: "Identifiant " field_login: "Identifiant "
field_mail_notification: Notifications par mail field_mail_notification: Notifications par e-mail
field_admin: Administrateur field_admin: Administrateur
field_last_login_on: "Dernière connexion " field_last_login_on: "Dernière connexion "
field_language: Langue field_language: Langue
@ -279,7 +280,7 @@ fr:
field_start_date: Début field_start_date: Début
field_done_ratio: "% réalisé" field_done_ratio: "% réalisé"
field_auth_source: Mode d'authentification field_auth_source: Mode d'authentification
field_hide_mail: Cacher mon adresse mail field_hide_mail: Cacher mon adresse e-mail
field_comments: Commentaire field_comments: Commentaire
field_url: URL field_url: URL
field_start_page: Page de démarrage field_start_page: Page de démarrage
@ -321,10 +322,10 @@ fr:
setting_issues_export_limit: Limite export demandes setting_issues_export_limit: Limite export demandes
setting_mail_from: Adresse d'émission setting_mail_from: Adresse d'émission
setting_bcc_recipients: Destinataires en copie cachée (cci) setting_bcc_recipients: Destinataires en copie cachée (cci)
setting_plain_text_mail: Mail texte brut (non HTML) setting_plain_text_mail: Mail texte brut (sans HTML)
setting_host_name: Nom d'hôte et chemin setting_host_name: Nom d'hôte et chemin
setting_text_formatting: Formatage du texte setting_text_formatting: Formatage du texte
setting_wiki_compression: Compression historique wiki setting_wiki_compression: Compression de l'historique du wiki
setting_feeds_limit: Limite du contenu des flux RSS setting_feeds_limit: Limite du contenu des flux RSS
setting_default_projects_public: Définir les nouveaux projets comme publics par défaut setting_default_projects_public: Définir les nouveaux projets comme publics par défaut
setting_autofetch_changesets: Récupération auto. des commits setting_autofetch_changesets: Récupération auto. des commits
@ -338,15 +339,15 @@ fr:
setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes
setting_repositories_encodings: Encodages des dépôts setting_repositories_encodings: Encodages des dépôts
setting_commit_logs_encoding: Encodage des messages de commit setting_commit_logs_encoding: Encodage des messages de commit
setting_emails_footer: Pied-de-page des emails setting_emails_footer: Pied-de-page des e-mails
setting_protocol: Protocole setting_protocol: Protocole
setting_per_page_options: Options d'objets affichés par page setting_per_page_options: Options d'objets affichés par page
setting_user_format: Format d'affichage des utilisateurs setting_user_format: Format d'affichage des utilisateurs
setting_activity_days_default: Nombre de jours affichés sur l'activité des projets setting_activity_days_default: Nombre de jours affichés sur l'activité des projets
setting_display_subprojects_issues: Afficher par défaut les demandes des sous-projets sur les projets principaux setting_display_subprojects_issues: Afficher par défaut les demandes des sous-projets sur les projets principaux
setting_enabled_scm: SCM activés setting_enabled_scm: SCM activés
setting_mail_handler_body_delimiters: "Tronquer les emails après l'une de ces lignes" setting_mail_handler_body_delimiters: "Tronquer les e-mails après l'une de ces lignes"
setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails" setting_mail_handler_api_enabled: "Activer le WS pour la réception d'e-mails"
setting_mail_handler_api_key: Clé de protection de l'API setting_mail_handler_api_key: Clé de protection de l'API
setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
@ -472,8 +473,8 @@ fr:
label_tracker_plural: Trackers label_tracker_plural: Trackers
label_tracker_new: Nouveau tracker label_tracker_new: Nouveau tracker
label_workflow: Workflow label_workflow: Workflow
label_issue_status: Statut de demandes label_issue_status: Statut de demande
label_issue_status_plural: Statuts de demandes label_issue_status_plural: Statuts de demande
label_issue_status_new: Nouveau statut label_issue_status_new: Nouveau statut
label_issue_category: Catégorie de demandes label_issue_category: Catégorie de demandes
label_issue_category_plural: Catégories de demandes label_issue_category_plural: Catégories de demandes
@ -646,7 +647,7 @@ fr:
label_sort_higher: Remonter label_sort_higher: Remonter
label_sort_lower: Descendre label_sort_lower: Descendre
label_sort_lowest: Descendre en dernier label_sort_lowest: Descendre en dernier
label_roadmap: Roadmap label_roadmap: Feuille de route
label_roadmap_due_in: "Échéance dans %{value}" label_roadmap_due_in: "Échéance dans %{value}"
label_roadmap_overdue: "En retard de %{value}" label_roadmap_overdue: "En retard de %{value}"
label_roadmap_no_issues: Aucune demande pour cette version label_roadmap_no_issues: Aucune demande pour cette version
@ -718,7 +719,7 @@ fr:
label_date_to: Au label_date_to: Au
label_language_based: Basé sur la langue de l'utilisateur label_language_based: Basé sur la langue de l'utilisateur
label_sort_by: "Trier par %{value}" label_sort_by: "Trier par %{value}"
label_send_test_email: Envoyer un email de test label_send_test_email: Envoyer un e-mail de test
label_feeds_access_key_created_on: "Clé d'accès RSS créée il y a %{value}" label_feeds_access_key_created_on: "Clé d'accès RSS créée il y a %{value}"
label_module_plural: Modules label_module_plural: Modules
label_added_time_by: "Ajouté par %{author} il y a %{age}" label_added_time_by: "Ajouté par %{author} il y a %{age}"
@ -736,7 +737,7 @@ fr:
label_user_mail_option_all: "Pour tous les événements de tous mes projets" label_user_mail_option_all: "Pour tous les événements de tous mes projets"
label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..." label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..."
label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue" label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue"
label_registration_activation_by_email: activation du compte par email label_registration_activation_by_email: activation du compte par e-mail
label_registration_manual_activation: activation manuelle du compte label_registration_manual_activation: activation manuelle du compte
label_registration_automatic_activation: activation automatique du compte label_registration_automatic_activation: activation automatique du compte
label_display_per_page: "Par page : %{value}" label_display_per_page: "Par page : %{value}"
@ -754,7 +755,7 @@ fr:
label_chronological_order: Dans l'ordre chronologique label_chronological_order: Dans l'ordre chronologique
label_reverse_chronological_order: Dans l'ordre chronologique inverse label_reverse_chronological_order: Dans l'ordre chronologique inverse
label_planning: Planning label_planning: Planning
label_incoming_emails: Emails entrants label_incoming_emails: E-mails entrants
label_generate_key: Générer une clé label_generate_key: Générer une clé
label_issue_watchers: Observateurs label_issue_watchers: Observateurs
label_example: Exemple label_example: Exemple
@ -909,7 +910,7 @@ fr:
default_role_non_member: "Non membre " default_role_non_member: "Non membre "
default_role_anonymous: "Anonyme " default_role_anonymous: "Anonyme "
default_tracker_bug: Anomalie default_tracker_bug: Anomalie
default_tracker_feature: Evolution default_tracker_feature: Évolution
default_tracker_support: Assistance default_tracker_support: Assistance
default_issue_status_new: Nouveau default_issue_status_new: Nouveau
default_issue_status_in_progress: En cours default_issue_status_in_progress: En cours
@ -943,13 +944,13 @@ fr:
text_journal_deleted: "%{label} %{old} supprimé" text_journal_deleted: "%{label} %{old} supprimé"
text_journal_added: "%{label} %{value} ajouté" text_journal_added: "%{label} %{value} ajouté"
enumeration_system_activity: Activité système enumeration_system_activity: Activité système
label_board_sticky: Sticky label_board_sticky: Post-it
label_board_locked: Verrouillé label_board_locked: Verrouillé
error_unable_delete_issue_status: Impossible de supprimer le statut de demande error_unable_delete_issue_status: Impossible de supprimer le statut de demande
error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
error_unable_to_connect: Connexion impossible (%{value}) error_unable_to_connect: Connexion impossible (%{value})
error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé. error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé. error_can_not_delete_tracker: "Ce tracker contenant des demandes, il ne peut pas être supprimé."
field_principal: Principal field_principal: Principal
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}." notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
text_zoom_out: Zoom arrière text_zoom_out: Zoom arrière
@ -959,7 +960,7 @@ fr:
field_time_entries: Log time field_time_entries: Log time
project_module_gantt: Gantt project_module_gantt: Gantt
project_module_calendar: Calendrier project_module_calendar: Calendrier
button_edit_associated_wikipage: "Modifier la page wiki associée: %{page_title}" button_edit_associated_wikipage: "Modifier la page wiki associée : %{page_title}"
text_are_you_sure_with_children: Supprimer la demande et toutes ses sous-demandes ? text_are_you_sure_with_children: Supprimer la demande et toutes ses sous-demandes ?
field_text: Champ texte field_text: Champ texte
label_user_mail_option_only_owner: Seulement pour ce que j'ai créé label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
@ -970,53 +971,53 @@ fr:
field_member_of_group: Groupe de l'assigné field_member_of_group: Groupe de l'assigné
field_assigned_to_role: Rôle de l'assigné field_assigned_to_role: Rôle de l'assigné
setting_emails_header: En-tête des emails setting_emails_header: En-tête des emails
text_powered_by: Powered by %{link} text_powered_by: Propulsé par %{link}
label_cvs_module: Module label_cvs_module: Module
label_filesystem_path: Root directory label_filesystem_path: Dossier parent
label_darcs_path: Root directory label_darcs_path: Dossier parent
label_bazaar_path: Root directory label_bazaar_path: Dossier parent
label_cvs_path: CVSROOT label_cvs_path: CVSROOT
label_git_path: Path to .git directory label_git_path: Dossier .git
label_mercurial_path: Root directory label_mercurial_path: Dossier parent
field_effective_date: Due date field_effective_date: Échéance
text_default_encoding: "Default: UTF-8" text_default_encoding: "par défaut, UTF-8"
text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo) text_git_repo_example: un dépôt local et nu (ex. /gitrepo, c:\gitrepo)
label_notify_member_plural: Email issue updates label_notify_member_plural: Email issue updates
label_path_encoding: Path encoding label_path_encoding: Encodage du dossier
text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo) text_mercurial_repo_example: dépôt local (ex. /hgrepo, c:\hgrepo)
description_search: Searchfield description_search: Case de recherche
description_user_mail_notification: Mail notification settings description_user_mail_notification: Mail notification settings
description_date_range_list: Choose range from list description_date_range_list: Choose range from list
description_date_to: Enter end date description_date_to: Enter end date
description_query_sort_criteria_attribute: Sort attribute description_query_sort_criteria_attribute: Sort attribute
description_message_content: Message content description_message_content: Contenu du message
description_wiki_subpages_reassign: Choose new parent page description_wiki_subpages_reassign: Choose new parent page
description_available_columns: Available Columns description_available_columns: Colonnes disponibles
description_selected_columns: Selected Columns description_selected_columns: Colonnes sélectionnées
description_date_range_interval: Choose range by selecting start and end date description_date_range_interval: Choisissez l'intervalle de date en sélectionnant une date de début et une date de fin
description_project_scope: Search scope description_project_scope: Portée de recherche
description_issue_category_reassign: Choose issue category description_issue_category_reassign: Sélectionnez la catégorie de la demande
description_query_sort_criteria_direction: Sort direction description_query_sort_criteria_direction: Tri par direction
description_notes: Notes description_notes: Notes
description_filter: Filter description_filter: Filtrer
description_choose_project: Projects description_choose_project: Projets
description_date_from: Enter start date description_date_from: Entrer la date du début
field_custom_filter: Custom LDAP filter field_custom_filter: Filtre LDAP personnalisé
text_display_subprojects: Display subprojects text_display_subprojects: Afficher les sous-projets
text_current_project: Current project text_current_project: Project en cours
label_toc: Contents label_toc: Table des matières
search_input_placeholder: search ... search_input_placeholder: recherche ...
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email setting_mail_handler_confirmation_on_success: Envoyer un e-mail
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}" label_mail_handler_confirmation: "Confirmation de l 'envoi d'un e-mail : %{subject}"
label_mail_handler_errors_with_submission: "There were errors with your email submission:" label_mail_handler_errors_with_submission: "Des erreurs sont survenues lors de l'envoi de votre e-mail :"
label_document_watchers: Watchers label_document_watchers: Observateurs
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email setting_mail_handler_confirmation_on_failure: Envoyez une confirmation en cas d'erreur d'e-mail entrant
label_between: between label_between: entre
label_mail_handler_failure: "Failed email submission: %{subject}" label_mail_handler_failure: "Erreur d'envoi d'e-mail : %{subject}"
notice_not_authorized_action: You are not authorized to perform this action. notice_not_authorized_action: Vous n'êtes pas autoriser à effectuer cette action.
text_mail_handler_confirmation_successful: Your email has been successful added at the following url text_mail_handler_confirmation_successful: Votre e-mail a été ajouté avec succès à l'adresse suivante
field_issue_summary: Issue summary field_issue_summary: Rapports
field_new_saved_query: New saved query field_new_saved_query: Nouveau rapport
field_issue_view_all_open: View all open issues field_issue_view_all_open: Demandes ouvertes
label_subtask_add: Add a subtask label_subtask_add: Ajouter une sous-tâche
label_issue_hierarchy: Issue hierarchy label_issue_hierarchy: Hiérarchie de la demande

View File

@ -154,7 +154,7 @@ pt-BR:
general_text_Yes: 'Sim' general_text_Yes: 'Sim'
general_text_no: 'não' general_text_no: 'não'
general_text_yes: 'sim' general_text_yes: 'sim'
general_lang_name: 'Português(Brasil)' general_lang_name: 'Português (Brasil)'
general_csv_separator: ';' general_csv_separator: ';'
general_csv_decimal_separator: ',' general_csv_decimal_separator: ','
general_csv_encoding: ISO-8859-1 general_csv_encoding: ISO-8859-1
@ -245,7 +245,7 @@ pt-BR:
field_role: Cargo field_role: Cargo
field_homepage: Página do projeto field_homepage: Página do projeto
field_is_public: Público field_is_public: Público
field_parent: Sub-projeto de field_parent: Subprojeto de
field_is_in_roadmap: Exibir no planejamento field_is_in_roadmap: Exibir no planejamento
field_login: Usuário field_login: Usuário
field_mail_notification: Notificações por e-mail field_mail_notification: Notificações por e-mail
@ -273,7 +273,7 @@ pt-BR:
field_comments: Comentário field_comments: Comentário
field_url: URL field_url: URL
field_start_page: Página inicial field_start_page: Página inicial
field_subproject: Sub-projeto field_subproject: Subprojeto
field_hours: Horas field_hours: Horas
field_activity: Atividade field_activity: Atividade
field_spent_on: Data field_spent_on: Data
@ -411,8 +411,8 @@ pt-BR:
label_auth_source: Modo de autenticação label_auth_source: Modo de autenticação
label_auth_source_new: Novo modo de autenticação label_auth_source_new: Novo modo de autenticação
label_auth_source_plural: Modos de autenticação label_auth_source_plural: Modos de autenticação
label_subproject_plural: Sub-projetos label_subproject_plural: Subprojetos
label_and_its_subprojects: "%{value} e seus sub-projetos" label_and_its_subprojects: "%{value} e seus subprojetos"
label_min_max_length: Tamanho mín-máx label_min_max_length: Tamanho mín-máx
label_list: Lista label_list: Lista
label_date: Data label_date: Data
@ -879,7 +879,7 @@ pt-BR:
field_sharing: Compartilhamento field_sharing: Compartilhamento
label_version_sharing_hierarchy: Com a hierarquia do projeto label_version_sharing_hierarchy: Com a hierarquia do projeto
label_version_sharing_system: Com todos os projetos label_version_sharing_system: Com todos os projetos
label_version_sharing_descendants: Com sub-projetos label_version_sharing_descendants: Com subprojetos
label_version_sharing_tree: Com a árvore do projeto label_version_sharing_tree: Com a árvore do projeto
label_version_sharing_none: Sem compartilhamento label_version_sharing_none: Sem compartilhamento
error_can_not_archive_project: Este projeto não pode ser arquivado error_can_not_archive_project: Este projeto não pode ser arquivado
@ -989,7 +989,7 @@ pt-BR:
label_mercurial_path: Diretório raiz label_mercurial_path: Diretório raiz
label_diff: diff label_diff: diff
description_search: Searchfield description_search: Campo de pesquisa
description_user_mail_notification: Configuração de notificações por e-mail description_user_mail_notification: Configuração de notificações por e-mail
description_date_range_list: Escolha um período a partira da lista description_date_range_list: Escolha um período a partira da lista
description_date_to: Digite a data final description_date_to: Digite a data final
@ -1008,21 +1008,21 @@ pt-BR:
description_date_from: Digita a data inicial description_date_from: Digita a data inicial
label_deleted_custom_field: (campo personalizado excluído) label_deleted_custom_field: (campo personalizado excluído)
field_custom_filter: Custom LDAP filter field_custom_filter: Custom LDAP filter
text_display_subprojects: Display subprojects text_display_subprojects: Exibir subprojetos
text_current_project: Current project text_current_project: Projeto atual
label_toc: Contents label_toc: Conteúdo
search_input_placeholder: search ... search_input_placeholder: pesquisar ...
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email setting_mail_handler_confirmation_on_success: Enviar confirmação ao receber um e-mail
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}" label_mail_handler_confirmation: "Confirmação de envio de e-mail: %{subject}"
label_mail_handler_errors_with_submission: "There were errors with your email submission:" label_mail_handler_errors_with_submission: "Seu envio de email falhou:"
label_document_watchers: Watchers label_document_watchers: Observadores
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email setting_mail_handler_confirmation_on_failure: Enviar confirmação ao falhar o recebimento de um e-mail
label_between: between label_between: between
label_mail_handler_failure: "Failed email submission: %{subject}" label_mail_handler_failure: "Envio de e-mail falhou: %{subject}"
notice_not_authorized_action: You are not authorized to perform this action. notice_not_authorized_action: Você não tem permissão para fazer isto.
text_mail_handler_confirmation_successful: Your email has been successful added at the following url text_mail_handler_confirmation_successful: Seu e-mail foi adicionado com sucesso a URL a seguir
field_issue_summary: Issue summary field_issue_summary: Relatório
field_new_saved_query: New saved query field_new_saved_query: Nova consulta
field_issue_view_all_open: View all open issues field_issue_view_all_open: Ver tarefas abertas
label_subtask_add: Add a subtask label_subtask_add: Adicionar
label_issue_hierarchy: Issue hierarchy label_issue_hierarchy: Subtarefas

View File

@ -1,65 +1,42 @@
# Swedish translation for Ruby on Rails # Swedish translation for Ruby on Rails and ChiliProject
# by Johan Lundström (johanlunds@gmail.com), # by Johan Lundström (johanlunds@gmail.com),
# with parts taken from http://github.com/daniel/swe_rails # with parts taken from http://github.com/daniel/swe_rails
#
# contributor: Björn Blissing
sv: sv:
number: # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
# Used in number_with_delimiter() direction: ltr
# These are also the defaults for 'currency', 'percentage', 'precision', and 'human' date:
format: formats:
# Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) # Use the strftime parameters for formats.
separator: "," # When no format has been given, it uses default.
# Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three) # You can provide other formats here if you like!
delimiter: "." default: "%Y-%m-%d"
# Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) short: "%e %b"
precision: 2 long: "%e %B, %Y"
# Used in number_to_currency() day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag]
currency: abbr_day_names: [sön, mån, tis, ons, tor, fre, lör]
format:
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
format: "%n %u"
unit: "kr"
# These three are to override number.format and are optional
# separator: "."
# delimiter: ","
# precision: 2
# Used in number_to_percentage() # Don't forget the nil at the beginning; there's no such thing as a 0th month
percentage: month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december]
format: abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec]
# These three are to override number.format and are optional # Used in date_select and datime_select.
# separator: order:
delimiter: "" - :day
# precision: - :month
- :year
# Used in number_to_precision() time:
precision: formats:
format: default: "%Y-%m-%d %H:%M"
# These three are to override number.format and are optional time: "%H:%M"
# separator: short: "%d %b %H:%M"
delimiter: "" long: "%d %B, %Y %H:%M"
# precision: am: ""
pm: ""
# Used in number_to_human_size()
human:
format:
# These three are to override number.format and are optional
# separator:
delimiter: ""
# precision: 1
storage_units:
format: "%n %u"
units:
byte:
one: "Byte"
other: "Bytes"
kb: "kB"
mb: "MB"
gb: "GB"
tb: "TB"
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
datetime: datetime:
distance_in_words: distance_in_words:
half_a_minute: "en halv minut" half_a_minute: "en halv minut"
@ -97,16 +74,67 @@ sv:
one: "nästan 1 år" one: "nästan 1 år"
other: "nästan %{count} år" other: "nästan %{count} år"
number:
format:
separator: ","
delimiter: "."
precision: 2
# Used in number_to_currency()
currency:
format:
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
format: "%n %u"
unit: "SEK"
# These three are to override number.format and are optional
# separator: "."
# delimiter: ","
# precision: 2
# Used in number_to_percentage()
percentage:
format:
# These three are to override number.format and are optional
# separator:
delimiter: ""
# precision:
# Used in number_to_precision()
precision:
format:
# These three are to override number.format and are optional
# separator:
delimiter: ""
# precision:
human:
format:
delimiter: ""
precision: 1
storage_units:
format: "%n %u"
units:
byte:
one: "Byte"
other: "Bytes"
kb: "kB"
mb: "MB"
gb: "GB"
tb: "TB"
# Used in array.to_sentence.
support:
array:
sentence_connector: "och"
skip_last_comma: true
activerecord: activerecord:
errors: errors:
template: template:
header: header:
one: "Ett fel förhindrade denna %{model} från att sparas" one: "Ett fel förhindrade denna %{model} från att sparas"
other: "%{count} fel förhindrade denna %{model} från att sparas" other: "%{count} fel förhindrade denna %{model} från att sparas"
# The variable :count is also available
body: "Det var problem med följande fält:"
# The values :model, :attribute and :value are always available for interpolation
# The value :count is available when applicable. Can be used for pluralization.
messages: messages:
inclusion: "finns inte i listan" inclusion: "finns inte i listan"
exclusion: "är reserverat" exclusion: "är reserverat"
@ -120,6 +148,7 @@ sv:
wrong_length: "har fel längd (ska vara %{count} tecken)" wrong_length: "har fel längd (ska vara %{count} tecken)"
taken: "har redan tagits" taken: "har redan tagits"
not_a_number: "är inte ett nummer" not_a_number: "är inte ett nummer"
not_a_date: "är inte ett giltigt datum"
greater_than: "måste vara större än %{count}" greater_than: "måste vara större än %{count}"
greater_than_or_equal_to: "måste vara större än eller lika med %{count}" greater_than_or_equal_to: "måste vara större än eller lika med %{count}"
equal_to: "måste vara samma som" equal_to: "måste vara samma som"
@ -132,43 +161,6 @@ sv:
circular_dependency: "Denna relation skulle skapa ett cirkulärt beroende" circular_dependency: "Denna relation skulle skapa ett cirkulärt beroende"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
direction: ltr
date:
formats:
# Use the strftime parameters for formats.
# When no format has been given, it uses default.
# You can provide other formats here if you like!
default: "%Y-%m-%d"
short: "%e %b"
long: "%e %B, %Y"
day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag]
abbr_day_names: [sön, mån, tis, ons, tor, fre, lör]
# Don't forget the nil at the beginning; there's no such thing as a 0th month
month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december]
abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec]
# Used in date_select and datime_select.
order:
- :day
- :month
- :year
time:
formats:
default: "%Y-%m-%d %H:%M"
time: "%H:%M"
short: "%d %b %H:%M"
long: "%d %B, %Y %H:%M"
am: ""
pm: ""
# Used in array.to_sentence.
support:
array:
sentence_connector: "och"
skip_last_comma: true
actionview_instancetag_blank_option: Var god välj actionview_instancetag_blank_option: Var god välj
general_text_No: 'Nej' general_text_No: 'Nej'
@ -198,6 +190,7 @@ sv:
notice_file_not_found: Sidan du försökte komma åt existerar inte eller är borttagen. notice_file_not_found: Sidan du försökte komma åt existerar inte eller är borttagen.
notice_locking_conflict: Data har uppdaterats av en annan användare. notice_locking_conflict: Data har uppdaterats av en annan användare.
notice_not_authorized: Du saknar behörighet att komma åt den här sidan. notice_not_authorized: Du saknar behörighet att komma åt den här sidan.
notice_not_authorized_action: Du saknar behörighet att utföra denna handling.
notice_not_authorized_archived_project: Projektet du försöker komma åt har arkiverats. notice_not_authorized_archived_project: Projektet du försöker komma åt har arkiverats.
notice_email_sent: "Ett mail skickades till %{value}" notice_email_sent: "Ett mail skickades till %{value}"
notice_email_error: "Ett fel inträffade när mail skickades (%{value})" notice_email_error: "Ett fel inträffade när mail skickades (%{value})"
@ -230,7 +223,6 @@ 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})"
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"
@ -243,8 +235,8 @@ sv:
mail_body_account_activation_request: "En ny användare (%{value}) har registrerat sig och avvaktar ditt godkännande:" 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 %{days} 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_body_reminder: "%{count} ärende(n) som är tilldelat dig har deadline under de %{days} dagarna:"
mail_subject_wiki_content_added: "'%{id}' wikisida has lagts till" mail_subject_wiki_content_added: "'%{id}' wikisida har lagts till"
mail_body_wiki_content_added: "The '%{id}' wikisida has lagts till av %{author}." mail_body_wiki_content_added: "The '%{id}' wikisida har lagts till av %{author}."
mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats" mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats"
mail_body_wiki_content_updated: "The '%{id}' wikisida har uppdaterats av %{author}." mail_body_wiki_content_updated: "The '%{id}' wikisida har uppdaterats av %{author}."
@ -286,7 +278,7 @@ sv:
field_priority: Prioritet field_priority: Prioritet
field_fixed_version: Versionsmål field_fixed_version: Versionsmål
field_user: Användare field_user: Användare
field_principal: Principal field_principal: Huvudsaklig
field_role: Roll field_role: Roll
field_homepage: Hemsida field_homepage: Hemsida
field_is_public: Publik field_is_public: Publik
@ -297,6 +289,7 @@ sv:
field_admin: Administratör field_admin: Administratör
field_last_login_on: Senaste inloggning field_last_login_on: Senaste inloggning
field_language: Språk field_language: Språk
field_effective_date: Förfallodag
field_password: Lösenord field_password: Lösenord
field_new_password: Nytt lösenord field_new_password: Nytt lösenord
field_password_confirmation: Bekräfta lösenord field_password_confirmation: Bekräfta lösenord
@ -348,6 +341,10 @@ sv:
field_text: Textfält field_text: Textfält
field_visible: Synlig field_visible: Synlig
field_warn_on_leaving_unsaved: Varna om jag lämnar en sida med osparad text field_warn_on_leaving_unsaved: Varna om jag lämnar en sida med osparad text
field_custom_filter: Anpassat LDAP filter
field_issue_summary: Sammanfattning av ärendet
field_new_saved_query: Skapa ny förfrågan
field_issue_view_all_open: Visa alla öppna ärenden
setting_app_title: Applikationsrubrik setting_app_title: Applikationsrubrik
setting_app_subtitle: Applikationsunderrubrik setting_app_subtitle: Applikationsunderrubrik
@ -407,6 +404,9 @@ sv:
setting_commit_logtime_enabled: Aktivera tidloggning setting_commit_logtime_enabled: Aktivera tidloggning
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_startdate_is_adddate: Använd nuvarande datum som startdatum för nya ärenden
setting_mail_handler_confirmation_on_success: "Skicka e-postbekräftelse på framgångsrika inkommande e-post"
setting_mail_handler_confirmation_on_failure: "Skicka e-postbekräftelse vid misslyckade inkommande e-post"
permission_add_project: Skapa projekt permission_add_project: Skapa projekt
permission_add_subprojects: Skapa underprojekt permission_add_subprojects: Skapa underprojekt
@ -416,9 +416,9 @@ sv:
permission_manage_project_activities: Hantera projektaktiviteter permission_manage_project_activities: Hantera projektaktiviteter
permission_manage_versions: Hantera versioner permission_manage_versions: Hantera versioner
permission_manage_categories: Hantera ärendekategorier permission_manage_categories: Hantera ärendekategorier
permission_view_issues: Visa ärenden
permission_add_issues: Lägga till ärenden permission_add_issues: Lägga till ärenden
permission_edit_issues: Ändra ärenden permission_edit_issues: Ändra ärenden
permission_view_issues: Visa ärenden
permission_manage_issue_relations: Hantera ärenderelationer permission_manage_issue_relations: Hantera ärenderelationer
permission_add_issue_notes: Lägga till ärendenotering permission_add_issue_notes: Lägga till ärendenotering
permission_edit_issue_notes: Ändra ärendenoteringar permission_edit_issue_notes: Ändra ärendenoteringar
@ -581,6 +581,7 @@ sv:
label_news_latest: Senaste nyheterna label_news_latest: Senaste nyheterna
label_news_view_all: Visa alla nyheter label_news_view_all: Visa alla nyheter
label_news_added: Nyhet tillagd label_news_added: Nyhet tillagd
label_news_comment_added: Kommentar tillagd till en nyhet
label_settings: Inställningar label_settings: Inställningar
label_overview: Översikt label_overview: Översikt
label_version: Version label_version: Version
@ -648,6 +649,7 @@ sv:
label_in_more_than: om mer än label_in_more_than: om mer än
label_greater_or_equal: '>=' label_greater_or_equal: '>='
label_less_or_equal: '<=' label_less_or_equal: '<='
label_between: "mellan"
label_in: om label_in: om
label_today: idag label_today: idag
label_all_time: närsom label_all_time: närsom
@ -670,8 +672,8 @@ sv:
label_browse: Bläddra label_browse: Bläddra
label_modification: "%{count} ändring" label_modification: "%{count} ändring"
label_modification_plural: "%{count} ändringar" label_modification_plural: "%{count} ändringar"
label_branch: Branch label_branch: Gren
label_tag: Tag label_tag: Tagg
label_revision: Revision label_revision: Revision
label_revision_plural: Revisioner label_revision_plural: Revisioner
label_revision_id: "Revision %{value}" label_revision_id: "Revision %{value}"
@ -695,6 +697,7 @@ sv:
label_roadmap_overdue: "%{value} sen" label_roadmap_overdue: "%{value} sen"
label_roadmap_no_issues: Inga ärenden för denna version label_roadmap_no_issues: Inga ärenden för denna version
label_search: Sök label_search: Sök
search_input_placeholder: sök ...
label_result_plural: Resultat label_result_plural: Resultat
label_all_words: Alla ord label_all_words: Alla ord
label_wiki: Wiki label_wiki: Wiki
@ -706,7 +709,7 @@ sv:
label_index_by_date: Innehåll efter datum label_index_by_date: Innehåll efter datum
label_current_version: Nuvarande version label_current_version: Nuvarande version
label_preview: Förhandsgranska label_preview: Förhandsgranska
label_feed_plural: Feeds label_feed_plural: Flöde
label_changes_details: Detaljer om alla ändringar label_changes_details: Detaljer om alla ändringar
label_issue_tracking: Ärendeuppföljning label_issue_tracking: Ärendeuppföljning
label_spent_time: Spenderad tid label_spent_time: Spenderad tid
@ -718,6 +721,7 @@ sv:
label_statistics: Statistik label_statistics: Statistik
label_commits_per_month: Commits per månad label_commits_per_month: Commits per månad
label_commits_per_author: Commits per författare label_commits_per_author: Commits per författare
label_diff: Skillnad
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
@ -749,7 +753,7 @@ sv:
label_board_new: Nytt forum label_board_new: Nytt forum
label_board_plural: Forum label_board_plural: Forum
label_board_locked: Låst label_board_locked: Låst
label_board_sticky: Sticky label_board_sticky: Viktigt
label_topic_plural: Ämnen label_topic_plural: Ämnen
label_message_plural: Meddelanden label_message_plural: Meddelanden
label_message_last: Senaste meddelande label_message_last: Senaste meddelande
@ -796,7 +800,7 @@ sv:
label_change_properties: Ändra inställningar label_change_properties: Ändra inställningar
label_general: Allmänt label_general: Allmänt
label_more: Mer label_more: Mer
label_scm: SCM label_scm: Versionshantering
label_plugins: Tillägg label_plugins: Tillägg
label_ldap_authentication: LDAP-autentisering label_ldap_authentication: LDAP-autentisering
label_downloads_abbr: Nerl. label_downloads_abbr: Nerl.
@ -809,6 +813,7 @@ sv:
label_incoming_emails: Inkommande mail label_incoming_emails: Inkommande mail
label_generate_key: Generera en nyckel label_generate_key: Generera en nyckel
label_issue_watchers: Bevakare label_issue_watchers: Bevakare
label_document_watchers: Bevakare
label_example: Exempel label_example: Exempel
label_display: Visa label_display: Visa
label_sort: Sortera label_sort: Sortera
@ -836,15 +841,35 @@ sv:
label_api_access_key_created_on: "API-nyckel skapad för %{value} sedan" label_api_access_key_created_on: "API-nyckel skapad för %{value} sedan"
label_profile: Profil label_profile: Profil
label_subtask_plural: Underaktiviteter label_subtask_plural: Underaktiviteter
label_subtask_add: Lägg till en underaktivitet
label_issue_hierarchy: Ärendehierarki
label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras
label_principal_search: "Sök efter användare eller grupp:" label_principal_search: "Sök efter användare eller grupp:"
label_user_search: "Sök efter användare:" label_user_search: "Sök efter användare:"
label_git_path: Sökväg till .git katalog
label_darcs_path: Rotkatalog
label_mercurial_path: Rotkatalog
label_cvs_path: CVSROOT
label_cvs_module: Modul
label_bazaar_path: Rotkatalog
label_filesystem_path: Rotkatalog
label_additional_workflow_transitions_for_assignee: Ytterligare övergångar tillåtna för tilldelad användare
label_additional_workflow_transitions_for_author: Ytterligare övergångar tillåtna när användaren är författaren
label_notify_member_plural: E-posta uppdateringar för ärende
label_path_encoding: Kodning av sökväg
label_deleted_custom_field: '(tog bort anpassat fält)'
label_toc: "Innehåll"
label_mail_handler_confirmation: "Bekräftelse inskickning via e-post: %{subject}"
label_mail_handler_failure: "Inskickning via e-post misslyckades: %{subject}"
label_mail_handler_errors_with_submission: "Det fanns fel med din inskickning via e-post:"
button_login: Logga in button_login: Logga in
button_submit: Skicka button_submit: Skicka
button_save: Spara button_save: Spara
button_check_all: Markera alla button_check_all: Markera alla
button_uncheck_all: Avmarkera alla button_uncheck_all: Avmarkera alla
button_collapse_all: Minimera alla
button_expand_all: Maximera alla
button_delete: Ta bort button_delete: Ta bort
button_create: Skapa button_create: Skapa
button_create_and_continue: Skapa och fortsätt button_create_and_continue: Skapa och fortsätt
@ -953,20 +978,27 @@ sv:
text_wiki_page_destroy_children: "Ta bort alla underliggande sidor" text_wiki_page_destroy_children: "Ta bort alla underliggande sidor"
text_wiki_page_reassign_children: "Flytta undersidor till denna föräldersida" text_wiki_page_reassign_children: "Flytta undersidor till denna föräldersida"
text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?" text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?"
text_zoom_out: Zooma ut
text_zoom_in: Zooma in text_zoom_in: Zooma in
text_zoom_out: Zooma ut
text_powered_by: "Powered by %{link}"
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_default_encoding: "Standard: UTF-8"
text_mercurial_repo_example: "Lokalt arkiv (t.ex. /hgrepo, c:\\hgrepo)"
text_git_repo_example: "Ett lokalt bare git arkiv (t.ex. /gitrepo, c:\\gitrepo)"
text_display_subprojects: Visa underprojekt
text_current_project: Nuvarande project
text_mail_handler_confirmation_successful: "Din e-post har framgångsrikt lagts till på följande webbadress"
default_role_manager: Projektledare default_role_manager: Projektledare
default_role_developer: Utvecklare default_role_developer: Utvecklare
default_role_reporter: Rapportör default_role_reporter: Rapportör
default_role_non_member: Non member default_role_non_member: Icke-medlem
default_role_anonymous: Anonymous default_role_anonymous: Anonym
default_tracker_bug: Bugg default_tracker_bug: Bugg
default_tracker_feature: Funktionalitet default_tracker_feature: Funktionalitet
default_tracker_support: Support default_tracker_support: Support
default_issue_status_new: Ny default_issue_status_new: Ny
default_issue_status_in_progress: Pågår default_issue_status_in_progress: Pågående
default_issue_status_resolved: Löst default_issue_status_resolved: Löst
default_issue_status_feedback: Återkoppling default_issue_status_feedback: Återkoppling
default_issue_status_closed: Stängd default_issue_status_closed: Stängd
@ -985,62 +1017,20 @@ 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
text_powered_by: Powered by %{link}
label_cvs_module: Module
label_filesystem_path: Root directory
label_darcs_path: Root directory
label_bazaar_path: Root directory
label_cvs_path: CVSROOT
label_git_path: Path to .git directory
label_mercurial_path: Root directory
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
button_expand_all: Expand all
button_collapse_all: Collapse all
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
field_effective_date: Due date
label_news_comment_added: Comment added to a news
text_default_encoding: "Default: UTF-8"
text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo)
label_notify_member_plural: Email issue updates
label_path_encoding: Path encoding
text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo)
label_diff: diff
setting_issue_startdate_is_adddate: Use current date as start date for new issues
description_search: Searchfield
description_user_mail_notification: Mail notification settings
description_date_range_list: Choose range from list
description_date_to: Enter end date
description_query_sort_criteria_attribute: Sort attribute
description_message_content: Message content
description_wiki_subpages_reassign: Choose new parent page
description_available_columns: Available Columns
description_selected_columns: Selected Columns
description_date_range_interval: Choose range by selecting start and end date
description_project_scope: Search scope
description_issue_category_reassign: Choose issue category
description_query_sort_criteria_direction: Sort direction
description_notes: Notes
description_filter: Filter description_filter: Filter
description_choose_project: Projects description_search: Sökfält
description_date_from: Enter start date description_choose_project: Projekt
label_deleted_custom_field: (deleted custom field) description_project_scope: Sökomfång
field_custom_filter: Custom LDAP filter description_notes: Noteringar
text_display_subprojects: Display subprojects description_message_content: Meddelandeinnehåll
text_current_project: Current project description_query_sort_criteria_attribute: Sorteringsattribut
label_toc: Contents description_query_sort_criteria_direction: Sorteringsordning
search_input_placeholder: search ... description_user_mail_notification: E-post notifieringsinställningar
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email description_available_columns: Tillängliga kolumner
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}" description_selected_columns: Valda kolumner
label_mail_handler_errors_with_submission: "There were errors with your email submission:" description_issue_category_reassign: Välj ärendekategori
label_document_watchers: Watchers description_wiki_subpages_reassign: Välj ny huvudsida
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email description_date_range_list: Välj omfång ifrån lista
label_between: between description_date_range_interval: Välj omfång genom att ange start- och slutdatum
label_mail_handler_failure: "Failed email submission: %{subject}" description_date_from: Ange startdatum
notice_not_authorized_action: You are not authorized to perform this action. description_date_to: Ange slutdatum
text_mail_handler_confirmation_successful: Your email has been successful added at the following url
field_issue_summary: Issue summary
field_new_saved_query: New saved query
field_issue_view_all_open: View all open issues
label_subtask_add: Add a subtask
label_issue_hierarchy: Issue hierarchy

View File

@ -12,6 +12,8 @@
# See doc/COPYRIGHT.rdoc for more details. # See doc/COPYRIGHT.rdoc for more details.
#++ #++
require 'wiki_content'
class MergeWikiVersionsWithJournals < ActiveRecord::Migration class MergeWikiVersionsWithJournals < ActiveRecord::Migration
# This is provided here for migrating up after the WikiContent::Version class has been removed # This is provided here for migrating up after the WikiContent::Version class has been removed
class WikiContent < ActiveRecord::Base class WikiContent < ActiveRecord::Base

View File

@ -1,5 +1,41 @@
= ChiliProject Changelog = ChiliProject Changelog
== 2012-06-13 v3.2.2
* Bug #1036: Ruby on Rails Unsafe Query Generation Risk in Ruby on Rails (CVE-2012-2694)
* Bug #1037: SQL Injection Vulnerability in Ruby on Rails (CVE-2012-2695)
== 2012-06-10 v3.2.1
* Bug #1034: Gravatar
== 2012-06-09 v3.2.0
* Bug #844: Set autocomplete=off for some fields in Registration form
* Bug #863: missing journals fixture at test/unit/issue_test.rb
* Bug #950: jQuery AJAX requests don't include CSRF token
* Bug #966: "edit own notes" fails since 3.1.0
* Bug #967: Menu - Missing translations (French)
* Bug #968: Forum threads aren't always displaying "Last Message"
* Bug #969: Forum URLs in the menu are missing the project_id
* Bug #970: Long version titles extend outside the group menu when expanding Roadmap
* Bug #974: menu link broken in duplicate issue mode
* Bug #975: Start Date is not saved for Versions
* Bug #984: Cannot unlock a forum thread
* Bug #986: Notification Mail for Wiki-Changes doesn't contain change comment
* Bug #994: select all in issue list isn't working
* Bug #1007: Right clicking on item in roadmap displays menu at incorrect position
* Bug #1008: error 500 when uploading a new file to an existing document
* Bug #1024: Select multiple issues with shift key in issue list
* Bug #1025: Rails: Unsafe Query Generation Risk in Ruby on Rails (CVE-2012-2660)
* Bug #1033: Replace vendored gravatar lib by gem
* Feature #749: Git Integration: Property Main Branch
* Feature #947: Reformat the CSS files to use a standard
* Feature #983: Bulgarian translation of several strings
* Feature #988: Swedish translation of several strings
* Feature #1016: Limit height of project drop down menu
* Task #982: Updated czech localization for chiliproject 3.1
== 2012-04-04 v3.1.0 == 2012-04-04 v3.1.0
* Bug #739: Relative textile links not converted to full URLs in emails * Bug #739: Relative textile links not converted to full URLs in emails

View File

@ -1 +1,3 @@
.icon-example-works { background-image: url(../images/it_works.png); } .icon-example-works {
background-image: url(../images/it_works.png);
}

View File

@ -18,8 +18,8 @@ module ChiliProject
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 3 MAJOR = 3
MINOR = 1 MINOR = 2
PATCH = 0 PATCH = 2
TINY = PATCH # Redmine compat TINY = PATCH # Redmine compat
# Used by semver to define the special version (if any). # Used by semver to define the special version (if any).

View File

@ -259,7 +259,7 @@ Redmine::MenuManager.map :project_menu do |menu|
:caption => :label_issue_plural, :caption => :label_issue_plural,
:children => issue_query_proc :children => issue_query_proc
}) })
menu.push(:new_issue, { :controller => 'issues', :action => 'new' }, { menu.push(:new_issue, { :controller => 'issues', :action => 'new', :copy_from => nil }, {
:param => :project_id, :param => :project_id,
:caption => :label_issue_new, :caption => :label_issue_new,
:parent => :issues, :parent => :issues,
@ -345,7 +345,7 @@ Redmine::MenuManager.map :project_menu do |menu|
project.boards.collect do |board| project.boards.collect do |board|
Redmine::MenuManager::MenuItem.new( Redmine::MenuManager::MenuItem.new(
"board-#{board.id}".to_sym, "board-#{board.id}".to_sym,
{ :controller => 'boards', :action => 'show', :id => board }, { :controller => 'boards', :action => 'show', :project_id => project, :id => board },
{ {
:caption => board.name # is h() in menu_helper.rb :caption => board.name # is h() in menu_helper.rb
}) })

View File

@ -100,6 +100,13 @@ module Redmine
def default_branch def default_branch
bras = self.branches bras = self.branches
return nil if bras.nil? return nil if bras.nil?
head = nil
scm_cmd('symbolic-ref', 'HEAD') do |io|
head = io.readline
end
/^refs\/heads\/(.*)$/.match(head)
bras.include?($1) ? $1 : bras.first
rescue ScmCommandAborted, EOFError
bras.include?('master') ? 'master' : bras.first bras.include?('master') ? 'master' : bras.first
end end

View File

@ -307,7 +307,8 @@ module Redmine
end end
blame blame
rescue HgCommandAborted rescue HgCommandAborted
nil # means not found or cannot be annotated # means not found or cannot be annotated
Annotate.new
end end
class Revision < Redmine::Scm::Adapters::Revision class Revision < Redmine::Scm::Adapters::Revision

View File

@ -24,6 +24,41 @@ end
# Tasks can be hooked into by redefining them in a plugin # Tasks can be hooked into by redefining them in a plugin
namespace :ci do namespace :ci do
namespace :travis do
desc "Prepare a TRAVIS run"
task :prepare do
ENV['RAILS_ENV'] = 'test'
RAILS_ENV = 'test'
database_yml = {"database" => "chiliproject_test"}
database_yml.merge! case ENV['DB']
when 'mysql'
{"adapter" => "mysql", "username" => "root"}
when 'mysql2'
{"adapter" => "mysql2", "username" => "root"}
when 'postgres'
{"adapter" => "postgresql", "username" => "postgres"}
when 'sqlite'
{"adapter" => "sqlite3", "database" => "db/test.sqlite3"}
end
File.open("config/database.yml", 'w') do |f|
YAML.dump({"test" => database_yml}, f)
end
Rake::Task["generate_session_store"].invoke
# Create and migrate the database
Rake::Task["db:create"].invoke
Rake::Task["db:migrate"].invoke
Rake::Task["db:migrate:plugins"].invoke
Rake::Task["db:schema:dump"].invoke
# Create test repositories
Rake::Task["test:scm:setup:all"].invoke
end
end
desc "Setup Redmine for a new build." desc "Setup Redmine for a new build."
task :setup do task :setup do
Rake::Task["ci:dump_environment"].invoke Rake::Task["ci:dump_environment"].invoke

View File

@ -467,7 +467,15 @@ jQuery.viewportHeight = function() {
// Automatically use format.js for jQuery Ajax // Automatically use format.js for jQuery Ajax
jQuery.ajaxSetup({ jQuery.ajaxSetup({
'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} 'beforeSend': function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript");
// TODO: Remove once jquery-rails (Rails 3) has been added a dependency
var csrf_meta_tag = jQuery('meta[name="csrf-token"]');
if (csrf_meta_tag) {
xhr.setRequestHeader('X-CSRF-Token', csrf_meta_tag.attr('content'));
}
}
}) })
/* TODO: integrate with existing code and/or refactor */ /* TODO: integrate with existing code and/or refactor */
@ -563,6 +571,13 @@ jQuery(document).ready(function($) {
// Click on the menu header with a dropdown menu // Click on the menu header with a dropdown menu
$('#account-nav .drop-down').live('click', function(event) { $('#account-nav .drop-down').live('click', function(event) {
var menuItem = $(this); var menuItem = $(this);
var menuUl = menuItem.find('> ul');
menuUl.css('height', 'auto');
if(menuUl.height() > $.viewportHeight()) {
var windowHeight = $.viewportHeight() - 150;
menuUl.css({'height': windowHeight});
}
toggleTopMenu(menuItem); toggleTopMenu(menuItem);

View File

@ -3,6 +3,7 @@
var element = el; var element = el;
var opts = options; var opts = options;
var observingContextMenuClick; var observingContextMenuClick;
var observingToggleAllClick;
var lastSelected = null; var lastSelected = null;
var menu; var menu;
var menuId = 'context-menu'; var menuId = 'context-menu';
@ -68,18 +69,17 @@
if (lastSelected !== null) if (lastSelected !== null)
{ {
var toggling = false; var toggling = false;
var rows = $(selectorName); var rows = $('.' + selectorName);
for (i = 0; i < rows.length; i++) rows.each(function() {
{ var self = $(this);
if (toggling || rows[i] == tr) if(toggling || (self.get(0) == tr.get(0))) {
{ methods.addSelection(self);
methods.addSelection(rows[i]);
} }
if (rows[i] == tr || rows[i] == lastSelected) if(((self.get(0) == tr.get(0)) || (self.get(0) == lastSelected.get(0)))
{ && (tr.get(0) !== lastSelected.get(0))) {
toggling = !toggling; toggling = !toggling;
} }
} });
} else { } else {
methods.addSelection(tr); methods.addSelection(tr);
} }
@ -153,7 +153,7 @@
} }
if(maxHeight > $(window).height()) { if(maxHeight > $(window).height()) {
renderY =+ menu.height(); renderY -= menu.height();
menu.addClass(reverseYClass); menu.addClass(reverseYClass);
} else { } else {
menu.removeClass(reverseYClass); menu.removeClass(reverseYClass);
@ -174,6 +174,7 @@
addSelection: function(element) { addSelection: function(element) {
element.addClass(contextMenuSelectionClass); element.addClass(contextMenuSelectionClass);
methods.checkSelectionBox(element, true); methods.checkSelectionBox(element, true);
methods.clearDocumentSelection();
}, },
isSelected: function(element) { isSelected: function(element) {
return element.hasClass(contextMenuSelectionClass); return element.hasClass(contextMenuSelectionClass);
@ -194,6 +195,27 @@
inputs.each(function() { inputs.each(function() {
inputs.attr('checked', checked ? 'checked' : false); inputs.attr('checked', checked ? 'checked' : false);
}); });
},
toggleIssuesSelection: function(e) {
e.preventDefault();
e.stopPropagation();
var issues = $(this).parents('form').find('tr.issue');
var checked = methods.isSelected(issues.eq(0));
issues.each(function() {
var self = $(this);
if(checked) {
methods.removeSelection(self)
} else {
methods.addSelection(self);
}
});
},
clearDocumentSelection: function() {
if(document.selection) {
document.selection.clear();
} else {
window.getSelection().removeAllRanges();
}
} }
}; };
@ -205,6 +227,11 @@
observingContextMenuClick = true; observingContextMenuClick = true;
} }
if(!observingToggleAllClick) {
element.find('.issues img[alt="Toggle_check"]').bind('click', methods.toggleIssuesSelection);
observingToggleAllClick = true;
}
methods.unselectAll(); methods.unselectAll();
}; };

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,17 @@
/* The main calendar widget. DIV containing a table. */ /* The main calendar widget. DIV containing a table. */
img.calendar-trigger { img.calendar-trigger {
cursor: pointer; cursor: pointer;
vertical-align: middle; vertical-align: middle;
margin-left: 4px; margin-left: 4px;
} }
div.calendar { position: relative; z-index: 30;} div.calendar {
position: relative;
z-index: 30;
}
div.calendar, div.calendar table { div.calendar,
div.calendar table {
border: 1px solid #556; border: 1px solid #556;
font-size: 11px; font-size: 11px;
color: #000; color: #000;
@ -18,10 +21,9 @@ div.calendar, div.calendar table {
} }
/* Header part -- contains navigation buttons and day names. */ /* Header part -- contains navigation buttons and day names. */
div.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ div.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
text-align: center; /* They are the navigation buttons */ text-align: center; /* They are the navigation buttons */
padding: 2px; /* Make the buttons seem like they're pressing */ padding: 2px; /* Make the buttons seem like they're pressing */
} }
div.calendar .nav { div.calendar .nav {
@ -29,7 +31,7 @@ div.calendar .nav {
} }
div.calendar thead .title { /* This holds the current "month, year" */ div.calendar thead .title { /* This holds the current "month, year" */
font-weight: bold; /* Pressing it will take you to the current date */ font-weight: bold; /* Pressing it will take you to the current date */
text-align: center; text-align: center;
background: #fff; background: #fff;
color: #000; color: #000;
@ -68,17 +70,18 @@ div.calendar thead .active { /* Active (pressed) buttons in header */
} }
/* The body part -- contains all the days in month. */ /* The body part -- contains all the days in month. */
div.calendar tbody .day { /* Cells <TD> containing month days dates */ div.calendar tbody .day { /* Cells <TD> containing month days dates */
width: 2em; width: 2em;
color: #456; color: #456;
text-align: right; text-align: right;
padding: 2px 4px 2px 2px; padding: 2px 4px 2px 2px;
} }
div.calendar tbody .day.othermonth { div.calendar tbody .day.othermonth {
font-size: 80%; font-size: 80%;
color: #bbb; color: #bbb;
} }
div.calendar tbody .day.othermonth.oweekend { div.calendar tbody .day.othermonth.oweekend {
color: #fbb; color: #fbb;
} }
@ -125,7 +128,9 @@ div.calendar tbody td.today { /* Cell showing selected date */
color: #f00; color: #f00;
} }
div.calendar tbody .disabled { color: #999; } div.calendar tbody .disabled {
color: #999;
}
div.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ div.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
visibility: hidden; visibility: hidden;
@ -136,7 +141,6 @@ div.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows)
} }
/* The footer part -- status bar and "Close" button */ /* The footer part -- status bar and "Close" button */
div.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */ div.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
text-align: center; text-align: center;
background: #556; background: #556;
@ -163,7 +167,6 @@ div.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
} }
/* Combo boxes (menus that display months/years for direct selection) */ /* Combo boxes (menus that display months/years for direct selection) */
div.calendar .combo { div.calendar .combo {
position: absolute; position: absolute;
display: none; display: none;

View File

@ -1,53 +1,112 @@
#context-menu { position: absolute; z-index: 40; } #context-menu {
position: absolute;
z-index: 40;
}
#context-menu ul, #context-menu li, #context-menu a { #context-menu ul,
display:block; #context-menu li,
margin:0; #context-menu a {
padding:0; display: block;
border:0; margin: 0;
padding: 0;
border: 0;
} }
#context-menu ul { #context-menu ul {
width:150px; width: 150px;
border-top:1px solid #ddd; border-top: 1px solid #ddd;
border-left:1px solid #ddd; border-left: 1px solid #ddd;
border-bottom:1px solid #777; border-bottom: 1px solid #777;
border-right:1px solid #777; border-right: 1px solid #777;
background:white; background: white;
list-style:none; list-style: none;
} }
#context-menu li { #context-menu li {
position:relative; position: relative;
padding:1px; padding: 1px;
z-index:39; z-index: 39;
border:1px solid white; border: 1px solid white;
} }
#context-menu li.folder ul { position:absolute; left:168px; /* IE6 */ top:-2px; max-height:300px; overflow:hidden; overflow-y: auto; }
#context-menu li.folder>ul { left:148px; }
#context-menu.reverse-y li.folder>ul { top:auto; bottom:0; } #context-menu li.folder ul {
#context-menu.reverse-x li.folder ul { left:auto; right:168px; /* IE6 */ } position: absolute;
#context-menu.reverse-x li.folder>ul { right:148px; } left: 168px; /* ie6 */
top: -2px;
max-height: 300px;
overflow: hidden;
overflow-y: auto;
}
#context-menu li.folder > ul {
left: 148px;
}
#context-menu.reverse-y li.folder > ul {
top: auto;
bottom: 0;
}
#context-menu.reverse-x li.folder ul {
left: auto;
right: 168px; /* IE6 */
}
#context-menu.reverse-x li.folder > ul {
right: 148px;
}
#context-menu a { #context-menu a {
text-decoration:none !important; text-decoration: none !important;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 1px 50%; background-position: 1px 50%;
padding: 1px 0px 1px 20px; padding: 1px 0px 1px 20px;
width:100%; /* IE */ width: 100%; /* IE */
}
#context-menu li > a {
width: auto;
}
/* others */
#context-menu a.disabled,
#context-menu a.disabled:hover {
color: #ccc;
}
#context-menu li:hover {
border: 1px solid gray;
background-color: #eee;
}
#context-menu a:hover {
color: #2A5685;
}
#context-menu li.folder:hover {
z-index: 40;
}
#context-menu ul ul,
#context-menu li:hover ul ul {
display: none;
}
#context-menu li:hover ul,
#context-menu li:hover li:hover ul {
display: block;
} }
#context-menu li>a { width:auto; } /* others */
#context-menu a.disabled, #context-menu a.disabled:hover {color: #ccc;}
#context-menu li:hover { border:1px solid gray; background-color:#eee; }
#context-menu a:hover {color:#2A5685;}
#context-menu li.folder:hover { z-index:40; }
#context-menu ul ul, #context-menu li:hover ul ul { display:none; }
#context-menu li:hover ul, #context-menu li:hover li:hover ul { display:block; }
/* selected element */ /* selected element */
.context-menu-selection { background-color:#507AAA !important; color:#000 !important; } .context-menu-selection {
.context-menu-selection:hover { background-color:#507AAA !important; color:#000 !important; } background-color: #507AAA !important;
color: #000 !important;
}
.context-menu-selection:hover {
background-color: #507AAA !important;
color: #000 !important;
}
#context-menu .submenu { #context-menu .submenu {
border: transparent solid 5px; border: transparent solid 5px;

View File

@ -1,6 +1,16 @@
#context-menu li.folder ul { left:auto; right:168px; } #context-menu li.folder ul {
#context-menu li.folder>ul { left:auto; right:148px; } left: auto;
#context-menu li a.submenu { background:url("../images/bullet_arrow_left.png") left no-repeat; } right: 168px;
}
#context-menu li.folder > ul {
left: auto;
right: 148px;
}
#context-menu li a.submenu {
background: url("../images/bullet_arrow_left.png") left no-repeat;
}
#context-menu a { #context-menu a {
background-position: 100% 40%; background-position: 100% 40%;

View File

@ -1,46 +1,58 @@
/* IE6 how i love to hate thee */ /* IE6 how i love to hate thee */
#account-nav li a { #account-nav li a {
width:45px; width: 45px;
} }
#account-nav li li a { #account-nav li li a {
width:150px; width: 150px;
} }
.title-bar { .title-bar {
zoom:1; zoom: 1;
} }
.title-bar-extras label { .title-bar-extras label {
float:none; float: none;
display:inline; display: inline;
padding-right:10px; padding-right: 10px;
} }
.issue-dropdown li.hover { .issue-dropdown li.hover {
background-color:#fff; background-color: #fff;
} }
.issue-dropdown li.hover ul { .issue-dropdown li.hover ul {
display:block; display: block;
left:112px; left: 112px;
} }
body .file-thumbs a { body .file-thumbs a {
width:150px; width: 150px;
} }
#history .journal { #history .journal {
zoom:1; zoom: 1;
} }
body #history .wiki { body #history .wiki {
overflow:hidden; overflow: hidden;
zoom:1; zoom: 1;
} }
#main-menu li li { #main-menu li li {
height:30px; height: 30px;
} }
#main-menu li li li { #main-menu li li li {
height:auto; height: auto;
} }
a.has-thumb.active { a.has-thumb.active {
background:none; background: none;
} }
.title-bar-extras ul { .title-bar-extras ul {
background-image:none; background-image: none;
border-top:1px solid #154E5D; border-top: 1px solid #154E5D;
} }

View File

@ -1,48 +1,56 @@
/* These will be included for IE6 & IE7 */ /* These will be included for IE6 & IE7 */
.title-bar h2 { .title-bar h2 {
height:21px; height: 21px;
} }
td.dropdown { td.dropdown {
z-index:50; z-index: 50;
position:relative; position: relative;
} }
body .title-bar-extras { body .title-bar-extras {
overflow:hidden; overflow: hidden;
} }
#main-menu, .title-bar { #main-menu,
z-index:4; .title-bar {
z-index: 4;
} }
.title-bar .button-large ul { .title-bar .button-large ul {
z-index:15; z-index: 15;
} }
form.tooltip-active { form.tooltip-active {
z-index:14; z-index: 14;
} }
#main-menu li li a span { #main-menu li li a span {
position:absolute; position: absolute;
right:0; right: 0;
top:0; top: 0;
display:block; display: block;
} }
#main-menu li li li a span { #main-menu li li li a span {
right:10px; right: 10px;
} }
body .file-thumbs a { body .file-thumbs a {
max-width:150px; max-width: 150px;
} }
#watchers { #watchers {
position:relative; position: relative;
z-index:5; z-index: 5;
} }
div.attachments { div.attachments {
position:relative; position: relative;
z-index:4; z-index: 4;
} }
fieldset.collapsible.header_collapsible legend { fieldset.collapsible.header_collapsible legend {
margin-left:-15px; margin-left: -15px;
} }

View File

@ -1,96 +1,123 @@
.jstEditor { .jstEditor {
padding-left: 0px; padding-left: 0px;
} }
.jstEditor textarea, .jstEditor iframe { .jstEditor textarea, .jstEditor iframe {
margin: 0; margin: 0;
} }
.jstHandle { .jstHandle {
height: 10px; height: 10px;
font-size: 0.1em; font-size: 0.1em;
cursor: s-resize; cursor: s-resize;
/*background: transparent url(img/resizer.png) no-repeat 45% 50%;*/ /*background: transparent url(img/resizer.png) no-repeat 45% 50%;*/
} }
.jstElements { .jstElements {
padding: 3px 3px; padding: 3px 3px;
} }
.jstElements button { .jstElements button {
margin-right : 6px; margin-right: 6px;
width : 24px; width: 24px;
height: 24px; height: 24px;
padding: 4px; padding: 4px;
border-style: solid; border-style: solid;
border-width: 1px; border-width: 1px;
border-color: #ddd; border-color: #ddd;
background-color : #f7f7f7; background-color: #f7f7f7;
background-position : 50% 50%; background-position: 50% 50%;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.jstElements button:hover { .jstElements button:hover {
border-color : #000; border-color: #000;
} }
.jstElements button span { .jstElements button span {
display : none; display: none;
} }
.jstElements span { .jstElements span {
display : inline; display: inline;
} }
.jstSpacer { .jstSpacer {
width : 0px; width: 0px;
font-size: 1px; font-size: 1px;
margin-right: 4px; margin-right: 4px;
} }
.jstElements .help { float: right; margin-right: 0.5em; padding-top: 8px; font-size: 0.9em; } .jstElements .help {
.jstElements .help a {padding: 2px 0 2px 20px; background: url(../images/help.png) no-repeat 0 50%;} float: right;
margin-right: 0.5em;
padding-top: 8px;
font-size: 0.9em;
}
.jstElements .help a {
padding: 2px 0 2px 20px;
background: url(../images/help.png) no-repeat 0 50%;
}
/* Buttons /* Buttons
-------------------------------------------------------- */ -------------------------------------------------------- */
.jstb_strong { .jstb_strong {
background-image: url(../images/jstoolbar/bt_strong.png); background-image: url(../images/jstoolbar/bt_strong.png);
} }
.jstb_em { .jstb_em {
background-image: url(../images/jstoolbar/bt_em.png); background-image: url(../images/jstoolbar/bt_em.png);
} }
.jstb_ins { .jstb_ins {
background-image: url(../images/jstoolbar/bt_ins.png); background-image: url(../images/jstoolbar/bt_ins.png);
} }
.jstb_del { .jstb_del {
background-image: url(../images/jstoolbar/bt_del.png); background-image: url(../images/jstoolbar/bt_del.png);
} }
.jstb_code { .jstb_code {
background-image: url(../images/jstoolbar/bt_code.png); background-image: url(../images/jstoolbar/bt_code.png);
} }
.jstb_h1 { .jstb_h1 {
background-image: url(../images/jstoolbar/bt_h1.png); background-image: url(../images/jstoolbar/bt_h1.png);
} }
.jstb_h2 { .jstb_h2 {
background-image: url(../images/jstoolbar/bt_h2.png); background-image: url(../images/jstoolbar/bt_h2.png);
} }
.jstb_h3 { .jstb_h3 {
background-image: url(../images/jstoolbar/bt_h3.png); background-image: url(../images/jstoolbar/bt_h3.png);
} }
.jstb_ul { .jstb_ul {
background-image: url(../images/jstoolbar/bt_ul.png); background-image: url(../images/jstoolbar/bt_ul.png);
} }
.jstb_ol { .jstb_ol {
background-image: url(../images/jstoolbar/bt_ol.png); background-image: url(../images/jstoolbar/bt_ol.png);
} }
.jstb_bq { .jstb_bq {
background-image: url(../images/jstoolbar/bt_bq.png); background-image: url(../images/jstoolbar/bt_bq.png);
} }
.jstb_unbq { .jstb_unbq {
background-image: url(../images/jstoolbar/bt_bq_remove.png); background-image: url(../images/jstoolbar/bt_bq_remove.png);
} }
.jstb_pre { .jstb_pre {
background-image: url(../images/jstoolbar/bt_pre.png); background-image: url(../images/jstoolbar/bt_pre.png);
} }
.jstb_link { .jstb_link {
background-image: url(../images/jstoolbar/bt_link.png); background-image: url(../images/jstoolbar/bt_link.png);
} }
.jstb_img { .jstb_img {
background-image: url(../images/jstoolbar/bt_img.png); background-image: url(../images/jstoolbar/bt_img.png);
} }

View File

@ -1,11 +1,46 @@
/***** Media print specific styles *****/ /***** Media print specific styles *****/
@media print { @media print {
#top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; } #top-menu,
#main { background: #fff; } #header,
#content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;} #main-menu,
#wiki_add_attachment { display:none; } #sidebar,
.hide-when-print { display: none; } #footer,
.autoscroll {overflow-x: visible;} .contextual,
table.list {margin-top:0.5em;} .other-formats {
table.list th, table.list td {border: 1px solid #aaa;} display:none;
}
#main {
background: #fff;
}
#content {
width: 99%;
margin: 0;
padding: 0;
border: 0;
background: #fff;
overflow: visible !important;
}
#wiki_add_attachment {
display:none;
}
.hide-when-print {
display: none;
}
.autoscroll {
overflow-x: visible;
}
table.list {
margin-top:0.5em;
}
table.list th,
table.list td {
border: 1px solid #aaa;
}
} }

View File

@ -2,37 +2,101 @@
* CSS Reset * CSS Reset
* Based on http://meyerweb.com/eric/tools/css/reset/ * Based on http://meyerweb.com/eric/tools/css/reset/
*/ */
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
font,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body { body {
line-height: 1; line-height: 1;
} }
ol, ul {
list-style: none; ol,
ul {
list-style: none;
} }
ins { ins {
text-decoration: underline; text-decoration: underline;
} }
del { del {
text-decoration: line-through; text-decoration: line-through;
} }
/* tables still need 'cellspacing="0"' in the markup */ /* tables still need 'cellspacing="0"' in the markup */
table { table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
} }
/* Helper classes */ /* Helper classes */
.clearfix { .clearfix {
clear:both; clear: both;
} }

View File

@ -1,63 +1,179 @@
body, #wrapper { direction: rtl;} body,
#wrapper {
direction: rtl;
}
#quick-search { float: left; } #quick-search {
#main-menu { margin-left: -500px; left: auto; right: 6px; margin-right: 0px;} float: left;
#main-menu li { float: right; }
#top-menu ul { float: right; }
#account { float: left; }
#top-menu #loggedas { float: left; }
#top-menu li { float: right; }
.tabular label.floating
{
margin-right: 0;
margin-left: auto;
text-align: right;
} }
.tabular label
{
float: right;
margin-left: auto;
}
.tabular p
{
clear: right;
}
.tabular label.block { text-align: right; }
.icon
{
background-position: 100% 40%;
padding-right: 20px;
padding-left: 0px;
}
div#activity dt, #search-results dt
{
background-position: 100% 50%;
padding-right: 20px;
padding-left: 0px;
}
#content .tabs ul li { float: right; }
#content .tabs ul { padding-left: auto; padding-right: 1em; }
table.progress { float: right; }
.contextual { float: left; }
.icon22 { background-position: 100% 40%; padding-right: 26px; padding-left: auto; }
h3, .wiki h2 { padding: 10px 2px 1px 0; }
.tooltip span.tip { text-align: right; }
tr.issue td.subject { text-align: right; }
tr.time-entry td.subject, tr.time-entry td.comments { text-align: right; }
#sidebar { float: left; }
#main.nosidebar #content { border-width: 1px; border-style: solid; border-color: #D7D7D7 #BBBBBB #BBBBBB #D7D7D7;}
.tabular.settings label { margin-left: auto; }
.splitcontentleft { float: right; }
.splitcontentright { float: left; }
p.progress-info { clear: right; }
table.list td.buttons a { padding-right: 20px; }
.filecontent { direction: ltr; }
.entries { direction: ltr; }
.changeset-changes { direction: ltr; padding-left: 2em }
.changesets { direction: ltr; }
div#issue-changesets { float: left; margin-right: 1em; margin-left: 0 }
div#issue-changesets div.wiki { direction: ltr; padding-left: 2em }
#activity dt, .journal { clear: right; }
.journal-link { float: left; }
div.wiki pre { direction: ltr; }
#main-menu {
margin-left: -500px;
left: auto;
right: 6px;
margin-right: 0px;
}
#main-menu li {
float: right;
}
#top-menu ul {
float: right;
}
#account {
float: left;
}
#top-menu #loggedas {
float: left;
}
#top-menu li {
float: right;
}
.tabular label.floating {
margin-right: 0;
margin-left: auto;
text-align: right;
}
.tabular label {
float: right;
margin-left: auto;
}
.tabular p {
clear: right;
}
.tabular label.block {
text-align: right;
}
.icon {
background-position: 100% 40%;
padding-right: 20px;
padding-left: 0px;
}
div#activity dt,
#search-results dt {
background-position: 100% 50%;
padding-right: 20px;
padding-left: 0px;
}
#content .tabs ul li {
float: right;
}
#content .tabs ul {
padding-left: auto;
padding-right: 1em;
}
table.progress {
float: right;
}
.contextual {
float: left;
}
.icon22 {
background-position: 100% 40%;
padding-right: 26px;
padding-left: auto;
}
h3,
.wiki h2 {
padding: 10px 2px 1px 0;
}
.tooltip span.tip {
text-align: right;
}
tr.issue td.subject {
text-align: right;
}
tr.time-entry td.subject,
tr.time-entry td.comments {
text-align: right;
}
#sidebar {
float: left;
}
#main.nosidebar #content {
border-width: 1px;
border-style: solid;
border-color: #D7D7D7 #BBBBBB #BBBBBB #D7D7D7;
}
.tabular.settings label {
margin-left: auto;
}
.splitcontentleft {
float: right;
}
.splitcontentright {
float: left;
}
p.progress-info {
clear: right;
}
table.list td.buttons a {
padding-right: 20px;
}
.filecontent {
direction: ltr;
}
.entries {
direction: ltr;
}
.changeset-changes {
direction: ltr;
padding-left: 2em;
}
.changesets {
direction: ltr;
}
div#issue-changesets {
float: left;
margin-right: 1em;
margin-left: 0;
}
div#issue-changesets div.wiki {
direction: ltr;
padding-left: 2em;
}
#activity dt,
.journal {
clear: right;
}
.journal-link {
float: left;
}
div.wiki pre {
direction: ltr;
}

View File

@ -1,181 +1,583 @@
div.changeset-changes ul {
div.changeset-changes ul { margin: 0; padding: 0; } margin: 0;
div.changeset-changes ul > ul { margin-left: 18px; padding: 0; } padding: 0;
li.change {
list-style-type:none;
background-image: url(../images/bullet_black.png);
background-position: 1px 1px;
background-repeat: no-repeat;
padding-top: 1px;
padding-bottom: 1px;
padding-left: 20px;
margin: 0;
} }
li.change.folder { background-image: url(../images/folder_open.png); }
li.change.folder.change-A { background-image: url(../images/folder_open_add.png); }
li.change.folder.change-M { background-image: url(../images/folder_open_orange.png); }
li.change.change-A { background-image: url(../images/bullet_add.png); }
li.change.change-M { background-image: url(../images/bullet_orange.png); }
li.change.change-C { background-image: url(../images/bullet_blue.png); }
li.change.change-R { background-image: url(../images/bullet_purple.png); }
li.change.change-D { background-image: url(../images/bullet_delete.png); }
li.change .copied-from { font-style: italic; color: #999; font-size: 0.9em; } div.changeset-changes ul > ul {
li.change .copied-from:before { content: " - "} margin-left: 18px;
padding: 0;
}
#changes-legend { float: right; font-size: 0.8em; margin: 0; } li.change {
#changes-legend li { float: left; background-position: 5px 0; } list-style-type: none;
background-image: url(../images/bullet_black.png);
background-position: 1px 1px;
background-repeat: no-repeat;
padding-top: 1px;
padding-bottom: 1px;
padding-left: 20px;
margin: 0;
}
li.change.folder {
background-image: url(../images/folder_open.png);
}
li.change.folder.change-A {
background-image: url(../images/folder_open_add.png);
}
li.change.folder.change-M {
background-image: url(../images/folder_open_orange.png);
}
li.change.change-A {
background-image: url(../images/bullet_add.png);
}
li.change.change-M {
background-image: url(../images/bullet_orange.png);
}
li.change.change-C {
background-image: url(../images/bullet_blue.png);
}
li.change.change-R {
background-image: url(../images/bullet_purple.png);
}
li.change.change-D {
background-image: url(../images/bullet_delete.png);
}
li.change .copied-from {
font-style: italic;
color: #999;
font-size: 0.9em;
}
li.change .copied-from:before {
content: " - ";
}
#changes-legend {
float: right;
font-size: 0.8em;
margin: 0;
}
#changes-legend li {
float: left;
background-position: 5px 0;
}
table.filecontent {
border: 1px solid #ccc;
border-collapse: collapse;
width: 98%;
background-color: #fafafa;
}
table.filecontent th {
border: 1px solid #ccc;
background-color: #eee;
}
table.filecontent th.filename {
background-color: #e4e4d4;
text-align: left;
padding: 0.2em;
}
table.filecontent tr.spacing th {
text-align: center;
}
table.filecontent tr.spacing td {
height: 0.4em;
background: #EAF2F5;
}
table.filecontent { border: 1px solid #ccc; border-collapse: collapse; width:98%; background-color: #fafafa; }
table.filecontent th { border: 1px solid #ccc; background-color: #eee; }
table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding: 0.2em;}
table.filecontent tr.spacing th { text-align:center; }
table.filecontent tr.spacing td { height: 0.4em; background: #EAF2F5;}
table.filecontent th.line-num { table.filecontent th.line-num {
border: 1px solid #d7d7d7; border: 1px solid #d7d7d7;
font-size: 0.8em; font-size: 0.8em;
text-align: right; text-align: right;
width: 2%; width: 2%;
padding-right: 3px; padding-right: 3px;
color: #999; color: #999;
} }
table.filecontent th.line-num a { table.filecontent th.line-num a {
text-decoration: none; text-decoration: none;
color: inherit; color: inherit;
} }
table.filecontent td.line-code pre { table.filecontent td.line-code pre {
margin: 0px; margin: 0px;
white-space: pre-wrap; /* CSS2.1 compliant */ white-space: pre-wrap; /* CSS2.1 compliant */
white-space: -moz-pre-wrap; /* Mozilla-based browsers */ white-space: -moz-pre-wrap; /* Mozilla-based browsers */
white-space: -o-pre-wrap; /* Opera 7+ */ white-space: -o-pre-wrap; /* Opera 7+ */
} }
/* 12 different colors for the annonate view */ /* 12 different colors for the annonate view */
table.annotate tr.bloc-0 {background: #FFFFBF;} table.annotate tr.bloc-0 {
table.annotate tr.bloc-1 {background: #EABFFF;} background: #FFFFBF;
table.annotate tr.bloc-2 {background: #BFFFFF;} }
table.annotate tr.bloc-3 {background: #FFD9BF;}
table.annotate tr.bloc-4 {background: #E6FFBF;} table.annotate tr.bloc-1 {
table.annotate tr.bloc-5 {background: #BFCFFF;} background: #EABFFF;
table.annotate tr.bloc-6 {background: #FFBFEF;} }
table.annotate tr.bloc-7 {background: #FFE6BF;}
table.annotate tr.bloc-8 {background: #FFE680;} table.annotate tr.bloc-2 {
table.annotate tr.bloc-9 {background: #AA80FF;} background: #BFFFFF;
table.annotate tr.bloc-10 {background: #FFBFDC;} }
table.annotate tr.bloc-11 {background: #BFE4FF;}
table.annotate tr.bloc-3 {
background: #FFD9BF;
}
table.annotate tr.bloc-4 {
background: #E6FFBF;
}
table.annotate tr.bloc-5 {
background: #BFCFFF;
}
table.annotate tr.bloc-6 {
background: #FFBFEF;
}
table.annotate tr.bloc-7 {
background: #FFE6BF;
}
table.annotate tr.bloc-8 {
background: #FFE680;
}
table.annotate tr.bloc-9 {
background: #AA80FF;
}
table.annotate tr.bloc-10 {
background: #FFBFDC;
}
table.annotate tr.bloc-11 {
background: #BFE4FF;
}
table.annotate td.revision { table.annotate td.revision {
text-align: center; text-align: center;
width: 2%; width: 2%;
padding-left: 1em; padding-left: 1em;
background: inherit; background: inherit;
} }
table.annotate td.author { table.annotate td.author {
text-align: center; text-align: center;
border-right: 1px solid #d7d7d7; border-right: 1px solid #d7d7d7;
white-space: nowrap; white-space: nowrap;
padding-left: 1em; padding-left: 1em;
padding-right: 1em; padding-right: 1em;
width: 3%; width: 3%;
background: inherit; background: inherit;
font-size: 90%; font-size: 90%;
} }
table.annotate td.line-code { background-color: #fafafa; } table.annotate td.line-code {
background-color: #fafafa;
}
div.action_M { background: #fd8 } div.action_M {
div.action_D { background: #f88 } background: #fd8;
div.action_A { background: #bfb } }
div.action_D {
background: #f88;
}
div.action_A {
background: #bfb;
}
/************* CodeRay styles *************/ /************* CodeRay styles *************/
.syntaxhl div {display: inline;} .syntaxhl div {
.syntaxhl .line-numbers { padding: 2px 4px 2px 4px; background-color: #eee; margin: 0 7px 0 0; } display: inline;
.syntaxhl .code pre { overflow: auto } }
.syntaxhl .debug { color:white ! important; background:blue ! important; }
.syntaxhl .annotation { color:#007 } .syntaxhl .line-numbers {
.syntaxhl .attribute-name { color:#b48 } padding: 2px 4px 2px 4px;
.syntaxhl .attribute-value { color:#700 } background-color: #eee;
.syntaxhl .binary { color:#509 } margin: 0 7px 0 0;
.syntaxhl .char .content { color:#D20 } }
.syntaxhl .char .delimiter { color:#710 }
.syntaxhl .char { color:#D20 }
.syntaxhl .class { color:#B06; font-weight:bold }
.syntaxhl .class-variable { color:#369 }
.syntaxhl .color { color:#0A0 }
.syntaxhl .comment { color:#777 }
.syntaxhl .comment .char { color:#444 }
.syntaxhl .comment .delimiter { color:#444 }
.syntaxhl .complex { color:#A08 }
.syntaxhl .constant { color:#036; font-weight:bold }
.syntaxhl .decorator { color:#B0B }
.syntaxhl .definition { color:#099; font-weight:bold }
.syntaxhl .delimiter { color:black }
.syntaxhl .directive { color:#088; font-weight:bold }
.syntaxhl .doc { color:#970 }
.syntaxhl .doc-string { color:#D42; font-weight:bold }
.syntaxhl .doctype { color:#34b }
.syntaxhl .entity { color:#800; font-weight:bold }
.syntaxhl .error { color:#F00; background-color:#FAA }
.syntaxhl .escape { color:#666 }
.syntaxhl .exception { color:#C00; font-weight:bold }
.syntaxhl .float { color:#60E }
.syntaxhl .function { color:#06B; font-weight:bold }
.syntaxhl .global-variable { color:#d70 }
.syntaxhl .hex { color:#02b }
.syntaxhl .imaginary { color:#f00 }
.syntaxhl .include { color:#B44; font-weight:bold }
.syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black }
.syntaxhl .inline-delimiter { font-weight: bold; color: #666 }
.syntaxhl .instance-variable { color:#33B }
.syntaxhl .integer { color:#00D }
.syntaxhl .key .char { color: #60f }
.syntaxhl .key .delimiter { color: #404 }
.syntaxhl .key { color: #606 }
.syntaxhl .keyword { color:#080; font-weight:bold }
.syntaxhl .label { color:#970; font-weight:bold }
.syntaxhl .local-variable { color:#963 }
.syntaxhl .namespace { color:#707; font-weight:bold }
.syntaxhl .octal { color:#40E }
.syntaxhl .operator { }
.syntaxhl .predefined { color:#369; font-weight:bold }
.syntaxhl .predefined-constant { color:#069 }
.syntaxhl .predefined-type { color:#0a5; font-weight:bold }
.syntaxhl .preprocessor { color:#579 }
.syntaxhl .pseudo-class { color:#00C; font-weight:bold }
.syntaxhl .regexp .content { color:#808 }
.syntaxhl .regexp .delimiter { color:#404 }
.syntaxhl .regexp .modifier { color:#C2C }
.syntaxhl .regexp { background-color:hsla(300,100%,50%,0.06); }
.syntaxhl .reserved { color:#080; font-weight:bold }
.syntaxhl .shell .content { color:#2B2 }
.syntaxhl .shell .delimiter { color:#161 }
.syntaxhl .shell { background-color:hsla(120,100%,50%,0.06); }
.syntaxhl .string .char { color: #b0b }
.syntaxhl .string .content { color: #D20 }
.syntaxhl .string .delimiter { color: #710 }
.syntaxhl .string .modifier { color: #E40 }
.syntaxhl .string { background-color:hsla(0,100%,50%,0.05); }
.syntaxhl .symbol .content { color:#A60 }
.syntaxhl .symbol .delimiter { color:#630 }
.syntaxhl .symbol { color:#A60 }
.syntaxhl .tag { color:#070 }
.syntaxhl .type { color:#339; font-weight:bold }
.syntaxhl .value { color: #088; }
.syntaxhl .variable { color:#037 }
.syntaxhl .insert { background: hsla(120,100%,50%,0.12) } .syntaxhl .code pre {
.syntaxhl .delete { background: hsla(0,100%,50%,0.12) } overflow: auto;
.syntaxhl .change { color: #bbf; background: #007; } }
.syntaxhl .head { color: #f8f; background: #505 }
.syntaxhl .head .filename { color: white; }
.syntaxhl .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; } .syntaxhl .debug {
.syntaxhl .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } color: white ! important;
background: blue ! important;
}
.syntaxhl .insert .insert { color: #0c0; background:transparent; font-weight:bold } .syntaxhl .annotation {
.syntaxhl .delete .delete { color: #c00; background:transparent; font-weight:bold } color: #007;
.syntaxhl .change .change { color: #88f } }
.syntaxhl .head .head { color: #f4f }
.syntaxhl .attribute-name {
color: #b48;
}
.syntaxhl .attribute-value {
color: #700;
}
.syntaxhl .binary {
color: #509;
}
.syntaxhl .char .content {
color: #D20;
}
.syntaxhl .char .delimiter {
color: #710;
}
.syntaxhl .char {
color: #D20;
}
.syntaxhl .class {
color: #B06;
font-weight: bold;
}
.syntaxhl .class-variable {
color: #369;
}
.syntaxhl .color {
color: #0A0;
}
.syntaxhl .comment {
color: #777;
}
.syntaxhl .comment .char {
color: #444;
}
.syntaxhl .comment .delimiter {
color: #444;
}
.syntaxhl .complex {
color: #A08;
}
.syntaxhl .constant {
color: #036;
font-weight: bold;
}
.syntaxhl .decorator {
color: #B0B;
}
.syntaxhl .definition {
color: #099;
font-weight: bold;
}
.syntaxhl .delimiter {
color: black;
}
.syntaxhl .directive {
color: #088;
font-weight: bold;
}
.syntaxhl .doc {
color: #970;
}
.syntaxhl .doc-string {
color: #D42;
font-weight: bold;
}
.syntaxhl .doctype {
color: #34b;
}
.syntaxhl .entity {
color: #800;
font-weight: bold;
}
.syntaxhl .error {
color: #F00;
background-color: #FAA;
}
.syntaxhl .escape {
color: #666;
}
.syntaxhl .exception {
color: #C00;
font-weight: bold;
}
.syntaxhl .float {
color: #60E;
}
.syntaxhl .function {
color: #06B;
font-weight: bold;
}
.syntaxhl .global-variable {
color: #d70;
}
.syntaxhl .hex {
color: #02b;
}
.syntaxhl .imaginary {
color: #f00;
}
.syntaxhl .include {
color: #B44;
font-weight: bold;
}
.syntaxhl .inline {
background-color: hsla(0,0%,0%,0.07);
color: black;
}
.syntaxhl .inline-delimiter {
font-weight: bold;
color: #666;
}
.syntaxhl .instance-variable {
color: #33B;
}
.syntaxhl .integer {
color: #00D;
}
.syntaxhl .key .char {
color: #60f;
}
.syntaxhl .key .delimiter {
color: #404;
}
.syntaxhl .key {
color: #606;
}
.syntaxhl .keyword {
color: #080;
font-weight: bold;
}
.syntaxhl .label {
color: #970;
font-weight: bold;
}
.syntaxhl .local-variable {
color: #963;
}
.syntaxhl .namespace {
color: #707;
font-weight: bold;
}
.syntaxhl .octal {
color: #40E;
}
.syntaxhl .operator {
}
.syntaxhl .predefined {
color: #369;
font-weight: bold;
}
.syntaxhl .predefined-constant {
color: #069;
}
.syntaxhl .predefined-type {
color: #0a5;
font-weight: bold;
}
.syntaxhl .preprocessor {
color: #579;
}
.syntaxhl .pseudo-class {
color: #00C;
font-weight: bold;
}
.syntaxhl .regexp .content {
color: #808;
}
.syntaxhl .regexp .delimiter {
color: #404;
}
.syntaxhl .regexp .modifier {
color: #C2C;
}
.syntaxhl .regexp {
background-color: hsla(300,100%,50%,0.06);
}
.syntaxhl .reserved {
color: #080;
font-weight: bold;
}
.syntaxhl .shell .content {
color: #2B2;
}
.syntaxhl .shell .delimiter {
color: #161;
}
.syntaxhl .shell {
background-color: hsla(120,100%,50%,0.06);
}
.syntaxhl .string .char {
color: #b0b;
}
.syntaxhl .string .content {
color: #D20;
}
.syntaxhl .string .delimiter {
color: #710;
}
.syntaxhl .string .modifier {
color: #E40;
}
.syntaxhl .string {
background-color: hsla(0,100%,50%,0.05);
}
.syntaxhl .symbol .content {
color: #A60;
}
.syntaxhl .symbol .delimiter {
color: #630;
}
.syntaxhl .symbol {
color: #A60;
}
.syntaxhl .tag {
color: #070;
}
.syntaxhl .type {
color: #339;
font-weight: bold;
}
.syntaxhl .value {
color: #088;
}
.syntaxhl .variable {
color: #037;
}
.syntaxhl .insert {
background: hsla(120,100%,50%,0.12);
}
.syntaxhl .delete {
background: hsla(0,100%,50%,0.12);
}
.syntaxhl .change {
color: #bbf;
background: #007;
}
.syntaxhl .head {
color: #f8f;
background: #505;
}
.syntaxhl .head .filename {
color: white;
}
.syntaxhl .delete .eyecatcher {
background-color: hsla(0,100%,50%,0.2);
border: 1px solid hsla(0,100%,45%,0.5);
margin: -1px;
border-bottom: none;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
}
.syntaxhl .insert .eyecatcher {
background-color: hsla(120,100%,50%,0.2);
border: 1px solid hsla(120,100%,25%,0.5);
margin: -1px;
border-top: none;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
.syntaxhl .insert .insert {
color: #0c0;
background: transparent;
font-weight: bold;
}
.syntaxhl .delete .delete {
color: #c00;
background: transparent;
font-weight: bold;
}
.syntaxhl .change .change {
color: #88f;
}
.syntaxhl .head .head {
color: #f4f;
}

View File

@ -147,6 +147,28 @@ LOREM
end end
end end
context "#add_attachment" do
setup do
@request.session[:user_id] = 2
set_tmp_attachments_directory
@document = Document.generate!(:project => Project.find('ecookbook'),
:title => 'Test')
end
should "send a notification mail" do
ActionMailer::Base.deliveries.clear
Setting.notified_events = Setting.notified_events.dup << 'document_added'
post :add_attachment,
:id => @document.id,
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
@document.reload
assert_not_nil @document
assert_equal 2, ActionMailer::Base.deliveries.size
end
end
def test_destroy def test_destroy
@request.session[:user_id] = 2 @request.session[:user_id] = 2
post :destroy, :id => 1 post :destroy, :id => 1

View File

@ -121,6 +121,30 @@ class MessagesControllerTest < ActionController::TestCase
assert_equal 'New body', message.content assert_equal 'New body', message.content
end end
def test_post_edit_sticky_and_locked
@request.session[:user_id] = 2
post :edit, :board_id => 1, :id => 1,
:message => { :subject => 'New subject',
:content => 'New body',
:locked => '1',
:sticky => '1'}
assert_redirected_to '/boards/1/topics/1'
message = Message.find(1)
assert_equal true, message.sticky?
assert_equal true, message.locked?
end
def test_post_edit_should_allow_to_change_board
@request.session[:user_id] = 2
post :edit, :board_id => 1, :id => 1,
:message => { :subject => 'New subject',
:content => 'New body',
:board_id => 2}
assert_redirected_to '/boards/2/topics/1'
message = Message.find(1)
assert_equal Board.find(2), message.board
end
def test_reply def test_reply
@request.session[:user_id] = 2 @request.session[:user_id] = 2
post :reply, :board_id => 1, :id => 1, :reply => { :content => 'This is a test reply', :subject => 'Test reply' } post :reply, :board_id => 1, :id => 1, :reply => { :content => 'This is a test reply', :subject => 'Test reply' }

View File

@ -131,6 +131,10 @@ class ProjectEnumerationsControllerTest < ActionController::TestCase
end end
def test_update_when_creating_new_activities_will_not_convert_existing_data_if_an_exception_is_raised def test_update_when_creating_new_activities_will_not_convert_existing_data_if_an_exception_is_raised
# SQLite doesn't support nested transactions, thus we can't test transaction-
# based features in a test wrapped in a transaction.
return if ChiliProject::Database.sqlite?
# TODO: Need to cause an exception on create but these tests # TODO: Need to cause an exception on create but these tests
# aren't setup for mocking. Just create a record now so the # aren't setup for mocking. Just create a record now so the
# second one is a dupicate # second one is a dupicate

View File

@ -112,13 +112,18 @@ class VersionsControllerTest < ActionController::TestCase
def test_post_update def test_post_update
@request.session[:user_id] = 2 @request.session[:user_id] = 2
today = Date.today
put :update, :id => 2, put :update, :id => 2,
:version => { :name => 'New version name', :version => { :name => 'New version name',
:effective_date => Date.today.strftime("%Y-%m-%d")} :start_date => today.yesterday.strftime("%Y-%m-%d"),
:effective_date => today.strftime("%Y-%m-%d"),
}
assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook'
version = Version.find(2) version = Version.find(2)
assert_equal 'New version name', version.name assert_equal 'New version name', version.name
assert_equal Date.today, version.effective_date assert_equal today.yesterday, version.start_date
assert_equal today, version.effective_date
end end
def test_post_update_with_validation_failure def test_post_update_with_validation_failure

View File

@ -664,6 +664,14 @@ RAW
Setting.gravatar_enabled = '1' Setting.gravatar_enabled = '1'
assert avatar(User.find_by_mail('jsmith@somenet.foo')).include?(Digest::MD5.hexdigest('jsmith@somenet.foo')) assert avatar(User.find_by_mail('jsmith@somenet.foo')).include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
assert avatar('jsmith <jsmith@somenet.foo>').include?(Digest::MD5.hexdigest('jsmith@somenet.foo')) assert avatar('jsmith <jsmith@somenet.foo>').include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
# Default size is 50
assert avatar('jsmith <jsmith@somenet.foo>').include?('s=50')
assert avatar('jsmith <jsmith@somenet.foo>', :size => 24).include?('s=24')
# Non-avatar options should be considered html options
assert avatar('jsmith <jsmith@somenet.foo>', :title => 'John Smith').include?('title="John Smith"')
# The default class of the img tag should be gravatar
assert avatar('jsmith <jsmith@somenet.foo>').include?('class="gravatar"')
assert !avatar('jsmith <jsmith@somenet.foo>', :class => 'picture').include?('class="gravatar"')
assert_nil avatar('jsmith') assert_nil avatar('jsmith')
assert_nil avatar(nil) assert_nil avatar(nil)

View File

@ -21,6 +21,7 @@ class IssueTest < ActiveSupport::TestCase
:issue_statuses, :issue_categories, :issue_relations, :workflows, :issue_statuses, :issue_categories, :issue_relations, :workflows,
:enumerations, :enumerations,
:issues, :issues,
:journals,
:custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values, :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
:time_entries :time_entries

View File

@ -14,7 +14,9 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class JournalTest < ActiveSupport::TestCase class JournalTest < ActiveSupport::TestCase
fixtures :issues, :issue_statuses, :journals, :enumerations fixtures :issues, :issue_statuses, :journals, :enumerations,\
:users, :trackers, :projects, :members, :member_roles, :roles,\
:enabled_modules
def setup def setup
@journal = IssueJournal.find(1) @journal = IssueJournal.find(1)
@ -35,23 +37,17 @@ class JournalTest < ActiveSupport::TestCase
def test_create_should_send_email_notification def test_create_should_send_email_notification
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
issue = Issue.find(:first) issue = issues :issues_001
if issue.journals.empty?
issue.init_journal(User.current, "This journal represents the creationa of journal version 1")
issue.save
end
user = User.find(:first)
assert_equal 0, ActionMailer::Base.deliveries.size assert_equal 0, ActionMailer::Base.deliveries.size
issue.reload
issue.update_attribute(:subject, "New subject to trigger automatic journal entry") issue.update_attribute(:subject, "New subject to trigger automatic journal entry")
assert_equal 2, ActionMailer::Base.deliveries.size assert_equal 2, ActionMailer::Base.deliveries.size
end end
def test_create_should_not_send_email_notification_if_told_not_to def test_create_should_not_send_email_notification_if_told_not_to
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
issue = Issue.find(:first) issue = issues :issues_001
user = User.find(:first) user = users :users_001
journal = issue.init_journal(user, "A note") journal = issue.init_journal(user, "A note")
JournalObserver.instance.send_notification = false JournalObserver.instance.send_notification = false

View File

@ -231,6 +231,13 @@ begin
end end
end end
def test_default_branch
@adapter.send :scm_cmd, 'branch', '-m', 'master', 'non-master-default-branch'
assert_equal 'non-master-default-branch', @adapter.default_branch
ensure
@adapter.send :scm_cmd, 'branch', '-m', 'non-master-default-branch', 'master'
end
private private
def test_scm_version_for(scm_command_version, version) def test_scm_version_for(scm_command_version, version)

View File

@ -101,6 +101,18 @@ class MessageTest < ActiveSupport::TestCase
# Watchers removed # Watchers removed
end end
def test_destroy_last_reply
message = Message.find(4)
last_reply = message.last_reply
penultimate_reply = message.children[-2]
assert last_reply.destroy
message.reload
assert_equal penultimate_reply, message.last_reply
end
def test_destroy_reply def test_destroy_reply
message = Message.find(5) message = Message.find(5)
board = message.board board = message.board

View File

@ -17,7 +17,7 @@ class NewsTest < ActiveSupport::TestCase
fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news
def valid_news def valid_news
{ :title => 'Test news', :description => 'Lorem ipsum etc', :author => User.find(:first) } { :title => 'Test news', :description => 'Lorem ipsum etc', :author => users(:users_001) }
end end
@ -28,7 +28,7 @@ class NewsTest < ActiveSupport::TestCase
def test_create_should_send_email_notification def test_create_should_send_email_notification
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events = Setting.notified_events.dup << 'news_added' Setting.notified_events = Setting.notified_events.dup << 'news_added'
news = Project.find(:first).news.new(valid_news) news = projects(:projects_001).news.new(valid_news)
assert news.save assert news.save
assert_equal 2, ActionMailer::Base.deliveries.size assert_equal 2, ActionMailer::Base.deliveries.size

View File

@ -82,7 +82,7 @@ class ProjectTest < ActiveSupport::TestCase
end end
assert_equal Tracker.all, Project.new.trackers assert_equal Tracker.all, Project.new.trackers
assert_equal Tracker.find(1, 3), Project.new(:tracker_ids => [1, 3]).trackers assert_equal Tracker.find(1, 3).sort_by(&:id), Project.new(:tracker_ids => [1, 3]).trackers.sort_by(&:id)
end end
def test_update def test_update

View File

@ -1 +0,0 @@
coverage

View File

@ -1,20 +0,0 @@
Copyright (c) 2007 West Arete Computing, Inc.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,55 +0,0 @@
== Gravatar Plugin
This plugin provides a handful of view helpers for displaying gravatars
(globally-recognized avatars).
Gravatars allow users to configure an avatar to go with their email address at
a central location: http://gravatar.com. Gravatar-aware websites (such
as yours) can then look up and display each user's preferred avatar, without
having to handle avatar management. The user gets the benefit of not having to
set up an avatar for each site that they post on.
== Installation
cd ~/myapp
ruby script/plugin install git://github.com/woods/gravatar-plugin.git
or, if you're using piston[http://piston.rubyforge.org] (worth it!):
cd ~/myapp/vendor/plugins
piston import git://github.com/woods/gravatar-plugin.git
== Example
If you represent your users with a model that has an +email+ method (typical
for most rails authentication setups), then you can simply use this method
in your views:
<%= gravatar_for @user %>
This will be replaced with the full HTML +img+ tag necessary for displaying
that user's gravatar.
Other helpers are documented under GravatarHelper::PublicMethods.
== Acknowledgments
Thanks to Magnus Bergmark (http://github.com/Mange), who contributed the SSL
support in this plugin, as well as a few minor fixes.
The following people have also written gravatar-related Ruby libraries:
* Seth Rasmussen created the gravatar gem[http://gravatar.rubyforge.org]
* Matt McCray has also created a gravatar
plugin[http://mattmccray.com/svn/rails/plugins/gravatar_helper]
== Author
Scott A. Woods
West Arete Computing, Inc.
http://westarete.com
scott at westarete dot com
== TODO
* Add specs for ssl support
* Finish rdoc documentation

View File

@ -1,32 +0,0 @@
require 'spec/rake/spectask'
require 'rake/rdoctask'
desc 'Default: run all specs'
task :default => :spec
desc 'Run all application-specific specs'
Spec::Rake::SpecTask.new(:spec) do |t|
# t.rcov = true
end
desc "Report code statistics (KLOCs, etc) from the application"
task :stats do
RAILS_ROOT = File.dirname(__FILE__)
STATS_DIRECTORIES = [
%w(Libraries lib/),
%w(Specs spec/),
].collect { |name, dir| [ name, "#{RAILS_ROOT}/#{dir}" ] }.select { |name, dir| File.directory?(dir) }
require 'code_statistics'
CodeStatistics.new(*STATS_DIRECTORIES).to_s
end
namespace :doc do
desc 'Generate documentation for the assert_request plugin.'
Rake::RDocTask.new(:plugin) do |rdoc|
rdoc.rdoc_dir = 'rdoc'
rdoc.title = 'Gravatar Rails Plugin'
rdoc.options << '--line-numbers' << '--inline-source' << '--accessor' << 'cattr_accessor=rw'
rdoc.rdoc_files.include('README')
rdoc.rdoc_files.include('lib/**/*.rb')
end
end

View File

@ -1,7 +0,0 @@
author: Scott Woods, West Arete Computing
summary: View helpers for displaying gravatars.
homepage: http://github.com/woods/gravatar-plugin/
plugin: git://github.com/woods/gravatar-plugin.git
license: MIT
version: 0.1
rails_version: 1.0+

View File

@ -1,3 +0,0 @@
#-- encoding: UTF-8
require 'gravatar'
ActionView::Base.send :include, GravatarHelper::PublicMethods

View File

@ -1,89 +0,0 @@
#-- encoding: UTF-8
require 'digest/md5'
require 'cgi'
module GravatarHelper
# These are the options that control the default behavior of the public
# methods. They can be overridden during the actual call to the helper,
# or you can set them in your environment.rb as such:
#
# # Allow racier gravatars
# GravatarHelper::DEFAULT_OPTIONS[:rating] = 'R'
#
DEFAULT_OPTIONS = {
# The URL of a default image to display if the given email address does
# not have a gravatar.
:default => nil,
# The default size in pixels for the gravatar image (they're square).
:size => 50,
# The maximum allowed MPAA rating for gravatars. This allows you to
# exclude gravatars that may be out of character for your site.
:rating => 'PG',
# The alt text to use in the img tag for the gravatar. Since it's a
# decorational picture, the alt text should be empty according to the
# XHTML specs.
:alt => '',
# The title text to use for the img tag for the gravatar.
:title => '',
# The class to assign to the img tag for the gravatar.
:class => 'gravatar',
# Whether or not to display the gravatars using HTTPS instead of HTTP
:ssl => false,
}
# The methods that will be made available to your views.
module PublicMethods
# Return the HTML img tag for the given user's gravatar. Presumes that
# the given user object will respond_to "email", and return the user's
# email address.
def gravatar_for(user, options={})
gravatar(user.email, options)
end
# Return the HTML img tag for the given email address's gravatar.
def gravatar(email, options={})
src = h(gravatar_url(email, options))
options = DEFAULT_OPTIONS.merge(options)
[:class, :alt, :size, :title].each { |opt| options[opt] = h(options[opt]) }
"<img class=\"#{options[:class]}\" alt=\"#{options[:alt]}\" title=\"#{options[:title]}\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{src}\" />"
end
# Returns the base Gravatar URL for the given email hash. If ssl evaluates to true,
# a secure URL will be used instead. This is required when the gravatar is to be
# displayed on a HTTPS site.
def gravatar_api_url(hash, ssl=false)
if ssl
"https://secure.gravatar.com/avatar/#{hash}"
else
"http://www.gravatar.com/avatar/#{hash}"
end
end
# Return the gravatar URL for the given email address.
def gravatar_url(email, options={})
email_hash = Digest::MD5.hexdigest(email)
options = DEFAULT_OPTIONS.merge(options)
options[:default] = CGI::escape(options[:default]) unless options[:default].nil?
gravatar_api_url(email_hash, options.delete(:ssl)).tap do |url|
opts = []
[:rating, :size, :default].each do |opt|
unless options[opt].nil?
value = h(options[opt])
opts << [opt, value].join('=')
end
end
url << "?#{opts.join('&')}" unless opts.empty?
end
end
end
end

View File

@ -1,44 +0,0 @@
#-- encoding: UTF-8
require 'rubygems'
require 'erb' # to get "h"
require 'active_support' # to get "returning"
require File.dirname(__FILE__) + '/../lib/gravatar'
include GravatarHelper, GravatarHelper::PublicMethods, ERB::Util
describe "gravatar_url with a custom default URL" do
before(:each) do
@original_options = DEFAULT_OPTIONS.dup
DEFAULT_OPTIONS[:default] = "no_avatar.png"
@url = gravatar_url("somewhere")
end
it "should include the \"default\" argument in the result" do
@url.should match(/&default=no_avatar.png/)
end
after(:each) do
DEFAULT_OPTIONS.merge!(@original_options)
end
end
describe "gravatar_url with default settings" do
before(:each) do
@url = gravatar_url("somewhere")
end
it "should have a nil default URL" do
DEFAULT_OPTIONS[:default].should be_nil
end
it "should not include the \"default\" argument in the result" do
@url.should_not match(/&default=/)
end
end
describe "gravatar with a custom title option" do
it "should include the title in the result" do
gravatar('example@example.com', :title => "This is a title attribute").should match(/This is a title attribute/)
end
end