diff --git a/app/Http/Controllers/BaseAPIController.php b/app/Http/Controllers/BaseAPIController.php
index af603a9c8f53..3a3a1e0bece9 100644
--- a/app/Http/Controllers/BaseAPIController.php
+++ b/app/Http/Controllers/BaseAPIController.php
@@ -92,13 +92,19 @@ class BaseAPIController extends Controller
protected function response($response)
{
$index = Request::get('index') ?: 'data';
- $meta = isset($response['meta']) ? $response['meta'] : null;
- $response = [
- $index => $response
- ];
- if ($meta) {
- $response['meta'] = $meta;
- unset($response[$index]['meta']);
+
+ if ($index == 'none') {
+ unset($response['meta']);
+ } else {
+ $meta = isset($response['meta']) ? $response['meta'] : null;
+ $response = [
+ $index => $response
+ ];
+
+ if ($meta) {
+ $response['meta'] = $meta;
+ unset($response[$index]['meta']);
+ }
}
$response = json_encode($response, JSON_PRETTY_PRINT);
diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php
index fa4c9df266d5..a3fea1435fb4 100644
--- a/app/Http/Controllers/ClientApiController.php
+++ b/app/Http/Controllers/ClientApiController.php
@@ -137,7 +137,7 @@ class ClientApiController extends BaseAPIController
if ($request->action == ACTION_ARCHIVE) {
try {
- $client = Client::scope($publicId)->firstOrFail();
+ $client = Client::scope($publicId)->withTrashed()->firstOrFail();
} catch (ModelNotFoundException $e) {
return $this->errorResponse(['message'=>'Record not found'], 400);
}
@@ -149,6 +149,20 @@ class ClientApiController extends BaseAPIController
return $this->response($data);
}
+ else if ($request->action == ACTION_RESTORE){
+
+ $client = Client::scope($publicId)->withTrashed()->first();
+
+ if(!$client)
+ return $this->errorResponse(['message'=>'Client not found.']);
+
+ $this->clientRepo->restore($client);
+
+ $transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer'));
+ $data = $this->createItem($client, $transformer, ENTITY_CLIENT);
+
+ return $this->response($data);
+ }
$data = $request->input();
$data['public_id'] = $publicId;
@@ -158,6 +172,9 @@ class ClientApiController extends BaseAPIController
->with('country', 'contacts', 'industry', 'size', 'currency')
->first();
+ if(!$client)
+ return $this->errorResponse(['message'=>'Client not found.']);
+
$transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer'));
$data = $this->createItem($client, $transformer, ENTITY_CLIENT);
diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php
index 3f7af9721876..f6a5b9b60b3d 100644
--- a/app/Http/Controllers/InvoiceApiController.php
+++ b/app/Http/Controllers/InvoiceApiController.php
@@ -12,6 +12,7 @@ use App\Models\Contact;
use App\Models\Product;
use App\Models\Invitation;
use App\Ninja\Repositories\ClientRepository;
+use App\Ninja\Repositories\PaymentRepository;
use App\Ninja\Repositories\InvoiceRepository;
use App\Ninja\Mailers\ContactMailer as Mailer;
use App\Http\Controllers\BaseAPIController;
@@ -23,12 +24,13 @@ class InvoiceApiController extends BaseAPIController
{
protected $invoiceRepo;
- public function __construct(InvoiceRepository $invoiceRepo, ClientRepository $clientRepo, Mailer $mailer)
+ public function __construct(InvoiceRepository $invoiceRepo, ClientRepository $clientRepo, PaymentRepository $paymentRepo, Mailer $mailer)
{
parent::__construct();
$this->invoiceRepo = $invoiceRepo;
$this->clientRepo = $clientRepo;
+ $this->paymentRepo = $paymentRepo;
$this->mailer = $mailer;
}
@@ -123,14 +125,26 @@ class InvoiceApiController extends BaseAPIController
}
$clientData = ['contact' => ['email' => $email]];
- foreach (['name', 'private_notes'] as $field) {
+ foreach ([
+ 'name',
+ 'address1',
+ 'address2',
+ 'city',
+ 'state',
+ 'postal_code',
+ 'private_notes',
+ ] as $field) {
if (isset($data[$field])) {
$clientData[$field] = $data[$field];
}
}
- foreach (['first_name', 'last_name'] as $field) {
+ foreach ([
+ 'first_name',
+ 'last_name',
+ 'phone',
+ ] as $field) {
if (isset($data[$field])) {
- $clientData[$field] = $data[$field];
+ $clientData['contact'][$field] = $data[$field];
}
}
@@ -143,6 +157,16 @@ class InvoiceApiController extends BaseAPIController
$data = self::prepareData($data, $client);
$data['client_id'] = $client->id;
$invoice = $this->invoiceRepo->save($data);
+ $payment = false;
+
+ // Optionally create payment with invoice
+ if (isset($data['paid']) && $data['paid']) {
+ $payment = $this->paymentRepo->save([
+ 'invoice_id' => $invoice->id,
+ 'client_id' => $client->id,
+ 'amount' => $data['paid']
+ ]);
+ }
if (!isset($data['id'])) {
$invitation = Invitation::createNew();
@@ -153,7 +177,11 @@ class InvoiceApiController extends BaseAPIController
}
if (isset($data['email_invoice']) && $data['email_invoice']) {
- $this->mailer->sendInvoice($invoice);
+ if ($payment) {
+ $this->mailer->sendPaymentConfirmation($payment);
+ } else {
+ $this->mailer->sendInvoice($invoice);
+ }
}
$invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first();
diff --git a/app/Http/routes.php b/app/Http/routes.php
index 9001c18e6256..04a34b268726 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -509,7 +509,7 @@ if (!defined('CONTACT_EMAIL')) {
define('NINJA_GATEWAY_CONFIG', 'NINJA_GATEWAY_CONFIG');
define('NINJA_WEB_URL', 'https://www.invoiceninja.com');
define('NINJA_APP_URL', 'https://app.invoiceninja.com');
- define('NINJA_VERSION', '2.5.0.1');
+ define('NINJA_VERSION', '2.5.0.2');
define('NINJA_DATE', '2000-01-01');
define('SOCIAL_LINK_FACEBOOK', 'https://www.facebook.com/invoiceninja');
diff --git a/app/Libraries/Utils.php b/app/Libraries/Utils.php
index 3515dc1c83c6..53a586f804be 100644
--- a/app/Libraries/Utils.php
+++ b/app/Libraries/Utils.php
@@ -686,7 +686,7 @@ class Utils
return EVENT_CREATE_PAYMENT;
} elseif ($eventName == 'create_vendor') {
return EVENT_CREATE_VENDOR;
- }else {
+ } else {
return false;
}
}
@@ -694,7 +694,7 @@ class Utils
public static function notifyZapier($subscription, $data)
{
$curl = curl_init();
- $jsonEncodedData = json_encode($data->toPublicArray());
+ $jsonEncodedData = json_encode($data);
$opts = [
CURLOPT_URL => $subscription->target_url,
@@ -717,37 +717,6 @@ class Utils
}
}
- public static function hideIds($data, $mapped = false)
- {
- $publicId = null;
-
- if (!$mapped) {
- $mapped = [];
- }
-
- foreach ($data as $key => $val) {
- if (is_array($val)) {
- if ($key == 'account' || isset($mapped[$key])) {
- // do nothing
- } else {
- $mapped[$key] = true;
- $data[$key] = Utils::hideIds($val, $mapped);
- }
- } elseif ($key == 'id' || strpos($key, '_id')) {
- if ($key == 'public_id') {
- $publicId = $val;
- }
- unset($data[$key]);
- }
- }
-
- if ($publicId) {
- $data['id'] = $publicId;
- }
-
- return $data;
- }
-
public static function getApiHeaders($count = 0)
{
return [
diff --git a/app/Listeners/SubscriptionListener.php b/app/Listeners/SubscriptionListener.php
index fab5a2c57493..2d12fcaeb953 100644
--- a/app/Listeners/SubscriptionListener.php
+++ b/app/Listeners/SubscriptionListener.php
@@ -12,50 +12,68 @@ use App\Events\PaymentWasCreated;
use App\Events\VendorWasCreated;
use App\Events\ExpenseWasCreated;
+use App\Ninja\Transformers\InvoiceTransformer;
+use App\Ninja\Transformers\ClientTransformer;
+use App\Ninja\Transformers\PaymentTransformer;
+
+use League\Fractal\Manager;
+use League\Fractal\Resource\Item;
+use App\Ninja\Serializers\ArraySerializer;
+
class SubscriptionListener
{
public function createdClient(ClientWasCreated $event)
{
- $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CLIENT, $event->client);
+ $transformer = new ClientTransformer(Auth::user()->account);
+ $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CLIENT, $event->client, $transformer);
}
public function createdQuote(QuoteWasCreated $event)
{
- $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_QUOTE, $event->quote);
+ $transformer = new InvoiceTransformer(Auth::user()->account);
+ $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_QUOTE, $event->quote, $transformer, ENTITY_CLIENT);
}
public function createdPayment(PaymentWasCreated $event)
{
- $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_PAYMENT, $event->payment);
+ $transformer = new PaymentTransformer(Auth::user()->account);
+ $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_PAYMENT, $event->payment, $transformer, [ENTITY_CLIENT, ENTITY_INVOICE]);
}
public function createdCredit(CreditWasCreated $event)
{
- $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CREDIT, $event->credit);
+ //$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_CREDIT, $event->credit);
}
public function createdInvoice(InvoiceWasCreated $event)
{
- $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_INVOICE, $event->invoice);
- }
-
- private function checkSubscriptions($activityTypeId, $entity)
- {
- $subscription = $entity->account->getSubscription($activityTypeId);
-
- if ($subscription) {
- Utils::notifyZapier($subscription, $entity);
- }
+ $transformer = new InvoiceTransformer(Auth::user()->account);
+ $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_INVOICE, $event->invoice, $transformer, ENTITY_CLIENT);
}
public function createdVendor(VendorWasCreated $event)
{
- $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_VENDOR, $event->vendor);
+ //$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_VENDOR, $event->vendor);
}
public function createdExpense(ExpenseWasCreated $event)
{
- $this->checkSubscriptions(ACTIVITY_TYPE_CREATE_EXPENSE, $event->expense);
+ //$this->checkSubscriptions(ACTIVITY_TYPE_CREATE_EXPENSE, $event->expense);
+ }
+
+ private function checkSubscriptions($activityTypeId, $entity, $transformer, $include = '')
+ {
+ $subscription = $entity->account->getSubscription($activityTypeId);
+
+ if ($subscription) {
+ $manager = new Manager();
+ $manager->setSerializer(new ArraySerializer());
+ $manager->parseIncludes($include);
+
+ $resource = new Item($entity, $transformer, $entity->getEntityType());
+ $data = $manager->createData($resource)->toArray();
+
+ Utils::notifyZapier($subscription, $data);
+ }
}
-
}
diff --git a/app/Models/Account.php b/app/Models/Account.php
index cca359734ee0..876804bf42a7 100644
--- a/app/Models/Account.php
+++ b/app/Models/Account.php
@@ -726,6 +726,10 @@ class Account extends Eloquent
public function isTrial()
{
+ if (!Utils::isNinjaProd()) {
+ return false;
+ }
+
if ($this->pro_plan_paid && $this->pro_plan_paid != '0000-00-00') {
return false;
}
diff --git a/app/Models/Client.php b/app/Models/Client.php
index 2984f7372fd5..eae0eb1c148f 100644
--- a/app/Models/Client.php
+++ b/app/Models/Client.php
@@ -3,8 +3,6 @@
use Utils;
use DB;
use Carbon;
-use App\Events\ClientWasCreated;
-use App\Events\ClientWasUpdated;
use Laracasts\Presenter\PresentableTrait;
use Illuminate\Database\Eloquent\SoftDeletes;
@@ -299,14 +297,6 @@ Client::creating(function ($client) {
$client->setNullValues();
});
-Client::created(function ($client) {
- event(new ClientWasCreated($client));
-});
-
Client::updating(function ($client) {
$client->setNullValues();
});
-
-Client::updated(function ($client) {
- event(new ClientWasUpdated($client));
-});
diff --git a/app/Models/EntityModel.php b/app/Models/EntityModel.php
index b8e7d651ada4..9e3fd6ec53e8 100644
--- a/app/Models/EntityModel.php
+++ b/app/Models/EntityModel.php
@@ -91,30 +91,6 @@ class EntityModel extends Eloquent
return $this->getName();
}
- // Remap ids to public_ids and show name
- public function toPublicArray()
- {
- $data = $this->toArray();
-
- foreach ($this->attributes as $key => $val) {
- if (strpos($key, '_id')) {
- list($field, $id) = explode('_', $key);
- if ($field == 'account') {
- // do nothing
- } else {
- $entity = @$this->$field;
- if ($entity) {
- $data["{$field}_name"] = $entity->getName();
- }
- }
- }
- }
-
- $data = Utils::hideIds($data);
-
- return $data;
- }
-
public function setNullValues()
{
foreach ($this->fillable as $field) {
diff --git a/app/Ninja/Repositories/AccountRepository.php b/app/Ninja/Repositories/AccountRepository.php
index 2170c34f25ad..2b469bf0fcf7 100644
--- a/app/Ninja/Repositories/AccountRepository.php
+++ b/app/Ninja/Repositories/AccountRepository.php
@@ -75,26 +75,26 @@ class AccountRepository
->where('clients.deleted_at', '=', null)
->where('clients.account_id', '=', \Auth::user()->account_id)
->whereRaw("clients.name <> ''")
- ->select(\DB::raw("'" . trans('texts.clients') . "' as type, clients.public_id, clients.name, '' as token"));
+ ->select(\DB::raw("'clients' as type, '" . trans('texts.clients') . "' as trans_type, clients.public_id, clients.name, '' as token"));
$contacts = \DB::table('clients')
->join('contacts', 'contacts.client_id', '=', 'clients.id')
->where('clients.deleted_at', '=', null)
->where('clients.account_id', '=', \Auth::user()->account_id)
->whereRaw("CONCAT(contacts.first_name, contacts.last_name, contacts.email) <> ''")
- ->select(\DB::raw("'" . trans('texts.contacts') . "' as type, clients.public_id, CONCAT(contacts.first_name, ' ', contacts.last_name, ' ', contacts.email) as name, '' as token"));
+ ->select(\DB::raw("'clients' as type, '" . trans('texts.contacts') . "' as trans_type, clients.public_id, CONCAT(contacts.first_name, ' ', contacts.last_name, ' ', contacts.email) as name, '' as token"));
$invoices = \DB::table('clients')
->join('invoices', 'invoices.client_id', '=', 'clients.id')
->where('clients.account_id', '=', \Auth::user()->account_id)
->where('clients.deleted_at', '=', null)
->where('invoices.deleted_at', '=', null)
- ->select(\DB::raw("'" . trans('texts.invoices') . "' as type, invoices.public_id, CONCAT(invoices.invoice_number, ': ', clients.name) as name, invoices.invoice_number as token"));
+ ->select(\DB::raw("'invoices' as type, '" . trans('texts.invoices') . "' as trans_type, invoices.public_id, CONCAT(invoices.invoice_number, ': ', clients.name) as name, invoices.invoice_number as token"));
$data = [];
foreach ($clients->union($contacts)->union($invoices)->get() as $row) {
- $type = $row->type;
+ $type = $row->trans_type;
if (!isset($data[$type])) {
$data[$type] = [];
@@ -111,6 +111,7 @@ class AccountRepository
'value' => $row->name,
'public_id' => $row->public_id,
'tokens' => $tokens,
+ 'entity_type' => $row->type,
];
}
diff --git a/app/Ninja/Repositories/ClientRepository.php b/app/Ninja/Repositories/ClientRepository.php
index 3e43d8f34f5f..324d62a45943 100644
--- a/app/Ninja/Repositories/ClientRepository.php
+++ b/app/Ninja/Repositories/ClientRepository.php
@@ -5,6 +5,8 @@ use App\Ninja\Repositories\BaseRepository;
use App\Models\Client;
use App\Models\Contact;
use App\Models\Activity;
+use App\Events\ClientWasCreated;
+use App\Events\ClientWasUpdated;
class ClientRepository extends BaseRepository
{
@@ -97,6 +99,12 @@ class ClientRepository extends BaseRepository
}
}
+ if (!$publicId || $publicId == '-1') {
+ event(new ClientWasCreated($client));
+ } else {
+ event(new ClientWasUpdated($client));
+ }
+
return $client;
}
}
diff --git a/app/Ninja/Transformers/ClientTransformer.php b/app/Ninja/Transformers/ClientTransformer.php
index 66fdd35bf064..83ee7e56238b 100644
--- a/app/Ninja/Transformers/ClientTransformer.php
+++ b/app/Ninja/Transformers/ClientTransformer.php
@@ -40,8 +40,11 @@ class ClientTransformer extends EntityTransformer
* @SWG\Property(property="language_id", type="integer", example=1)
*/
- protected $availableIncludes = [
+ protected $defaultIncludes = [
'contacts',
+ ];
+
+ protected $availableIncludes = [
'invoices',
'credits',
];
@@ -92,7 +95,9 @@ class ClientTransformer extends EntityTransformer
'vat_number' => $client->vat_number,
'id_number' => $client->id_number,
'language_id' => (int) $client->language_id,
- 'currency_id' => (int) $client->currency_id
+ 'currency_id' => (int) $client->currency_id,
+ 'custom_value1' => $client->custom_value1,
+ 'custom_value2' => $client->custom_value2,
];
}
}
\ No newline at end of file
diff --git a/app/Ninja/Transformers/InvoiceTransformer.php b/app/Ninja/Transformers/InvoiceTransformer.php
index d673c87e95f9..464fc5e3fad7 100644
--- a/app/Ninja/Transformers/InvoiceTransformer.php
+++ b/app/Ninja/Transformers/InvoiceTransformer.php
@@ -22,11 +22,12 @@ class InvoiceTransformer extends EntityTransformer
protected $defaultIncludes = [
'invoice_items',
- 'payments'
];
protected $availableIncludes = [
'invitations',
+ 'payments',
+ 'client',
];
public function includeInvoiceItems(Invoice $invoice)
@@ -47,6 +48,12 @@ class InvoiceTransformer extends EntityTransformer
return $this->includeCollection($invoice->payments, $transformer, ENTITY_PAYMENT);
}
+ public function includeClient(Invoice $invoice)
+ {
+ $transformer = new ClientTransformer($this->account, $this->serializer);
+ return $this->includeItem($invoice->client, $transformer, 'client');
+ }
+
public function transform(Invoice $invoice)
{
return [
@@ -89,6 +96,8 @@ class InvoiceTransformer extends EntityTransformer
'custom_taxes2' => (bool) $invoice->custom_taxes2,
'has_expenses' => (bool) $invoice->has_expenses,
'quote_invoice_id' => (int) $invoice->quote_invoice_id,
+ 'custom_text_value1' => $invoice->custom_text_value1,
+ 'custom_text_value2' => $invoice->custom_text_value2,
];
}
}
diff --git a/app/Ninja/Transformers/PaymentTransformer.php b/app/Ninja/Transformers/PaymentTransformer.php
index a2750eaad8af..22642259751a 100644
--- a/app/Ninja/Transformers/PaymentTransformer.php
+++ b/app/Ninja/Transformers/PaymentTransformer.php
@@ -20,6 +20,11 @@ class PaymentTransformer extends EntityTransformer
*/
protected $defaultIncludes = [];
+ protected $availableIncludes = [
+ 'client',
+ 'invoice',
+ ];
+
public function __construct(Account $account)
{
diff --git a/public/built.js b/public/built.js
index 417e368dcb15..ec11a94ceb11 100644
--- a/public/built.js
+++ b/public/built.js
@@ -30311,7 +30311,7 @@ if (window.ko) {
function getContactDisplayName(contact)
{
if (contact.first_name || contact.last_name) {
- return contact.first_name + ' ' + contact.last_name;
+ return (contact.first_name || '') + ' ' + (contact.last_name || '');
} else {
return contact.email;
}
@@ -30967,11 +30967,11 @@ function GetPdfMake(invoice, javascript, callback) {
if (invoice.is_pro) {
if (key === 'header') {
return function(page, pages) {
- return page === 1 || account.all_pages_header ? val : '';
+ return page === 1 || invoice.account.all_pages_header == '1' ? val : '';
}
} else if (key === 'footer') {
return function(page, pages) {
- return page === pages || account.all_pages_footer ? val : '';
+ return page === pages || invoice.account.all_pages_footer == '1' ? val : '';
}
}
}
diff --git a/public/css/built.css b/public/css/built.css
index a93d1f86a77c..5a511b0f1f1b 100644
--- a/public/css/built.css
+++ b/public/css/built.css
@@ -2626,10 +2626,6 @@ border-radius: 3px;
/*new*/
-div {
- word-break: break-word;
-}
-
div.input-group {
word-break: normal;
}
diff --git a/public/css/style.css b/public/css/style.css
index 78c44f781fe2..e469e9418d83 100644
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -275,10 +275,6 @@ border-radius: 3px;
/*new*/
-div {
- word-break: break-word;
-}
-
div.input-group {
word-break: normal;
}
diff --git a/public/js/pdf.pdfmake.js b/public/js/pdf.pdfmake.js
index 64eb33811baf..58ddd24d2db7 100644
--- a/public/js/pdf.pdfmake.js
+++ b/public/js/pdf.pdfmake.js
@@ -58,11 +58,11 @@ function GetPdfMake(invoice, javascript, callback) {
if (invoice.is_pro) {
if (key === 'header') {
return function(page, pages) {
- return page === 1 || account.all_pages_header ? val : '';
+ return page === 1 || invoice.account.all_pages_header == '1' ? val : '';
}
} else if (key === 'footer') {
return function(page, pages) {
- return page === pages || account.all_pages_footer ? val : '';
+ return page === pages || invoice.account.all_pages_footer == '1' ? val : '';
}
}
}
diff --git a/public/js/script.js b/public/js/script.js
index e1feaefd8f28..a98db86385aa 100644
--- a/public/js/script.js
+++ b/public/js/script.js
@@ -430,7 +430,7 @@ if (window.ko) {
function getContactDisplayName(contact)
{
if (contact.first_name || contact.last_name) {
- return contact.first_name + ' ' + contact.last_name;
+ return (contact.first_name || '') + ' ' + (contact.last_name || '');
} else {
return contact.email;
}
diff --git a/readme.md b/readme.md
index 0e2ce989ff04..d9f7f05a2bbc 100644
--- a/readme.md
+++ b/readme.md
@@ -55,7 +55,7 @@ There are two options:
* [Feature Roadmap](https://trello.com/b/63BbiVVe/)
### Pull Requests
-We're using the [git-flow](http://nvie.com/posts/a-successful-git-branching-model/) model of branching and releasing, **please create pull requests against the develop branch**.
+We're using the [Git-Flow](http://nvie.com/posts/a-successful-git-branching-model/) model of branching and releasing, **please create pull requests against the develop branch**.
### Contributors
* [Troels Liebe Bentsen](https://github.com/tlbdk)
diff --git a/resources/lang/fr_CA/texts.php b/resources/lang/fr_CA/texts.php
index d50028f264b5..f5deda9deda3 100644
--- a/resources/lang/fr_CA/texts.php
+++ b/resources/lang/fr_CA/texts.php
@@ -9,34 +9,34 @@ return array(
'work_phone' => 'Téléphone',
'address' => 'Adresse',
'address1' => 'Rue',
- 'address2' => 'Appt/Bâtiment',
+ 'address2' => 'Adresse 2',
'city' => 'Ville',
- 'state' => 'Région/Département',
+ 'state' => 'Province',
'postal_code' => 'Code Postal',
'country_id' => 'Pays',
- 'contacts' => 'Informations de contact', //if you speak about contact details
+ 'contacts' => 'Contact',
'first_name' => 'Prénom',
'last_name' => 'Nom',
'phone' => 'Téléphone',
'email' => 'Courriel',
'additional_info' => 'Informations complémentaires',
- 'payment_terms' => 'Conditions de paiement',
+ 'payment_terms' => 'Termes',
'currency_id' => 'Devise',
- 'size_id' => 'Taille',
- 'industry_id' => 'Secteur', // literal translation : Industrie
+ 'size_id' => 'Taille de l\'entreprise',
+ 'industry_id' => 'Secteur d\'activité',
'private_notes' => 'Note personnelle',
// invoice
'invoice' => 'Facture',
'client' => 'Client',
- 'invoice_date' => 'Date de la facture',
- 'due_date' => 'Date d\'échéance',
- 'invoice_number' => 'Numéro de facture',
+ 'invoice_date' => 'Date',
+ 'due_date' => 'Échéance',
+ 'invoice_number' => 'N° de facture',
'invoice_number_short' => 'Facture #',
- 'po_number' => 'Numéro du bon de commande',
+ 'po_number' => 'N° bon de commande',
'po_number_short' => 'Bon de commande #',
'frequency_id' => 'Fréquence',
- 'discount' => 'Remise',
+ 'discount' => 'Escompte',
'taxes' => 'Taxes',
'tax' => 'Taxe',
'item' => 'Article',
@@ -45,10 +45,10 @@ return array(
'quantity' => 'Quantité',
'line_total' => 'Total',
'subtotal' => 'Total',
- 'paid_to_date' => 'Versé à ce jour',//this one is not very used in France
- 'balance_due' => 'Montant total',//can be "Montant à verser" or "Somme totale"
- 'invoice_design_id' => 'Design', //if you speak about invoice's design -> "Modèle"
- 'terms' => 'Conditions',
+ 'paid_to_date' => 'Montant reçu',
+ 'balance_due' => 'Montant total',
+ 'invoice_design_id' => 'Modèle',
+ 'terms' => 'Termes',
'your_invoice' => 'Votre Facture',
'remove_contact' => 'Supprimer un contact',
@@ -61,18 +61,18 @@ return array(
'note_to_client' => 'Commentaire pour le client',
'invoice_terms' => 'Conditions de facturation',
'save_as_default_terms' => 'Sauvegarder comme conditions par défaut',
- 'download_pdf' => 'Télécharger le PDF',
+ 'download_pdf' => 'PDF',
'pay_now' => 'Payer maintenant',
'save_invoice' => 'Sauvegarder la facture',
'clone_invoice' => 'Dupliquer la facture',
'archive_invoice' => 'Archiver la facture',
'delete_invoice' => 'Supprimer la facture',
- 'email_invoice' => 'Envoyer la facture par courriel',
+ 'email_invoice' => 'Envoyer par courriel',
'enter_payment' => 'Saisissez un paiement',
'tax_rates' => 'Taux de taxe',
'rate' => 'Taux',
'settings' => 'Paramètres',
- 'enable_invoice_tax' => 'Spécifier une
taxe pour la facture',
+ 'enable_invoice_tax' => 'Spécifier une taxe pour la facture',
'enable_line_item_tax' => 'Spécifier une taxe pour chaque ligne',
// navigation
@@ -83,7 +83,7 @@ return array(
'credits' => 'Crédits',
'history' => 'Historique',
'search' => 'Rechercher',
- 'sign_up' => 'S\'enregistrer',
+ 'sign_up' => 'Inscription',
'guest' => 'Invité',
'company_details' => 'Informations sur l\'entreprise',
'online_payments' => 'Paiements en ligne',
@@ -104,13 +104,13 @@ return array(
// recurring invoices
'recurring_invoices' => 'Factures récurrentes',
'recurring_help' => '
Envoyer automatiquement la même facture à vos clients de façon hebdomadaire, bimensuelle, mensuelle, trimestrielle ou annuelle.
-Utiliser :MONTH, :QUARTER ou :YEAR pour des dates dynamiques. Les opérations simples fonctionnent également, par exemple :MONTH-1.
-Exemples de variables dynamiques pour les factures:
-Utiliser :MONTH, :QUARTER ou :YEAR pour des dates dynamiques. Les opérations simples fonctionnent également, par exemple :MONTH-1.
+Exemples de variables dynamiques pour les factures:
+We use pdfmake to define the invoice designs declaratively. The pdfmake playground provide\'s a great way to see the library in action.
-You can access any invoice field by adding Value
to the end. For example $invoiceNumberValue
displays the invoice number.
To access a child property using dot notation. For example to show the client name you could use $client.nameValue
.
If you need help figuring something out post a question to our support forum.
', + 'current_user' => 'Utilisateur en cours', + 'new_recurring_invoice' => 'Nouvelle facture récurrente', + 'recurring_invoice' => 'Facture récurrente', + 'recurring_too_soon' => 'il est trop tôt pour la création d\'une autre facture récurrente, elle est planifiée pour le :date', + 'created_by_invoice' => 'Créée par :invoice', + 'primary_user' => 'Utilisateur principal', + 'help' => 'Aide', + 'customize_help' => 'Nous utilisons pdfmake pour définir le design des factures de façon déclarative. L\'environnement pdfmake permet de voir la librairie en action.
+Vous pouvez accéder à n\'importe quel champ de facture en ajoutant Value
à la fin. Par exemple $invoiceNumberValue
affiche le numéro de facture.
Pour accéder à une propriété enfant en utilisant la notation par point. Par exemple $client.nameValue
affiche le nom du client.
Si vous avez besoin d\'aide à cet effet, n\'hésitez pas à publier une question sur notre forum d\'aide (en anglais).
', - 'invoice_due_date' => 'Due Date', - 'quote_due_date' => 'Valid Until', - 'valid_until' => 'Valid Until', - 'reset_terms' => 'Reset terms', - 'reset_footer' => 'Reset footer', - 'invoices_sent' => ':count invoice sent|:count invoices sent', - 'status_draft' => 'Draft', - 'status_sent' => 'Sent', - 'status_viewed' => 'Viewed', - 'status_partial' => 'Partial', - 'status_paid' => 'Paid', - 'show_line_item_tax' => 'Display line item taxes inline', + 'invoice_due_date' => 'Échéance', + 'quote_due_date' => 'Échéance', + 'valid_until' => 'Échéance', + 'reset_terms' => 'Remise à zéro des termes', + 'reset_footer' => 'Remise à zéro du pied de page', + 'invoices_sent' => ':count facture envoyée|:count factures envoyées', + 'status_draft' => 'Brouillon', + 'status_sent' => 'Envoyée', + 'status_viewed' => 'Vue', + 'status_partial' => 'Partiel', + 'status_paid' => 'Payée', + 'show_line_item_tax' => 'Afficher la taxe sur la même ligne', - 'iframe_url' => 'Website', - 'iframe_url_help1' => 'Copy the following code to a page on your site.', - 'iframe_url_help2' => 'You can test the feature by clicking \'View as recipient\' for an invoice.', + 'iframe_url' => 'Site web', + 'iframe_url_help1' => 'Copier ce code sur une page de votre site.', + 'iframe_url_help2' => 'Vous pouvez tester cette fonctionnalité en cliquant \'Visualiser en tant que destinataire\' pour uen facture.', - 'auto_bill' => 'Auto Bill', - 'military_time' => '24 Hour Time', - 'last_sent' => 'Last Sent', + 'auto_bill' => 'Facturation automatique', + 'military_time' => 'Format d\'heure 24 h', + 'last_sent' => 'Dernier envoi', - 'reminder_emails' => 'Reminder Emails', - 'templates_and_reminders' => 'Templates & Reminders', - 'subject' => 'Subject', - 'body' => 'Body', - 'first_reminder' => 'First Reminder', - 'second_reminder' => 'Second Reminder', - 'third_reminder' => 'Third Reminder', - 'num_days_reminder' => 'Days after due date', - 'reminder_subject' => 'Reminder: Invoice :invoice from :account', - 'reset' => 'Reset', - 'invoice_not_found' => 'The requested invoice is not available', + 'reminder_emails' => 'Courriels de rappel', + 'templates_and_reminders' => 'Modèles et rappels', + 'subject' => 'Sujet', + 'body' => 'Message', + 'first_reminder' => '1er rappel', + 'second_reminder' => '2e rappel', + 'third_reminder' => '3e rappel', + 'num_days_reminder' => 'Jours après la date d\'échéance', + 'reminder_subject' => 'Rappel: facture :invoice de :account', + 'reset' => 'Remise à zéro', + 'invoice_not_found' => 'La facture demandée n\'est pas disponible', - 'referral_program' => 'Referral Program', - 'referral_code' => 'Referral Code', - 'last_sent_on' => 'Last sent on :date', + 'referral_program' => 'Programme de référencement', + 'referral_code' => 'Code de référencement', + 'last_sent_on' => 'Dernier envoi le :date', - 'page_expire' => 'This page will expire soon, :click_here to keep working', - 'upcoming_quotes' => 'Upcoming Quotes', - 'expired_quotes' => 'Expired Quotes', + 'page_expire' => 'Cette page va expirer bientôt, :click_here popur continuer', + 'upcoming_quotes' => 'Soumissions à venir', + 'expired_quotes' => 'Soumissions expirées', - 'sign_up_using' => 'Sign up using', - 'invalid_credentials' => 'These credentials do not match our records', - 'show_all_options' => 'Show all options', - 'user_details' => 'User Details', - 'oneclick_login' => 'One-Click Login', - 'disable' => 'Disable', - 'invoice_quote_number' => 'Invoice and Quote Numbers', - 'invoice_charges' => 'Invoice Charges', + 'sign_up_using' => 'Connectez-vous avec', + 'invalid_credentials' => 'Ces informations ne correspondent pas', + 'show_all_options' => 'Afficher toutes les options', + 'user_details' => 'Profil utilisateur', + 'oneclick_login' => 'Connexion 1 Clic', + 'disable' => 'Desactiver', + 'invoice_quote_number' => 'Numéros de factures et de soumissions', + 'invoice_charges' => 'Frais de facturation', 'invitation_status' => [ - 'sent' => 'Email Sent', - 'opened' => 'Email Openend', - 'viewed' => 'Invoice Viewed', + 'sent' => 'Courriel envoyé', + 'opened' => 'Courriel ouvert', + 'viewed' => 'Facture consultée', ], - 'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact.', - 'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice', - 'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact.', - 'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice', + 'notification_invoice_bounced' => 'Impossible d\'envoyer la facture :invoice à :contact.', + 'notification_invoice_bounced_subject' => 'Impossible d\'envoyer la facture :invoice', + 'notification_quote_bounced' => 'Impossible d\'envoyer la soumission :invoice à :contact.', + 'notification_quote_bounced_subject' => 'Impossible d\'envoyer la soumission :invoice', - 'custom_invoice_link' => 'Custom Invoice Link', - 'total_invoiced' => 'Total Invoiced', - 'open_balance' => 'Open Balance', - 'verify_email' => 'Please visit the link in the account confirmation email to verify your email address.', - 'basic_settings' => 'Basic Settings', + 'custom_invoice_link' => 'Lien de facture personnalisé', + 'total_invoiced' => 'Total facturé', + 'open_balance' => 'Solde', + 'verify_email' => 'Veuillez confirmer votre courriel en suivant le lien.', + 'basic_settings' => 'Paramètres généraux', 'pro' => 'Pro', - 'gateways' => 'Payment Gateways', + 'gateways' => 'Passerelles de paiements', - 'next_send_on' => 'Send Next: :date', - 'no_longer_running' => 'This invoice is not scheduled to run', - 'general_settings' => 'General Settings', - 'customize' => 'Customize', - 'oneclick_login_help' => 'Connect an account to login without a password', - 'referral_code_help' => 'Earn money by sharing our app online', + 'next_send_on' => 'Prochain envoi: :date', + 'no_longer_running' => 'Cette facture n\'est pas planifié pour un envoi', + 'general_settings' => 'Paramètres généraux', + 'customize' => 'Personnalisation', + 'oneclick_login_help' => 'Connectez-vous à un compte pour une connexion sans mot de passe', + 'referral_code_help' => 'Gagnes de l\'argent en faisnat connaître notre application', - 'enable_with_stripe' => 'Enable | Requires Stripe', - 'tax_settings' => 'Tax Settings', - 'create_tax_rate' => 'Add Tax Rate', - 'updated_tax_rate' => 'Successfully updated tax rate', - 'created_tax_rate' => 'Successfully created tax rate', - 'edit_tax_rate' => 'Edit tax rate', - 'archive_tax_rate' => 'Archive tax rate', - 'archived_tax_rate' => 'Successfully archived the tax rate', - 'default_tax_rate_id' => 'Default Tax Rate', - 'tax_rate' => 'Tax Rate', - 'recurring_hour' => 'Recurring Hour', - 'pattern' => 'Pattern', - 'pattern_help_title' => 'Pattern Help', - 'pattern_help_1' => 'Create custom invoice and quote numbers by specifying a pattern', - 'pattern_help_2' => 'Available variables:', - 'pattern_help_3' => 'For example, :example would be converted to :value', - 'see_options' => 'See options', - 'invoice_counter' => 'Invoice Counter', - 'quote_counter' => 'Quote Counter', + 'enable_with_stripe' => 'Activer | Requiert Stripe', + 'tax_settings' => 'Paramètres de taxe', + 'create_tax_rate' => 'Ajouter un taux de taxe', + 'updated_tax_rate' => 'Le taux de taxe a été mis à jour', + 'created_tax_rate' => 'Le taux de taxe a été créé', + 'edit_tax_rate' => 'Éditer le taux de taxe', + 'archive_tax_rate' => 'Archiver le taux de taxe', + 'archived_tax_rate' => 'Le taux de taxe a été archivé', + 'default_tax_rate_id' => 'Taux de taxe par défaut', + 'tax_rate' => 'Taux de taxe', + 'recurring_hour' => 'Heure récurrente', + 'pattern' => 'Modèle', + 'pattern_help_title' => 'Aide pour les modèles', + 'pattern_help_1' => 'Créer des numéros de factures et soumissions personnalisées en spécifiant un modèle', + 'pattern_help_2' => 'Variables disponibles:', + 'pattern_help_3' => 'Par exemple, :example produira :value', + 'see_options' => 'Voir les options', + 'invoice_counter' => 'Numéros de factures', + 'quote_counter' => 'Numéros de soumissions', 'type' => 'Type', - 'activity_1' => ':user created client :client', - 'activity_2' => ':user archived client :client', - 'activity_3' => ':user deleted client :client', - 'activity_4' => ':user created invoice :invoice', - 'activity_5' => ':user updated invoice :invoice', - 'activity_6' => ':user emailed invoice :invoice to :contact', - 'activity_7' => ':contact viewed invoice :invoice', - 'activity_8' => ':user archived invoice :invoice', - 'activity_9' => ':user deleted invoice :invoice', - 'activity_10' => ':contact entered payment :payment for :invoice', - 'activity_11' => ':user updated payment :payment', - 'activity_12' => ':user archived payment :payment', - 'activity_13' => ':user deleted payment :payment', - 'activity_14' => ':user entered :credit credit', - 'activity_15' => ':user updated :credit credit', - 'activity_16' => ':user archived :credit credit', - 'activity_17' => ':user deleted :credit credit', - 'activity_18' => ':user created quote :quote', - 'activity_19' => ':user updated quote :quote', - 'activity_20' => ':user emailed quote :quote to :contact', - 'activity_21' => ':contact viewed quote :quote', - 'activity_22' => ':user archived quote :quote', - 'activity_23' => ':user deleted quote :quote', - 'activity_24' => ':user restored quote :quote', - 'activity_25' => ':user restored invoice :invoice', - 'activity_26' => ':user restored client :client', - 'activity_27' => ':user restored payment :payment', - 'activity_28' => ':user restored :credit credit', - 'activity_29' => ':contact approved quote :quote', + 'activity_1' => ':user a créé le client :client', + 'activity_2' => ':user a archivé le client :client', + 'activity_3' => ':user a supprimé le client :client', + 'activity_4' => ':user a créé la facture :invoice', + 'activity_5' => ':user a mis à jour la facture :invoice', + 'activity_6' => ':user a envoyé la facture :invoice à :contact', + 'activity_7' => ':contact a visualisé la facture :invoice', + 'activity_8' => ':user a archivé la facture :invoice', + 'activity_9' => ':user a supprimé la facture :invoice', + 'activity_10' => ':contact a saisi le paiement :payment pour :invoice', + 'activity_11' => ':user a mis à jour le paiement :payment', + 'activity_12' => ':user a archivé le paiement :payment', + 'activity_13' => ':user a supprimé le paiement :payment', + 'activity_14' => ':user a saisi le crédit :credit', + 'activity_15' => ':user a mis à jour le crédit :credit', + 'activity_16' => ':user a archivé le crédit :credit', + 'activity_17' => ':user a supprimé le crédit :credit', + 'activity_18' => ':user a créé la soumission :quote', + 'activity_19' => ':user a mis à jour la soumission :quote', + 'activity_20' => ':user a envoyé la soumission :quote à :contact', + 'activity_21' => ':contact a visualisé la soumission :quote', + 'activity_22' => ':user a archivé la soumission :quote', + 'activity_23' => ':user a supprimé la soumission :quote', + 'activity_24' => ':user a restauré la soumission :quote', + 'activity_25' => ':user a restauré la facture :invoice', + 'activity_26' => ':user a restauré le client :client', + 'activity_27' => ':user a restauré le paiement :payment', + 'activity_28' => ':user a restauré le crédit :credit', + 'activity_29' => ':contact accepté la soumission :quote', - 'payment' => 'Payment', - 'system' => 'System', - 'signature' => 'Email Signature', - 'default_messages' => 'Default Messages', - 'quote_terms' => 'Quote Terms', - 'default_quote_terms' => 'Default Quote Terms', - 'default_invoice_terms' => 'Default Invoice Terms', - 'default_invoice_footer' => 'Default Invoice Footer', - 'quote_footer' => 'Quote Footer', - 'free' => 'Free', + 'payment' => 'Paiement', + 'system' => 'Système', + 'signature' => 'Signature de courriel', + 'default_messages' => 'Message par défaut', + 'quote_terms' => 'Conditions de soumission', + 'default_quote_terms' => 'Conditions par défaut pour les soumissions', + 'default_invoice_terms' => 'Conditions par défaut pour les factures', + 'default_invoice_footer' => 'Pied de facture par défaut', + 'quote_footer' => 'Pied de soumission par défaut', + 'free' => 'Gratuit', - 'quote_is_approved' => 'This quote is approved', - 'apply_credit' => 'Apply Credit', - 'system_settings' => 'System Settings', - 'archive_token' => 'Archive Token', - 'archived_token' => 'Successfully archived token', - 'archive_user' => 'Archive User', - 'archived_user' => 'Successfully archived user', - 'archive_account_gateway' => 'Archive Gateway', - 'archived_account_gateway' => 'Successfully archived gateway', - 'archive_recurring_invoice' => 'Archive Recurring Invoice', - 'archived_recurring_invoice' => 'Successfully archived recurring invoice', - 'delete_recurring_invoice' => 'Delete Recurring Invoice', - 'deleted_recurring_invoice' => 'Successfully deleted recurring invoice', - 'restore_recurring_invoice' => 'Restore Recurring Invoice', - 'restored_recurring_invoice' => 'Successfully restored recurring invoice', - 'archived' => 'Archived', - 'untitled_account' => 'Untitled Company', + 'quote_is_approved' => 'Cette soumission a été acceptée', + 'apply_credit' => 'Appliquer le crédit', + 'system_settings' => 'Paramètres système', + 'archive_token' => 'Archiver le jeton', + 'archived_token' => 'Le jeton a été archivé', + 'archive_user' => 'Archiver l\'utilisateur', + 'archived_user' => 'L\'utilisateur a été archivé', + 'archive_account_gateway' => 'Archiver la passerelle', + 'archived_account_gateway' => 'La passerelle a été archivé', + 'archive_recurring_invoice' => 'Archiver la facture récurrente', + 'archived_recurring_invoice' => 'La facture récurrente a été archivée', + 'delete_recurring_invoice' => 'Supprimer la facture récurrente', + 'deleted_recurring_invoice' => 'La facture récurrente a été supprimée', + 'restore_recurring_invoice' => 'Restaurer la facture récurrente', + 'restored_recurring_invoice' => 'La facture récurrente a été restaurée', + 'archived' => 'Archivée', + 'untitled_account' => 'Entreprise sans nom', - 'before' => 'Before', - 'after' => 'After', - 'reset_terms_help' => 'Reset to the default account terms', - 'reset_footer_help' => 'Reset to the default account footer', - 'export_data' => 'Export Data', - 'user' => 'User', - 'country' => 'Country', - 'include' => 'Include', + 'before' => 'Avant', + 'after' => 'Après', + 'reset_terms_help' => 'Remise à zéro', + 'reset_footer_help' => 'Remise à zéro', + 'export_data' => 'Exporter les données', + 'user' => 'Utilisateur', + 'country' => 'Pays', + 'include' => 'Inclus', - 'logo_too_large' => 'Your logo is :size, for better PDF performance we suggest uploading an image file less than 200KB', - 'import_freshbooks' => 'Import From FreshBooks', - 'import_data' => 'Import Data', + 'logo_too_large' => 'Votre logo est :size, pour de meilleures performances PDF, veuillez charger une image de moins de 200KB', + 'import_freshbooks' => 'Importer de FreshBooks', + 'import_data' => 'Importer les données', 'source' => 'Source', 'csv' => 'CSV', - 'client_file' => 'Client File', - 'invoice_file' => 'Invoice File', - 'task_file' => 'Task File', - 'no_mapper' => 'No valid mapping for file', - 'invalid_csv_header' => 'Invalid CSV Header', + 'client_file' => 'Fichier des clients', + 'invoice_file' => 'Fichier des factures', + 'task_file' => 'Fichier des tâches', + 'no_mapper' => 'Aucun liens de champs valides pour ce fichier', + 'invalid_csv_header' => 'Entête CSV invalide', 'email_errors' => [ - 'inactive_client' => 'Emails can not be sent to inactive clients', - 'inactive_contact' => 'Emails can not be sent to inactive contacts', - 'inactive_invoice' => 'Emails can not be sent to inactive invoices', - 'user_unregistered' => 'Please register your account to send emails', - 'user_unconfirmed' => 'Please confirm your account to send emails', - 'invalid_contact_email' => 'Invalid contact email', + 'inactive_client' => 'Aucun courriel ne peut être envoyé à un client inactif', + 'inactive_contact' => 'Aucun courriel ne peut être envoyé à un contact inactif', + 'inactive_invoice' => 'Aucun courriel ne peut être envoyé à une facture inactive', + 'user_unregistered' => 'Veuillez vous créer un compte pour envoyer des courriels', + 'user_unconfirmed' => 'Veuillez confirmer votre compte pour pouvoir envoyer des courriels', + 'invalid_contact_email' => 'Ce courriel est invalide', ], - 'client_portal' => 'Client Portal', + 'client_portal' => 'Portail client', 'admin' => 'Admin', - 'disabled' => 'Disabled', - 'show_archived_users' => 'Show archived users', + 'disabled' => 'Désactivé', + 'show_archived_users' => 'Afficher les utilisateurs archivés', 'notes' => 'Notes', - 'invoice_will_create' => 'client will be created', - 'invoices_will_create' => 'invoices will be created', - 'failed_to_import' => 'The following records failed to import', + 'invoice_will_create' => 'Le client sera créé', + 'invoices_will_create' => 'Les factures seront créées', + 'failed_to_import' => 'Cet enregistrement n\'a pu être importé', - 'publishable_key' => 'Publishable Key', - 'secret_key' => 'Secret Key', - 'missing_publishable_key' => 'Set your Stripe publishable key for an improved checkout process', + 'publishable_key' => 'Clé publique', + 'secret_key' => 'Clé secrète', + 'missing_publishable_key' => 'Entrez votre lcé publique de Stripe pour une meilleur expérience de paiement', - 'email_design' => 'Email Design', - 'due_by' => 'Due by :date', - 'enable_email_markup' => 'Enable Markup', - 'enable_email_markup_help' => 'Make it easier for your clients to pay you by adding schema.org markup to your emails.', - 'template_help_title' => 'Templates Help', - 'template_help_1' => 'Available variables:', - 'email_design_id' => 'Email Style', - 'email_design_help' => 'Make your emails look more professional with HTML layouts', - 'plain' => 'Plain', - 'light' => 'Light', - 'dark' => 'Dark', + 'email_design' => 'Modèle de courriel', + 'due_by' => 'Due pour :date', + 'enable_email_markup' => 'Autoriser le marquage', + 'enable_email_markup_help' => 'rendez le paiement plus facile à vos client en ajoutant à vos courriel, le marquage de schema.org.', + 'template_help_title' => 'Aide pour les modèles', + 'template_help_1' => 'Variables disponibles:', + 'email_design_id' => 'Style de courriel', + 'email_design_help' => 'Donnez à vos courriel un effet professionnel avec les modèles HTML', + 'plain' => 'Ordinaire', + 'light' => 'Clair', + 'dark' => 'Foncé', - 'industry_help' => 'Used to provide comparisons against the averages of companies of similar size and industry.', - 'subdomain_help' => 'Customize the invoice link subdomain or display the invoice on your own website.', - 'invoice_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the invoice number.', - 'quote_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the quote number.', - 'custom_client_fields_helps' => 'Add a text input to the client create/edit page and display the label and value on the PDF.', - 'custom_account_fields_helps' => 'Add a label and value to the company details section of the PDF.', - 'custom_invoice_fields_helps' => 'Add a text input to the invoice create/edit page and display the label and value on the PDF.', - 'custom_invoice_charges_helps' => 'Add a text input to the invoice create/edit page and include the charge in the invoice subtotals.', - 'color_help' => 'Note: the primary color is also used in the client portal and custom email designs.', + 'industry_help' => 'Pour des fins de comparaison entre des entreprises de même taille et du même secteur d\'activité.', + 'subdomain_help' => 'Personnalisez le lien de sous-domaine de la facture ou en affichant la facture sur votre site web.', + 'invoice_number_help' => 'Spécifiez un préfixe ou utilisez un modèle personnalisé pour la création du numéro de facture.', + 'quote_number_help' => 'Spécifiez un préfixe ou utilisez un modèle personnalisé pour la création du numéro de soumission.', + 'custom_client_fields_helps' => 'Ajoutez un champ personnalisé à la page de création/édition de client et affichez le titre et la valeur dans le fichier PDF.', + 'custom_account_fields_helps' => 'Ajoutez un titre et une valeur à la section des informations de l\'entreprise dans le fichier PDF.', + 'custom_invoice_fields_helps' => 'Ajoutez un champ personnalisé à la page de création/édition de facture et affichez le titre et la valeur dans le fichier PDF.', + 'custom_invoice_charges_helps' => 'Ajoutez un champ personnalisé à la page de création/édition de facture pour inclure les frais au sous-totaux de la facture.', + 'color_help' => 'Note: la couleur principale est également utilisée dans le portail du client et les modèles personnalisés de courriels.', - 'token_expired' => 'Validation token was expired. Please try again.', - 'invoice_link' => 'Invoice Link', - 'button_confirmation_message' => 'Click to confirm your email address.', - 'confirm' => 'Confirm', - 'email_preferences' => 'Email Preferences', - 'created_invoices' => 'Successfully created :count invoice(s)', - 'next_invoice_number' => 'The next invoice number is :number.', - 'next_quote_number' => 'The next quote number is :number.', + 'token_expired' => 'Le jeton de validation a expiré. Veuillez réessayer.', + 'invoice_link' => 'Lien de facture', + 'button_confirmation_message' => 'Veuillez confirmer votre courriel.', + 'confirm' => 'Confirmer', + 'email_preferences' => 'Préférences courriel', + 'created_invoices' => ':count factures ont été créées', + 'next_invoice_number' => 'Le prochain numéro de facture est :number.', + 'next_quote_number' => 'Le prochain numéro de soumission est :number.', - 'days_before' => 'days before', - 'days_after' => 'days after', - 'field_due_date' => 'due date', - 'field_invoice_date' => 'invoice date', - 'schedule' => 'Schedule', - 'email_designs' => 'Email Designs', - 'assigned_when_sent' => 'Assigned when sent', + 'days_before' => 'jours avant', + 'days_after' => 'jours après', + 'field_due_date' => 'Échéance', + 'field_invoice_date' => 'date de la facture', + 'schedule' => 'Calendrier', + 'email_designs' => 'Modèles de courriel', + 'assigned_when_sent' => 'Assignée lors de l\'envoi', - 'white_label_custom_css' => ':link for $'.WHITE_LABEL_PRICE.' to enable custom styling and help support our project.', - 'white_label_purchase_link' => 'Purchase a white label license', + 'white_label_custom_css' => ':link à $'.WHITE_LABEL_PRICE.' pour activer les styles personnalisés et supporter notre projet.', + 'white_label_purchase_link' => 'Achetez une licence sans pub', // Expense / vendor - 'expense' => 'Expense', - 'expenses' => 'Expenses', - 'new_expense' => 'Enter Expense', - 'enter_expense' => 'Enter Expense', - 'vendors' => 'Vendors', - 'new_vendor' => 'New Vendor', + 'expense' => 'Dépense', + 'expenses' => 'Dépenses', + 'new_expense' => 'Nouvelle dépense', + 'enter_expense' => 'Nouvelle dépense', + 'vendors' => 'Fournisseurs', // et non pas Vendeurs, ce qui n'a pas la même signification + 'new_vendor' => 'Nouveau fournisseur', 'payment_terms_net' => 'Net', - 'vendor' => 'Vendor', - 'edit_vendor' => 'Edit Vendor', - 'archive_vendor' => 'Archive Vendor', - 'delete_vendor' => 'Delete Vendor', - 'view_vendor' => 'View Vendor', - 'deleted_expense' => 'Successfully deleted expense', - 'archived_expense' => 'Successfully archived expense', - 'deleted_expenses' => 'Successfully deleted expenses', - 'archived_expenses' => 'Successfully archived expenses', + 'vendor' => 'Fournisseur', + 'edit_vendor' => 'Éditer le fournisseur', + 'archive_vendor' => 'Archiver le fournisseur', + 'delete_vendor' => 'Supprimer le fournisseur', + 'view_vendor' => 'Voir le fournisseur', + 'deleted_expense' => 'La dépense a été supprimée', + 'archived_expense' => 'La dépense a été archivée', + 'deleted_expenses' => 'Les dépenses ont été supprimées', + 'archived_expenses' => 'Les dépenses ont été archivées', // Expenses - 'expense_amount' => 'Expense Amount', - 'expense_balance' => 'Expense Balance', - 'expense_date' => 'Expense Date', - 'expense_should_be_invoiced' => 'Should this expense be invoiced?', - 'public_notes' => 'Public Notes', - 'invoice_amount' => 'Invoice Amount', - 'exchange_rate' => 'Exchange Rate', - 'yes' => 'Yes', - 'no' => 'No', - 'should_be_invoiced' => 'Should be invoiced', - 'view_expense' => 'View expense # :expense', - 'edit_expense' => 'Edit Expense', - 'archive_expense' => 'Archive Expense', - 'delete_expense' => 'Delete Expense', - 'view_expense_num' => 'Expense # :expense', - 'updated_expense' => 'Successfully updated expense', - 'created_expense' => 'Successfully created expense', - 'enter_expense' => 'Enter Expense', - 'view' => 'View', - 'restore_expense' => 'Restore Expense', - 'invoice_expense' => 'Invoice Expense', - 'expense_error_multiple_clients' => 'The expenses can\'t belong to different clients', - 'expense_error_invoiced' => 'Expense has already been invoiced', - 'convert_currency' => 'Convert currency', + 'expense_amount' => 'Montant de la dépense', + 'expense_balance' => 'Solde de la dépense', + 'expense_date' => 'Date de la dépense', + 'expense_should_be_invoiced' => 'Dépense facturée?', + 'public_notes' => 'Notes publiques', + 'invoice_amount' => 'Montant de la facture', + 'exchange_rate' => 'Taxu de change', + 'yes' => 'Oui', + 'no' => 'Non', + 'should_be_invoiced' => 'Devrait être facturée', + 'view_expense' => 'Voir la dépense # :expense', + 'edit_expense' => 'Éditer la dépense', + 'archive_expense' => 'Archiver la dépense', + 'delete_expense' => 'Supprimer la dépense', + 'view_expense_num' => 'Dépense # :expense', + 'updated_expense' => 'La dépense a été mise à jour', + 'created_expense' => 'La dépense a été créée', + 'enter_expense' => 'Nouvelle dépense', + 'view' => 'Visualiser', + 'restore_expense' => 'Restaurer la dépense', + 'invoice_expense' => 'Facture de dépense', + 'expense_error_multiple_clients' => 'Les dépenses ne peuvent pas appartenir à plusieus clients', + 'expense_error_invoiced' => 'Ces dépenses ont déjà été facturées', + 'convert_currency' => 'Conversion de devise', // Payment terms - 'num_days' => 'Number of days', - 'create_payment_term' => 'Create Payment Term', - 'edit_payment_terms' => 'Edit Payment Term', - 'edit_payment_term' => 'Edit Payment Term', - 'archive_payment_term' => 'Archive Payment Term', + 'num_days' => 'Nombre de jours', + 'create_payment_term' => 'Nouveau terme de paiement', + 'edit_payment_terms' => 'Editer les termes de paiement', + 'edit_payment_term' => 'Editer le terme de paiement', + 'archive_payment_term' => 'Archiver le terme de paiement', // recurring due dates - 'recurring_due_dates' => 'Recurring Invoice Due Dates', - 'recurring_due_date_help' => 'Automatically sets a due date for the invoice.
-Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.
-Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.
-For example:
-Définissez automatiquement une date d\'échéance pour la facture.
+Les factures de type mensuel ou annuel dont la date d\'échéance est définie le jour même ou le jour précédent de leur création seront dues pour le prochain mois. Les factures dont la date d\'échéance est définie le 29 ou le 30 des mois qui n\'ont pas ces jours seront dues le dernier jour de ce mois.
+Les factures de type hebdomadaire dont la date d\'échéance est définie le jour de la semaine de leur création seront dues pour la semaine suivante.
+par exemple:
+