fat_free_crm 0.11.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
|
+
|