fat_free_crm 0.11.0 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fat_free_crm might be problematic. Click here for more details.
- data/.gitignore +1 -0
- data/.travis.yml +2 -2
- data/Gemfile +15 -2
- data/Gemfile.lock +34 -14
- data/README.md +37 -124
- data/app/assets/javascripts/application.js.erb +1 -1
- data/app/assets/javascripts/crm.js +22 -1
- data/app/assets/javascripts/crm_fields.js +2 -3
- data/app/assets/javascripts/jquery-noconflict.js +17 -0
- data/app/assets/stylesheets/application.css.erb +1 -0
- data/app/assets/stylesheets/common.scss +26 -0
- data/app/assets/stylesheets/ffcrm_chosen.scss +1 -1
- data/app/controllers/admin/application_controller.rb +1 -1
- data/app/controllers/application_controller.rb +0 -8
- data/app/controllers/{accounts_controller.rb → entities/accounts_controller.rb} +1 -13
- data/app/controllers/{campaigns_controller.rb → entities/campaigns_controller.rb} +1 -13
- data/app/controllers/{contacts_controller.rb → entities/contacts_controller.rb} +1 -7
- data/app/controllers/{leads_controller.rb → entities/leads_controller.rb} +1 -1
- data/app/controllers/{opportunities_controller.rb → entities/opportunities_controller.rb} +1 -7
- data/app/controllers/{tasks_controller.rb → entities/tasks_controller.rb} +1 -1
- data/app/controllers/{base_controller.rb → entities_controller.rb} +32 -1
- data/app/controllers/home_controller.rb +9 -9
- data/app/controllers/lists_controller.rb +17 -0
- data/app/helpers/admin/tags_helper.rb +1 -1
- data/app/helpers/application_helper.rb +14 -14
- data/app/helpers/crm_tags_helper.rb +1 -1
- data/app/helpers/home_helper.rb +13 -15
- data/app/helpers/lists_helper.rb +17 -0
- data/app/inputs/date_time_input.rb +17 -0
- data/app/inputs/text_input.rb +17 -1
- data/app/models/{base → entities}/account.rb +0 -1
- data/app/models/{base → entities}/account_contact.rb +0 -0
- data/app/models/{base → entities}/account_opportunity.rb +0 -0
- data/app/models/{base → entities}/campaign.rb +0 -1
- data/app/models/{base → entities}/contact.rb +0 -1
- data/app/models/{base → entities}/contact_opportunity.rb +0 -0
- data/app/models/{base → entities}/lead.rb +0 -1
- data/app/models/{base → entities}/opportunity.rb +0 -1
- data/app/models/{base → entities}/task.rb +5 -6
- data/app/models/list.rb +17 -0
- data/app/models/observers/lead_observer.rb +39 -0
- data/app/models/observers/opportunity_observer.rb +54 -0
- data/app/models/observers/task_observer.rb +41 -0
- data/app/models/polymorphic/address.rb +1 -3
- data/app/models/polymorphic/avatar.rb +0 -5
- data/app/models/polymorphic/comment.rb +2 -11
- data/app/models/polymorphic/email.rb +2 -9
- data/app/models/polymorphic/tag.rb +17 -0
- data/app/models/polymorphic/tagging.rb +17 -0
- data/app/models/users/ability.rb +13 -0
- data/app/models/users/user.rb +1 -4
- data/app/views/accounts/_account.html.haml +10 -6
- data/app/views/accounts/index.html.haml +1 -1
- data/app/views/accounts/show.html.haml +6 -24
- data/app/views/admin/fields/_field.html.haml +6 -6
- data/app/views/admin/tags/_tag.html.haml +2 -2
- data/app/views/admin/tags/index.html.haml +1 -1
- data/app/views/admin/users/_user.html.haml +3 -3
- data/app/views/admin/users/index.html.haml +1 -1
- data/app/views/campaigns/_campaign.html.haml +9 -5
- data/app/views/campaigns/index.html.haml +1 -1
- data/app/views/campaigns/show.html.haml +4 -24
- data/app/views/comments/_comment.html.haml +17 -14
- data/app/views/comments/_edit.html.haml +1 -1
- data/app/views/comments/_new.html.haml +3 -3
- data/app/views/contacts/_contact.html.haml +33 -15
- data/app/views/contacts/_contacts.html.haml +6 -0
- data/app/views/contacts/_sidebar_show.html.haml +1 -1
- data/app/views/contacts/index.html.haml +1 -1
- data/app/views/contacts/show.html.haml +3 -19
- data/app/views/emails/_email.html.haml +24 -21
- data/app/views/{base → entities}/_advanced_search.html.haml +0 -0
- data/app/views/{base → entities}/_condition_fields.html.haml +0 -0
- data/app/views/{base → entities}/_grouping_fields.html.haml +0 -0
- data/app/views/{base → entities}/_sort_fields.html.haml +0 -0
- data/app/views/{base → entities}/advanced_search.js.rjs +0 -0
- data/app/views/entities/contacts.js.rjs +3 -0
- data/app/views/entities/leads.js.rjs +3 -0
- data/app/views/entities/opportunities.js.rjs +3 -0
- data/app/views/entities/versions.js.rjs +3 -0
- data/app/views/home/_activity.html.haml +19 -18
- data/app/views/home/_events_menu.html.haml +8 -0
- data/app/views/home/_options.html.haml +2 -3
- data/app/views/home/index.html.haml +1 -1
- data/app/views/leads/_lead.html.haml +42 -23
- data/app/views/leads/_leads.html.haml +6 -0
- data/app/views/leads/_sidebar_show.html.haml +1 -1
- data/app/views/leads/index.html.haml +1 -1
- data/app/views/leads/show.html.haml +3 -13
- data/app/views/opportunities/_opportunities.html.haml +6 -0
- data/app/views/opportunities/_opportunity.html.haml +23 -11
- data/app/views/opportunities/index.html.haml +1 -1
- data/app/views/opportunities/show.html.haml +4 -18
- data/app/views/shared/_comment.html.haml +3 -3
- data/app/views/shared/_edit_comment.html.haml +1 -1
- data/app/views/shared/_recent.html.haml +4 -4
- data/app/views/shared/_recently.html.haml +3 -3
- data/app/views/shared/_timeline.html.haml +2 -3
- data/app/views/tasks/_assigned.html.haml +4 -4
- data/app/views/tasks/_completed.html.haml +2 -2
- data/app/views/tasks/_pending.html.haml +2 -2
- data/app/views/tasks/_related.html.haml +4 -5
- data/app/views/tasks/_tasks.html.haml +3 -0
- data/app/views/tasks/_title.html.haml +1 -1
- data/app/views/tasks/index.html.haml +1 -1
- data/app/views/users/_avatar.html.haml +2 -2
- data/app/views/versions/_version.html.haml +9 -12
- data/app/views/versions/_versions.html.haml +11 -0
- data/config/application.rb +3 -2
- data/config/environments/development.rb +2 -2
- data/config/environments/production.rb +0 -4
- data/config/environments/staging.rb +1 -1
- data/config/initializers/action_mailer.rb +9 -0
- data/config/initializers/paper_trail.rb +80 -0
- data/config/initializers/relative_url_root.rb +23 -0
- data/config/locales/cz_fat_free_crm.yml +1 -1
- data/config/locales/en-US_fat_free_crm.yml +22 -17
- data/config/locales/fr_fat_free_crm.yml +349 -134
- data/config/routes.rb +144 -140
- data/config/settings.default.yml +14 -2
- data/db/demo/addresses.yml +2 -2
- data/db/demo/emails.yml +2 -2
- data/db/migrate/20120216042541_is_paranoid_to_paper_trail.rb +1 -2
- data/db/migrate/20120309070209_add_versions_related.rb +6 -0
- data/db/migrate/20120316045804_activities_to_versions.rb +35 -0
- data/db/schema.rb +79 -53
- data/fat_free_crm.gemspec +8 -4
- data/lib/development_tasks/gem.rake +18 -1
- data/lib/development_tasks/license.rake +2 -4
- data/lib/development_tasks/rdoc.rake +17 -0
- data/lib/development_tasks/rspec.rake +17 -0
- data/lib/fat_free_crm.rb +20 -14
- data/lib/fat_free_crm/core_ext/array.rb +0 -27
- data/lib/fat_free_crm/dropbox.rb +11 -1
- data/lib/fat_free_crm/engine.rb +21 -3
- data/lib/fat_free_crm/gem_dependencies.rb +26 -0
- data/lib/fat_free_crm/gem_ext.rb +18 -1
- data/lib/fat_free_crm/gem_ext/active_record/schema_dumper.rb +18 -1
- data/lib/fat_free_crm/gem_ext/authlogic/session/cookies.rb +17 -0
- data/lib/fat_free_crm/gem_ext/rails/engine.rb +17 -0
- data/lib/fat_free_crm/gem_ext/rails/text_helper.rb +17 -0
- data/lib/fat_free_crm/gem_ext/rake/task.rb +17 -0
- data/lib/fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper.rb +18 -1
- data/lib/fat_free_crm/plugin_dependencies.rb +23 -5
- data/lib/fat_free_crm/renderers.rb +17 -0
- data/lib/fat_free_crm/syck_yaml.rb +17 -0
- data/lib/fat_free_crm/version.rb +1 -1
- data/lib/{country_select → plugins/country_select}/MIT-LICENSE +0 -0
- data/lib/{country_select → plugins/country_select}/README +0 -0
- data/lib/{country_select → plugins/country_select}/init.rb +0 -0
- data/lib/{country_select → plugins/country_select}/install.rb +0 -0
- data/lib/{country_select → plugins/country_select}/lib/country_select.rb +0 -0
- data/lib/{country_select → plugins/country_select}/uninstall.rb +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/Gemfile +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/README.textile +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/ROADMAP.textile +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/Rakefile +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/VERSION +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/gravatar_image_tag.gemspec +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/init.rb +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/lib/gravatar_image_tag.rb +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/spec/gravatar_image_tag_spec.rb +0 -0
- data/lib/{gravatar_image_tag → plugins/gravatar_image_tag}/spec/test_helper.rb +0 -0
- data/lib/tasks/demo.rake +32 -29
- data/lib/tasks/dropbox.rake +1 -1
- data/lib/tasks/fat_free_crm.rake +3 -2
- data/lib/tasks/plugins.rake +1 -0
- data/spec/controllers/accounts_controller_spec.rb +7 -5
- data/spec/controllers/campaigns_controller_spec.rb +11 -9
- data/spec/controllers/contacts_controller_spec.rb +7 -5
- data/spec/controllers/home_controller_spec.rb +2 -2
- data/spec/controllers/leads_controller_spec.rb +7 -5
- data/spec/controllers/opportunities_controller_spec.rb +7 -5
- data/spec/factories/shared_factories.rb +8 -11
- data/spec/lib/dropbox_spec.rb +1 -0
- data/spec/models/polymorphic/version_spec.rb +247 -0
- data/spec/models/users/user_spec.rb +0 -9
- data/spec/spec_helper.rb +4 -0
- data/spec/views/home/index.haml_spec.rb +1 -1
- data/spec/views/home/index.rjs_spec.rb +4 -4
- data/spec/views/tasks/new.rjs_spec.rb +2 -2
- data/vendor/assets/javascripts/calendar_date_select/format_french.js +24 -0
- metadata +167 -126
- data/app/models/observers/activity_observer.rb +0 -84
- data/app/models/polymorphic/activity.rb +0 -106
- data/app/views/accounts/contacts.js.rjs +0 -3
- data/app/views/accounts/opportunities.js.rjs +0 -3
- data/app/views/campaigns/leads.js.rjs +0 -3
- data/app/views/campaigns/opportunities.js.rjs +0 -3
- data/app/views/contacts/opportunities.js.rjs +0 -3
- data/app/views/home/_actions_menu.html.haml +0 -8
- data/lib/dynamic_form/MIT-LICENSE +0 -20
- data/lib/dynamic_form/README +0 -13
- data/lib/dynamic_form/Rakefile +0 -10
- data/lib/dynamic_form/dynamic_form.gemspec +0 -12
- data/lib/dynamic_form/init.rb +0 -2
- data/lib/dynamic_form/lib/action_view/helpers/dynamic_form.rb +0 -301
- data/lib/dynamic_form/lib/action_view/locale/en-US.yml +0 -8
- data/lib/dynamic_form/lib/dynamic_form.rb +0 -6
- data/lib/dynamic_form/test/dynamic_form_i18n_test.rb +0 -42
- data/lib/dynamic_form/test/dynamic_form_test.rb +0 -370
- data/lib/dynamic_form/test/test_helper.rb +0 -10
- data/lib/responds_to_parent/MIT-LICENSE +0 -20
- data/lib/responds_to_parent/README +0 -47
- data/lib/responds_to_parent/Rakefile +0 -22
- data/lib/responds_to_parent/init.rb +0 -2
- data/lib/responds_to_parent/install.rb +0 -2
- data/lib/responds_to_parent/lib/responds_to_parent.rb +0 -70
- data/lib/responds_to_parent/test/responds_to_parent_test.rb +0 -11
- data/lib/responds_to_parent/test/test_helper.rb +0 -7
- data/lib/responds_to_parent/uninstall.rb +0 -2
- data/spec/models/polymorphic/activity_spec.rb +0 -303
@@ -2,7 +2,7 @@
|
|
2
2
|
= link_to_inline(:create_task, url_for(:action => :new, :view => @view), :text => t(:create_task))
|
3
3
|
.title#title
|
4
4
|
= (@view == "assigned" ? t(:assigned_tasks) : t(:tasks))
|
5
|
-
= image_tag("loading.gif", :size =>
|
5
|
+
= image_tag("loading.gif", :size => :thumb, :id => "loading", :style => "display: none;")
|
6
6
|
|
7
7
|
.remote#options{ hidden }
|
8
8
|
.remote#create_task{ hidden }
|
@@ -4,7 +4,7 @@
|
|
4
4
|
- buckets = Setting.unroll(:task_completed)
|
5
5
|
.title
|
6
6
|
= t(:completed_tasks)
|
7
|
-
= image_tag("loading.gif", :size =>
|
7
|
+
= image_tag("loading.gif", :size => :thumb, :id => "loading", :style => "display: none;")
|
8
8
|
- else
|
9
9
|
- buckets = Setting.unroll(:task_bucket)
|
10
10
|
= render "title"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
.remote
|
2
|
-
= form_for(@user, :url => upload_avatar_user_path(@user, :format => "js"), :html => { :multipart => true, :target => "uploading", :onsubmit => "$('
|
2
|
+
= form_for(@user, :url => upload_avatar_user_path(@user, :format => "js"), :html => { :multipart => true, :target => "uploading", :onsubmit => "$('user_avatar_submit').disabled = true" }) do |f|
|
3
3
|
= link_to_close avatar_user_path(@user)
|
4
4
|
= error_messages_for :avatar, :object => @user.avatar, :object_name => t('avatar')
|
5
5
|
|
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
.buttonbar
|
14
14
|
%small.cool{:style => "float:right"}== #{t :gravatar_help} #{link_to(t(:here), "http://en.gravatar.com", :"data-popup" => true)}.
|
15
|
-
= f.submit t(:upload_picture), :
|
15
|
+
= f.submit t(:upload_picture), :id => "user_avatar_submit"
|
16
16
|
#{t :or}
|
17
17
|
= link_to(t(:use_gravatar), upload_avatar_user_path(@user) + '?gravatar=1', :method => :put, :remote => true)
|
18
18
|
#{t :or}
|
@@ -1,14 +1,11 @@
|
|
1
|
-
%li[version]
|
1
|
+
%li.highlight[version]
|
2
2
|
.body
|
3
|
-
|
4
|
-
=# link_to_edit(version) + " | "
|
5
|
-
=# link_to_delete(version)
|
6
|
-
|
3
|
+
- item_name = t(version.item.class.name)
|
7
4
|
- if user = User.find_by_id(version.whodunnit)
|
8
5
|
- user_name = user.name
|
9
6
|
- else
|
10
7
|
- user_name = t('version.anonymous')
|
11
|
-
= t('version.' + version.event, :by => user_name, :when => time_ago_in_words(version.created_at))
|
8
|
+
= t('version.' + version.event, :item => item_name, :by => user_name, :when => time_ago_in_words(version.created_at))
|
12
9
|
%tt
|
13
10
|
- version.changeset.each do |attr_name, change|
|
14
11
|
- if attr_name =~ /^cf_/
|
@@ -22,9 +19,9 @@
|
|
22
19
|
- second = change.second
|
23
20
|
- if [first, second].any?(&:present?)
|
24
21
|
%br
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
- if first.blank? and second.present?
|
23
|
+
= t('version.set', :attr => label, :to => second)
|
24
|
+
- elsif first.present? and second.present?
|
25
|
+
= t('version.change', :attr => label, :from => first, :to => second)
|
26
|
+
- elsif first.present? and second.blank?
|
27
|
+
= t('version.unset', :attr => label, :from => first)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
- if Setting.paper_trail_ui_enabled
|
2
|
+
%br
|
3
|
+
|
4
|
+
.subtitle
|
5
|
+
= t(:versions)
|
6
|
+
|
7
|
+
.list#versions
|
8
|
+
- versions = Version.history(object).paginate(:page => 1, :per_page => 10)
|
9
|
+
= render :partial => "versions/version", :collection => versions
|
10
|
+
|
11
|
+
= will_paginate versions, :id => 'versions_pagination', :params => {:action => :versions}
|
data/config/application.rb
CHANGED
@@ -20,10 +20,11 @@ module FatFreeCRM
|
|
20
20
|
# -- all .rb files in that directory are automatically loaded.
|
21
21
|
|
22
22
|
# Models are organized in sub-directories
|
23
|
-
config.autoload_paths += Dir[Rails.root.join("app/models/**")]
|
23
|
+
config.autoload_paths += Dir[Rails.root.join("app/models/**")] +
|
24
|
+
Dir[Rails.root.join("app/controllers/entities")]
|
24
25
|
|
25
26
|
# Activate observers that should always be running.
|
26
|
-
config.active_record.observers = :
|
27
|
+
config.active_record.observers = :lead_observer, :opportunity_observer, :task_observer unless ARGV.join.include?('assets:precompile')
|
27
28
|
|
28
29
|
# Load development rake tasks (RSpec, Gem packaging, etc.)
|
29
30
|
rake_tasks do
|
@@ -24,7 +24,7 @@ if defined?(FatFreeCRM::Application)
|
|
24
24
|
config.action_dispatch.best_standards_support = :builtin
|
25
25
|
|
26
26
|
# Raise exception on mass assignment protection for Active Record models
|
27
|
-
config.active_record.mass_assignment_sanitizer = :strict
|
27
|
+
#config.active_record.mass_assignment_sanitizer = :strict
|
28
28
|
|
29
29
|
# Log the query plan for queries taking more than this (works
|
30
30
|
# with SQLite, MySQL, and PostgreSQL)
|
@@ -36,4 +36,4 @@ if defined?(FatFreeCRM::Application)
|
|
36
36
|
# Expands the lines which load the assets
|
37
37
|
config.assets.debug = true
|
38
38
|
end
|
39
|
-
end
|
39
|
+
end
|
@@ -50,10 +50,6 @@ if defined?(FatFreeCRM::Application)
|
|
50
50
|
'calendar_date_select/default.css',
|
51
51
|
/calendar_date_select\/[^\/]*\.js/]
|
52
52
|
|
53
|
-
# Disable delivery errors, bad email addresses will be ignored
|
54
|
-
# config.action_mailer.raise_delivery_errors = false
|
55
|
-
config.action_mailer.delivery_method = :smtp
|
56
|
-
|
57
53
|
# Enable threaded mode
|
58
54
|
# config.threadsafe!
|
59
55
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
if defined?(FatFreeCRM::Application)
|
2
|
-
require
|
2
|
+
require FatFreeCRM.root.join('config', 'environments', 'production')
|
3
3
|
FatFreeCRM::Application.configure do
|
4
4
|
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
5
5
|
# the I18n.default_locale when a translation can not be found)
|
@@ -1,3 +1,12 @@
|
|
1
|
+
# Configure ActionMailer
|
2
|
+
|
3
|
+
# Set SMTP settings if present.
|
4
|
+
if smtp_settings = Setting.smtp
|
5
|
+
Rails.application.config.action_mailer.delivery_method = :smtp
|
6
|
+
Rails.application.config.action_mailer.smtp_settings = smtp_settings
|
7
|
+
end
|
8
|
+
|
9
|
+
# Set default host for outgoing emails
|
1
10
|
if Setting.host.present?
|
2
11
|
(Rails.application.config.action_mailer.default_url_options ||= {})[:host] = Setting.host
|
3
12
|
end
|
@@ -1 +1,81 @@
|
|
1
1
|
require 'paper_trail'
|
2
|
+
|
3
|
+
Version.class_eval do
|
4
|
+
|
5
|
+
ASSETS = %w(all tasks campaigns leads accounts contacts opportunities comments emails)
|
6
|
+
EVENTS = %w(all_events create view update destroy)
|
7
|
+
DURATION = %w(one_hour one_day two_days one_week two_weeks one_month)
|
8
|
+
ENTITIES = %w(Account Campaign Contact Lead Opportunity)
|
9
|
+
|
10
|
+
attr_accessible :related
|
11
|
+
belongs_to :related, :polymorphic => true
|
12
|
+
belongs_to :user, :foreign_key => :whodunnit
|
13
|
+
|
14
|
+
scope :default_order, order('created_at DESC')
|
15
|
+
scope :include_events, lambda { |*events| where(:event => events) }
|
16
|
+
scope :exclude_events, lambda { |*events| where('event NOT IN (?)', events) }
|
17
|
+
scope :for, lambda { |user| where(:whodunnit => user.id.to_s) }
|
18
|
+
|
19
|
+
class << self
|
20
|
+
|
21
|
+
def recent_for_user(user, limit = 10)
|
22
|
+
# Hybrid SQL/Ruby to build a unique list of the most recent entities that the
|
23
|
+
# user has interacted with
|
24
|
+
versions = []
|
25
|
+
offset = 0
|
26
|
+
while versions.size < limit
|
27
|
+
query = includes(:item).
|
28
|
+
where(:whodunnit => user.id.to_s).
|
29
|
+
where(:item_type => ENTITIES).
|
30
|
+
limit(limit * 2).
|
31
|
+
offset(offset).
|
32
|
+
default_order
|
33
|
+
|
34
|
+
break if query.size == 0
|
35
|
+
versions += query.select {|v| v.item.present? }
|
36
|
+
versions.uniq! {|v| [v.item_id, v.item_type]}
|
37
|
+
offset += limit * 2
|
38
|
+
end
|
39
|
+
versions[0...10]
|
40
|
+
end
|
41
|
+
|
42
|
+
def latest(options = {})
|
43
|
+
includes(:item, :related, :user).
|
44
|
+
where(({:item_type => options[:asset]} if options[:asset])).
|
45
|
+
where(({:event => options[:event]} if options[:event])).
|
46
|
+
where(({:whodunnit => options[:user].to_s} if options[:user])).
|
47
|
+
where('versions.created_at >= ?', Time.zone.now - (options[:duration] || 2.days)).
|
48
|
+
default_order
|
49
|
+
end
|
50
|
+
|
51
|
+
def related_to(object)
|
52
|
+
where('(item_id = :id AND item_type = :type) OR (related_id = :id AND related_type = :type)',
|
53
|
+
:id => object.id, :type => object.class.name)
|
54
|
+
end
|
55
|
+
|
56
|
+
def history(object)
|
57
|
+
related_to(object).exclude_events(:view).default_order
|
58
|
+
end
|
59
|
+
|
60
|
+
def visible_to(user)
|
61
|
+
scoped.delete_if do |version|
|
62
|
+
if item = version.item || version.reify
|
63
|
+
if item.respond_to?(:access) # NOTE: Tasks don't have :access as of yet.
|
64
|
+
# Delete from scope if it shouldn't be visible
|
65
|
+
next item.user_id != user.id &&
|
66
|
+
item.assigned_to != user.id &&
|
67
|
+
(item.access == "Private" ||
|
68
|
+
(item.access == "Shared" &&
|
69
|
+
!item.permissions.map(&:user_id).include?(user.id)))
|
70
|
+
end
|
71
|
+
# Don't delete any objects that don't have :access method (e.g. tasks)
|
72
|
+
next false
|
73
|
+
end
|
74
|
+
# Delete from scope if no object can be found or reified (e.g. from 'show' events)
|
75
|
+
true
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Fat Free CRM
|
2
|
+
# Copyright (C) 2008-2011 by Michael Dvorkin
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU Affero General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU Affero General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Affero General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
#------------------------------------------------------------------------------
|
17
|
+
|
18
|
+
#
|
19
|
+
# Set relative url root for assets
|
20
|
+
|
21
|
+
if Setting.base_url.present?
|
22
|
+
ActionController::Base.relative_url_root = Setting.base_url
|
23
|
+
end
|
@@ -218,7 +218,7 @@ cz:
|
|
218
218
|
option_target_leads: cíloví možní kl.
|
219
219
|
option_target_revenue: cílový výnos
|
220
220
|
option_updated_at: upraveno
|
221
|
-
|
221
|
+
all_events_past_participle: a všechny akce vytvořené
|
222
222
|
created_past_participle: vytvořené
|
223
223
|
updated_past_participle: upravené
|
224
224
|
viewed_past_participle: zobrazené
|
@@ -475,34 +475,34 @@ en-US:
|
|
475
475
|
|
476
476
|
# Views -> Home.
|
477
477
|
#----------------------------------------------------------------------------
|
478
|
-
action_commented: commented on
|
479
478
|
action_completed: completed
|
480
|
-
|
481
|
-
|
482
|
-
action_email: exchanged emails with
|
479
|
+
action_create: created
|
480
|
+
action_destroy: deleted
|
483
481
|
action_reassigned: reassigned
|
484
482
|
action_rejected: rejected
|
485
483
|
action_rescheduled: rescheduled
|
486
|
-
|
487
|
-
|
484
|
+
action_update: updated
|
485
|
+
action_view: viewed
|
488
486
|
action_won: won
|
489
487
|
activities: Activities
|
490
488
|
no_activity_records: No activity records found.
|
491
489
|
recent_activity: Recent Activity
|
492
490
|
recent_activity_options: Recent Activity Options
|
493
491
|
subject_account: account
|
492
|
+
subject_address: address on
|
494
493
|
subject_campaign: campaign
|
494
|
+
subject_comment: comment on
|
495
495
|
subject_contact: contact
|
496
|
+
subject_email: email on
|
496
497
|
subject_lead: lead
|
497
498
|
subject_opportunity: opportunity
|
498
499
|
subject_task: task
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
all_actions_past_participle: Activities
|
500
|
+
subject_user: user
|
501
|
+
create_past_participle: Record Creations
|
502
|
+
view_past_participle: Views
|
503
|
+
update_past_participle: Updates
|
504
|
+
destroy_past_participle: Deletions
|
505
|
+
all_events_past_participle: Activities
|
506
506
|
|
507
507
|
# Views -> Common.
|
508
508
|
#----------------------------------------------------------------------------
|
@@ -603,10 +603,15 @@ en-US:
|
|
603
603
|
|
604
604
|
# Views -> Comments.
|
605
605
|
#----------------------------------------------------------------------------
|
606
|
+
comment: Comment
|
606
607
|
edit_comment: Editing comment
|
607
608
|
show: Show
|
608
609
|
update: Update
|
609
610
|
|
611
|
+
# Views -> Emails.
|
612
|
+
#----------------------------------------------------------------------------
|
613
|
+
email: Email
|
614
|
+
|
610
615
|
# Views -> Passwords.
|
611
616
|
#----------------------------------------------------------------------------
|
612
617
|
confirm_password_intro: Please type your new password and then confirm it.
|
@@ -646,9 +651,9 @@ en-US:
|
|
646
651
|
#----------------------------------------------------------------------------
|
647
652
|
versions: History
|
648
653
|
version:
|
649
|
-
create:
|
650
|
-
update:
|
651
|
-
destroy:
|
654
|
+
create: %{item} created by %{by} %{when} ago.
|
655
|
+
update: %{item} modified by %{by} %{when} ago.
|
656
|
+
destroy: %{item} destroyed by %{by} %{when} ago.
|
652
657
|
set: %{attr} set to %{to}
|
653
658
|
unset: %{attr} unset
|
654
659
|
change: %{attr} changed from %{from} to %{to}
|
@@ -776,7 +781,7 @@ en-US:
|
|
776
781
|
tag_with_taggings_confirm_delete: "If this tag is deleted, it will be removed from %{value} records."
|
777
782
|
msg_cant_delete_tag: "Couldn't delete '%{value}' since it has associated Field Groups."
|
778
783
|
|
779
|
-
|
784
|
+
|
780
785
|
# Views -> Admin -> Plugins
|
781
786
|
#----------------------------------------------------------------------------
|
782
787
|
views:
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# French I18n file for Fat Free CRM
|
2
2
|
# Translation by Cédric Brancourt aka Electron-libre
|
3
3
|
# cedric.brancourt@gmail.com
|
4
|
+
# Updated by David Keita aka ManInGA
|
5
|
+
# maninga@gmail.com
|
4
6
|
|
5
7
|
fr:
|
6
8
|
language: Français
|
@@ -14,13 +16,14 @@ fr:
|
|
14
16
|
not_implemented: Pas encore implémenté.
|
15
17
|
or: ou
|
16
18
|
select_none: '-- Aucun --'
|
17
|
-
select_blank: '--
|
19
|
+
select_blank: '-- Sélectionnez --'
|
18
20
|
yes_button: 'Oui'
|
19
21
|
|
22
|
+
|
20
23
|
# Settings.
|
21
24
|
#----------------------------------------------------------------------------
|
22
|
-
tab_dashboard:
|
23
|
-
tab_tasks: Tâches
|
25
|
+
tab_dashboard: Tableau de bord
|
26
|
+
tab_tasks: Tâches
|
24
27
|
tab_campaigns: Campagnes
|
25
28
|
tab_leads: Pistes
|
26
29
|
tab_accounts: Comptes
|
@@ -28,23 +31,32 @@ fr:
|
|
28
31
|
tab_opportunities: Opportunités
|
29
32
|
|
30
33
|
admin_tab_users: Utilisateurs
|
34
|
+
admin_tab_fields: Champs Personnalisés
|
35
|
+
admin_tab_tags: Tags
|
31
36
|
admin_tab_settings: Paramètres
|
32
37
|
admin_tab_plugins: Plugins
|
33
38
|
|
39
|
+
affiliate: Affilié
|
40
|
+
competitor: Concurrent
|
41
|
+
customer: Client
|
42
|
+
partner: Partenaire adm
|
43
|
+
reseller: Revendeur
|
44
|
+
vendor: Vendeur
|
45
|
+
|
34
46
|
planned: Planifié
|
35
47
|
started: Démarré
|
36
48
|
on_hold: En attente
|
37
49
|
completed: Complétée
|
38
50
|
called_off: Abandonné
|
39
51
|
|
40
|
-
new:
|
41
|
-
contacted:
|
42
|
-
converted:
|
43
|
-
rejected:
|
52
|
+
new: Nouvelle
|
53
|
+
contacted: Contactée
|
54
|
+
converted: Convertie
|
55
|
+
rejected: Rejetée
|
44
56
|
|
45
57
|
cold_call: Appel entrant
|
46
58
|
conference: Conférence
|
47
|
-
online:
|
59
|
+
online: Marketing web
|
48
60
|
referral: Référant
|
49
61
|
self: Interne
|
50
62
|
web: Website
|
@@ -57,15 +69,16 @@ fr:
|
|
57
69
|
proposal: Proposition
|
58
70
|
negotiation: Négociation
|
59
71
|
final_review: Examen final
|
60
|
-
won:
|
61
|
-
lost:
|
72
|
+
won: Clôturée/Gagnée
|
73
|
+
lost: Clôturée/Perdue
|
62
74
|
|
63
75
|
call: Appel
|
64
76
|
email: E-mail
|
65
|
-
follow_up:
|
66
|
-
lunch:
|
77
|
+
follow_up: Suivi
|
78
|
+
lunch: Dîner
|
67
79
|
meeting: Réunion
|
68
|
-
money:
|
80
|
+
money: Finance
|
81
|
+
presentation: Présentation
|
69
82
|
trip: Voyage
|
70
83
|
|
71
84
|
overdue: Délai expiré
|
@@ -75,7 +88,7 @@ fr:
|
|
75
88
|
due_this_week: Cette semaine
|
76
89
|
due_next_week: La semaine prochaine
|
77
90
|
due_later: Plus tard
|
78
|
-
due_specific_date: A date précise...
|
91
|
+
due_specific_date: A la date précise...
|
79
92
|
|
80
93
|
completed_today: "Ajourd'hui"
|
81
94
|
completed_yesterday: Hier
|
@@ -154,30 +167,21 @@ fr:
|
|
154
167
|
missing_email: "^Précisez une adresse e-mail"
|
155
168
|
email_in_use: "^Un utilisateur existe déjà avec cette adresse."
|
156
169
|
|
157
|
-
# dynamic_form plugin translations.
|
158
|
-
#----------------------------------------------------------------------------
|
159
|
-
errors:
|
160
|
-
template:
|
161
|
-
header:
|
162
|
-
one: "Impossible d'enregistrer ce %{model} : 1 erreur"
|
163
|
-
other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
|
164
|
-
body: "Veuillez vérifier les champs suivants : "
|
165
|
-
|
166
170
|
msg_account_suspended: Ce compte utilisateur a été suspendu.
|
167
|
-
password_reset_instruction:
|
171
|
+
password_reset_instruction: instructions de réinitialisation du mot de passe
|
168
172
|
|
169
173
|
# Controllers.
|
170
174
|
#----------------------------------------------------------------------------
|
171
|
-
msg_account_created: "Votre compte a été créé, il est en attente d'approbation par l'administrateur"
|
175
|
+
msg_account_created: "Votre compte a été créé, il est en attente d'approbation par l'administrateur"
|
172
176
|
msg_account_not_approved: "Votre compte n'à pas encore été approuvé"
|
173
177
|
msg_asset_deleted: "%{value} à été supprimé"
|
174
178
|
msg_asset_not_available: "Ce %{value} n'est plus disponible."
|
175
|
-
msg_asset_not_authorized:
|
179
|
+
msg_asset_not_authorized: "Vous n'êtes pas autorisé à accéder à ce/cette %{value}."
|
176
180
|
msg_assets_not_available: "Les %{value} ne sont pas disponibles."
|
177
181
|
msg_asset_rejected: "%{value} à été rejetée."
|
178
|
-
msg_bad_image_file: "^Nous n'avons pu télécharger ou redimensionner votre image."
|
182
|
+
msg_bad_image_file: "^Nous n'avons pas pu télécharger ou redimensionner votre image."
|
179
183
|
msg_cant_create_related: "Impossible de crée le %{asset} puisque le %{related} n'est plus disponnible."
|
180
|
-
msg_cant_delete_user: "^Impossible de supprimer car %{value} a des objets présents."
|
184
|
+
msg_cant_delete_user: "^Impossible de supprimer l'utilisateur car %{value} a des objets liés encore présents."
|
181
185
|
msg_cant_do: "Impossible de %{action} le %{asset} puisqu'il n'est plus disponible."
|
182
186
|
msg_email_not_found: "Aucun utilisateur ne correspond a cette adresse"
|
183
187
|
msg_enter_new_password: Saisissez votre nouveau mot de passe.
|
@@ -191,14 +195,14 @@ fr:
|
|
191
195
|
msg_password_not_changed: "Votre mot de passe n'a pas été modifié"
|
192
196
|
msg_password_updated: Modification de mot de passe réussie.
|
193
197
|
msg_pwd_instructions_sent: "Les instruction de modification de mot de passe vous on été envoyées. Vérifiez vos e-mails"
|
194
|
-
msg_require_admin: Vous devez être administrateur pour accéder a cette page
|
198
|
+
msg_require_admin: Vous devez être administrateur pour accéder a cette page
|
195
199
|
msg_successful_signup: Enregistrement réussi. Bienvenu dans Fat Free CRM
|
196
|
-
msg_welcome:
|
200
|
+
msg_welcome: Bienvenue dans Fat Free CRM
|
197
201
|
|
198
202
|
# Options.
|
199
203
|
#----------------------------------------------------------------------------
|
200
204
|
"option_amount*probability": Montant pondéré
|
201
|
-
activity_options: Voir les
|
205
|
+
activity_options: Voir les %{action_type} %{models} effectuées par %{user} dans les derniers %{period}.
|
202
206
|
all_users: tous les utilisateurs
|
203
207
|
option_after: après
|
204
208
|
option_all: tous
|
@@ -222,21 +226,21 @@ fr:
|
|
222
226
|
option_target_leads: pistes cibles
|
223
227
|
option_target_revenue: revenus cibles
|
224
228
|
option_updated_at: date de modification
|
225
|
-
show_per_page: Voir %{number} %{models} par page au format %{fmt}.
|
226
|
-
sort_by: Trier %{models} par %{field}.
|
227
|
-
sort_by_displaying: Trier %{models} par %{field} afficher le prénom %{position} le nom.
|
229
|
+
show_per_page: Voir %{number} %{models} par page au format %{fmt}.
|
230
|
+
sort_by: Trier les %{models} par %{field}.
|
231
|
+
sort_by_displaying: Trier les %{models} par %{field} et afficher le prénom %{position} le nom.
|
228
232
|
|
229
233
|
# Views -> Profile.
|
230
234
|
#----------------------------------------------------------------------------
|
231
235
|
aim: AOL IM
|
232
|
-
already_signed_up: Déjà
|
236
|
+
already_signed_up: Déjà inscrit?
|
233
237
|
alt_email: e-mail secondaire
|
234
|
-
avatar: Image
|
238
|
+
avatar: Image(avatar)
|
235
239
|
change_password: Modifier le mot de passe
|
236
240
|
company: Société
|
237
241
|
contact_info: Informations de contact
|
238
242
|
current_password: Mot de passe actuel
|
239
|
-
edit_profile: Modifier le
|
243
|
+
edit_profile: Modifier le profil
|
240
244
|
# email: E-mail # <-- Already defined as the task type if Settings.
|
241
245
|
first_name: Prénom
|
242
246
|
google: Google IM
|
@@ -247,16 +251,16 @@ fr:
|
|
247
251
|
last_name: Nom
|
248
252
|
login_now_link: Connectez vous maintenant!
|
249
253
|
mobile: Mobile
|
250
|
-
my_profile: Mon
|
254
|
+
my_profile: Mon profil
|
251
255
|
new_password: Nouveau mot de passe
|
252
256
|
password: Mot de passe
|
253
257
|
password_confirmation: Confirmez le nouveau mot de passe
|
254
258
|
phone: Téléphone
|
255
|
-
profile:
|
259
|
+
profile: Profil
|
256
260
|
profile_language: Langue
|
257
|
-
save_profile: Enregistrer le
|
258
|
-
sign_up:
|
259
|
-
sign_up_button:
|
261
|
+
save_profile: Enregistrer le profil
|
262
|
+
sign_up: Créer un compte
|
263
|
+
sign_up_button: S'inscrire
|
260
264
|
skype: Skype
|
261
265
|
upload_picture: Envoyez une image
|
262
266
|
use_gravatar: Utilisez Gravatar
|
@@ -267,15 +271,17 @@ fr:
|
|
267
271
|
# Views -> Authenticate.
|
268
272
|
#----------------------------------------------------------------------------
|
269
273
|
forgot_password: Mot de passe oublié
|
270
|
-
login:
|
271
|
-
no_account: Vous
|
274
|
+
login: Se connecter
|
275
|
+
no_account: "Vous n'avez pas de compte?"
|
272
276
|
remember_me: Se souvenir de moi
|
273
|
-
sign_up_now: "
|
277
|
+
sign_up_now: "Créez le maintenant!"
|
274
278
|
|
275
279
|
# Views -> Accounts.
|
276
280
|
#----------------------------------------------------------------------------
|
277
281
|
account: Compte
|
282
|
+
select_an_account: Sélectionner un compte
|
278
283
|
account_small: compte
|
284
|
+
account_summary: Résumé du compte
|
279
285
|
accounts: Comptes
|
280
286
|
accounts_options: Options des comptes
|
281
287
|
accounts_small: comptes
|
@@ -286,38 +292,41 @@ fr:
|
|
286
292
|
date_updated: Date de modification
|
287
293
|
fax: Fax
|
288
294
|
intro: Vous pouvez ajouter les informations de %{value} plus tard.
|
295
|
+
keep_private: Garder privé, ne pas partager avec les autres
|
296
|
+
mail_to: Envoyer à %{value}
|
297
|
+
make_public: Partager avec tous
|
289
298
|
mobile_small: mobile
|
290
299
|
open_in_window: Ouvrir %{value} dans une nouvelle fenêtre
|
291
300
|
phone_small: téléphone
|
292
301
|
phone_toll_free: Tel. gratuit
|
293
|
-
|
294
|
-
make_public: Partager avec tous
|
302
|
+
pipeline: Prévisions
|
295
303
|
same_as_billing: identique à facturation
|
296
304
|
save_account: Enregistrer le compte
|
297
305
|
share_with: Partager avec les personnes suivantes
|
298
306
|
shipping_address: Adresse de livraison
|
299
|
-
|
307
|
+
total_accounts: Total des comptes
|
308
|
+
website: Site web
|
300
309
|
|
301
310
|
# Views -> Campaigns.
|
302
311
|
#----------------------------------------------------------------------------
|
303
|
-
actual:
|
312
|
+
actual: Etat actuel
|
304
313
|
actual_performance: Performance Actuelle
|
305
314
|
budget: Budget
|
306
|
-
budget_label: Budget (
|
315
|
+
budget_label: Budget (€)
|
307
316
|
campaign: Campagne
|
308
317
|
campaign_and_leads: campagne et ses pistes
|
309
318
|
campaign_small: campagne
|
310
319
|
campaign_summary: Résumé de la campagne
|
311
|
-
campaign_targets:
|
320
|
+
campaign_targets: Prévisions de la campagne
|
312
321
|
campaigns: Campagnes
|
313
|
-
campaigns_options: Options
|
322
|
+
campaigns_options: Options des campagnes
|
314
323
|
campaigns_small: campagnes
|
315
324
|
conversion: Conversion
|
316
325
|
conversion_label: Conversion (%)
|
317
|
-
conversion_number: "%{value} conversion"
|
326
|
+
conversion_number: "%{value} de conversion"
|
318
327
|
create_campaign: Créer une Campagne
|
319
328
|
end_date: Date de fin
|
320
|
-
finished_on:
|
329
|
+
finished_on: terminée le %{value}
|
321
330
|
finishes_in: se termine dans %{value}
|
322
331
|
no_start_date: pas de date de début spécifiée
|
323
332
|
number_of_leads: Nombre de pistes
|
@@ -332,27 +341,27 @@ fr:
|
|
332
341
|
started_ago: démarré il y a %{value}
|
333
342
|
starts_in: démarré dans %{value}
|
334
343
|
starts_today: "démarre aujourd'hui!"
|
335
|
-
target:
|
344
|
+
target: Prévisionnel
|
336
345
|
total_campaigns: Total des Campagnes
|
337
346
|
was_supposed_to_finish: présumée se terminer le %{value}
|
338
347
|
was_supposed_to_start: était supposée démarrer il y a %{time_ago} le %{start_date}
|
339
|
-
|
348
|
+
#was_supposed_to_start_in: was supposed to start in %{starts_in} on %{start_date} # Not in use in the project
|
349
|
+
|
340
350
|
# Views -> Contacts.
|
341
351
|
#----------------------------------------------------------------------------
|
342
|
-
address: Adresse
|
343
352
|
alt_email_small: Autre
|
344
353
|
blog: Site Web/Blog
|
345
354
|
contact: Contact
|
346
355
|
contact_small: contact
|
347
356
|
contacts: Contacts
|
348
|
-
contacts_options: Options des
|
357
|
+
contacts_options: Options des contacts
|
349
358
|
contacts_small: contacts
|
350
359
|
create_contact: Créer un Contact
|
351
360
|
department: Département
|
352
361
|
department_small: 'département %{value} '
|
353
362
|
do_not_call: ne pas appeler
|
354
363
|
extra_info: Informations supplémentaires
|
355
|
-
extra_info_small:
|
364
|
+
extra_info_small: infos supplémentaires
|
356
365
|
facebook: Facebook
|
357
366
|
linked_in: LinkedIn
|
358
367
|
myself: Moi-même
|
@@ -362,9 +371,10 @@ fr:
|
|
362
371
|
referred_by: Référencé par
|
363
372
|
referred_by_small: référence par
|
364
373
|
save_contact: Enregistrer le contact
|
374
|
+
skype: Skype
|
365
375
|
twitter: Twitter
|
366
|
-
web_presence: Présence Web
|
367
|
-
web_presence_small: présence web
|
376
|
+
web_presence: Présence Web
|
377
|
+
web_presence_small: présence web
|
368
378
|
works_at: "%{job_title} chez %{company}"
|
369
379
|
|
370
380
|
# Views -> Leads.
|
@@ -372,7 +382,7 @@ fr:
|
|
372
382
|
convert: Convertir
|
373
383
|
convert_lead: Convertir la piste
|
374
384
|
convert_lead_permissions_intro: Les permissions du contact seront dupliquées depuis la piste. Vous pouvez modifier les permissions du contact ultérieurement.
|
375
|
-
convert_lead_text: En convertissant la piste %{value} il/elle
|
385
|
+
convert_lead_text: En convertissant la piste %{value} il/elle deviendra un contact associé à un compte existant ou nouvellement créé. Le statut de la piste sera automatiquement positionné à converti.
|
376
386
|
create_lead: Créer une piste
|
377
387
|
create_opp_for_contact: "Vous pouvez éventuellement créer une opportunité pour le contact %{value} en spécifiant le nom, l'étape courante, la date de clôture estimée, la probabilité de vente, le montant de l'affaire, la remise offerte."
|
378
388
|
lead: Piste
|
@@ -399,7 +409,7 @@ fr:
|
|
399
409
|
#----------------------------------------------------------------------------
|
400
410
|
amount: Montant
|
401
411
|
close_date: Date de clôture
|
402
|
-
closed_ago_on: clôturé il y
|
412
|
+
closed_ago_on: clôturé il y à %{time_ago} le %{date}
|
403
413
|
closes_today: "doit être clôturé aujourd'hui!"
|
404
414
|
closing_date: la date de clôture est %{value}
|
405
415
|
create_opportunity: Créer une opportunité
|
@@ -407,19 +417,19 @@ fr:
|
|
407
417
|
days_late: En retard de
|
408
418
|
days_left: Jours restant
|
409
419
|
discount: Remise
|
410
|
-
discount_number: avec %{value} remise
|
420
|
+
discount_number: avec %{value} de remise
|
411
421
|
expected_to_close: doit être clôturé dans %{time} le %{date}
|
412
422
|
from: de
|
413
423
|
no_closing_date: Aucune date de clôture fixée
|
414
424
|
no_discount: sans remise
|
415
425
|
opportunities: Opportunités
|
416
|
-
opportunities_options: Options des
|
417
|
-
opportunities_small:
|
426
|
+
opportunities_options: Options des opportunités
|
427
|
+
opportunities_small: opportunités
|
418
428
|
opportunity: Opportunité
|
419
429
|
opportunity_small: opportunité
|
420
|
-
opportunity_summary:
|
430
|
+
opportunity_summary: "Coup d'oeil sur l'opportunité"
|
421
431
|
opportunity_summary_text: "%{amount} avec %{discount} de remise et %{probability} de probabilité"
|
422
|
-
past_due: en retard,
|
432
|
+
past_due: en retard, devait être clôturé il y a %{value}
|
423
433
|
probability: Probabilité
|
424
434
|
probability_number: et %{value} de probabilité
|
425
435
|
save_opportunity: "Enregistrer l'opportunité"
|
@@ -429,23 +439,27 @@ fr:
|
|
429
439
|
|
430
440
|
# Views -> Tasks.
|
431
441
|
#----------------------------------------------------------------------------
|
442
|
+
task: Tâche
|
443
|
+
task_small: tâche
|
444
|
+
tasks: Tâches
|
445
|
+
tasks_small: tâches
|
432
446
|
assign_to: Assigner à
|
433
447
|
assigned_tab: Assigné
|
434
448
|
assigned_tasks: Tâches assignées
|
435
|
-
category:
|
436
|
-
completed_tab:
|
437
|
-
completed_tasks:
|
449
|
+
category: Catégorie
|
450
|
+
completed_tab: Complétée
|
451
|
+
completed_tasks: Tâches complétées
|
438
452
|
create_task: Créer une tâche
|
439
|
-
create_task_small:
|
453
|
+
create_task_small: créer une nouvelle tâche
|
440
454
|
due: A faire
|
441
455
|
feel_free: N'hésitez pas à
|
442
456
|
move_to: aller à
|
443
|
-
no_tasks: "Vous n'avez aucune tâche %{value}
|
457
|
+
no_tasks: "Vous n'avez aucune tâche %{value}"
|
444
458
|
no_tasks_pending: en attente
|
445
459
|
no_tasks_assigned: assignée
|
446
460
|
no_tasks_completed: complétée
|
447
461
|
pending_tab: En attente
|
448
|
-
pending_tasks:
|
462
|
+
pending_tasks: Tâches en attente
|
449
463
|
related: 're:'
|
450
464
|
save_task: Enregistrer la tâche
|
451
465
|
task_assigned: La tâche à été assignée à %{value}
|
@@ -453,33 +467,32 @@ fr:
|
|
453
467
|
task_completed: complétée
|
454
468
|
task_completed_ago: complétée il y à %{value}
|
455
469
|
task_completed_by: complétée il y à %{time_ago} par %{user}
|
456
|
-
task_created: La tâche à été
|
470
|
+
task_created: La tâche à été créée
|
457
471
|
task_due_in: échéance dans %{value}
|
458
|
-
task_due_later:
|
459
|
-
task_due_now:
|
460
|
-
task_due_today: "
|
472
|
+
task_due_later: à faire bientôt
|
473
|
+
task_due_now: à faire maintenant
|
474
|
+
task_due_today: "à faire aujourd'hui"
|
461
475
|
task_from: De %{value}
|
462
|
-
task_overdue: en retard,
|
463
|
-
task_pending: La tâche à été mise en attente
|
464
|
-
|
465
|
-
tasks: Taches
|
466
|
-
total_tasks: Total %{value}
|
476
|
+
task_overdue: en retard, échéance prévue le
|
477
|
+
task_pending: La tâche à été mise en attente
|
478
|
+
total_tasks: Total des %{value}
|
467
479
|
view_assigned_tasks: voir les tâches assignées
|
468
480
|
view_pending_tasks: voir les tâches en attente
|
469
481
|
|
470
482
|
# Views -> Home.
|
471
483
|
#----------------------------------------------------------------------------
|
472
|
-
action_commented: commenté le
|
473
|
-
action_completed:
|
474
|
-
action_created: créé
|
475
|
-
action_deleted: supprimé
|
476
|
-
action_email:
|
477
|
-
action_reassigned: réassigné
|
478
|
-
action_rejected: rejeté
|
479
|
-
action_rescheduled: re-planifié
|
480
|
-
action_updated: mis à jour
|
481
|
-
action_viewed: vu
|
482
|
-
action_won: gagné
|
484
|
+
action_commented: a commenté le/la
|
485
|
+
action_completed: a complété le/la
|
486
|
+
action_created: a créé le/la
|
487
|
+
action_deleted: a supprimé le/la
|
488
|
+
action_email: a échangé des mails avec
|
489
|
+
action_reassigned: a réassigné le/la
|
490
|
+
action_rejected: a rejeté le/la
|
491
|
+
action_rescheduled: a re-planifié le/la
|
492
|
+
action_updated: a mis à jour le/la
|
493
|
+
action_viewed: a vu le/la
|
494
|
+
action_won: a gagné une
|
495
|
+
activities: Activités
|
483
496
|
no_activity_records: Aucune activité trouvée.
|
484
497
|
recent_activity: Activité récente
|
485
498
|
recent_activity_options: Options des activités récentes
|
@@ -488,59 +501,111 @@ fr:
|
|
488
501
|
subject_contact: contact
|
489
502
|
subject_lead: piste
|
490
503
|
subject_opportunity: opportunité
|
491
|
-
subject_task:
|
504
|
+
subject_task: tâche
|
505
|
+
created_past_participle: "Création d'enregistrements"
|
506
|
+
commented_past_participle: Commentaires
|
507
|
+
viewed_past_participle: Consultations
|
508
|
+
updated_past_participle: Modifications
|
509
|
+
deleted_past_participle: Supressions
|
510
|
+
email_past_participle: Emails
|
511
|
+
all_events_past_participle: Activités
|
492
512
|
|
493
513
|
# Views -> Common.
|
494
514
|
#----------------------------------------------------------------------------
|
495
515
|
add_note: Ajouter une note
|
496
516
|
save_note: Enregistrer la note
|
497
517
|
add_note_help: Ajouter une nouvelle note...
|
518
|
+
edit_note: Modifier la note
|
498
519
|
added_ago: ajoutée il y à %{value}
|
499
|
-
added_by: ajoutée il y à %{time_ago} par %{user}
|
520
|
+
added_by: ajoutée il y à %{time_ago} par %{user}
|
500
521
|
back: Retour
|
501
522
|
cancel: Annuler
|
502
523
|
close_form: Fermer le formulaire
|
503
524
|
confirm_delete: "Êtes-vous certain de vouloir supprimer ceci : %{value}?"
|
504
|
-
copy_permissions: Copier les permissions de %{value}
|
505
|
-
could_not_find: "%{value}
|
506
|
-
could_not_find_matching: "Aucun(e) %{value} n'a été trouvé correspondant à"
|
525
|
+
copy_permissions: Copier les permissions de %{value}
|
526
|
+
could_not_find: "Aucun(e) %{value} n'a été trouvé(e). N'hésitez pas à "
|
527
|
+
could_not_find_matching: "Aucun(e) %{value} n'a été trouvé(e) correspondant à"
|
507
528
|
create_new: créer un(e)
|
508
|
-
|
529
|
+
create_a_new: créer un(e)
|
530
|
+
select_existing: sélectionnez un(e)
|
509
531
|
delete: Supprimer
|
510
|
-
discard:
|
532
|
+
discard: Abandonner
|
511
533
|
edit: Modifier
|
512
534
|
items_total: '%{count} total.'
|
513
|
-
less:
|
535
|
+
less: Moins...
|
514
536
|
me: moi
|
515
|
-
more:
|
516
|
-
n_a: N/
|
537
|
+
more: Plus...
|
538
|
+
n_a: N/R
|
517
539
|
name: Nom
|
518
|
-
no_match:
|
519
|
-
no_recent_items: "Il n'y rien de récent à afficher"
|
540
|
+
no_match: Aucun(e) %{value} ne correspond
|
541
|
+
no_recent_items: "Il n'y rien de récent à afficher pour l'instant."
|
520
542
|
options: Options
|
521
543
|
permissions: Permissions
|
522
|
-
please_retry:
|
544
|
+
please_retry: essayez une autre requête.
|
523
545
|
recent_items: Objets récents
|
546
|
+
select_contact: Choisir un contact
|
547
|
+
select_lead: Choisir une piste
|
548
|
+
select_task: Choisir une tâche
|
549
|
+
select_opportunity: Choisir une opportunité
|
524
550
|
search_assets: Recherche de %{value}
|
525
|
-
time_ago: "il y
|
551
|
+
time_ago: "il y a %{value}"
|
552
|
+
background_info: Informations
|
553
|
+
address: Adresse
|
554
|
+
street1: Rue 1 # NEW
|
555
|
+
street2: Rue 2 # NEW
|
556
|
+
city: Ville
|
557
|
+
zipcode: Code postal
|
558
|
+
state: Région
|
559
|
+
country: Pays
|
560
|
+
select_a_country: Choisir un pays
|
561
|
+
expand_all: Tout déplier
|
562
|
+
collapse_all: Tout replier
|
563
|
+
expanded: déplier
|
564
|
+
collapsed: replier
|
526
565
|
|
527
566
|
# Views -> Layout.
|
528
567
|
#----------------------------------------------------------------------------
|
529
568
|
about: A propos
|
530
|
-
about_dev_group: Groupe de discussion
|
569
|
+
about_dev_group: Groupe de discussion pour les développeurs
|
531
570
|
about_features: Fonctionnalités et bugs
|
532
|
-
about_ffc: A propos Fat Free CRM
|
533
|
-
about_ffc_resources: Ressources Fat Free CRM (Nouvelle fenêtre)
|
534
|
-
about_ffc_version: Fat Free CRM
|
571
|
+
about_ffc: A propos de Fat Free CRM
|
572
|
+
about_ffc_resources: Ressources pour Fat Free CRM (Nouvelle fenêtre)
|
573
|
+
about_ffc_version: version de Fat Free CRM
|
535
574
|
about_home_page: "Page d'accueil"
|
536
575
|
about_project_page: Page du projet
|
537
576
|
about_thank_you: "Merci d'utiliser Fat Free CRM!"
|
538
|
-
about_twitter:
|
539
|
-
about_user_group:
|
540
|
-
admin:
|
541
|
-
logout:
|
577
|
+
about_twitter: mises à jours sur Twitter
|
578
|
+
about_user_group: Groupe de discussion pour les utilisateurs
|
579
|
+
admin: Administration
|
580
|
+
logout: Se déconnecter
|
542
581
|
quick_find: Recherche rapide
|
543
|
-
welcome:
|
582
|
+
welcome: Bienvenue
|
583
|
+
|
584
|
+
# Views -> Advanced Search.
|
585
|
+
accounts_advanced_search: Recherche avancée des comptes
|
586
|
+
advanced_search: Recherche avancée
|
587
|
+
advanced_search_submit: Rechercher
|
588
|
+
advanced_search_add_group: Ajouter un groupe de filtres
|
589
|
+
advanced_search_group_first: Afficher les enregistrement quand %{combinator} du/des critère(s) suivant(s) correspond(ent)
|
590
|
+
advanced_search_group_rest: ...et quand %{combinator} du/des critère(s) suivant(s) correspond(ent)
|
591
|
+
advanced_search_add_condition: Ajouter un filtre
|
592
|
+
advanced_search_remove_condition: Supprimer un filtre
|
593
|
+
|
594
|
+
ransack:
|
595
|
+
predicates:
|
596
|
+
eq: est égal à
|
597
|
+
not_eq: est différent de
|
598
|
+
lt: est plus petit que
|
599
|
+
gt: est plus grand que
|
600
|
+
matches: ressemble à
|
601
|
+
does_not_match: ne ressemble pas à
|
602
|
+
cont: contient
|
603
|
+
not_cont: ne contient pas
|
604
|
+
blank: est vide
|
605
|
+
present: est présent
|
606
|
+
"null": est nul
|
607
|
+
not_null: est non nul
|
608
|
+
|
544
609
|
|
545
610
|
# Views -> Comments.
|
546
611
|
#----------------------------------------------------------------------------
|
@@ -557,16 +622,15 @@ fr:
|
|
557
622
|
|
558
623
|
# Views -> Admin
|
559
624
|
#----------------------------------------------------------------------------
|
560
|
-
|
561
|
-
|
562
|
-
crm_admin_page: Fat Free CRM Administration
|
625
|
+
back_to_crm: Retour à Fat Free CRM
|
626
|
+
crm_admin_page: Administration de Fat Free CRM
|
563
627
|
|
564
628
|
# Views -> Admin -> Users.
|
565
629
|
#----------------------------------------------------------------------------
|
566
630
|
approve: Approuver
|
567
631
|
create_user: Créer un utilisateur
|
568
|
-
last_seen: vu pour la dernière fois il y
|
569
|
-
personal_information: Informations
|
632
|
+
last_seen: vu pour la dernière fois il y a %{value}
|
633
|
+
personal_information: Informations complémentaires
|
570
634
|
reactivate: Réactiver
|
571
635
|
save_user: "Enregistrer l'utilisateur"
|
572
636
|
suspend: Suspendre
|
@@ -576,29 +640,56 @@ fr:
|
|
576
640
|
user_confirm_delete: Un utilisateur ne peut être supprimé que si aucun objet lui appartenant existent toujours.
|
577
641
|
user_is_admin: "L'utilisateur est administrateur"
|
578
642
|
user_never_logged_in: "ne s'est pas encore connecté"
|
579
|
-
user_signed_up:
|
643
|
+
user_signed_up: est enregistré
|
580
644
|
user_signed_up_on: "s'est enregistré le %{value}"
|
581
|
-
user_since: utilisateur depuis %{value}
|
645
|
+
user_since: utilisateur depuis le %{value}
|
582
646
|
user_suspended: Suspendu
|
583
647
|
user_suspended_on: suspendu le %{value}
|
584
648
|
users: Utilisateurs
|
585
649
|
users_small: utilisateurs
|
586
650
|
|
651
|
+
# Views -> Versions
|
652
|
+
#----------------------------------------------------------------------------
|
653
|
+
versions: Historique
|
654
|
+
version:
|
655
|
+
create: Créé par %{by} il y a %{when}.
|
656
|
+
update: Modifié par %{by} il y a %{when}.
|
657
|
+
destroy: Détruit par %{by} il y a %{when}.
|
658
|
+
set: %{attr} renseigné %{to}
|
659
|
+
unset: %{attr} supprimé
|
660
|
+
change: %{attr} changé de %{from} à %{to}
|
661
|
+
anonymous: anonyme
|
662
|
+
|
663
|
+
# Export.
|
664
|
+
#----------------------------------------------------------------------------
|
665
|
+
to_xls: Exporter au format Excel
|
666
|
+
to_csv: Exporter au format CSV (enregistrements supprimés inclus)
|
667
|
+
to_rss: fil RSS
|
668
|
+
to_atom: fil Atom
|
669
|
+
|
587
670
|
# Dropbox.
|
588
671
|
#----------------------------------------------------------------------------
|
589
|
-
dropbox_ack_subject: dropbox -
|
590
|
-
dropbox_ack_intro:
|
591
|
-
dropbox_ack_to:
|
672
|
+
dropbox_ack_subject: dropbox - Email ajouté - %{subject}
|
673
|
+
dropbox_ack_intro: "a ajouté l'email que vous avez envoyé à la dropbox"
|
674
|
+
dropbox_ack_to: ajoutés aux
|
592
675
|
subject: Sujet
|
593
676
|
body: Corps
|
594
|
-
|
677
|
+
|
678
|
+
# Lists
|
679
|
+
#----------------------------------------------------------------------------
|
680
|
+
lists: Listes
|
681
|
+
list: Liste
|
682
|
+
no_saved_lists: Liste non sauvegardée
|
683
|
+
make_current_view_list: Faire de la vue courante une liste
|
684
|
+
list_name_info: Si vous utilisez le nom d'une liste existante vous écraserez cette liste avec vos paramètres courants
|
685
|
+
|
595
686
|
# Pluralizations.
|
596
687
|
#----------------------------------------------------------------------------
|
597
688
|
pluralize:
|
598
689
|
comment:
|
599
|
-
one: '1
|
600
|
-
other: '%{count}
|
601
|
-
contact:
|
690
|
+
one: '1 commentaire'
|
691
|
+
other: '%{count} commentaires'
|
692
|
+
contact:
|
602
693
|
one: '1 contact'
|
603
694
|
other: '%{count} contacts'
|
604
695
|
opportunity:
|
@@ -620,14 +711,138 @@ fr:
|
|
620
711
|
formats:
|
621
712
|
mmddyyyy: "%d/%m/%Y"
|
622
713
|
mmdd: "%e %b"
|
623
|
-
mmddyy: "%e %b
|
714
|
+
mmddyy: "%e %b %Y"
|
624
715
|
|
625
716
|
time:
|
626
717
|
formats:
|
627
|
-
mmddhhss: "%
|
628
|
-
|
718
|
+
mmddhhss: "%b %e à %H:%M%"
|
719
|
+
mmddyyyy_hhmm: "%d/%m/%Y à %H:%M"
|
720
|
+
|
629
721
|
calendar_date_select:
|
630
722
|
ok: OK
|
631
723
|
now: Maintenant
|
632
724
|
today: "Aujourd'hui"
|
633
725
|
clear: Vider
|
726
|
+
|
727
|
+
# If you need custom format look at
|
728
|
+
# http://code.google.com/p/calendardateselect/wiki/ChangingDateFormatCustom
|
729
|
+
calendar_date_select_format: french
|
730
|
+
|
731
|
+
# will_paginate translations copied for 'fr'
|
732
|
+
#----------------------------------------------------------------------------
|
733
|
+
will_paginate:
|
734
|
+
previous_label: "← Précédent"
|
735
|
+
next_label: "Suivant →"
|
736
|
+
page_gap: "…"
|
737
|
+
|
738
|
+
page_entries_info:
|
739
|
+
single_page:
|
740
|
+
zero: "Aucun(e) %{name} trouvé"
|
741
|
+
one: "Affichage de 1 %{name}"
|
742
|
+
other: "Affichage de %{count} %{plural}"
|
743
|
+
|
744
|
+
multi_page: "Affichage des %{plural} %{from} à %{to} de %{total} au total"
|
745
|
+
|
746
|
+
|
747
|
+
# Views -> Admin -> Custom Fields
|
748
|
+
#----------------------------------------------------------------------------
|
749
|
+
label: Etiquette
|
750
|
+
custom_fields: Champs personnalisés
|
751
|
+
custom_field_options: Options des champs personnalisés
|
752
|
+
create_field: Créer un champ
|
753
|
+
save_field: Enregistrer le champ
|
754
|
+
create_field_group: Créer une section (groupe de champs)
|
755
|
+
edit_field_group: Editer la section
|
756
|
+
save_field_group: enregistrer la section
|
757
|
+
|
758
|
+
field_group_empty: "Il n'y a aucun champ dans cette section"
|
759
|
+
|
760
|
+
select_or_create_tags: "Sélectionner un tag ou créez un nouveau tag en validant par la touche entrée."
|
761
|
+
|
762
|
+
restrict_by_tag: Restriction par tag
|
763
|
+
restrict_by_tag_info: Cette section ne sera visible que pour les %{assets} qui seront taggé(e)s"
|
764
|
+
field_group_tag_restriction: Cette section est visible pour les %{assets} qui sont taggé(e)s "%{tag}"
|
765
|
+
field_group_unrestricted: "Cette section est visible pour l'ensemble des %{assets}"
|
766
|
+
field_group_confirm_delete: Quand une section est supprimée, tous les champs personnalisés sont déplacés vers la section par défaut.
|
767
|
+
msg_cant_delete_field_group: Cette section ne peut pas être supprimée.
|
768
|
+
|
769
|
+
admin_fields_info: |
|
770
|
+
Les champs personnalisés sont affichés dans des sections.
|
771
|
+
Créez d'abord une nouvelle section, ou ajoutez les champs dans une section existante ci-dessous.<br />
|
772
|
+
Vous pouvez faire glisser les champs pour ordonner leur présentation ou les faire changer de section.
|
773
|
+
|
774
|
+
# Views -> Admin -> Tags
|
775
|
+
#----------------------------------------------------------------------------
|
776
|
+
tags: Tags
|
777
|
+
tag_small: tag
|
778
|
+
tagged: taggé(es)
|
779
|
+
create_tag: Créer un tag
|
780
|
+
save_tag: Enregistrer le tag
|
781
|
+
field_group_tags: Sections visibles pour ce tag
|
782
|
+
tag_with_taggings_confirm_delete: "En supprimant ce tag, il sera supprimé de %{value} enregistrements."
|
783
|
+
msg_cant_delete_tag: "Impossible de supprimer '%{value}' car il est associé à au moins une section."
|
784
|
+
|
785
|
+
|
786
|
+
# Views -> Admin -> Plugins
|
787
|
+
#----------------------------------------------------------------------------
|
788
|
+
views:
|
789
|
+
admin:
|
790
|
+
plugins:
|
791
|
+
author: Auteur
|
792
|
+
version: Version
|
793
|
+
description: Description
|
794
|
+
|
795
|
+
# Simple Form translations
|
796
|
+
#----------------------------------------------------------------------------
|
797
|
+
simple_form:
|
798
|
+
"yes": 'Oui'
|
799
|
+
"no": 'Non'
|
800
|
+
required:
|
801
|
+
text: 'required'
|
802
|
+
mark: '*'
|
803
|
+
# You can uncomment the line below if you need to overwrite the whole required html.
|
804
|
+
# When using html, text and mark won't be used.
|
805
|
+
# html: '<abbr title="required">*</abbr>'
|
806
|
+
error_notification:
|
807
|
+
default_message: "Votre demande ne peut aboutir, les erreurs suivantes se sont déclenchées:"
|
808
|
+
# Labels and hints examples
|
809
|
+
# labels:
|
810
|
+
# password: 'Password'
|
811
|
+
# user:
|
812
|
+
# new:
|
813
|
+
# email: 'E-mail para efetuar o sign in.'
|
814
|
+
# edit:
|
815
|
+
# email: 'E-mail.'
|
816
|
+
# hints:
|
817
|
+
# username: 'User name to sign in.'
|
818
|
+
# password: 'No special characters, please.'
|
819
|
+
|
820
|
+
|
821
|
+
# Form field types
|
822
|
+
#----------------------------------------------------------------------------
|
823
|
+
field_types:
|
824
|
+
string: Texte court
|
825
|
+
text: Texte long
|
826
|
+
select: Liste de sélection
|
827
|
+
multiselect: Liste de sélection (multiple)
|
828
|
+
radio: Boutons radios
|
829
|
+
boolean: Case à cocher
|
830
|
+
check_boxes: Liste de cases à cocher
|
831
|
+
date: Date
|
832
|
+
datetime: Date et heure
|
833
|
+
email: Adresse email
|
834
|
+
url: URL
|
835
|
+
tel: Numéro de téléphone
|
836
|
+
decimal: Nombre décimal
|
837
|
+
integer: Nombre entier
|
838
|
+
float: Nombre flottant
|
839
|
+
|
840
|
+
# dynamic_form plugin translations.
|
841
|
+
#----------------------------------------------------------------------------
|
842
|
+
errors:
|
843
|
+
template:
|
844
|
+
header:
|
845
|
+
one: "Impossible d'enregistrer ce %{model} : 1 erreur"
|
846
|
+
other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
|
847
|
+
body: "Veuillez vérifier les champs suivants : "
|
848
|
+
|