Files
sure/config/locales/views/simplefin_items/fr.yml
Nicolas c962b1f420 Complete French translations for views, models, and settings (#1501)
* i18n(fr): complete provider_sync_summary translations

Add 13 missing French translations under provider_sync_summary in
config/locales/views/components/fr.yml to bring it to parity with en.yml.

Covers: transactions.fetching/protected/view_protected, full skip_reasons
section, full trades section (investment activities), and
health.view_error_details.

* chore(i18n): fix i18n-tasks scanner config

Add app/components to i18n-tasks relative_roots so component .erb files
using t(".relative_key") are correctly resolved by the scanner. Without
this, the scanner crashed on any component using relative i18n keys.

* i18n(fr): complete high-impact view translations

Bring full FR parity to the 5 most-visited user-facing screens:
- accounts (+25 keys)
- transactions (+168)
- holdings (+53)
- settings (+81)
- reports (+20)

Vocabulary aligned with docs/i18n/fr-glossary.md (Holding → Avoir,
Trade → Transaction boursière, Brokerage → Courtier, Posted → Validée,
Merchant → Commerçant, Net worth → Patrimoine net, etc.).

* i18n(fr): complete remaining incomplete view translations

Bring full FR parity to 23 partially-translated view locale files:

Mid-size (8-68 keys each): investments, pages, merchants, imports,
coinstats_items, sessions, cryptos, rules, transfers, trades,
invitations, entries, onboardings, simplefin_items.

Small (1-4 keys each): plaid_items, recurring_transactions, users,
password_resets, other_assets, loans, shared, registrations,
oidc_accounts.

Total: ~430 new FR keys. Existing FR translations preserved where
already in place; only missing keys were added.

Note: shared/fr.yml retains a `breadcrumbs:` block not present in EN
(used by FR breadcrumb controllers — removing would regress).

* i18n(fr): complete nested admin & settings translations

Cover the nested view subdirectories missed by the top-level scan:
- defaults/fr.yml (+3 custom keys: global.expand,
  helpers.select.default_label, helpers.select.search_placeholder)
- admin/sso_providers (+2 keys: role_guest, guest_groups)
- admin/users (+25 keys: section title, family/role/trial filters,
  table columns, summary, role descriptions, invitations)
- settings/api_keys (+1 key + structural fix: no_api_key and
  current_api_key were nested incorrectly, now match en.yml)
- settings/hostings (+93 keys: assistant_settings, provider_selection,
  tiingo/eodhd/alpha_vantage/openai blocks, twelve_data plan upgrade)

* i18n(fr): add fr.yml for 11 previously untranslated views

Create French locale files for all view directories that had no fr.yml:

Core features (6 files, 112 keys):
- account_sharings, budgets, splits, pdf_import_mailer (view scope),
  pending_duplicate_merges, securities

Provider integrations (5 files, 575 keys):
- binance_items (Binance crypto exchange)
- coinbase_items (Coinbase crypto exchange)
- indexa_capital_items (Indexa Capital robo-advisor)
- mercury_items (Mercury business banking)
- snaptrade_items (SnapTrade broker aggregator)

Provider names kept in English. Domain vocabulary follows
docs/i18n/fr-glossary.md (Reconnect → Reconnecter, Refresh →
Actualiser, Wallet → Portefeuille, Cost basis → Coût d'acquisition,
Canadian retirement accounts mapped to official FR-CA acronyms
RRSP→REER, TFSA→CELI, RRIF→FERR).

* i18n(fr): add models, mailer, breadcrumb & Doorkeeper translations

Create French locale files for the remaining non-view scopes:

- models/coinbase_account/fr.yml (1 key)
- models/transaction/fr.yml (3 keys)
- mailers/pdf_import_mailer/fr.yml (1 key)
- breadcrumbs/fr.yml (5 root-level breadcrumb labels)
- doorkeeper.fr.yml (89 keys: full OAuth2 UI translation
  modeled on the doorkeeper-i18n FR conventions; PKCE/scope/
  Client Credentials kept in English as proper grant names;
  date_format adjusted to %d/%m/%Y %H:%M:%S)

* i18n(fr): use "Inscription des utilisateurs" for invite_codes onboarding

In the invite_codes settings section, EN "Onboarding" was translated as
"Intégration" — wrong context. The page controls how new people sign up
to the instance, so "Inscription des utilisateurs" is the natural
French term for this UX flow.

* i18n(fr): use "Marchand" consistently for Merchant

Aligns transactions/, settings/, and settings/hostings/ with the FR
fintech convention (Lydia, Revolut FR, Boursorama, N26 FR all use
"Marchand"). Earlier waves had introduced "Commerçant" via a glossary
choice that turned out to imply a small physical retailer rather than
a generic transaction payee.

Net effect: a single consistent term across all FR screens.

* i18n(fr): address CodeRabbit review feedback

Fixes 9 of 17 actionable items from the CodeRabbit review:

- Remove duplicate breadcrumbs block from shared/fr.yml (item 2)
- Standardize "Indexa Capital" naming throughout (item 6)
- Pluralize merchants.perform_merge.success in EN+FR (item 7)
- Add rel="noopener noreferrer" to Coinbase + Binance external links
  in EN+FR settings (item 9, security)
- Replace "rappeler" with "invoquer" for MCP tool calling (item 10)
- Localize Doorkeeper "Single Page Apps" + grant names with FR-first
  phrasing (item 12)
- Reorder twelve_data_settings to put title first (item 14)
- Enrich IRA/SEP/SIMPLE/ISA/LISA/SIPP long labels with FR expansion
  + acronym in parens (item 15)
- Use "Transfert" (not "Virement") for investment activity_labels.transfer
  to disambiguate from banking transfers (item 16)

Items deferred (require non-FR code changes or are pre-existing EN bugs):
1, 3, 4, 5, 8, 11, 13.

* i18n(fr): address second-wave CodeRabbit review feedback

- transactions: fix gender agreement on one_time_title
  ("%{type} ponctuel" → "Transaction ponctuelle (%{type})") so that
  "Dépense" no longer renders as "Dépense ponctuel"
- transactions: fix bare-noun-modifier in rule_description_prefix
  ("Les futures transactions %{type}…" → "…de type %{type}…")
- settings/hostings: clarify email_confirmation_description
  ("lors du changement" → "lorsqu'ils la modifient")
- settings/hostings: fix dangling "Utilisé de préférence" in EODHD
  and Alpha Vantage rate_limit_warning ("À utiliser de préférence")
2026-04-19 00:18:40 +02:00

133 lines
7.9 KiB
YAML

---
fr:
simplefin_items:
new:
title: Connecter SimpleFIN
setup_token: Jeton de configuration
setup_token_placeholder: collez votre jeton de configuration SimpleFIN
connect: Connecter
cancel: Annuler
create:
success: Connexion SimpleFIN ajoutée avec succès ! Vos comptes apparaîtront sous peu lors de la synchronisation en arrière-plan.
errors:
blank_token: Veuillez entrer un jeton de configuration SimpleFIN.
invalid_token: Jeton de configuration invalide. Veuillez vérifier que vous avez copié le jeton complet depuis SimpleFIN Bridge.
token_compromised: Le jeton de configuration est peut-être compromis, expiré ou déjà utilisé. Veuillez en créer un nouveau.
create_failed: "Échec de la connexion : %{message}"
unexpected: Une erreur inattendue s'est produite. Veuillez réessayer.
destroy:
success: La connexion SimpleFIN va être supprimée
update:
success: Connexion SimpleFIN mise à jour avec succès ! Vos comptes sont en cours de reconnexion.
errors:
blank_token: Veuillez entrer un jeton de configuration SimpleFIN.
invalid_token: Jeton de configuration invalide. Veuillez vérifier que vous avez copié le jeton complet depuis SimpleFIN Bridge.
token_compromised: Le jeton de configuration est peut-être compromis, expiré ou déjà utilisé. Veuillez en créer un nouveau.
update_failed: "Échec de la mise à jour de la connexion : %{message}"
unexpected: Une erreur inattendue s'est produite. Veuillez réessayer.
edit:
setup_token:
label: "Jeton de configuration SimpleFIN :"
placeholder: "Collez votre jeton de configuration SimpleFIN ici..."
help_text: "Le jeton doit être une longue chaîne commençant par des lettres et des chiffres"
setup_accounts:
account_card:
balance: "Solde"
activity:
recent:
one: "1 transaction • dernière %{when}"
other: "%{count} transactions • dernière %{when}"
dormant: "Aucune activité depuis %{days} jours"
empty: "Aucune transaction importée pour le moment"
likely_closed: "Aucune activité récente et solde à zéro — il peut s'agir d'une carte fermée ou remplacée"
today: "aujourd'hui"
yesterday: "hier"
days_ago:
one: "il y a 1 jour"
other: "il y a %{count} jours"
stale_accounts:
title: "Comptes qui ne sont plus dans SimpleFIN"
description: "Ces comptes existent dans votre base de données mais ne sont plus fournis par SimpleFIN. Cela peut se produire lorsque la configuration des comptes change en amont."
action_prompt: "Que souhaitez-vous faire ?"
action_delete: "Supprimer le compte et toutes les transactions"
action_move: "Déplacer les transactions vers :"
action_skip: "Ignorer pour l'instant"
transaction_count:
one: "%{count} transaction"
other: "%{count} transactions"
complete_account_setup:
all_skipped: "Tous les comptes ont été ignorés. Aucun compte n'a été créé."
no_accounts: "Aucun compte à configurer."
success:
one: "%{count} compte SimpleFIN créé avec succès ! Vos transactions et avoirs sont en cours d'importation en arrière-plan."
other: "%{count} comptes SimpleFIN créés avec succès ! Vos transactions et avoirs sont en cours d'importation en arrière-plan."
stale_accounts_processed: "Comptes obsolètes : %{deleted} supprimés, %{moved} déplacés."
stale_accounts_errors:
one: "%{count} action sur un compte obsolète a échoué. Consultez les journaux pour plus de détails."
other: "%{count} actions sur des comptes obsolètes ont échoué. Consultez les journaux pour plus de détails."
simplefin_item:
add_new: Ajouter une nouvelle connexion
confirm_accept: Supprimer la connexion
confirm_body: Cela supprimera définitivement tous les comptes de ce groupe et toutes les données associées.
confirm_title: Supprimer la connexion SimpleFIN ?
delete: Supprimer
deletion_in_progress: "(suppression en cours...)"
error: Une erreur s'est produite lors de la synchronisation des données
no_accounts_description: Cette connexion n'a pas encore de comptes synchronisés.
no_accounts_title: Aucun compte trouvé
requires_update: Reconnecter
setup_needed: Nouveaux comptes prêts à être configurés
setup_description: Choisissez les types de comptes pour vos comptes SimpleFIN nouvellement importés.
setup_action: Configurer les nouveaux comptes
setup_accounts_menu: Configurer les comptes
more_accounts_available:
one: "%{count} compte supplémentaire disponible à configurer"
other: "%{count} comptes supplémentaires disponibles à configurer"
accounts_skipped_tooltip: "Certains comptes ont été ignorés en raison d'erreurs lors de la synchronisation"
accounts_skipped_label: "Ignorés : %{count}"
rate_limited_ago: "Limite de débit atteinte (il y a %{time})"
rate_limited_recently: "Limite de débit atteinte récemment"
status: Dernière synchronisation il y a %{timestamp}
status_never: Jamais synchronisé
status_with_summary: "Dernière synchronisation il y a %{timestamp} • %{summary}"
syncing: Synchronisation...
update: Mettre à jour
stale_pending_note: "(exclues des budgets)"
stale_pending_accounts: "dans : %{accounts}"
reconciled_details_note: "(voir le résumé de synchronisation pour plus de détails)"
duplicate_accounts_skipped: "Certains comptes ont été ignorés comme doublons — utilisez 'Lier des comptes existants' pour fusionner."
select_existing_account:
title: "Lier %{account_name} à SimpleFIN"
description: Sélectionnez un compte SimpleFIN à lier à votre compte existant
cancel: Annuler
link_account: Lier le compte
no_accounts_found: "Aucun compte SimpleFIN trouvé pour ce %{moniker}."
wait_for_sync: Si vous venez de connecter ou de synchroniser, réessayez une fois la synchronisation terminée.
unlink_to_move: Pour déplacer un lien, détachez-le d'abord depuis le menu d'actions du compte.
all_accounts_already_linked: Tous les comptes SimpleFIN semblent déjà liés.
currently_linked_to: "Actuellement lié à : %{account_name}"
link_existing_account:
success: Compte lié à SimpleFIN avec succès
errors:
only_manual: Seuls les comptes manuels peuvent être liés
different_provider: Ce compte est lié à un autre fournisseur. Détachez-le d'abord de ce fournisseur, puis liez-le à SimpleFIN.
invalid_simplefin_account: Compte SimpleFIN sélectionné invalide
dismiss_replacement_suggestion:
dismissed: Suggestion de remplacement ignorée
replacement_prompt:
title: "Votre carte %{institution} a peut-être été remplacée"
description: "« %{account_name} » est liée à « %{old_name} », qui n'a eu aucune activité récente et un solde à zéro. Une nouvelle carte, « %{new_name} », est désormais active dans la même institution. Reliez-la pour conserver votre historique intact."
relink: Relier à la nouvelle carte
confirm_title: Relier à la nouvelle carte ?
confirm_body: "« %{account_name} » sera liée à « %{new_name} ». Votre historique de transactions est conservé ; les transactions futures proviendront de la nouvelle carte."
dismiss_aria: Ignorer la suggestion de remplacement
reconciled_status:
message:
one: "%{count} transaction en attente en doublon réconciliée"
other: "%{count} transactions en attente en doublon réconciliées"
stale_pending_status:
message:
one: "%{count} transaction en attente depuis plus de %{days} jours"
other: "%{count} transactions en attente depuis plus de %{days} jours"