mirror of
https://github.com/we-promise/sure.git
synced 2026-06-01 00:39:01 +00:00
* 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")
157 lines
7.0 KiB
YAML
157 lines
7.0 KiB
YAML
---
|
|
fr:
|
|
activerecord:
|
|
attributes:
|
|
doorkeeper/application:
|
|
name: 'Nom'
|
|
redirect_uri: 'URI de redirection'
|
|
errors:
|
|
models:
|
|
doorkeeper/application:
|
|
attributes:
|
|
redirect_uri:
|
|
fragment_present: 'ne peut pas contenir de fragment.'
|
|
invalid_uri: 'doit être une URI valide.'
|
|
unspecified_scheme: 'doit spécifier un schéma.'
|
|
relative_uri: 'doit être une URI absolue.'
|
|
secured_uri: 'doit être une URI HTTPS/SSL.'
|
|
forbidden_uri: 'est interdit par le serveur.'
|
|
scopes:
|
|
not_match_configured: "ne correspond pas à ceux configurés sur le serveur."
|
|
|
|
doorkeeper:
|
|
applications:
|
|
confirmations:
|
|
destroy: 'Êtes-vous sûr ?'
|
|
buttons:
|
|
edit: 'Modifier'
|
|
destroy: 'Supprimer'
|
|
submit: 'Envoyer'
|
|
cancel: 'Annuler'
|
|
authorize: 'Autoriser'
|
|
form:
|
|
error: 'Oups ! Vérifiez votre formulaire pour d''éventuelles erreurs'
|
|
help:
|
|
confidential: 'L''application sera utilisée dans un contexte où le client secret peut être gardé confidentiel. Les applications mobiles natives et les applications monopage (SPA) sont considérées comme non confidentielles.'
|
|
redirect_uri: 'Utilisez une ligne par URI'
|
|
blank_redirect_uri: "Laissez vide si vous avez configuré votre fournisseur pour utiliser les identifiants client (Client Credentials), le mot de passe du propriétaire de la ressource (Resource Owner Password Credentials) ou tout autre type d'octroi qui ne nécessite pas d'URI de redirection."
|
|
scopes: 'Séparez les scopes par des espaces. Laissez vide pour utiliser les scopes par défaut.'
|
|
edit:
|
|
title: 'Modifier l''application'
|
|
index:
|
|
title: 'Vos applications'
|
|
new: 'Nouvelle application'
|
|
name: 'Nom'
|
|
callback_url: 'URL de rappel'
|
|
confidential: 'Confidentielle ?'
|
|
actions: 'Actions'
|
|
confidentiality:
|
|
'yes': 'Oui'
|
|
'no': 'Non'
|
|
new:
|
|
title: 'Nouvelle application'
|
|
show:
|
|
title: 'Application : %{name}'
|
|
application_id: 'UID'
|
|
secret: 'Secret'
|
|
secret_hashed: 'Secret haché'
|
|
scopes: 'Scopes'
|
|
confidential: 'Confidentielle'
|
|
callback_urls: 'URL de rappel'
|
|
actions: 'Actions'
|
|
not_defined: 'Non défini'
|
|
|
|
authorizations:
|
|
buttons:
|
|
authorize: 'Autoriser'
|
|
deny: 'Refuser'
|
|
error:
|
|
title: 'Une erreur s''est produite'
|
|
new:
|
|
title: 'Autorisation requise'
|
|
prompt: 'Autoriser %{client_name} à utiliser votre compte ?'
|
|
able_to: 'Cette application pourra'
|
|
show:
|
|
title: 'Code d''autorisation'
|
|
form_post:
|
|
title: 'Envoyer ce formulaire'
|
|
|
|
authorized_applications:
|
|
confirmations:
|
|
revoke: 'Êtes-vous sûr ?'
|
|
buttons:
|
|
revoke: 'Révoquer'
|
|
index:
|
|
title: 'Vos applications autorisées'
|
|
application: 'Application'
|
|
created_at: 'Créée le'
|
|
date_format: '%d/%m/%Y %H:%M:%S'
|
|
|
|
pre_authorization:
|
|
status: 'Pré-autorisation'
|
|
|
|
errors:
|
|
messages:
|
|
# Common error messages
|
|
invalid_request:
|
|
unknown: 'La requête ne comporte pas un paramètre obligatoire, inclut une valeur de paramètre non prise en charge ou est malformée d''une autre manière.'
|
|
missing_param: 'Paramètre obligatoire manquant : %{value}.'
|
|
request_not_authorized: 'La requête doit être autorisée. Le paramètre obligatoire pour autoriser la requête est manquant ou invalide.'
|
|
invalid_code_challenge: 'Le code challenge est obligatoire.'
|
|
invalid_redirect_uri: "L'URI de redirection demandée est malformée ou ne correspond pas à l'URI de redirection du client."
|
|
unauthorized_client: 'Le client n''est pas autorisé à effectuer cette requête avec cette méthode.'
|
|
access_denied: 'Le propriétaire de la ressource ou le serveur d''autorisation a refusé la requête.'
|
|
invalid_scope: 'Le scope demandé est invalide, inconnu ou malformé.'
|
|
invalid_code_challenge_method:
|
|
zero: 'Le serveur d''autorisation ne prend pas en charge PKCE car aucune valeur de code_challenge_method n''est acceptée.'
|
|
one: 'Le code_challenge_method doit être %{challenge_methods}.'
|
|
other: 'Le code_challenge_method doit être l''un des suivants : %{challenge_methods}.'
|
|
server_error: 'Le serveur d''autorisation a rencontré une condition inattendue qui l''a empêché de traiter la requête.'
|
|
temporarily_unavailable: 'Le serveur d''autorisation est actuellement incapable de traiter la requête en raison d''une surcharge temporaire ou d''une maintenance du serveur.'
|
|
|
|
# Configuration error messages
|
|
credential_flow_not_configured: 'Le flux Resource Owner Password Credentials a échoué car Doorkeeper.configure.resource_owner_from_credentials n''est pas configuré.'
|
|
resource_owner_authenticator_not_configured: 'La recherche de Resource Owner a échoué car Doorkeeper.configure.resource_owner_authenticator n''est pas configuré.'
|
|
admin_authenticator_not_configured: 'L''accès au panneau d''administration est interdit car Doorkeeper.configure.admin_authenticator n''est pas configuré.'
|
|
|
|
# Access grant errors
|
|
unsupported_response_type: 'Le serveur d''autorisation ne prend pas en charge ce type de réponse.'
|
|
unsupported_response_mode: 'Le serveur d''autorisation ne prend pas en charge ce mode de réponse.'
|
|
|
|
# Access token errors
|
|
invalid_client: 'L''authentification du client a échoué en raison d''un client inconnu, d''une authentification client manquante ou d''une méthode d''authentification non prise en charge.'
|
|
invalid_grant: 'L''octroi d''autorisation fourni est invalide, expiré, révoqué, ne correspond pas à l''URI de redirection utilisée dans la requête d''autorisation, ou a été émis pour un autre client.'
|
|
unsupported_grant_type: 'Le type d''octroi d''autorisation n''est pas pris en charge par le serveur d''autorisation.'
|
|
|
|
invalid_token:
|
|
revoked: "Le jeton d'accès a été révoqué"
|
|
expired: "Le jeton d'accès a expiré"
|
|
unknown: "Le jeton d'accès est invalide"
|
|
revoke:
|
|
unauthorized: "Vous n'êtes pas autorisé à révoquer ce jeton"
|
|
|
|
forbidden_token:
|
|
missing_scope: 'L''accès à cette ressource requiert le scope "%{oauth_scopes}".'
|
|
|
|
flash:
|
|
applications:
|
|
create:
|
|
notice: 'Application créée.'
|
|
destroy:
|
|
notice: 'Application supprimée.'
|
|
update:
|
|
notice: 'Application mise à jour.'
|
|
authorized_applications:
|
|
destroy:
|
|
notice: 'Application révoquée.'
|
|
|
|
layouts:
|
|
admin:
|
|
title: 'Doorkeeper'
|
|
nav:
|
|
oauth2_provider: 'Fournisseur OAuth2'
|
|
applications: 'Applications'
|
|
home: 'Accueil'
|
|
application:
|
|
title: 'Autorisation OAuth requise'
|