mirror of
https://github.com/we-promise/sure.git
synced 2026-05-10 22:25:00 +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")
233 lines
5.8 KiB
YAML
233 lines
5.8 KiB
YAML
---
|
||
fr:
|
||
defaults:
|
||
brand_name: "%{brand_name}"
|
||
product_name: "%{product_name}"
|
||
activerecord:
|
||
errors:
|
||
messages:
|
||
record_invalid: 'La validation a échoué : %{errors}'
|
||
restrict_dependent_destroy:
|
||
has_many: Vous ne pouvez pas supprimer l'enregistrement parce que les %{record}
|
||
dépendants existent
|
||
has_one: Vous ne pouvez pas supprimer l'enregistrement car un(e) %{record}
|
||
dépendant(e) existe
|
||
date:
|
||
abbr_day_names:
|
||
- dim
|
||
- lun
|
||
- mar
|
||
- mer
|
||
- jeu
|
||
- ven
|
||
- sam
|
||
abbr_month_names:
|
||
-
|
||
- jan.
|
||
- fév.
|
||
- mars
|
||
- avr.
|
||
- mai
|
||
- juin
|
||
- juil.
|
||
- août
|
||
- sept.
|
||
- oct.
|
||
- nov.
|
||
- déc.
|
||
day_names:
|
||
- dimanche
|
||
- lundi
|
||
- mardi
|
||
- mercredi
|
||
- jeudi
|
||
- vendredi
|
||
- samedi
|
||
formats:
|
||
default: "%d/%m/%Y"
|
||
long: "%-d %B %Y"
|
||
short: "%-d %b"
|
||
month_names:
|
||
-
|
||
- janvier
|
||
- février
|
||
- mars
|
||
- avril
|
||
- mai
|
||
- juin
|
||
- juillet
|
||
- août
|
||
- septembre
|
||
- octobre
|
||
- novembre
|
||
- décembre
|
||
order:
|
||
- :day
|
||
- :month
|
||
- :year
|
||
datetime:
|
||
distance_in_words:
|
||
about_x_hours:
|
||
one: environ une heure
|
||
other: environ %{count} heures
|
||
about_x_months:
|
||
one: environ un mois
|
||
other: environ %{count} mois
|
||
about_x_years:
|
||
one: environ un an
|
||
other: environ %{count} ans
|
||
almost_x_years:
|
||
one: presque un an
|
||
other: presque %{count} ans
|
||
half_a_minute: une demi‑minute
|
||
less_than_x_minutes:
|
||
one: moins d'une minute
|
||
other: moins de %{count} minutes
|
||
zero: moins d'une minute
|
||
less_than_x_seconds:
|
||
one: moins d'une seconde
|
||
other: moins de %{count} secondes
|
||
zero: moins d'une seconde
|
||
over_x_years:
|
||
one: plus d'un an
|
||
other: plus de %{count} ans
|
||
x_days:
|
||
one: "%{count} jour"
|
||
other: "%{count} jours"
|
||
x_minutes:
|
||
one: "%{count} minute"
|
||
other: "%{count} minutes"
|
||
x_months:
|
||
one: "%{count} mois"
|
||
other: "%{count} mois"
|
||
x_seconds:
|
||
one: "%{count} seconde"
|
||
other: "%{count} secondes"
|
||
x_years:
|
||
one: "%{count} an"
|
||
other: "%{count} ans"
|
||
prompts:
|
||
day: Jour
|
||
hour: Heure
|
||
minute: Minute
|
||
month: Mois
|
||
second: Seconde
|
||
year: Année
|
||
errors:
|
||
format: "%{attribute} %{message}"
|
||
messages:
|
||
accepted: doit être accepté(e)
|
||
blank: doit être rempli(e)
|
||
confirmation: ne concorde pas avec %{attribute}
|
||
empty: doit être rempli(e)
|
||
equal_to: doit être égal à %{count}
|
||
even: doit être pair
|
||
exclusion: n'est pas disponible
|
||
greater_than: doit être supérieur à %{count}
|
||
greater_than_or_equal_to: doit être supérieur ou égal à %{count}
|
||
in: doit être dans l'intervalle %{count}
|
||
inclusion: n'est pas inclus(e) dans la liste
|
||
invalid: n'est pas valide
|
||
less_than: doit être inférieur à %{count}
|
||
less_than_or_equal_to: doit être inférieur ou égal à %{count}
|
||
model_invalid: 'Validation échouée : %{errors}'
|
||
not_a_number: n'est pas un nombre
|
||
not_an_integer: doit être un nombre entier
|
||
odd: doit être impair
|
||
other_than: doit être différent de %{count}
|
||
present: doit être vide
|
||
required: doit exister
|
||
taken: est déjà utilisé(e)
|
||
too_long:
|
||
one: est trop long (pas plus d'un caractère)
|
||
other: est trop long (pas plus de %{count} caractères)
|
||
too_short:
|
||
one: est trop court (au moins un caractère)
|
||
other: est trop court (au moins %{count} caractères)
|
||
wrong_length:
|
||
one: ne fait pas la bonne longueur (doit comporter un seul caractère)
|
||
other: ne fait pas la bonne longueur (doit comporter %{count} caractères)
|
||
template:
|
||
body: 'Veuillez vérifier les champs suivants : '
|
||
header:
|
||
one: 'Impossible d''enregistrer ce(tte) %{model} : %{count} erreur'
|
||
other: 'Impossible d''enregistrer ce(tte) %{model} : %{count} erreurs'
|
||
global:
|
||
expand: Développer
|
||
helpers:
|
||
select:
|
||
prompt: Veuillez sélectionner
|
||
default_label: Sélectionner…
|
||
search_placeholder: Rechercher
|
||
submit:
|
||
create: Créer un(e) %{model}
|
||
submit: Enregistrer ce(tte) %{model}
|
||
update: Modifier ce(tte) %{model}
|
||
number:
|
||
currency:
|
||
format:
|
||
delimiter: " "
|
||
format: "%n %u"
|
||
precision: 2
|
||
separator: ","
|
||
significant: false
|
||
strip_insignificant_zeros: false
|
||
unit: "€"
|
||
format:
|
||
delimiter: " "
|
||
precision: 3
|
||
round_mode: default
|
||
separator: ","
|
||
significant: false
|
||
strip_insignificant_zeros: false
|
||
human:
|
||
decimal_units:
|
||
format: "%n %u"
|
||
units:
|
||
billion: milliard
|
||
million:
|
||
one: million
|
||
other: millions
|
||
quadrillion: million de milliards
|
||
thousand: millier
|
||
trillion:
|
||
one: billion
|
||
other: billions
|
||
unit: ''
|
||
format:
|
||
delimiter: ''
|
||
precision: 3
|
||
significant: true
|
||
strip_insignificant_zeros: true
|
||
storage_units:
|
||
format: "%n %u"
|
||
units:
|
||
byte:
|
||
one: octet
|
||
other: octets
|
||
eb: Eo
|
||
gb: Go
|
||
kb: ko
|
||
mb: Mo
|
||
pb: Po
|
||
tb: To
|
||
percentage:
|
||
format:
|
||
delimiter: ''
|
||
format: "%n%"
|
||
precision:
|
||
format:
|
||
delimiter: ''
|
||
support:
|
||
array:
|
||
last_word_connector: " et "
|
||
two_words_connector: " et "
|
||
words_connector: ", "
|
||
time:
|
||
am: am
|
||
formats:
|
||
default: "%d %B %Y %Hh %Mmin %Ss"
|
||
long: "%A %d %B %Y %Hh%M"
|
||
short: "%d %b %Hh%M"
|
||
pm: pm
|