mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-08-04 15:12:12 +00:00
* feat(invoices): add credit note (Stornorechnung) backend
Implement native credit notes as invoices with type=CREDIT_NOTE that
reference the original invoice they reverse. All monetary fields are
negated as integer cents (no float arithmetic).
- Migration: add invoices.type + related_invoice_id (unsignedInteger,
matching invoices.id which is INT UNSIGNED via increments() rather than
bigIncrements() -- required for the self-referencing foreign key to
form correctly on MySQL/MariaDB) + widen invoice_items.price/base_price
to signed (idempotent guards)
- Invoice model: TYPE_* constants, relatedInvoice/creditNotes relations,
isCreditNote() helper
- InvoiceService::createCreditNote() copies + negates the source invoice,
sets creator_id from the authenticated user
- POST /invoices/{invoice}/credit-note endpoint (201) with CreditNotePolicy
authorization; 422 when the source is already a credit note, 403 across
companies
- CreditNoteResource exposing type + related_invoice reference
- Dedicated credit-note PDF template (Stornorechnung header + reference line)
- SendCreditNoteRequest + SendCreditNoteMail + send endpoint/email template
- en/de translations for the credit-note PDF labels
- Feature tests: create, item negation, relation, 422, 403, PDF, email
Fresh implementation addressing all review feedback from PR #536.
Refs #317
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* feat(invoices): add credit note UI (button, badge, back-link)
- 'Create Credit Note' action in the invoice dropdown (hidden on rows that
are already credit notes)
- Credit-note badge in the invoice list
- Credit-note banner with a link back to the reversed invoice on the detail
view; show() returns CreditNoteResource for credit notes so the original
invoice reference is available
- Expose type + related_invoice_id on InvoiceResource
- invoiceService.createCreditNote + store action
- Invoice domain type: InvoiceType, RelatedInvoice, type/related fields
- en/de translations for the credit-note UI strings
Refs #317
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Settle balances on credit note creation and surface cancellation in UI
Creating a credit note (full reversal) now settles both documents, the
mechanism @gdarko praised in PR #536 ("Invoice due amount adjustment
logic for create/update/delete is well thought out"), adapted to the
invoice-row-with-type architecture:
- The original invoice's due_amount/base_due_amount drop to 0 and its
status/paid_status are recalculated through the existing
changeInvoiceStatus() path (COMPLETED/PAID), so it falls out of every
awaiting-payment view. The UI shows a distinct "Cancelled" badge and a
"Cancelled via credit note: ST-XXXX" banner instead of the generic
Paid badge, avoiding Xero's documented paid-vs-credited ambiguity.
- The credit note itself is created settled (due 0, PAID): nothing is
ever owed on it, so it never surfaces as an open negative balance.
- Deleting a credit note restores the original invoice's balance,
recomputed from recorded payments (integer cents), covering unpaid
and partially-paid invoices; skipped when both documents are deleted
in one batch.
- One credit note per invoice: a second full reversal would
double-negate the books (422 + hidden dropdown action).
- InvoiceResource exposes minimal credit_notes refs, mirroring the
existing related_invoice back-link, for the banner/badge in
InvoiceDetailView and InvoiceIndexView.
8 new feature tests cover settlement, resource exposure, the
one-per-invoice guard, and delete-side restoration.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Render credit notes through the invoice's own template, add cancellation banner to PDFs
Fixes two bugs found via screenshot: the actual generated PDF (not just the
Vue preview) is what customers download/print/email, and it was broken in
both directions.
1. Credit notes always rendered through one hardcoded standalone layout
(app/pdf/credit-note/credit-note.blade.php) regardless of which of the
3 invoice templates the company actually uses. A company on invoice2/3
branding got a credit note PDF that looked nothing like their real
invoices. Fixed by making invoice1/2/3.blade.php credit-note-aware
(swap number/date labels, add the red "CREDIT NOTE" banner + reference
line, scaled to each template's own visual language) and removing the
isCreditNote() special case in InvoiceService::getPdfData() so credit
notes now go through the same PdfTemplateUtils resolution as regular
invoices. The standalone template is deleted.
2. The original (now-cancelled) invoice's PDF showed zero indication it
had been reversed by a credit note — only the Vue UI banner existed.
Added an equivalent amber "Cancelled" banner + reference line to all
three templates, conditional on $invoice->creditNotes->isNotEmpty().
getPdfData() now eager-loads both relatedInvoice and creditNotes
unconditionally (cheap either way) so every template has what it needs.
Covers all 3 templates x both document types (6 combinations), verified
by generating real PDFs (not just Vue previews) for each. 4 new feature
tests hit the actual /invoices/pdf/{hash}?preview=1 endpoint under
non-default templates (invoice2, invoice3) and assert on
template-specific structural markers plus the new banner text, so this
class of bug (works on the default template, breaks on the others)
cannot regress silently.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Create credit notes as COMPLETED and hide Record Payment on settled documents
The credit note is born fully settled (due_amount 0, paid_status PAID), but
its own status was hardcoded to SENT at creation and never advanced. It
therefore showed a stale "Sent" badge forever and the detail view kept
offering "Record Payment" on a document with nothing owed.
- InvoiceService::createCreditNote() now creates the credit note with
STATUS_COMPLETED, matching the end-state the original invoice reaches
through the settlement path.
- The "Record Payment" button (detail view) and dropdown item now also
require due_amount > 0, so no already-settled document ever offers to
record a payment, regardless of its status string.
- CreditNoteTest: assert the credit note is created with STATUS_COMPLETED.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Refresh invoice sidebar list after creating a credit note from detail view
Creating a credit note from the split-pane invoice detail view
(/admin/invoices/{id}/view) left the left-hand invoice list stale until a
manual page reload: the new credit note never appeared, and the original
invoice's row kept showing its pre-cancellation status.
InvoiceDropdown's createCreditNote() now calls the loadData/table refresh
callbacks after success, matching the pattern already used by
removeInvoice(). InvoiceDetailView wires loadData to a new
refreshInvoiceList() that resets invoiceList before refetching (loadInvoices()
is append-only, built for infinite scroll, so calling it without a reset
would duplicate every already-loaded row) — mirroring the existing
onSearched() reset-and-refetch pattern.
Also add the "Cancelled" badge to the sidebar's list-item template; it
previously only existed in InvoiceIndexView.vue, so the split-pane sidebar
never reflected an invoice's cancelled-by-credit-note state even after a
full reload.
* fix(migrations): drop the credit-note foreign key constraint
related_invoice_id kept a DB-level foreign key with nullOnDelete(). That is
against the codebase-wide convention established after the FK breakage in
PRs #618 / #683: reference columns are plain unsignedInteger plus an index,
with the relation declared on the model and cascades handled in app code.
Replace the constraint with an index, and swap the dropForeign() in down()
for a dropIndex() that runs before the column drop (MySQL and PostgreSQL
would drop the index with the column, SQLite leaves it behind and then fails
with "no such column").
Documents why the type default is load-bearing while here: it backfills
existing rows with INVOICE, and the type-scoped serial-number queries would
otherwise restart numbering on an existing install.
* feat(invoices): give credit notes their own number sequence
Credit notes were numbered out of the invoice sequence, so cancelling an
invoice consumed an invoice number and the two document series interleaved
(INV-000001, INV-000002 for a credit note, INV-000003 for the next invoice).
Credit notes are Invoice rows with type = CREDIT_NOTE, and SerialNumberService
derived both the format setting and the sequence lookup from the model class
alone, which cannot distinguish them.
SerialNumberService gains two optional, fluent hooks that leave the default
behaviour untouched:
- setSettingKey() overrides the company setting the format is read from, so a
document type sharing a table can have its own format.
- setSequenceScope() takes column => value constraints applied on top of the
company (and customer) filters in both setNextSequenceNumber() and
setNextCustomerSequenceNumber(), so each type counts on its own.
createCreditNote() uses both: credit_note_number_format (default
{{SERIES:CN}}{{DELIMITER:-}}{{SEQUENCE:6}}) and a CREDIT_NOTE scope. Every
call site that numbers a real invoice is scoped to TYPE_INVOICE so the credit
notes now sharing the table do not inflate the invoice sequence: create,
update, clone, the recurring-invoice generator, estimate conversion, and the
factory. The update() scope is not redundant: a customer change there triggers
a customer-sequence recompute through setModelObject(), which would otherwise
count credit notes. Estimate and payment numbering is unaffected.
The format is configurable in Settings alongside invoice numbering (a second
NumberCustomizer on the Invoices tab, no component changes needed) and is
seeded for new companies by CompanyService. A data migration backfills it for
existing companies: without a row, CompanySetting::getSetting() returns null
and the generated serial is silently empty.
The next-number endpoint answers key=credit_note with the CN format, so the
settings preview and any future create form read the right sequence.
* feat(pdf): show credit-note and cancellation banners on invoice PDFs
The generated PDF is what the customer downloads, prints and receives by
mail, and it was silent in both directions: a credit note rendered as an
ordinary invoice, and the invoice it reversed carried no sign that it had
been cancelled. Only the Vue UI said anything.
The banner lives in one partial, resources/views/app/pdf/partials/
credit-note-banner.blade.php, rather than being copied into the three stock
templates. It reads the shared $invoice, renders a red CREDIT NOTE box with
a reference to the original when the document is a credit note, an amber
CANCELLED box naming the credit note when the document has been reversed,
and nothing at all otherwise -- pdf:compare reports byte-identical ink
boxes for all seven stock templates, so regular documents are untouched.
Every rule is inline on the elements. A partial included in the body cannot
add anything to <head>, and inline styles are the one thing dompdf and
Chromium honour identically; line-height is stated explicitly for the same
reason. The box is a plain block with clear: both, so it cannot disturb the
float layouts the templates are built on.
Custom templates published into the pdf_templates namespace keep rendering
exactly as they do today and opt in by including the partial.
Alongside it, the cheap label swaps the same document type needs: the
<title>, invoice1's and invoice3's number/date labels, invoice2's header
heading, and the PDF's own Title/Subject metadata now say Credit Note, and
the due-date row is dropped from a credit note, which has none.
* feat(invoices): give credit notes the normal lifecycle and guard the unsafe paths
A credit note had a parallel universe of its own: a dedicated send endpoint,
its own request class, its own two gates and policy methods, all of which
duplicated the invoice send path verbatim except for which mailable was
constructed. It was also born COMPLETED, which is the one status that hides
every Send affordance in the UI, so the endpoint that existed for it could
not be reached from the app at all.
Both halves are now the invoice's. InvoiceService::send() picks the mailable
by document type and sendPreview() picks the matching template, so a credit
note goes out through POST /invoices/{invoice}/send under the existing
'send invoice' authorization. The credit-note send route, controller action,
service method, SendCreditNoteRequest, and the 'send credit note' /
'view credit note' gates are gone; CreditNotePolicy keeps only create(),
which is the one ability that is genuinely different (it is gated on the
*source* invoice's company). SendCreditNoteMail and its Blade template stay
exactly as they were.
The credit note is now created DRAFT with due_date null, still settled
(paid_status PAID, both due amounts 0). DRAFT gives it the ordinary
create-review-send lifecycle: the Send button appears on the detail page and
send() promotes it to SENT. Nothing is owed on it in any status, so Record
Payment stays hidden either way.
The guards are the other half. A credit note is now immutable (InvoicePolicy
::update returns false: saving it back through the invoice form would
recompute its totals positive), cannot be cloned or converted to an estimate
(both copy the amounts unnegated), and can never be minted through the create
endpoint -- getInvoicePayload() hard-sets type and related_invoice_id, which
were previously forwarded straight from the request into Invoice::create.
Reversing an invoice that already took a payment, or one that was never
issued at all, is refused with a 422 alongside the two existing domain rules.
CheckInvoiceStatus only considers real invoices, so a credit note can never
be flagged overdue, and the invoice next-number preview is scoped by type
like every invoice create path already is, so it can never count credit
notes.
Test changes follow the behaviour changes: invoices being credited are
created SENT rather than relying on the factory's DRAFT default, the
"created settled" test now expects DRAFT plus a null due date, the send test
goes through the invoice endpoint and asserts the promotion to SENT, and the
partially-paid delete-restore test mints its credit note through the service
because the API now refuses that invoice. Nine tests cover the new guards.
* fix(invoices): stop credit notes distorting counts, queries and deletes
Three follow-ups to the credit-note feature, all of them cases where a
reversal row was treated as if it were another invoice.
Counts. A credit note is not an issued document, so "invoices: 12" must not
become 13 the moment one is cancelled. The company dashboard, the customer
portal dashboard and its invoice list, and both AI stat tools now count
type = INVOICE only. Every sum is deliberately left alone: the negated total
is exactly what nets a reversed sale back out of the figure, which is the
whole point of storing it that way. The admin index meta count is also left
alone, because that list shows credit notes and the count has to match it.
Queries. InvoiceResource probed creditNotes twice per row -- an exists()
then a fetch -- on a resource that is serialized for every row of a
paginated list, and CreditNoteResource did the same for relatedInvoice.
Both now read the loaded relation and emit nothing when it was not loaded,
and the two places whose UI consumes the field (the index list badge, which
also feeds the detail-page sidebar, and the detail page banner) eager-load
it with the two columns they need.
Deletes. related_invoice_id has no DB foreign key by convention, so both
sides of the cascade have to be written out. Deleting an invoice whose
credit note is not in the same batch is now a validation failure --
RelationNotExist cannot express "unless it is also going", so the rule takes
the whole ids list. And InvoiceService::delete() nulls out any surviving
pointer into the deleted batch, so even a caller that bypasses the request
layer cannot leave a credit note referencing a row that is gone.
Also: creating a credit note from the dropdown swallowed server errors, so a
refused reversal (paid invoice, draft, already credited) looked like it had
worked. It now surfaces the message the way the sibling actions in the app
do.
* fix(i18n): translate credit-note guard errors and complete locale coverage
The create/clone/convert guards throw ValidationException with bare
snake_case keys, and none of them were in ERROR_TRANSLATION_MAP, so the
toast rendered the raw key instead of a sentence.
- map the six guard keys to new errors.* translations
- give clone and convert-to-estimate a catch so their guards surface at
all, and factor the toast into showApiErrorNotification()
- add every credit-note string to fr, it and mk (avoir / nota di credito
/ книжно одобрение) so the branch ships in all five maintained locales
- proofread the German: "durch" instead of "via", reword
errors.credit_note_attached
* refactor(db): consolidate credit-note migrations into one
Nothing in PR #689 has shipped, so the branch's two separate migrations are
squashed into a single 2026_08_02_120000_add_credit_note_support. Installs
upgrading to 3.0.0 apply one migration instead of three, and the columns the
next phases need land in the same file rather than as follow-ups.
Carried over unchanged from the deleted files: the INVOICE default on
invoices.type (it backfills existing rows so they stay inside the type-scoped
serial-number queries), the no-FK unsignedInteger convention for
related_invoice_id per PRs #618 / #683, the SQLite requirement to dropIndex
before dropColumn in down(), and the company_settings backfill of
credit_note_number_format for installs predating independent credit-note
numbering.
New in this migration, for partial credit notes:
- invoices.credit_reason (nullable text)
- invoice_items.source_invoice_item_id (nullable unsignedInteger + index),
recording which line of the original invoice a credit-note line credits
- taxes.base_amount widened to a signed bigInteger
The base_amount change fixes a pre-existing bug, not just a credit-note need.
taxes.amount was made signed in 2024_02_08_181804_taxes_amount_as_signed but
base_amount, added as unsignedBigInteger in 2021_07_16_075100, was left behind,
so any negative tax row on a company with an exchange rate is rejected outright
under strict-mode MySQL.
CreditNoteSchemaTest covers the new columns and their nullability, the INVOICE
default, a Tax row with a negative base_amount, a negative-price invoice item
linked to its source line, and the seeded credit_note_number_format setting.
Round-tripped up and down on both SQLite and MySQL 8.0.
* feat(credit-notes): add the pure telescoping credit-note calculator
CreditNoteAmounts computes partial and full credit notes from a plain-array
snapshot of the original invoice, with no Eloquent involved. Every credit is
the difference between two cumulative credits derived from the original's
stored integers, so crediting a line in chunks sums back to the invoice to the
cent and the order of the chunks does not matter.
Quantities are carried as integer hundredths, money stays in integer minor
units, and rounding is the same half-away-from-zero rule DocumentTotals uses.
Fixed-amount tax rows are pro-rated like percentage ones (otherwise a flat tax
is credited once per chunk and exceeds what was invoiced), and percentage rows
are pro-rated from the stored amount rather than re-derived, so a full credit
reproduces the invoice instead of re-making a rounding decision.
* feat(credit-notes): credit an invoice line by line, not all at once
A credit note is no longer a whole-invoice reversal. CreditNoteService takes
the lines and quantities to credit (an empty list still means everything that
is left) and drives CreditNoteAmounts, so an invoice can be credited in as
many pieces as needed.
The model is telescoping, not incremental: each credit note is the difference
between the cumulative credit at the quantities credited after it and the one
before it, both derived from the original invoice's stored integers and never
from earlier credit notes. Chunks therefore sum back to the invoice to the
cent in every field, in any order, and a fully credited invoice nets to zero.
Because those integers are already exact, the line items are written with
recompute disabled: re-deriving a total from price times quantity, or a base_*
column through the exchange rate, would round a second time and break the
identity by a cent.
How much of each line is already credited is read off the surviving credit
notes through source_invoice_item_id, so deleting one gives its quantities
back with no separate bookkeeping. The invariants live in the service, under a
row lock, because each is a read-then-write on the invoice: nothing may be
credited twice, no line beyond what was invoiced, and no more in total than
the invoice's unpaid balance. The one-credit-note-per-invoice and no-payments
guards in the controller are gone, replaced by those.
Paid status and balance are kept apart. A credit is not a payment: an invoice
credited in part is still UNPAID, just for less, and only the payments decide
whether it reads PARTIALLY_PAID. recalculateBalance() owns that rule and runs
only when a credit note is created or deleted, which is why it does not live
in getInvoiceStatusByAmount(): PaymentService::create() adjusts the invoice
before the Payment row exists, so a payments-derived rule there would read a
stale sum. PaymentService::delete() now derives the status from the payments
that remain rather than from due == total, which is the same answer on an
uncredited invoice and the correct one on a credited one.
A credited invoice is frozen (its item ids anchor the credit-note lines), the
reason for a credit is stored and cannot be written through the invoice form,
and the invoice resource reports how much has been credited, whether that is
partial or full, and how much of each line.
* feat(credit-notes): choose the lines and quantities to credit in the UI
Creating a credit note was a yes/no dialog that reversed the whole
invoice, which is all the API could do. The API now credits any subset
of the lines, so the front end has to ask which ones.
The dropdown action opens a form instead of a confirmation: one row per
invoice line showing what was invoiced, what is already credited and
what is left, with the remaining quantity pre-filled and editable.
Quantities are compared in integer hundredths so the last unit of a
line is never blocked by float drift, and selecting every line at its
full remaining quantity on an untouched invoice is sent as the
no-items full reversal the server already implements.
Only the line subtotals are shown: discounts and taxes are apportioned
by the server's calculator, so re-deriving them here would disagree
with the document that gets written. The note under the table says so.
The "Cancelled" badge and banner now key on credited_status rather than
on the presence of any credit note, so a partly credited invoice reads
as partly credited and keeps its real paid status alongside.
* feat(credit-notes): show partial credits on the document and in every locale
The PDF said one of two things about a credited invoice: nothing, or
"Cancelled". Partial credits made both wrong. An invoice credited by half now
carries a Partially Credited banner naming the amount and the credit notes it
came from, a fully credited one lists every credit note rather than the first,
and the credit note itself prints the reason it was issued.
The totals block was the more dangerous half. It was gated on paid_status, so
an invoice settled by a credit note announced "Amount Paid" for money nobody
sent. It now splits the two: Amount Credited comes off the credit notes, Amount
Paid is whatever the balance dropped by beyond them. For a document with no
credit notes the arithmetic collapses to the old expression and the rendering
is unchanged word for word and position for position, checked against dompdf
output and against pdf:compare across all seven stock templates.
The reason is operator-written free text, so it is echoed escaped rather than
through @lang, which does not escape.
Locale-side, the phase-4 English-only strings are translated into the four
maintained catalogues, and the two guards partial crediting retired (one credit
note per invoice, and no crediting an invoice with payments) are deleted
everywhere so no translated install can still show them. A test walks all five
catalogues and fails on either a missing key or a surviving one.
The dashboard's recent-due list eager-loads the credit notes so its rows can
tell a credited invoice from a paid one.
* fix(payments): stop an overpayment from silently vanishing
A payment carried no maximum, so any amount larger than the invoice's
outstanding balance was accepted. PaymentService then handed it to
Invoice::subtractInvoicePayment(), which drove the balance negative, and
Invoice::getInvoiceStatusByAmount() returns an empty array for a negative
amount, so the status change was never applied. The money was recorded
against an invoice whose balance and paid status no longer described it.
The bug predates credit notes, but partial credit notes shrink an
invoice's balance without shrinking its total, which makes it easy to
walk into.
PaymentRequest now caps the amount at the invoice's due amount. On an
edit of a payment that already belongs to that same invoice its own
amount returns to the pool, matching what PaymentService::update() does;
a payment with no invoice stays uncapped. The message string is the
translation key, as elsewhere in the app, and is mapped and localized in
all five shipped locales.
The 'update payment' fixture stacked two randomly sized payments on a
randomly sized invoice, which the cap turns into an intermittent failure,
so its amounts are pinned.
* fix(payments): show the rejected-save message on the payment form
The create-payment view swallowed every API failure in a bare catch, so a
validation rejection, including the new remaining-balance cap, looked like
a save that silently stalled. The catch now routes the error through the
shared toast path the other forms use.
* fix(dashboard): stop the recent-due list crashing on partial credits
The recent-due invoices are serialized as raw models, so every loaded
relation runs the full $appends set. The column-limited creditNotes eager
load left its children without company_id, the company date-format lookup
returned null, and formattedCreatedAt took the endpoint down with a 500.
The relation is not needed there at all: credited_status is a resource
field the raw payload never carried, and a fully credited invoice has no
due amount so it never appears in this list. Drop the eager load and pin
the scenario (a partially credited invoice among the recent due) with a
test that fails 500 on the old code.
---------
Co-authored-by: Linus <lkurz@posteo.de>
Co-authored-by: Darko Gjorgjijoski <dg@darkog.com>
1721 lines
78 KiB
JSON
1721 lines
78 KiB
JSON
{
|
||
"navigation": {
|
||
"dashboard": "Tableau de bord",
|
||
"customers": "Clients",
|
||
"items": "Articles",
|
||
"invoices": "Factures",
|
||
"recurring-invoices": "Factures récurrentes",
|
||
"expenses": "Dépenses",
|
||
"estimates": "Devis",
|
||
"payments": "Paiements",
|
||
"reports": "Rapports",
|
||
"settings": "Paramètres",
|
||
"logout": "Déconnexion",
|
||
"users": "Utilisateurs",
|
||
"modules": "Modules"
|
||
},
|
||
"general": {
|
||
"add_company": "Ajouter une entreprise",
|
||
"view_pdf": "Afficher le PDF",
|
||
"copy_pdf_url": "Copier l'URL du PDF",
|
||
"download_pdf": "Télécharger le PDF",
|
||
"save": "Enregistrer",
|
||
"create": "Créer",
|
||
"cancel": "Annuler",
|
||
"update": "Mettre à jour",
|
||
"deselect": "Enlever",
|
||
"download": "Télécharger",
|
||
"from_date": "Du",
|
||
"to_date": "Au",
|
||
"from": "De",
|
||
"to": "À",
|
||
"cc": "CC",
|
||
"bcc": "BCC",
|
||
"ok": "OK",
|
||
"yes": "Oui",
|
||
"no": "Non",
|
||
"sort_by": "Trier par",
|
||
"ascending": "Ascendant",
|
||
"descending": "Descendant",
|
||
"subject": "Objet",
|
||
"body": "Message",
|
||
"message": "Message",
|
||
"send": "Envoyer",
|
||
"preview": "Aperçu",
|
||
"go_back": "Retourner",
|
||
"back_to_login": "Revenir à la page de connexion ?",
|
||
"home": "Tableau de bord",
|
||
"filter": "Filtrer",
|
||
"delete": "Supprimer",
|
||
"edit": "Modifier",
|
||
"view": "Afficher",
|
||
"add_new_item": "Ajouter une ligne",
|
||
"clear_all": "Tout supprimer",
|
||
"showing": "Affichage ",
|
||
"of": "sur",
|
||
"actions": "Actions",
|
||
"subtotal": "SOUS-TOTAL",
|
||
"discount": "REMISE",
|
||
"fixed": "Fixe",
|
||
"percentage": "Pourcentage",
|
||
"tax": "TAXE",
|
||
"total_amount": "TOTAL ",
|
||
"bill_to": "Facturer à",
|
||
"ship_to": "Expédier à",
|
||
"due": "En cours",
|
||
"draft": "Brouillon",
|
||
"sent": "Envoyée",
|
||
"all": "Tout",
|
||
"select_all": "Tout sélectionner",
|
||
"select_template": "Modèle",
|
||
"choose_file": "Cliquez ici pour choisir un fichier",
|
||
"choose_template": "Choisissez un modèle",
|
||
"choose": "Choisir",
|
||
"remove": "Supprimer",
|
||
"select_a_status": "Sélectionnez un statut",
|
||
"select_a_tax": "Sélectionnez une taxe",
|
||
"search": "Rechercher",
|
||
"are_you_sure": "Êtes-vous sûr ?",
|
||
"list_is_empty": "La liste est vide.",
|
||
"no_tax_found": "Aucune taxe trouvée !",
|
||
"four_zero_four": "Page non trouvée",
|
||
"you_got_lost": "Oups ! Vous vous êtes perdus !",
|
||
"go_home": "Retour au tableau de bord",
|
||
"test_mail_conf": "Envoyer un email de test",
|
||
"send_mail_successfully": "Email envoyé",
|
||
"setting_updated": "Paramètres mis à jour",
|
||
"select_state": "Sélectionnez l'état",
|
||
"select_country": "Choisissez le pays",
|
||
"select_city": "Sélectionnez une ville",
|
||
"street_1": "Rue, voie, boite postale",
|
||
"street_2": "Bâtiment, étage, lieu-dit, complément,...",
|
||
"action_failed": "Action : échoué",
|
||
"retry": "Réessayez",
|
||
"choose_note": "Choisissez une note de bas de page",
|
||
"no_note_found": "Aucune note de bas de page trouvée",
|
||
"insert_note": "Insérer une note",
|
||
"copied_pdf_url_clipboard": "L'adresse du PDF a été copiée.",
|
||
"copied_url_clipboard": "URL copiée vers le presse-papier!",
|
||
"docs": "Documents",
|
||
"do_you_wish_to_continue": "Voulez-vous continuer ?",
|
||
"note": "Note de bas de page",
|
||
"pay_invoice": "Payer facture",
|
||
"login_successfully": "Identifié avec succès!",
|
||
"logged_out_successfully": "Déconnecté avec succès",
|
||
"mark_as_default": "Marquer par défaut",
|
||
"no_data_found": "Aucune donnée trouvée",
|
||
"pagination": {
|
||
"previous": "Précédent",
|
||
"next": "Suivant",
|
||
"showing": "Affichage de",
|
||
"to": "à",
|
||
"of": "sur",
|
||
"results": "résultats"
|
||
},
|
||
"file_upload": {
|
||
"drag_a_file": "Déposer un fichier ici ou",
|
||
"browse": "parcourir",
|
||
"to_choose": "pour choisir un fichier"
|
||
},
|
||
"multiselect": {
|
||
"the_list_is_empty": "La liste est vide",
|
||
"no_results_found": "Aucun résultat"
|
||
},
|
||
"copy_to_clipboard": "Copier dans le presse-papier"
|
||
},
|
||
"dashboard": {
|
||
"select_year": "Sélectionnez l'année",
|
||
"cards": {
|
||
"due_amount": "Encours clients",
|
||
"customers": "Client | Clients",
|
||
"invoices": "Facture | Factures",
|
||
"estimates": "Devis | Devis",
|
||
"payments": "Paiement | Paiements"
|
||
},
|
||
"chart_info": {
|
||
"total_sales": "Ventes",
|
||
"total_receipts": "Recettes",
|
||
"total_expense": "Dépenses",
|
||
"net_income": "Résultat",
|
||
"year": "Sélectionnez l'année"
|
||
},
|
||
"monthly_chart": {
|
||
"title": "Recettes et dépenses"
|
||
},
|
||
"recent_invoices_card": {
|
||
"title": "Factures en cours",
|
||
"due_on": "Échéance",
|
||
"customer": "Client",
|
||
"amount_due": "Montant",
|
||
"actions": "Actions",
|
||
"view_all": "Tout afficher"
|
||
},
|
||
"recent_estimate_card": {
|
||
"title": "Devis récents",
|
||
"date": "Expiration",
|
||
"customer": "Client",
|
||
"amount_due": "Montant",
|
||
"actions": "Actions",
|
||
"view_all": "Tout afficher"
|
||
}
|
||
},
|
||
"tax_types": {
|
||
"name": "Nom",
|
||
"description": "Description",
|
||
"percent": "Pourcentage",
|
||
"compound_tax": "Taxe composée",
|
||
"percentage": "Pourcentage",
|
||
"fixed_amount": "Montant fixe",
|
||
"tax_type": "Type de taxe"
|
||
},
|
||
"global_search": {
|
||
"search": "Rechercher",
|
||
"customers": "Clients",
|
||
"users": "Utilisateurs",
|
||
"no_results_found": "Aucun résultat"
|
||
},
|
||
"company_switcher": {
|
||
"label": "CHANGER DE SOCIÉTÉ",
|
||
"no_results_found": "Aucun résultat",
|
||
"add_new_company": "Ajouter une société",
|
||
"new_company": "Nouvelle société",
|
||
"created_message": "Société créée"
|
||
},
|
||
"dateRange": {
|
||
"today": "Aujourd'hui",
|
||
"this_week": "Cette semaine",
|
||
"this_month": "Ce mois",
|
||
"this_quarter": "Ce trimestre",
|
||
"this_year": "Cette année",
|
||
"previous_week": "Semaine précédente",
|
||
"previous_month": "Mois précédent",
|
||
"previous_quarter": "Trimestre précédent",
|
||
"previous_year": "Année précédente",
|
||
"custom": "Personnalisée"
|
||
},
|
||
"customers": {
|
||
"title": "Clients",
|
||
"prefix": "Code client",
|
||
"tax_id": "N° fiscal",
|
||
"add_customer": "Ajouter un client",
|
||
"contacts_list": "Liste de clients",
|
||
"name": "Nom",
|
||
"mail": "Email | Emails",
|
||
"statement": "Déclaration",
|
||
"display_name": "Nom",
|
||
"primary_contact_name": "Contact principal",
|
||
"contact_name": "Contact",
|
||
"amount_due": "Montant dû",
|
||
"email": "Email",
|
||
"address": "Adresse",
|
||
"phone": "Téléphone",
|
||
"website": "Site Internet",
|
||
"overview": "Aperçu",
|
||
"invoice_prefix": "Préfixe de facture",
|
||
"estimate_prefix": "Préfixe des devis",
|
||
"payment_prefix": "Préfixe de paiement",
|
||
"enable_portal": "Activer le portail",
|
||
"country": "Pays",
|
||
"state": "État",
|
||
"city": "Ville",
|
||
"zip_code": "Code postal",
|
||
"added_on": "Ajouté le",
|
||
"action": "Action",
|
||
"password": "Mot de passe",
|
||
"confirm_password": "Confirmez le mot de passe",
|
||
"street_number": "Numéro de rue",
|
||
"primary_currency": "Devise principale",
|
||
"description": "Description",
|
||
"add_new_customer": "Ajouter un client",
|
||
"save_customer": "Enregistrer",
|
||
"update_customer": "Enregistrer",
|
||
"customer": "Client | Clients",
|
||
"new_customer": "Nouveau client",
|
||
"edit_customer": "Modifier le client",
|
||
"basic_info": "Informations de base",
|
||
"portal_access": "Accès Portail",
|
||
"portal_access_text": "Souhaitez vous autoriser ce client à se connecter au Portail Client ?",
|
||
"portal_access_url": "URL de connexion Portail Client",
|
||
"portal_access_url_help": "Veuillez copiez et envoyez le lien ci-dessus au client pour lui fournir l'accès au portail.",
|
||
"billing_address": "Adresse de facturation",
|
||
"shipping_address": "Adresse de livraison",
|
||
"copy_billing_address": "Copier depuis l'adresse de facturation",
|
||
"no_customers": "Vous n’avez pas encore de clients !",
|
||
"no_customers_found": "Aucun client",
|
||
"no_contact": "-",
|
||
"no_contact_name": "-",
|
||
"list_of_customers": "Ajoutez des clients et retrouvez-les ici.",
|
||
"primary_display_name": "Nom d'affichage principal",
|
||
"select_currency": "Sélectionnez la devise",
|
||
"select_a_customer": "Sélectionnez un client",
|
||
"type_or_click": "Sélectionnez un article",
|
||
"new_transaction": "Ajouter une opération",
|
||
"no_matching_customers": "Il n'y a aucun client correspondant !",
|
||
"phone_number": "Numéro de téléphone",
|
||
"create_date": "Date de création",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer ce client et les devis, factures et paiements associés. | Vous ne serez pas en mesure de récupérer ces clients et les devis, factures et paiements associés.",
|
||
"created_message": "Client créé",
|
||
"updated_message": "Client mis à jour",
|
||
"address_updated_message": "Adresse mise à jour avec succès",
|
||
"deleted_message": "Client supprimé | Clients supprimés",
|
||
"edit_currency_not_allowed": "Impossible de changer de devise une fois les transactions créées."
|
||
},
|
||
"items": {
|
||
"title": "Articles",
|
||
"items_list": "Liste d'articles",
|
||
"name": "Nom",
|
||
"unit": "Unité",
|
||
"description": "Description",
|
||
"added_on": "Ajouté le",
|
||
"price": "Prix",
|
||
"date_of_creation": "Date de création",
|
||
"not_selected": "Aucun article sélectionné",
|
||
"action": "Action",
|
||
"add_item": "Nouvel article",
|
||
"save_item": "Enregistrer",
|
||
"update_item": "Enregistrer",
|
||
"item": "Article | Articles",
|
||
"add_new_item": "Ajouter un article",
|
||
"new_item": "Nouvel article",
|
||
"edit_item": "Modifier cet article",
|
||
"no_items": "Aucun article",
|
||
"list_of_items": "Ajoutez des articles et retrouvez-les ici",
|
||
"select_a_unit": "Sélectionnez l'unité",
|
||
"taxes": "Taxes",
|
||
"item_attached_message": "Impossible de supprimer un article déjà utilisé",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer cet article | Vous ne pourrez pas récupérer ces objets",
|
||
"created_message": "Article créé",
|
||
"updated_message": "Article mis à jour",
|
||
"deleted_message": "Article supprimé avec succès | Articles supprimés avec succès"
|
||
},
|
||
"estimates": {
|
||
"title": "Devis",
|
||
"accept_estimate": "Accepter devis",
|
||
"reject_estimate": "Rejeter devis",
|
||
"estimate": "Devis | Devis",
|
||
"estimates_list": "Liste des devis",
|
||
"days": "{days} jours",
|
||
"months": "{months} mois",
|
||
"years": "{years} Année",
|
||
"all": "Tous",
|
||
"paid": "Payé",
|
||
"unpaid": "Non payé",
|
||
"customer": "Client",
|
||
"ref_no": "Réf.",
|
||
"number": "N°",
|
||
"amount_due": "MONTANT",
|
||
"partially_paid": "Partiellement payé",
|
||
"total": "Total",
|
||
"discount": "Remise",
|
||
"sub_total": "Sous-total",
|
||
"net_total": "Net",
|
||
"estimate_number": "N°",
|
||
"ref_number": "Référence",
|
||
"contact": "Contact",
|
||
"add_item": "Ajouter un article",
|
||
"date": "Date",
|
||
"due_date": "Date d'échéance",
|
||
"expiry_date": "Date d'expiration",
|
||
"status": "Statut",
|
||
"add_tax": "Ajouter une taxe",
|
||
"amount": "Montant",
|
||
"action": "Action",
|
||
"notes": "Notes de bas de page",
|
||
"tax": "Taxe",
|
||
"estimate_template": "Modèle de devis",
|
||
"convert_to_invoice": "Convertir en facture",
|
||
"mark_as_sent": "Marquer comme envoyé",
|
||
"send_estimate": "Envoyer par email",
|
||
"resend_estimate": "Renvoyer le devis",
|
||
"record_payment": "Enregistrer un paiement",
|
||
"add_estimate": "Nouveau devis",
|
||
"save_estimate": "Enregistrer",
|
||
"cloned_successfully": "Devis dupliqué avec succès",
|
||
"clone_estimate": "Dupliquer le devis",
|
||
"confirm_clone": "Ce devis sera dupliqué dans un nouveau devis",
|
||
"confirm_conversion": "Ce devis sera utilisé pour créer une nouvelle facture.",
|
||
"conversion_message": "Conversion réussie",
|
||
"confirm_send_estimate": "Ce devis sera envoyée par email au client",
|
||
"confirm_mark_as_sent": "Ce devis sera marqué comme envoyé",
|
||
"confirm_mark_as_accepted": "Ce devis sera marqué comme accepté",
|
||
"confirm_mark_as_rejected": "Ce devis sera marqué comme rejeté",
|
||
"no_matching_estimates": "Aucune estimation correspondante !",
|
||
"mark_as_sent_successfully": "Devis marqué comme envoyé",
|
||
"send_estimate_successfully": "Devis envoyé",
|
||
"errors": {
|
||
"required": "Champ requis"
|
||
},
|
||
"accepted": "Accepté",
|
||
"rejected": "Refusé",
|
||
"expired": "Expiré",
|
||
"sent": "Envoyé",
|
||
"draft": "Brouillon",
|
||
"viewed": "Consultée",
|
||
"declined": "Refusé",
|
||
"new_estimate": "Nouveau devis",
|
||
"add_new_estimate": "Nouveau devis",
|
||
"update_Estimate": "Enregistrer",
|
||
"edit_estimate": "Modifier ce devis",
|
||
"items": "articles",
|
||
"Estimate": "Devis | Devis",
|
||
"add_new_tax": "Ajouter une taxe",
|
||
"no_estimates": "Aucun devis",
|
||
"list_of_estimates": "Ajoutez des clients et retrouvez-les ici",
|
||
"mark_as_rejected": "Marquer comme rejeté",
|
||
"mark_as_accepted": "Marquer comme accepté",
|
||
"marked_as_accepted_message": "Devis marqué comme accepté",
|
||
"marked_as_rejected_message": "Devis marqué comme rejeté",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer ce devis | Vous ne pourrez pas récupérer ces devis",
|
||
"created_message": "Devis créé",
|
||
"updated_message": "Devis mise à jour",
|
||
"deleted_message": "Devis supprimé | Devis supprimés",
|
||
"something_went_wrong": "quelque chose a mal tourné",
|
||
"item": {
|
||
"title": "Titre de l'article",
|
||
"description": "Description",
|
||
"quantity": "Quantité",
|
||
"price": "Prix",
|
||
"discount": "Remise",
|
||
"total": "Total",
|
||
"total_discount": "Remise totale",
|
||
"sub_total": "Sous-total",
|
||
"tax": "Taxe",
|
||
"amount": "Montant",
|
||
"select_an_item": "Sélectionnez un article",
|
||
"type_item_description": "Taper la description de l'article (facultatif)"
|
||
},
|
||
"mark_as_default_estimate_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les prochains devis."
|
||
},
|
||
"invoices": {
|
||
"title": "Factures",
|
||
"download": "Télécharger",
|
||
"pay_invoice": "Payer facture",
|
||
"invoices_list": "Liste des factures",
|
||
"invoice_information": "Informations sur la facture",
|
||
"days": "{days} jours",
|
||
"months": "{months} mois",
|
||
"years": "{years} années",
|
||
"all": "Toutes",
|
||
"paid": "Payée",
|
||
"unpaid": "Non payée",
|
||
"viewed": "Consultée",
|
||
"overdue": "En retard",
|
||
"completed": "Payée",
|
||
"customer": "CLIENT",
|
||
"paid_status": "État du paiement",
|
||
"ref_no": "Réf.",
|
||
"number": "N°",
|
||
"amount_due": "MONTANT",
|
||
"partially_paid": "Partiellement payée",
|
||
"total": "Total",
|
||
"discount": "Remise",
|
||
"sub_total": "Sous-total",
|
||
"invoice": "Facture | Factures",
|
||
"invoice_number": "N°",
|
||
"ref_number": "Référence",
|
||
"contact": "Contact",
|
||
"add_item": "Nouvel article",
|
||
"date": "Date",
|
||
"due_date": "Date d'échéance",
|
||
"status": "Statut",
|
||
"add_tax": "Ajouter une taxe",
|
||
"amount": "Montant",
|
||
"action": "Action",
|
||
"notes": "Notes de bas de page",
|
||
"view": "Afficher",
|
||
"send_invoice": "Envoyer par email",
|
||
"resend_invoice": "Renvoyer la facture",
|
||
"invoice_template": "Modèle de facture",
|
||
"conversion_message": "Facture clonée",
|
||
"template": "Modèle",
|
||
"mark_as_sent": "Marquer comme envoyée",
|
||
"confirm_send_invoice": "Cette facture sera envoyée par email au client",
|
||
"invoice_mark_as_sent": "Cette facture sera marquée comme envoyé",
|
||
"confirm_mark_as_accepted": "Cette facture sera marquée comme acceptée",
|
||
"confirm_mark_as_rejected": "Cette facture sera marquée comme rejetée",
|
||
"confirm_send": "Cette facture sera envoyée par email au client",
|
||
"invoice_date": "Date",
|
||
"record_payment": "Enregistrer un paiement",
|
||
"add_new_invoice": "Nouvelle facture",
|
||
"update_expense": "Enregistrer la dépense",
|
||
"edit_invoice": "Modifier cette facture",
|
||
"new_invoice": "Nouvelle facture",
|
||
"save_invoice": "Enregistrer",
|
||
"update_invoice": "Enregistrer",
|
||
"add_new_tax": "Ajouter une taxe",
|
||
"no_invoices": "Aucune facture",
|
||
"mark_as_rejected": "Marquer comme rejetée",
|
||
"mark_as_accepted": "Marquer comme acceptée",
|
||
"list_of_invoices": "Ajoutez des factures et retrouvez-les ici",
|
||
"select_invoice": "Sélectionnez facture",
|
||
"no_matching_invoices": "Aucune facture correspondante !",
|
||
"mark_as_sent_successfully": "Facture marquée comme envoyée",
|
||
"invoice_sent_successfully": "Facture envoyée",
|
||
"cloned_successfully": "Facture clonée",
|
||
"clone_invoice": "Dupliquer",
|
||
"confirm_clone": "Cette facture sera dupliquée dans une nouvelle facture",
|
||
"create_credit_note": "Créer un avoir",
|
||
"credit_note_created": "Avoir créé",
|
||
"credit_note": "Avoir",
|
||
"credit_note_items": "Lignes à créditer",
|
||
"credit_note_quantity_to_credit": "Qté à créditer",
|
||
"credit_note_original_quantity": "Facturé",
|
||
"credit_note_already_credited": "Crédité",
|
||
"credit_note_remaining_quantity": "Restant",
|
||
"credit_note_amount": "Montant",
|
||
"credit_note_credited_subtotal": "Sous-total crédité",
|
||
"credit_note_reason": "Motif",
|
||
"credit_note_reason_placeholder": "Facultatif : pourquoi cette facture est créditée",
|
||
"credit_note_proportional_note": "Les remises et les taxes sont créditées au prorata des lignes et des quantités sélectionnées ci-dessus.",
|
||
"credit_note_select_at_least_one_item": "Sélectionnez au moins une ligne à créditer.",
|
||
"credit_note_quantity_exceeds_remaining": "La quantité dépasse la quantité restante de cette ligne.",
|
||
"credit_note_fully_credited_line": "Entièrement crédité",
|
||
"credited_amount": "Montant crédité",
|
||
"partially_credited": "Partiellement créditée",
|
||
"partially_credited_via_credit_notes": "Partiellement créditée par l'avoir",
|
||
"original_invoice": "Facture d'origine",
|
||
"cancelled": "Annulée",
|
||
"cancelled_via_credit_note": "Annulée par un avoir",
|
||
"item": {
|
||
"title": "Titre de l'article",
|
||
"description": "Description",
|
||
"quantity": "Quantité",
|
||
"price": "Prix",
|
||
"discount": "Remise",
|
||
"total": "Total",
|
||
"total_discount": "Remise totale",
|
||
"sub_total": "Sous-total",
|
||
"tax": "Taxe",
|
||
"amount": "Montant",
|
||
"select_an_item": "Sélectionnez un article",
|
||
"type_item_description": "Saisissez une description (facultatif)"
|
||
},
|
||
"payment_attached_message": "Un paiement est lié à l'une des factures sélectionnées. Veuillez d'abord les supprimer, puis réessayez",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer cette facture | Vous ne pourrez pas récupérer ces factures",
|
||
"created_message": "Facture créée",
|
||
"updated_message": "Facture mise à jour",
|
||
"deleted_message": "La facture a été supprimée | Les factures ont été supprimées",
|
||
"marked_as_sent_message": "Facture supprimée | Factures supprimées",
|
||
"something_went_wrong": "quelque chose a mal tourné",
|
||
"invalid_due_amount_message": "Le paiement entré est supérieur au montant total dû pour cette facture. Veuillez vérifier et réessayer.",
|
||
"mark_as_default_invoice_template_description": "Si activé, le modèle sélectionné sera automatiquement utilisé pour les nouvelles factures."
|
||
},
|
||
"recurring_invoices": {
|
||
"title": "Factures récurrentes",
|
||
"invoices_list": "Liste des factures récurrentes",
|
||
"days": "{days} jours",
|
||
"months": "{months} mois",
|
||
"years": "{years} ans",
|
||
"all": "Toutes",
|
||
"paid": "Payée",
|
||
"unpaid": "Non payée",
|
||
"viewed": "Consultée",
|
||
"overdue": "En retard",
|
||
"active": "Actif",
|
||
"completed": "Payée",
|
||
"customer": "CLIENT",
|
||
"paid_status": "ÉTAT DU PAIEMENT",
|
||
"ref_no": "N° de REF.",
|
||
"number": "N°",
|
||
"amount_due": "MONTANT DÛ",
|
||
"partially_paid": "Partiellement payée",
|
||
"total": "Total",
|
||
"discount": "Remise",
|
||
"sub_total": "Sous-total",
|
||
"invoice": "Facture récurrente | Factures récurrentes",
|
||
"invoice_number": "N°",
|
||
"next_invoice_date": "Prochaine date de facturation",
|
||
"ref_number": "N° de référence",
|
||
"contact": "Contact",
|
||
"add_item": "Ajouter un article",
|
||
"date": "Date",
|
||
"limit_by": "Limiter par",
|
||
"limit_date": "Date limite",
|
||
"limit_count": "Nombre limite",
|
||
"count": "Nombre",
|
||
"status": "Statut",
|
||
"select_a_status": "Sélectionnez un statut",
|
||
"working": "Active",
|
||
"on_hold": "Suspendue",
|
||
"complete": "Payée",
|
||
"add_tax": "Ajouter une taxe",
|
||
"amount": "Montant",
|
||
"action": "Action",
|
||
"notes": "Notes de bas de page",
|
||
"view": "Afficher",
|
||
"basic_info": "Informations générales",
|
||
"send_invoice": "Envoyer la facture récurrente",
|
||
"auto_send": "Envoi automatique",
|
||
"resend_invoice": "Renvoyer la facture récurrente",
|
||
"invoice_template": "Modèle de facture récurrente",
|
||
"conversion_message": "Facture récurrente clonée",
|
||
"template": "Modèle",
|
||
"mark_as_sent": "Marquer comme envoyée",
|
||
"confirm_send_invoice": "Cette facture récurrente sera envoyée par email au client",
|
||
"invoice_mark_as_sent": "Cette facture récurrente sera marquée comme envoyée",
|
||
"confirm_send": "Cette facture récurrente sera envoyée par email au client",
|
||
"starts_at": "Date de début",
|
||
"due_date": "Date d'échéance",
|
||
"record_payment": "Enregister un paiement",
|
||
"add_new_invoice": "Nouvelle facture récurrente",
|
||
"update_expense": "Mettre à jour les dépenses",
|
||
"edit_invoice": "Modifier cette facture récurrente",
|
||
"new_invoice": "Nouvelle facture récurrente",
|
||
"send_automatically": "Envoyer automatiquement",
|
||
"send_automatically_desc": "Activez ceci si vous souhaitez envoyer la facture automatiquement au client lorsque celle-ci est créée.",
|
||
"save_invoice": "Enregistrer",
|
||
"update_invoice": "Modifier la facture récurrente",
|
||
"add_new_tax": "Ajouter une taxe",
|
||
"no_invoices": "Aucune facture récurrente pour le moment !",
|
||
"mark_as_rejected": "Marquer comme rejetée",
|
||
"mark_as_accepted": "Marquer comme accepté",
|
||
"list_of_invoices": "Ajoutez des factures récurrentes et retrouvez-les ici",
|
||
"select_invoice": "Sélectionnez la facture",
|
||
"no_matching_invoices": "Aucune facture récurrente correspondante",
|
||
"mark_as_sent_successfully": "Facture récurrente marquée comme envoyée",
|
||
"invoice_sent_successfully": "Facture récurrente envoyée",
|
||
"cloned_successfully": "Facture récurrente clonée",
|
||
"clone_invoice": "Dupliquer",
|
||
"confirm_clone": "Cette facture récurrente sera clonée dans une nouvelle facture récurrente",
|
||
"add_customer_email": "Veuillez ajouter une adresse e-mail pour ce client afin d'envoyer les factures automatiquement.",
|
||
"item": {
|
||
"title": "Nom",
|
||
"description": "Description",
|
||
"quantity": "Quantité",
|
||
"price": "Prix",
|
||
"discount": "Remise",
|
||
"total": "Total",
|
||
"total_discount": "Remise totale",
|
||
"sub_total": "Sous-total",
|
||
"tax": "Taxe",
|
||
"amount": "Montant",
|
||
"select_an_item": "Tapez ou cliquez pour sélectionner un article",
|
||
"type_item_description": "Description de l'article (facultatif)"
|
||
},
|
||
"frequency": {
|
||
"title": "Fréquence (au format cron)",
|
||
"select_frequency": "Sélectionner la fréquence",
|
||
"minute": "Minute",
|
||
"hour": "Heure",
|
||
"day_month": "Jour du mois",
|
||
"month": "Mois",
|
||
"day_week": "Jour de la semaine",
|
||
"every_minute": "Toutes les minutes",
|
||
"every_30_minute": "Toutes les 30 minutes",
|
||
"every_hour": "Toutes les heures",
|
||
"every_2_hour": "Toutes les 2 heures",
|
||
"every_day_at_midnight": "Tous les jours à minuit",
|
||
"every_week": "Toutes les semaines",
|
||
"every_15_days_at_midnight": "Tous les 15 jours à minuit",
|
||
"on_the_first_day_of_every_month_at_midnight": "Au premier jour du mois à minuit",
|
||
"every_6_month": "Tous les 6 mois",
|
||
"every_year_on_the_first_day_of_january_at_midnight": "Tous les ans, au premier janvier à minuit",
|
||
"custom": "Personnalisée"
|
||
},
|
||
"confirm_delete": "Vous ne pourrez pas récupérer cette facture | Vous ne pourrez pas récupérer ces factures",
|
||
"created_message": "Facture récurrente créée",
|
||
"updated_message": "Facture récurrente mise à jour",
|
||
"deleted_message": "Facture récurrente supprimée",
|
||
"marked_as_sent_message": "Facture récurrente envoyée",
|
||
"user_email_does_not_exist": "L'email de l'utilisateur n'existe pas",
|
||
"something_went_wrong": "une erreur s’est produite",
|
||
"invalid_due_amount_message": "Le montant total de la facture récurrente ne peut pas être inférieur au montant total payé pour cette facture récurrente. Veuillez mettre à jour la facture ou supprimer les paiements associés pour continuer.",
|
||
"limit": {
|
||
"none": "Pas de limite",
|
||
"date": "Date",
|
||
"count": "Nombre"
|
||
}
|
||
},
|
||
"payments": {
|
||
"title": "Paiements",
|
||
"payments_list": "Liste de paiements",
|
||
"record_payment": "Enregistrer un paiement",
|
||
"customer": "Client",
|
||
"date": "Date",
|
||
"amount": "Montant",
|
||
"action": "Action",
|
||
"payment_number": "N°",
|
||
"payment_mode": "Mode de paiement",
|
||
"invoice": "Facture",
|
||
"note": "Description",
|
||
"add_payment": "Nouveau paiement",
|
||
"new_payment": "Nouveau paiement",
|
||
"edit_payment": "Modifier ce paiement",
|
||
"view_payment": "Afficher le paiement",
|
||
"add_new_payment": "Nouveau paiement",
|
||
"send_payment_receipt": "Envoyer le reçu",
|
||
"send_payment": "Envoyer par email",
|
||
"save_payment": "Enregistrer",
|
||
"update_payment": "Enregistrer",
|
||
"payment": "Paiement | Paiements",
|
||
"no_payments": "Aucun paiement",
|
||
"not_selected": "-",
|
||
"no_invoice": "Aucune facture",
|
||
"no_matching_payments": "Il n'y a aucun paiement correspondant !",
|
||
"list_of_payments": "Ajoutez des paiements et retrouvez-les ici",
|
||
"select_payment_mode": "Sélectionnez le mode de paiement",
|
||
"confirm_mark_as_sent": "Ce devis sera marqué comme envoyé",
|
||
"confirm_send_payment": "Ce paiement sera envoyé par email au client",
|
||
"send_payment_successfully": "Paiement envoyé",
|
||
"something_went_wrong": "quelque chose a mal tourné",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer ce paiement | Vous ne pourrez pas récupérer ces paiements",
|
||
"created_message": "Paiement créé",
|
||
"updated_message": "Paiement mis à jour",
|
||
"deleted_message": "Paiement supprimé | Paiements supprimés",
|
||
"invalid_amount_message": "Le montant du paiement est invalide",
|
||
"amount_due": "Montant dû"
|
||
},
|
||
"expenses": {
|
||
"title": "Dépenses",
|
||
"expenses_list": "Liste des dépenses",
|
||
"select_a_customer": "Sélectionnez un client",
|
||
"expense_title": "Titre",
|
||
"customer": "Client",
|
||
"currency": "Devise",
|
||
"contact": "Contact",
|
||
"category": "Catégorie",
|
||
"from_date": "Du",
|
||
"to_date": "Au",
|
||
"expense_date": "Date",
|
||
"expense_number": "Numéro de dépense",
|
||
"expense_number_placeholder": "EXP-001",
|
||
"description": "Description",
|
||
"receipt": "Reçu",
|
||
"amount": "Montant",
|
||
"action": "Action",
|
||
"not_selected": "-",
|
||
"note": "Description",
|
||
"category_id": "Identifiant de catégorie",
|
||
"date": "Date",
|
||
"add_expense": "Nouvelle dépense",
|
||
"add_new_expense": "Nouvelle dépense",
|
||
"save_expense": "Enregistrer",
|
||
"update_expense": "Enregistrer",
|
||
"download_receipt": "Télécharger le reçu",
|
||
"edit_expense": "Modifier cette dépense",
|
||
"new_expense": "Nouvelle dépense",
|
||
"expense": "Dépense | Dépenses",
|
||
"no_expenses": "Aucune dépense",
|
||
"list_of_expenses": "Ajoutez des dépenses et retrouvez-les ici",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer cette dépense | Vous ne pourrez pas récupérer ces dépenses",
|
||
"created_message": "Dépense créée",
|
||
"updated_message": "Dépense mise à jour",
|
||
"deleted_message": "Dépense supprimée | Dépenses supprimées",
|
||
"categories": {
|
||
"categories_list": "Liste des catégories",
|
||
"title": "Titre",
|
||
"name": "Nom",
|
||
"description": "Description",
|
||
"amount": "Montant",
|
||
"actions": "Actions",
|
||
"add_category": "Nouvelle catégorie",
|
||
"new_category": "Nouvelle catégorie",
|
||
"category": "Catégorie | Catégories",
|
||
"select_a_category": "Choisissez une catégorie"
|
||
}
|
||
},
|
||
"login": {
|
||
"email": "Email",
|
||
"password": "Mot de passe",
|
||
"forgot_password": "Mot de passe oublié ?",
|
||
"or_signIn_with": "ou connectez-vous avec",
|
||
"login": "Se connecter",
|
||
"register": "S'inscrire",
|
||
"reset_password": "Réinitialiser le mot de passe",
|
||
"password_reset_successfully": "Réinitialisation du mot de passe réussie",
|
||
"enter_email": "Entrez votre email",
|
||
"enter_password": "Entrer le mot de passe",
|
||
"retype_password": "Retaper le mot de passe"
|
||
},
|
||
"modules": {
|
||
"buy_now": "Acheter maintenant",
|
||
"install": "Installer",
|
||
"price": "Prix",
|
||
"download_zip_file": "Télécharger le fichier ZIP",
|
||
"unzipping_package": "Décompresser le fichier",
|
||
"copying_files": "Copie de fichiers en cours",
|
||
"deleting_files": "Supprimer les fichiers inutilisés",
|
||
"completing_installation": "Terminer l'installation",
|
||
"update_failed": "Échec de la mise à jour",
|
||
"install_success": "Votre module a été correctement installé !",
|
||
"customer_reviews": "Évaluations",
|
||
"license": "Licence",
|
||
"faq": "FAQ",
|
||
"monthly": "Mensuel",
|
||
"yearly": "Annuel",
|
||
"updated": "Mis à jour",
|
||
"version": "Version",
|
||
"disable": "Désactiver",
|
||
"module_disabled": "Module désactivé",
|
||
"enable": "Activer",
|
||
"module_enabled": "Module activé",
|
||
"update_to": "Mise à jour vers",
|
||
"module_updated": "Le module a bien été mis à jour !",
|
||
"title": "Modules",
|
||
"module": "Module",
|
||
"api_token": "Jeton API",
|
||
"invalid_api_token": "Jeton API invalide.",
|
||
"other_modules": "Autres modules",
|
||
"view_all": "Tout afficher",
|
||
"no_reviews_found": "Il n'y a pas encore d'avis pour ce module !",
|
||
"module_not_purchased": "Module non acheté",
|
||
"module_not_found": "Module non trouvé",
|
||
"version_not_supported": "This module version doesn't support the current version of InvoiceShelf",
|
||
"last_updated": "Mis à jour le",
|
||
"connect_installation": "Connectez votre installation",
|
||
"api_token_description": "Rendez-vous à {url} et connectez votre application en entrant le jeton d'API. Vos modules achetés apparaîtront ici une fois la connexion établie.",
|
||
"view_module": "Afficher le module",
|
||
"update_available": "Mise à jour disponible",
|
||
"purchased": "Acheté",
|
||
"installed": "Installé",
|
||
"no_modules_installed": "Aucun module installé !",
|
||
"disable_warning": "Tous les paramètres de ce module seront réinitialisés.",
|
||
"what_you_get": "Ce que vous obtenez",
|
||
"sign_up_and_get_token": "S'inscrire et obtenir un jeton"
|
||
},
|
||
"users": {
|
||
"title": "Utilisateurs",
|
||
"users_list": "Liste des utilisateurs",
|
||
"name": "Nom",
|
||
"description": "Description",
|
||
"added_on": "Ajouté le",
|
||
"date_of_creation": "Date de création",
|
||
"action": "Action",
|
||
"add_user": "Nouvel utilisateur",
|
||
"save_user": "Enregistrer l'utilisateur",
|
||
"update_user": "Enregistrer",
|
||
"user": "Utilisateur | Utilisateurs",
|
||
"add_new_user": "Nouvel utilisateur",
|
||
"new_user": "Nouvel utilisateur",
|
||
"edit_user": "Modifier cet utilisateur",
|
||
"no_users": "Aucun utilisateur",
|
||
"list_of_users": "Ajoutez des utilisateurs et retrouvez-les ici",
|
||
"email": "Email",
|
||
"phone": "Téléphone",
|
||
"password": "Mot de passe",
|
||
"user_attached_message": "Impossible de supprimer un élément déjà utilisé",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer cet utilisateur | Vous ne pourrez pas récupérer ces utilisateurs",
|
||
"created_message": "Utilisateur créé",
|
||
"updated_message": "Utilisateur mis à jour",
|
||
"deleted_message": "Utilisateur supprimé | Utilisateurs supprimés",
|
||
"select_company_role": "Sélectionner un rôle pour {company}",
|
||
"companies": "Sociétés"
|
||
},
|
||
"reports": {
|
||
"title": "Rapport",
|
||
"from_date": "Du",
|
||
"to_date": "Au",
|
||
"status": "Statut",
|
||
"paid": "Payé",
|
||
"unpaid": "Non payé",
|
||
"download_pdf": "Télécharger le PDF",
|
||
"view_pdf": "Afficher le PDF",
|
||
"update_report": "Actualiser",
|
||
"report": "Rapport | Rapports",
|
||
"profit_loss": {
|
||
"profit_loss": "Balance",
|
||
"to_date": "Au",
|
||
"from_date": "Du",
|
||
"date_range": "Période"
|
||
},
|
||
"sales": {
|
||
"sales": "Ventes",
|
||
"date_range": "Période",
|
||
"to_date": "Au",
|
||
"from_date": "Du",
|
||
"report_type": "Trier",
|
||
"sort": {
|
||
"by_customer": "Par client",
|
||
"by_item": "Par article"
|
||
}
|
||
},
|
||
"taxes": {
|
||
"taxes": "Taxes",
|
||
"to_date": "Au",
|
||
"from_date": "Du",
|
||
"date_range": "Période"
|
||
},
|
||
"errors": {
|
||
"required": "Champ requis"
|
||
},
|
||
"invoices": {
|
||
"invoice": "Facture",
|
||
"invoice_date": "Date",
|
||
"due_date": "Date déchéance",
|
||
"amount": "Montant ",
|
||
"contact_name": "Contact",
|
||
"status": "Statut"
|
||
},
|
||
"estimates": {
|
||
"estimate": "Devis",
|
||
"estimate_date": "Date",
|
||
"due_date": "Date d'échéance",
|
||
"estimate_number": "N°",
|
||
"ref_number": "Référence",
|
||
"amount": "Montant",
|
||
"contact_name": "Contact",
|
||
"status": "Statut"
|
||
},
|
||
"expenses": {
|
||
"expenses": "Dépenses",
|
||
"category": "Nom",
|
||
"date": "Date",
|
||
"amount": "Montant",
|
||
"to_date": "Au",
|
||
"from_date": "Du",
|
||
"date_range": "Période"
|
||
}
|
||
},
|
||
"settings": {
|
||
"menu_title": {
|
||
"account_settings": "Profil",
|
||
"company_information": "Coordonnées de la société",
|
||
"customization": "Personnalisation",
|
||
"preferences": "Préférences",
|
||
"notifications": "Notifications",
|
||
"tax_types": "Taxes",
|
||
"expense_category": "Catégories de dépense",
|
||
"update_app": "Mise à jour",
|
||
"backup": "Sauvegarde",
|
||
"file_disk": "Stockage",
|
||
"custom_fields": "Champs personnalisés",
|
||
"payment_modes": "Modes de paiement",
|
||
"notes": "Notes de bas de page",
|
||
"exchange_rate": "Taux de change",
|
||
"address_information": "Information d'adresse",
|
||
"pdf_generation": "Génération de PDF"
|
||
},
|
||
"address_information": {
|
||
"section_description": " Vous pouvez mettre à jour vos informations d'adresse via le formulaire ci dessous."
|
||
},
|
||
"title": "Paramètres",
|
||
"setting": "Paramètres | Paramètres",
|
||
"general": "Paramètres généraux",
|
||
"language": "Langue",
|
||
"primary_currency": "Devise principale",
|
||
"timezone": "Fuseau horaire",
|
||
"date_format": "Format de date",
|
||
"time_format": "Format d'heure",
|
||
"currencies": {
|
||
"title": "Devises",
|
||
"currency": "Devise | Devises",
|
||
"currencies_list": "Liste des devises",
|
||
"select_currency": "Sélectionnez la devise",
|
||
"name": "Nom",
|
||
"code": "Code ",
|
||
"symbol": "Symbole",
|
||
"precision": "Précision",
|
||
"thousand_separator": "Séparateur de milliers",
|
||
"decimal_separator": "Séparateur décimal",
|
||
"position": "Position",
|
||
"position_of_symbol": "Position du symbole",
|
||
"right": "Droite",
|
||
"left": "Gauche",
|
||
"action": "Action",
|
||
"add_currency": "Ajouter une devise"
|
||
},
|
||
"mail": {
|
||
"host": "Adresse du serveur",
|
||
"port": "Port",
|
||
"driver": "Fournisseur",
|
||
"secret": "Secret",
|
||
"mailgun_secret": "Secret Mailgun",
|
||
"mailgun_domain": "Domaine",
|
||
"mailgun_endpoint": "Mailgun Endpoint",
|
||
"ses_secret": "SES Secret",
|
||
"ses_key": "SES Key",
|
||
"ses_region": "Région AWS",
|
||
"password": "Mot de passe",
|
||
"username": "Nom d'utilisateur",
|
||
"mail_config": "Envoi d'emails",
|
||
"from_name": "Nom de l'expéditeur",
|
||
"from_mail": "Email de l'expéditeur",
|
||
"encryption": "Chiffrement",
|
||
"mail_config_desc": "Saisissez ici les paramètres d'envoi de votre boîte email, afin que l'application puisse envoyer des messages. Vous pouvez également utiliser un service tiers, comme Sendgrid par exemple."
|
||
},
|
||
"pdf": {
|
||
"title": "Paramètre PDF",
|
||
"footer_text": "Pied de page",
|
||
"pdf_layout": "Mise en page PDF",
|
||
"pdf_configuration": "Réglages pour la génération des PDF",
|
||
"section_description": "Changer la méthode de génération des PDF",
|
||
"driver": "Pilote PDF à utiliser",
|
||
"papersize": "Format de papier",
|
||
"papersize_hint": "Format de papier en largeur et hauteur (ex. \"210 mm 297 mm\")",
|
||
"gotenberg_host": "Service du serveur Gotenberg",
|
||
"pdf_variables_save_successfully": "La configuration PDF a été sauvegardée",
|
||
"pdf_variables_save_error": "La configuration PDF n’a pas pu être enregistrée"
|
||
},
|
||
"company_info": {
|
||
"company_info": "Coordonnées de la société",
|
||
"company_name": "Nom",
|
||
"tax_id": "N° d'identification fiscale (SIREN)",
|
||
"vat_id": "N° d'identification TVA",
|
||
"company_logo": "Logo",
|
||
"section_description": "Saisissez ici les coordonnées de votre entreprise qui s'afficheront sur tous vos documents.",
|
||
"phone": "Téléphone",
|
||
"country": "Pays",
|
||
"state": "État",
|
||
"city": "Ville",
|
||
"address": "Adresse",
|
||
"zip": "Code postal",
|
||
"save": "Enregistrer",
|
||
"delete": "Supprimer",
|
||
"updated_message": "Informations sur la société mises à jour",
|
||
"delete_company": "Supprimer la société",
|
||
"delete_company_description": "Une fois votre société supprimée, vous perdrez définitivement toutes les données et fichiers qui lui sont associés.",
|
||
"are_you_absolutely_sure": "En êtes-vous vraiment sûr ?",
|
||
"delete_company_modal_desc": "Cette action ne peut pas être annulée. Cela supprimera définitivement {company} et toutes les données associées.",
|
||
"delete_company_modal_label": "Veuillez saisir {company} pour confirmer"
|
||
},
|
||
"custom_fields": {
|
||
"title": "Champs personnalisés",
|
||
"section_description": "Personnalisez vos factures, devis et reçus de paiement avec vos propres champs. Vous pouvez les utiliser dans les formats d'adresse ou dans les notes de bas de page.",
|
||
"add_custom_field": "Ajouter un champ personnalisé",
|
||
"edit_custom_field": "Modifier ce champ personnalisé",
|
||
"field_name": "Nom du champs",
|
||
"label": "Étiquette",
|
||
"type": "Type ",
|
||
"name": "Nom",
|
||
"slug": "Jeton",
|
||
"required": "Obligatoire",
|
||
"placeholder": "Indication",
|
||
"help_text": "Texte d'aide",
|
||
"default_value": "Valeur par défaut",
|
||
"prefix": "Préfixe",
|
||
"starting_number": "Numéro de départ",
|
||
"model": "Appliquer à",
|
||
"help_text_description": "Saisissez du texte pour aider les utilisateurs à comprendre l'objectif de ce champ personnalisé.",
|
||
"suffix": "Suffixe",
|
||
"yes": "Oui",
|
||
"no": "Non",
|
||
"order": "Ordre",
|
||
"custom_field_confirm_delete": "Vous ne pourrez pas récupérer ce champ personnalisé",
|
||
"already_in_use": "Le champ personnalisé est déjà utilisé",
|
||
"deleted_message": "Champ personnalisé supprimé",
|
||
"options": "les options",
|
||
"add_option": "Ajouter des options",
|
||
"add_another_option": "Ajouter une autre option",
|
||
"sort_in_alphabetical_order": "Trier par ordre alphabétique",
|
||
"add_options_in_bulk": "Ajouter des options en masse",
|
||
"use_predefined_options": "Utiliser des options prédéfinies",
|
||
"select_custom_date": "Sélectionnez une date personnalisée",
|
||
"select_relative_date": "Sélectionnez la date relative",
|
||
"ticked_by_default": "Coché par défaut",
|
||
"updated_message": "Champ personnalisé mis à jour",
|
||
"added_message": "Champ personnalisé ajouté",
|
||
"press_enter_to_add": "Appuyez sur Entrée pour ajouter une nouvelle option",
|
||
"model_in_use": "Impossible de mettre à jour le modèle pour les champs qui sont déjà utilisés.",
|
||
"type_in_use": "Impossible de mettre à jour le type des champs déjà utilisés.",
|
||
"model_type": {
|
||
"customer": "Client",
|
||
"invoice": "Facture",
|
||
"estimate": "Devis",
|
||
"expense": "Dépense",
|
||
"payment": "Paiement"
|
||
}
|
||
},
|
||
"customization": {
|
||
"customization": "Personnalisation",
|
||
"updated_message": "Informations la société mises à jour",
|
||
"save": "Enregistrer",
|
||
"insert_fields": "Insérer des champs",
|
||
"learn_custom_format": "Apprenez à utiliser le format personnalisé",
|
||
"add_new_component": "Ajouter un composant",
|
||
"component": "Composant",
|
||
"Parameter": "Paramètre",
|
||
"series": "Texte",
|
||
"series_description": "Un texte statique qui peut faire jusqu'à quatre caractères.",
|
||
"series_param_label": "Texte",
|
||
"delimiter": "Séparateur",
|
||
"delimiter_description": "Un caractère servant à séparer deux composants. Par exemple, un trait d'union",
|
||
"delimiter_param_label": "Caractère",
|
||
"date_format": "Date",
|
||
"time_format": "Format d'heure",
|
||
"date_format_description": "Une date qui peut formatée. Par exemple, \"Y\" affichera l'année en cours.",
|
||
"date_format_param_label": "Format",
|
||
"sequence": "Suite",
|
||
"sequence_description": "Génère un numéro de facture unique. Vous pouvez indiquer le nombre de chiffres à utiliser.",
|
||
"sequence_param_label": "Longueur",
|
||
"customer_series": "Code client",
|
||
"customer_series_description": "Un code unique à chaque client, qui peut être indiqué dans les paramètres du client.",
|
||
"customer_sequence": "Numéro client",
|
||
"customer_sequence_description": "Un numéro de client unique.",
|
||
"customer_sequence_param_label": "Longueur",
|
||
"random_sequence": "Suite aléatoire",
|
||
"random_sequence_description": "Suite alphanumérique aléatoire.\nVous pouvez spécifier le nombre de caractère.",
|
||
"random_sequence_param_label": "Longueur",
|
||
"invoices": {
|
||
"title": "Factures",
|
||
"invoice_number_format": "Format de numéro",
|
||
"invoice_number_format_description": "Personnalisez la structure de vos numéros de facture.",
|
||
"preview_invoice_number": "Aperçu",
|
||
"due_date": "Date d'échéance",
|
||
"due_date_description": "Indiquez si la date d'échéance doit être automatiquement définie lorsque vous créez une facture.",
|
||
"due_date_days": "Nombre de jours avant l'échéance de la facture",
|
||
"set_due_date_automatically": "Remplir automatiquement la date d'échéance",
|
||
"set_due_date_automatically_description": "Activez cette option si vous souhaitez définir automatiquement la date d'échéance lors de la création d'une facture.",
|
||
"default_formats": "Modèles",
|
||
"default_formats_description": "Modifiez ci-dessous les formats d'adresse ou l'email utilisé lors de la création d'une facture.",
|
||
"default_invoice_email_body": "Modèle d'email",
|
||
"company_address_format": "Adresse de la société",
|
||
"shipping_address_format": "Adresse d'expédition",
|
||
"billing_address_format": "Adresse de facturation",
|
||
"invoice_email_attachment": "Envoyer les factures en pièces jointes",
|
||
"invoice_email_attachment_setting_description": "Activez cette option si vous souhaitez envoyer les factures en pièces jointes. Le bouton \"Afficher la facture\" n'apparaîtra plus dans l'email.",
|
||
"invoice_settings_updated": "Paramètres de facturation mis à jour",
|
||
"retrospective_edits": "Édition à postériori",
|
||
"allow": "Autoriser",
|
||
"disable_on_invoice_partial_paid": "Désactiver après l'enregistrement d'un paiement partiel",
|
||
"disable_on_invoice_paid": "Désactiver après l'enregistrement du paiement intégral",
|
||
"disable_on_invoice_sent": "Désactiver après l'envoi de la facture",
|
||
"retrospective_edits_description": "Vous pouvez empêcher la modification de factures lorsque un paiement est effectué, pour être en conformité avec la loi de certains pays."
|
||
},
|
||
"credit_notes": {
|
||
"title": "Avoirs",
|
||
"credit_note_number_format": "Format de numéro",
|
||
"credit_note_number_format_description": "Personnalisez la structure de vos numéros d'avoir. Les avoirs sont numérotés indépendamment des factures.",
|
||
"preview_credit_note_number": "Aperçu",
|
||
"credit_note_settings_updated": "Paramètres des avoirs mis à jour"
|
||
},
|
||
"estimates": {
|
||
"title": "Devis",
|
||
"estimate_number_format": "Format de numéro",
|
||
"estimate_number_format_description": "Personnalisez la structure de vos numéros de devis.",
|
||
"preview_estimate_number": "Aperçu",
|
||
"expiry_date": "Date d'expiration",
|
||
"expiry_date_description": "Indiquez si la date d'échéance doit être automatiquement définie lorsque vous créez un devis.",
|
||
"expiry_date_days": "Le devis expire après les jours",
|
||
"set_expiry_date_automatically": "Définir automatiquement la date d'expiration",
|
||
"set_expiry_date_automatically_description": "Activez cette option si vous souhaitez définir automatiquement la date d'échéance lors de la création d'un devis.",
|
||
"default_formats": "Formats par défaut",
|
||
"default_formats_description": "Modifiez ci-dessous les formats d'adresse ou l'email utilisé lors de la création d'un devis.",
|
||
"default_estimate_email_body": "Modèle d'email",
|
||
"company_address_format": "Adresse de la société",
|
||
"shipping_address_format": "Adresse d'expédition",
|
||
"billing_address_format": "Adresse de facturation",
|
||
"estimate_email_attachment": "Envoyer les devis en pièces jointes",
|
||
"estimate_email_attachment_setting_description": "Activez cette option si vous souhaitez envoyer les devis en pièces jointes. Le bouton \"Afficher le devis\" n'apparaîtra plus dans l'email.",
|
||
"estimate_settings_updated": "Paramètres de devis mis à jour",
|
||
"convert_estimate_options": "Conversion du devis",
|
||
"convert_estimate_description": "Indiquez quoi faire du devis après sa conversion en facture.",
|
||
"no_action": "Ne rien faire",
|
||
"delete_estimate": "Supprimer le devis",
|
||
"mark_estimate_as_accepted": "Marquer le devis comme accepté"
|
||
},
|
||
"payments": {
|
||
"title": "Paiements",
|
||
"payment_number_format": "Format de numéro",
|
||
"payment_number_format_description": "Personnalisez la structure de vos numéros de reçu de paiement.",
|
||
"preview_payment_number": "Aperçu",
|
||
"default_formats": "Formats par défaut",
|
||
"default_formats_description": "Modifiez ci-dessous les formats d'adresse ou l'email utilisé lors de la création d'un reçu de paiement.",
|
||
"default_payment_email_body": "Modèle d'email",
|
||
"company_address_format": "Adresse de la société",
|
||
"from_customer_address_format": "Adresse de facturation",
|
||
"payment_email_attachment": "Envoyer les reçus de paiement en pièces jointes",
|
||
"payment_email_attachment_setting_description": "Activez cette option si vous souhaitez envoyer les devis en pièces jointes. Le bouton \"Afficher le reçu de paiement\" n'apparaîtra plus dans l'email.",
|
||
"payment_settings_updated": "Paramètres mis à jour"
|
||
},
|
||
"items": {
|
||
"title": "Articles",
|
||
"units": "Unités",
|
||
"add_item_unit": "Ajouter une unité",
|
||
"edit_item_unit": "Modifier cette unité",
|
||
"unit_name": "Nom",
|
||
"item_unit_added": "Unité ajoutée",
|
||
"item_unit_updated": "Unité mis à jour",
|
||
"item_unit_confirm_delete": "Êtes-vous sur de supprimer cette unité ?",
|
||
"already_in_use": "Cette unité existe déjà",
|
||
"deleted_message": "Unité supprimée"
|
||
},
|
||
"notes": {
|
||
"title": "Notes de bas de page",
|
||
"description": "Créez des notes de bas de page réutilisable sur vos factures, devis et paiements.",
|
||
"notes": "Note de bas de page",
|
||
"type": "Type ",
|
||
"is_default": "Sélectionner par défaut",
|
||
"is_default_description": "Cette note sera sélectionnée par défaut dans les nouvelles factures.",
|
||
"add_note": "Nouvelle note de bas de page",
|
||
"add_new_note": "Ajouter une note de bas de page",
|
||
"name": "Nom",
|
||
"edit_note": "Modifier cette note de bas de page",
|
||
"note_added": "Note de bas de page ajoutée",
|
||
"note_updated": "Note de bas de page mise à jour",
|
||
"note_confirm_delete": "Vous ne pourrez pas récupérer cette note de bas de page",
|
||
"already_in_use": "La note de bas de page est déjà utilisée",
|
||
"deleted_message": "Note de bas de page supprimée",
|
||
"types": {
|
||
"estimate": "Devis",
|
||
"invoice": "Facture",
|
||
"payment": "Paiement"
|
||
}
|
||
}
|
||
},
|
||
"account_settings": {
|
||
"profile_picture": "Image de profil",
|
||
"name": "Nom",
|
||
"email": "Email",
|
||
"password": "Mot de passe",
|
||
"confirm_password": "Confirmez le mot de passe",
|
||
"account_settings": "Profil",
|
||
"save": "Enregistrer",
|
||
"section_description": "Mettez à jour ici vos paramètres de compte, tels que votre nom, votre email ou votre mot de passe.",
|
||
"updated_message": "Profil mis à jour"
|
||
},
|
||
"user_profile": {
|
||
"name": "Nom",
|
||
"email": "Email",
|
||
"password": "Mot de passe",
|
||
"confirm_password": "Confirmez le mot de passe"
|
||
},
|
||
"notification": {
|
||
"title": "Notifications",
|
||
"email": "Envoyer des notifications à",
|
||
"description": "Définissez ici les notifications que vous souhaitez recevoir par email.",
|
||
"invoice_viewed": "Facture consultée",
|
||
"invoice_viewed_desc": "Lorsque le client visualise la facture envoyée via le tableau de bord de Neptune.",
|
||
"estimate_viewed": "Devis consulté",
|
||
"estimate_viewed_desc": "Lorsque le client visualise le devis envoyé via le tableau de bord de Neptune.",
|
||
"save": "Enregistrer",
|
||
"email_save_message": "Email enregistré",
|
||
"please_enter_email": "Veuillez entrer un email"
|
||
},
|
||
"roles": {
|
||
"title": "Rôles",
|
||
"description": "Gérer les rôles & autorisations de cette société",
|
||
"save": "Enregistrer",
|
||
"add_new_role": "Ajouter un rôle",
|
||
"role_name": "Nom",
|
||
"added_on": "Ajouté le",
|
||
"add_role": "Ajouter un rôle",
|
||
"edit_role": "Modifier ce rôle",
|
||
"name": "Nom",
|
||
"permission": "Autorisation | Autorisations",
|
||
"select_all": "Tout sélectionner",
|
||
"none": "Aucun",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer ce rôle",
|
||
"created_message": "Rôle créé",
|
||
"updated_message": "Rôle mis à jour",
|
||
"deleted_message": "Rôle supprimé",
|
||
"already_in_use": "Le rôle est déjà utilisé"
|
||
},
|
||
"exchange_rate": {
|
||
"exchange_rate": "Taux de change",
|
||
"title": "Résoudre les problèmes de taux de change",
|
||
"description": "Veuillez entrez le taux de change pour toutes les devises mentionnées ci-dessous pour calculer les totaux en {currency}.",
|
||
"drivers": "Fournisseurs",
|
||
"new_driver": "Ajouter un fournisseur",
|
||
"edit_driver": "Modifier ce fournisseur",
|
||
"select_driver": "Sélectionner un fournisseur",
|
||
"update": "sélectionner le taux de change ",
|
||
"providers_description": "Configurez vos fournisseurs de taux de change ici pour récupérer automatiquement le dernier taux de change sur les transactions.",
|
||
"key": "Clé d'API",
|
||
"name": "Nom",
|
||
"driver": "Fournisseur",
|
||
"is_default": "PAR DÉFAUT",
|
||
"currency": "Devises",
|
||
"exchange_rate_confirm_delete": "Vous ne pourrez pas récupérer ce fournisseur",
|
||
"created_message": "Fournisseur créé",
|
||
"updated_message": "Fournisseur mis à jour",
|
||
"deleted_message": "Fournisseur supprimé",
|
||
"error": "Vous ne pouvez pas supprimer le fournisseur actif",
|
||
"default_currency_error": "Cette devise est déjà affectée à un fournisseur",
|
||
"exchange_help_text": "Veuillez entrer le taux de change pour convertir {currency} en {baseCurrency}",
|
||
"currency_freak": "Currency Freak",
|
||
"currency_layer": "Currency Layer",
|
||
"open_exchange_rate": "Open Exchange Rate",
|
||
"currency_converter": "Currency Converter",
|
||
"server": "Serveur",
|
||
"url": "URL",
|
||
"active": "Actif",
|
||
"currency_help_text": "Ce fournisseur ne sera utilisé que pour les devises sélectionnées ci-dessus",
|
||
"currency_in_used": "Les devises suivantes sont déjà affectées à un autre fournisseur. Veuillez désélectionner ces devises pour réactiver ce fournisseur."
|
||
},
|
||
"tax_types": {
|
||
"title": "Taxes",
|
||
"add_tax": "Ajouter une taxe",
|
||
"edit_tax": "Modifier cette taxe",
|
||
"description": "Ajoutez ou supprimez ici des taxes, et choisissez si elles s'appliquent individuellement aux articles ou au montant total.",
|
||
"add_new_tax": "Nouvelle taxe",
|
||
"tax_settings": "Paramètres de taxe",
|
||
"tax_per_item": "Taxe par article",
|
||
"tax_name": "Nom",
|
||
"compound_tax": "Taxe empilée",
|
||
"amount": "Montant",
|
||
"percent": "Pourcentage",
|
||
"fixed_amount": "Montant fixe",
|
||
"calculation_type": "Type de calcul",
|
||
"percentage": "Pourcentage",
|
||
"fixed": "Fixe",
|
||
"action": "action",
|
||
"tax_setting_description": "Activez cette option si vous souhaitez ajouter des taxes à des postes de facture individuels. Par défaut, les taxes sont ajoutées directement à la facture.",
|
||
"created_message": "Taxe créée",
|
||
"updated_message": "Taxe mise à jour",
|
||
"deleted_message": "Taxe supprimée",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer ce type de taxe",
|
||
"already_in_use": "La taxe est déjà utilisée",
|
||
"tax_included": "Taxes incluses",
|
||
"tax_included_description": "Activez cette option si vous souhaitez signaler que les taxes sont déjà incluses dans les articles de la facture ou le total de la facture.",
|
||
"tax_included_by_default": "Activer les taxes incluses par défaut",
|
||
"tax_included_by_default_description": "Activer cette option si vous voulez définir des taxes incluses par défaut"
|
||
},
|
||
"payment_modes": {
|
||
"title": "Moyens de paiement",
|
||
"description": "Indiquez les différents moyen de paiement que vous utilisez",
|
||
"add_payment_mode": "Ajouter un mode de paiement",
|
||
"edit_payment_mode": "Modifier le mode de paiement",
|
||
"mode_name": "Nom",
|
||
"payment_mode_added": "Mode de paiement ajouté",
|
||
"payment_mode_updated": "Mode de paiement mis à jour",
|
||
"payment_mode_confirm_delete": "Vous ne pourrez pas récupérer ce mode de paiement",
|
||
"payments_attached": "Ce moyen de paiement est déjà utilisé par des paiements. Merci de supprimer les paiements associés avant de procéder à la suppression.",
|
||
"expenses_attached": "Ce moyen de paiement est déjà utilisé par des dépenses. Merci de supprimer les dépenses associées avant de procéder à la suppression.",
|
||
"deleted_message": "Mode de paiement supprimé"
|
||
},
|
||
"expense_category": {
|
||
"title": "Catégories de dépense",
|
||
"action": "action",
|
||
"description": "Ajoutez ou supprimez ici des catégories de dépense.",
|
||
"add_new_category": "Ajouter une catégorie",
|
||
"add_category": "Nouvelle catégorie",
|
||
"edit_category": "Modifier cette catégorie",
|
||
"category_name": "Nom",
|
||
"category_description": "Description",
|
||
"created_message": "Catégorie de dépenses créée",
|
||
"deleted_message": "Catégorie de dépenses supprimée",
|
||
"updated_message": "Catégorie de dépenses mise à jour",
|
||
"confirm_delete": "Vous ne pourrez pas récupérer cette catégorie de dépenses",
|
||
"already_in_use": "La catégorie est déjà utilisée"
|
||
},
|
||
"preferences": {
|
||
"currency": "Devise",
|
||
"default_language": "Langue par défaut",
|
||
"time_zone": "Fuseau horaire",
|
||
"fiscal_year": "Exercice fiscal",
|
||
"date_format": "Format de date",
|
||
"time_format": "Format de l'heure",
|
||
"discount_setting": "Réglage de remise",
|
||
"discount_per_item": "Remise par article",
|
||
"discount_setting_description": "Activez cette option si vous souhaitez détailler les remises par article. Par défaut, les remises sont ajoutées au sous-total.",
|
||
"expire_public_links": "Expiration automatique des liens publics",
|
||
"expire_setting_description": "Spécifiez si vous souhaitez faire expirer tous les liens publiques envoyés par l'application pour consulter les factures, devis, paiements,... après une durée spécifique.",
|
||
"save": "Enregistrer",
|
||
"preference": "Préférence | Préférences",
|
||
"general_settings": "Modifiez ici les paramètres globaux de InvoiceShelf.",
|
||
"updated_message": "Préférences mises à jour",
|
||
"select_language": "Choisir la langue",
|
||
"select_time_zone": "Sélectionnez le fuseau horaire",
|
||
"select_date_format": "Choix du format de date",
|
||
"select_time_format": "Choix du format d'heure",
|
||
"select_financial_year": "Exercice fiscal",
|
||
"recurring_invoice_status": "Statut de la facture récurrente",
|
||
"create_status": "Créer un statut",
|
||
"active": "Actif",
|
||
"on_hold": "En attente",
|
||
"update_status": "Mettre à jour le statut",
|
||
"completed": "Terminé",
|
||
"company_currency_unchangeable": "La devise de la société ne peut pas être modifiée",
|
||
"invoice_use_time": "Inclure l'heure dans les factures",
|
||
"invoice_use_time_description": "Activez cette option si vous souhaitez indiquer l'heure exacte de la facturation.",
|
||
"fiscal_years": {
|
||
"january_december": "Janvier - Décembre",
|
||
"february_january": "Février - Janvier",
|
||
"march_february": "Mars - Février",
|
||
"april_march": "Avril - Mars",
|
||
"may_april": "Mai - Avril",
|
||
"june_may": "Juin - Mai",
|
||
"july_june": "Juillet - Juin",
|
||
"august_july": "Aout - Juillet",
|
||
"september_august": "Septembre - Août ",
|
||
"october_september": "Octobre - Septembre",
|
||
"november_october": "Novembre - Octobre",
|
||
"december_november": "Décembre - Novembre"
|
||
}
|
||
},
|
||
"update_app": {
|
||
"title": "Mise à jour",
|
||
"description": "Mettez simplement InvoiceShelf à jour en cliquant sur le bouton ci-dessous.",
|
||
"check_update": "Rechercher des mises à jour",
|
||
"insider_consent": "Utiliser les versions de test. Recommandé uniquement à des fins de test.",
|
||
"avail_update": "Nouvelle mise à jour disponible",
|
||
"next_version": "Version suivante",
|
||
"requirements": "Spécifications requises",
|
||
"update": "Mettre à jour maintenant",
|
||
"update_progress": "Mise à jour en cours...",
|
||
"progress_text": "Cela ne prendra que quelques minutes. Veuillez ne pas actualiser ou fermer la fenêtre avant la fin de la mise à jour",
|
||
"update_success": "L'application a été mise à jour. Veuillez patienter pendant le rechargement de la fenêtre de votre navigateur.",
|
||
"latest_message": "Bravo, vous êtes à jour.",
|
||
"current_version": "Version actuelle",
|
||
"download_zip_file": "Télécharger le fichier ZIP",
|
||
"unzipping_package": "Dézipper le package",
|
||
"copying_files": "Copie de fichiers en cours",
|
||
"deleting_files": "Supprimer les fichiers inutilisés",
|
||
"running_migrations": "Migrations en cours",
|
||
"finishing_update": "Finalisation de la mise à jour",
|
||
"update_failed": "Échec de la mise à jour",
|
||
"update_failed_text": "Désolé ! Votre mise à jour a échoué à: {step} étape",
|
||
"update_warning": "Cet utilitaire va écraser tous les fichiers et templates de l'application. Veuillez faire une sauvegarde de vos templates et de la base de donnée avant de faire la mise à jour.",
|
||
"requirements_not_met": "La mise à jour ne peut pas continuer car certaines exigences système ne sont pas respectées (y compris la version PHP minimale). Veuillez corriger les exigences en échec puis réessayer."
|
||
},
|
||
"backup": {
|
||
"title": "Sauvegarde | Sauvegardes",
|
||
"description": "Gérez ici vos sauvegardes. InvoiceShelf créée un fichiez ZIP contenant vos fichiers et un export de la base de données.",
|
||
"new_backup": "Faire une sauvegarde",
|
||
"create_backup": "Créer une sauvegarde",
|
||
"select_backup_type": "Type de sauvegarde",
|
||
"backup_confirm_delete": "Vous ne pourrez pas récupérer cette sauvegarde",
|
||
"path": "chemin",
|
||
"new_disk": "Nouveau stockage",
|
||
"created_at": "créé à",
|
||
"size": "taille",
|
||
"dropbox": "dropbox",
|
||
"local": "local",
|
||
"healthy": "en bonne santé",
|
||
"amount_of_backups": "nombre de sauvegardes",
|
||
"newest_backups": "dernières sauvegardes",
|
||
"used_storage": "Stockage utilisé",
|
||
"select_disk": "Emplacement",
|
||
"action": "Action",
|
||
"deleted_message": "Sauvegarde supprimée",
|
||
"created_message": "Sauvegarde créée",
|
||
"invalid_disk_credentials": "Informations d'identification invalides de l'espace de stockage"
|
||
},
|
||
"disk": {
|
||
"title": "Stockage | Stockages",
|
||
"description": "InvoiceShelf utilise par défaut votre disque local pour stocker les sauvegardes, les avatar et d'autres fichiers image. Vous pouvez configurer d'autres comptes de stockage, comme DigitalOcean, S3 et Dropbox.",
|
||
"created_at": "créé à",
|
||
"dropbox": "dropbox",
|
||
"name": "Nom",
|
||
"driver": "Compte de stockage",
|
||
"disk_type": "Type ",
|
||
"disk_name": "Nom",
|
||
"new_disk": "Ajouter un espace de stockage",
|
||
"filesystem_driver": "Fournisseur",
|
||
"local_driver": "stockage local",
|
||
"local_root": "répertoire local",
|
||
"public_driver": "Stockage public",
|
||
"public_root": "Répertoire public",
|
||
"public_url": "URL publique",
|
||
"public_visibility": "Visibilité publique",
|
||
"media_driver": "Stockage multimédia",
|
||
"media_root": "Répertoire média",
|
||
"aws_driver": "AWS",
|
||
"aws_key": "Clef AWS",
|
||
"aws_secret": "Secret AWS",
|
||
"aws_region": "Région AWS",
|
||
"aws_bucket": "Bucket",
|
||
"aws_root": "Répertoire",
|
||
"s3_endpoint": "S3 Endpoint",
|
||
"s3_key": "S3 Key",
|
||
"s3_secret": "S3 Secret",
|
||
"s3_region": "S3 Region",
|
||
"s3_bucket": "S3 Bucket",
|
||
"s3_root": "S3 Root",
|
||
"do_spaces_type": "Type",
|
||
"do_spaces_key": "Key",
|
||
"do_spaces_secret": "Secret",
|
||
"do_spaces_region": "Région",
|
||
"do_spaces_bucket": "Bucket",
|
||
"do_spaces_endpoint": "Endpoint",
|
||
"do_spaces_root": "Répertoire",
|
||
"dropbox_type": "Type",
|
||
"dropbox_token": "Token",
|
||
"dropbox_key": "Key",
|
||
"dropbox_secret": "Secret",
|
||
"dropbox_app": "Application",
|
||
"dropbox_root": "Répertoire",
|
||
"default_driver": "Fournisseur par défaut",
|
||
"is_default": "Par défaut",
|
||
"set_default_disk": "Définir l'espace par défaut",
|
||
"set_default_disk_confirm": "Cet espace sera utilisé par défaut pour l'enregistrement des PDF",
|
||
"success_set_default_disk": "Stockage par défaut mis à jour",
|
||
"save_pdf_to_disk": "Enregistrer les PDF sur le disque",
|
||
"disk_setting_description": "Activez cette option si vous souhaitez enregistrer automatiquement une copie de chaque facture, devis et reçu de paiement PDF sur votre disque par défaut. L'activation de cette option réduira le temps de chargement lors de l'affichage des PDF.",
|
||
"select_disk": "Emplacement",
|
||
"disk_settings": "Paramètres de stockage",
|
||
"confirm_delete": "Vos fichiers et dossiers existants sur le disque spécifié ne seront pas affectés, mais la configuration de votre disque sera supprimée de InvoiceShelf",
|
||
"action": "Action",
|
||
"edit_file_disk": "Modifier cet espace de stockage",
|
||
"success_create": "Stockage ajouté",
|
||
"success_update": "Stockage mis à jour",
|
||
"error": "L'ajout de disque a échoué",
|
||
"deleted_message": "Stockage supprimé",
|
||
"disk_variables_save_successfully": "Stockage configuré",
|
||
"disk_variables_save_error": "La configuration du stockage a échoué.",
|
||
"invalid_disk_credentials": "Informations d'identification non valides du stockage sélectionné"
|
||
},
|
||
"taxations": {
|
||
"add_billing_address": "Entrez l'adresse de facturation",
|
||
"add_shipping_address": "Entrez l'adresse de livraison",
|
||
"add_company_address": "Entrez l'adresse de la société",
|
||
"modal_description": "Les informations ci-dessous sont requises afin de récupérer les taxes de vente.",
|
||
"add_address": "Ajoutez une adresse pour récupérer les taxes de vente.",
|
||
"address_placeholder": "Exemple: 123, My Street",
|
||
"city_placeholder": "Exemple: Los Angeles",
|
||
"state_placeholder": "Exemple: CA",
|
||
"zip_placeholder": "Exemple: 90024",
|
||
"invalid_address": "Veuillez fournir une adresse valide."
|
||
}
|
||
},
|
||
"wizard": {
|
||
"account_info": "Information du compte",
|
||
"account_info_desc": "Les détails ci-dessous seront utilisés pour créer le compte administrateur principal. Aussi, vous pouvez modifier les détails à tout moment après la connexion.",
|
||
"name": "Nom",
|
||
"email": "Email",
|
||
"password": "Mot de passe",
|
||
"confirm_password": "Confirmez le mot de passe",
|
||
"save_cont": "Enregistrer et poursuivre",
|
||
"company_info": "Coordonnées de la société",
|
||
"company_info_desc": "Ces informations seront affichées sur les factures. Notez que vous pouvez éditer ceci plus tard sur la page des paramètres.",
|
||
"company_name": "Nom",
|
||
"company_logo": "Logo",
|
||
"logo_preview": "Aperçu",
|
||
"preferences": "Préférences",
|
||
"preferences_desc": "Préférences par défaut du système.",
|
||
"currency_set_alert": "La devise ne pourra pas être changé.",
|
||
"country": "Pays",
|
||
"state": "État",
|
||
"city": "Ville",
|
||
"address": "Adresse",
|
||
"street": "Rue 1 | Rue 2",
|
||
"phone": "Téléphone",
|
||
"zip_code": "Code postal",
|
||
"go_back": "Revenir",
|
||
"currency": "Devise",
|
||
"language": "Langue",
|
||
"time_zone": "Fuseau horaire",
|
||
"fiscal_year": "Exercice fiscal",
|
||
"date_format": "Format de date",
|
||
"time_format": "Format d'heure",
|
||
"from_address": "De l'adresse",
|
||
"username": "Nom d'utilisateur",
|
||
"next": "Suivant",
|
||
"continue": "Poursuivre",
|
||
"skip": "Ignorer",
|
||
"install_language": {
|
||
"title": "Choix de la langue",
|
||
"description": "Sélectionner la langue de l'assistant pour installer InvoiceShelf"
|
||
},
|
||
"database": {
|
||
"database": "URL du site et base de données",
|
||
"connection": "Connexion à la base de données",
|
||
"host": "Serveur de la base de données",
|
||
"port": "Port de la base de données",
|
||
"password": "Mot de passe de la base de données",
|
||
"app_url": "Application URL",
|
||
"app_domain": "Nom de domaine",
|
||
"username": "Nom d'utilisateur de la base de données",
|
||
"db_name": "Nom de la base de données",
|
||
"db_path": "Emplacement de la base de données",
|
||
"overwrite": "Écraser la base de données existante et continuer",
|
||
"desc": "Créez une base de données sur votre serveur et définissez les informations d'identification à l'aide du formulaire ci-dessous."
|
||
},
|
||
"permissions": {
|
||
"permissions": "Permissions",
|
||
"permission_confirm_title": "Êtes-vous certain de vouloir continuer ?",
|
||
"permission_confirm_desc": "La vérification des permissions du dossier a échoué",
|
||
"permission_desc": "Vous trouverez ci-dessous la liste des permissions de dossier requises pour le fonctionnement de l'application. Si la vérification des permissions échoue, veillez mettre à jour vos permissions de dossier."
|
||
},
|
||
"verify_domain": {
|
||
"title": "Vérification du domaine",
|
||
"desc": "InvoiceShelf utilise l'authentification basée sur la session qui nécessite une vérification du domaine pour des raisons de sécurité. Veuillez saisir le domaine sur lequel vous allez accéder à votre application web.",
|
||
"app_domain": "Domaine de l'application",
|
||
"verify_now": "Vérifier maintenant",
|
||
"success": "Vérification du domaine réussie.",
|
||
"failed": "La vérification du domaine a échoué. Veuillez entrer un nom de domaine valide.",
|
||
"verify_and_continue": "Vérifier et continuer",
|
||
"notes": {
|
||
"notes": "Notes :",
|
||
"not_contain": "Le domaine de l'application ne doit pas contenir",
|
||
"or": "ou",
|
||
"in_front": "devant le domaine.",
|
||
"if_you": "Si vous accédez au site Web sur un port différent, veuillez préciser le port. Par exemple :"
|
||
}
|
||
},
|
||
"mail": {
|
||
"host": "Serveur email",
|
||
"port": "Port",
|
||
"driver": "Fournisseur d'email",
|
||
"secret": "Secret",
|
||
"mailgun_secret": "Secret",
|
||
"mailgun_domain": "Nom de domaine",
|
||
"mailgun_endpoint": "Endpoint",
|
||
"ses_secret": "Secret",
|
||
"ses_key": "Key",
|
||
"password": "Mot de passe",
|
||
"username": "Nom d'utilisateur",
|
||
"mail_config": "Envoi d'emails",
|
||
"from_name": "Nom de messagerie",
|
||
"from_mail": "Email de l'expéditeur",
|
||
"encryption": "Chiffrement des emails",
|
||
"mail_config_desc": "Les détails ci-dessous seront utilisés pour mettre à jour le fournisseur de messagerie. Vous pourrez modifier ceux-ci à tout moment après la connexion."
|
||
},
|
||
"req": {
|
||
"system_req": "Configuration requise",
|
||
"php_req_version": "Php (version {version} nécessaire)",
|
||
"check_req": "Vérifier les prérequis",
|
||
"system_req_desc": "InvoiceShelf a quelques prérequis. Assurez-vous que votre serveur dispose de la version Php requise et de toutes les extensions mentionnées ci-dessous."
|
||
},
|
||
"errors": {
|
||
"migrate_failed": "Échec de la migration",
|
||
"database_variables_save_error": "Impossible de créer le fichier de configuration. Veuillez vérifier les permissions du répertoire",
|
||
"mail_variables_save_error": "La configuration du courrier électronique a échoué.",
|
||
"connection_failed": "La connexion à la base de données a échoué",
|
||
"database_should_be_empty": "La base de données devrait être vide"
|
||
},
|
||
"success": {
|
||
"mail_variables_save_successfully": "Email configuré",
|
||
"database_variables_save_successfully": "Base de données configurée."
|
||
}
|
||
},
|
||
"validation": {
|
||
"invalid_phone": "Numéro de téléphone invalide",
|
||
"invalid_url": "URL invalide (ex: http://www.invoiceshelf.com)",
|
||
"invalid_domain_url": "URL invalide (ex: invoiceshelf.com)",
|
||
"required": "Champ requis",
|
||
"email_incorrect": "Adresse Email incorrecte.",
|
||
"email_already_taken": "Un compte est déjà associé à cette adresse email.",
|
||
"email_does_not_exist": "Cet utilisateur n'existe pas",
|
||
"item_unit_already_taken": "Cette unité est déjà été utilisée",
|
||
"payment_mode_already_taken": "Ce moyen de paiement est déjà utilisé",
|
||
"send_reset_link": "Envoyer le lien de réinitialisation",
|
||
"not_yet": "Pas encore reçu ? Réessayer",
|
||
"password_min_length": "Le mot de passe doit contenir au moins {count} caractères",
|
||
"name_min_length": "Le nom doit comporter au moins {count} lettres.",
|
||
"prefix_min_length": "Le préfixe doit faire au moins {count} lettres.",
|
||
"enter_valid_tax_rate": "Entrez un taux de taxe valide",
|
||
"numbers_only": "Chiffres uniquement.",
|
||
"characters_only": "Caractères seulement.",
|
||
"password_incorrect": "Les mots de passe doivent être identiques",
|
||
"password_length": "Le mot de passe doit comporter au moins {count} caractères.",
|
||
"qty_must_greater_than_zero": "La quantité doit être supérieure à zéro.",
|
||
"price_greater_than_zero": "Le prix doit être supérieur à zéro.",
|
||
"payment_greater_than_zero": "Le paiement doit être supérieur à zéro.",
|
||
"payment_greater_than_due_amount": "Le paiement saisi est plus élevé que le montant dû de cette facture.",
|
||
"quantity_maxlength": "La quantité ne doit pas dépasser 20 chiffres.",
|
||
"price_maxlength": "Le prix ne doit pas dépasser 20 chiffres.",
|
||
"price_minvalue": "Le prix doit être supérieur à 0.",
|
||
"amount_maxlength": "Le montant ne doit pas dépasser 20 chiffres.",
|
||
"amount_minvalue": "Le montant doit être supérieur à 0.",
|
||
"discount_maxlength": "La remise ne doit pas être supérieure à la remise maximale",
|
||
"description_maxlength": "La description ne doit pas dépasser 255 caractères.",
|
||
"subject_maxlength": "L'objet ne doit pas dépasser 100 caractères.",
|
||
"message_maxlength": "Le message ne doit pas dépasser 255 caractères.",
|
||
"maximum_options_error": "Maximum de {max} options sélectionnées. Commencez par supprimer une option sélectionnée pour en sélectionner une autre.",
|
||
"notes_maxlength": "Les notes de bas de page ne doivent pas dépasser 255 caractères.",
|
||
"address_maxlength": "L'adresse ne doit pas dépasser 255 caractères.",
|
||
"ref_number_maxlength": "Le numéro de référence ne doit pas dépasser 255 caractères.",
|
||
"prefix_maxlength": "Le préfixe ne doit pas dépasser 5 caractères.",
|
||
"something_went_wrong": "quelque chose a mal tourné",
|
||
"number_length_minvalue": "Ce nombre doit être supérieur à 0",
|
||
"at_least_one_ability": "Veuillez sélectionner au moins une autorisation.",
|
||
"valid_driver_key": "Veuillez saisir une clé {driver} valide.",
|
||
"valid_exchange_rate": "Veuillez saisir un taux de change valide.",
|
||
"company_name_not_same": "Le nom de la société doit correspondre au nom fourni."
|
||
},
|
||
"errors": {
|
||
"starter_plan": "Cette fonctionnalité est disponible à partir du plan Starter.",
|
||
"invalid_provider_key": "Veuillez entrer une clé d'API valide du fournisseur.",
|
||
"estimate_number_used": "Ce numéro de devis est déjà utilisé.",
|
||
"invoice_number_used": "Ce numéro de facture est déjà utilisé.",
|
||
"payment_attached": "Cette facture est liée à un reçu de paiement. Veuillez d'abord le supprimer avant de poursuivre.",
|
||
"credit_note_attached": "Cette facture a été annulée par un avoir. Sélectionnez également l'avoir afin de supprimer les deux documents ensemble.",
|
||
"credit_note_cannot_be_created_from_credit_note": "Un avoir ne peut pas être créé à partir d'un autre avoir.",
|
||
"draft_invoice_cannot_be_credited": "Une facture au brouillon ne peut pas faire l'objet d'un avoir. Modifiez ou supprimez plutôt le brouillon.",
|
||
"invoice_already_fully_credited": "Il ne reste plus rien à créditer sur cette facture.",
|
||
"credit_quantity_exceeds_remaining": "L'une des quantités dépasse ce qu'il reste à créditer sur cette ligne.",
|
||
"credit_amount_exceeds_invoice_balance": "Le crédit dépasse le solde restant dû de la facture.",
|
||
"credit_note_must_credit_something": "Sélectionnez au moins une ligne avec une quantité à créditer.",
|
||
"credit_item_not_on_invoice": "L'une des lignes sélectionnées n'appartient pas à cette facture.",
|
||
"credit_quantity_invalid": "Saisissez une quantité valide supérieure à zéro pour chaque ligne sélectionnée.",
|
||
"credit_note_cannot_be_cloned": "Un avoir ne peut pas être dupliqué.",
|
||
"credit_note_cannot_be_converted_to_estimate": "Un avoir ne peut pas être converti en devis.",
|
||
"payment_amount_exceeds_invoice_due_amount": "Le paiement dépasse le solde restant dû de la facture.",
|
||
"payment_number_used": "Ce numéro de paiement est déjà utilisé.",
|
||
"name_already_taken": "Ce nom est déjà pris.",
|
||
"receipt_does_not_exist": "Le reçu n'existe pas.",
|
||
"customer_cannot_be_changed_after_payment_is_added": "Le client ne peut pas être modifié après l'ajout du paiement",
|
||
"invalid_credentials": "Identifiants invalides.",
|
||
"not_allowed": "Non autorisé",
|
||
"login_invalid_credentials": "Ces identifiants ne correspondent pas à nos enregistrements.",
|
||
"enter_valid_cron_format": "Veuillez entrer une tâche Cron valide",
|
||
"email_could_not_be_sent": "L'Email n'a pas pu être envoyé vers cette adresse email.",
|
||
"invalid_address": "Veuillez spécifier une adresse valide.",
|
||
"invalid_key": "Veuillez spécifier une clé valide.",
|
||
"invalid_state": "Veuillez spécifier un état valide.",
|
||
"invalid_city": "Veuillez spécifier une ville valide.",
|
||
"invalid_postal_code": "Veuillez spécifier un code postal valide.",
|
||
"invalid_format": "Veuillez spécifier un format de requête valide.",
|
||
"api_error": "Le serveur ne répond plus.",
|
||
"feature_not_enabled": "Fonctionnalité inactive.",
|
||
"request_limit_met": "Limite de requêtes API dépassée.",
|
||
"address_incomplete": "Adresse incomplète"
|
||
},
|
||
"pdf_estimate_label": "Devis",
|
||
"pdf_estimate_number": "N°",
|
||
"pdf_estimate_date": "Date",
|
||
"pdf_estimate_expire_date": "Date d'expiration",
|
||
"pdf_invoice_label": "Facture",
|
||
"pdf_invoice_number": "Numéro",
|
||
"pdf_invoice_date": "Date",
|
||
"pdf_invoice_due_date": "Date d'échéance",
|
||
"pdf_credit_note_label": "Avoir",
|
||
"pdf_credit_note_number": "Numéro",
|
||
"pdf_credit_note_date": "Date",
|
||
"pdf_credit_note_reference": "En référence à la facture :number du :date",
|
||
"pdf_credit_note_reason": "Motif : :reason",
|
||
"pdf_cancelled_label": "Annulée",
|
||
"pdf_cancelled_via_credit_note": "Annulée par l'avoir :number",
|
||
"pdf_partially_credited_label": "Partiellement créditée",
|
||
"pdf_partially_credited_via_credit_notes": ":amount crédités par l'avoir :numbers",
|
||
"pdf_notes": "Notes de bas de page",
|
||
"pdf_items_label": "Articles",
|
||
"pdf_quantity_label": "Quantité",
|
||
"pdf_price_label": "Prix",
|
||
"pdf_discount_label": "Remise",
|
||
"pdf_amount_label": "Montant",
|
||
"pdf_subtotal": "Sous-total",
|
||
"pdf_net_total": "Net",
|
||
"pdf_total": "Total TTC",
|
||
"pdf_payment_label": "Paiement",
|
||
"pdf_payment_receipt_label": "Reçu de paiement",
|
||
"pdf_payment_date": "Date de paiement",
|
||
"pdf_payment_number": "Numéro",
|
||
"pdf_payment_mode": "Moyen de paiement",
|
||
"pdf_payment_amount_received_label": "Montant reçu",
|
||
"pdf_expense_report_label": "RAPPORT DE DÉPENSES",
|
||
"pdf_total_expenses_label": "TOTAL DES DÉPENSES",
|
||
"pdf_profit_loss_label": "RECETTES ET DÉPENSES",
|
||
"pdf_sales_customers_label": "Rapport de vente client",
|
||
"pdf_sales_items_label": "Rapport de vente par articles",
|
||
"pdf_tax_summery_label": "Rapport de résumé fiscal",
|
||
"pdf_income_label": "REVENU",
|
||
"pdf_net_profit_label": "RÉSULTAT",
|
||
"pdf_customer_sales_report": "Rapport de ventes : par client",
|
||
"pdf_total_sales_label": "TOTAL DES VENTES",
|
||
"pdf_item_sales_label": "Rapport des ventes : par article",
|
||
"pdf_tax_report_label": "TAXES",
|
||
"pdf_total_tax_label": "TOTAL TAXES",
|
||
"pdf_tax_types_label": "Taxe",
|
||
"pdf_expenses_label": "Dépenses",
|
||
"pdf_bill_to": "Facturer à",
|
||
"pdf_ship_to": "Expédier à",
|
||
"pdf_received_from": "Reçu de :",
|
||
"pdf_tax_label": "Taxe",
|
||
"pdf_tax_id": "N° fiscal",
|
||
"pdf_vat_id": "N° de TVA",
|
||
"pdf_amount_credited": "Montant crédité",
|
||
"pdf_amount_paid": "Montant acquitté",
|
||
"pdf_amount_due": "Montant dû",
|
||
"mail_thanks": "Merci",
|
||
"mail_view_estimate": "Voir le devis",
|
||
"mail_viewed_estimate": ":name a consulté ce devis.",
|
||
"mail_view_invoice": "Voir la facture",
|
||
"mail_viewed_invoice": ":name a consulté cette facture.",
|
||
"mail_view_payment": "Voir le paiement",
|
||
"notification_view_estimate": "[Notification] Devis consulté",
|
||
"notification_view_invoice": "[Notification] Facture consultée",
|
||
"You have received a new invoice from <b>{COMPANY_NAME}</b>.</br> Please download using the button below:": "Vous avez reçu une nouvelle facture de <b>{COMPANY_NAME}</b>.</br> Vous pouvez la télécharger en cliquant sur le bouton ci-dessous :"
|
||
}
|