feat(core,cli,gui): support two-password accounts without storing the mailbox password

A two-password account signed in with its login password as the mailbox
password, so the key chain never unlocked and the daemon retried forever.

Login now asks for the mailbox password and checks it against the account
(proton-sdk 0.8 `unlock`), so a typo is a retry. The password is never
stored: the keyring blob keeps the per-key passphrases instead, and for a
two-password account only when the user opts in (`--remember`, or the
"Keep unlocked on this computer" switch). By default they live in the
kernel keyring for the login session and the account is locked after a
reboot until `pdfs unlock` or the app supplies them again.

- core: kernelkey module, Error::Locked / WrongMailboxPassword, unlock,
  lock, key_state, ready; blobs written by 3.0.x are migrated on first
  start; token refresh updates only the tokens in the stored blob
- cli: `pdfs unlock [--remember]`, `pdfs lock [--forget]`; status and
  diagnose report the key state; the daemon waits while locked and is
  marked non-dumpable
- gui: mailbox password dialog at sign-in and on open, locked tray state
- po: all catalogs translated
- bump to 3.1.0, depend on proton-sdk and proton-drive-rs 0.8.0

Refs #26.
This commit is contained in:
nvrl committed 2026-10-07 08:17:50 +02:00
1 parent f105159186
commit 9fa88ff397
24 files changed
+2871 -1417

No files matched your search

+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n"
"POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: French\n"
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A %-d %B %Y à %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743
#: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y à %H:%M"
msgid "My files"
msgstr "Mes fichiers"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390
#: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos"
msgstr "Photos"
#: crates/pdfs-gui/src/app/main.rs:751
#: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me"
msgstr "Partagés avec moi"
#: crates/pdfs-gui/src/app/main.rs:756
#: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me"
msgstr "Partagés par moi"
#: crates/pdfs-gui/src/app/main.rs:759
#: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers"
msgstr "Ordinateurs"
#: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash"
msgstr "Corbeille"
#. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762
#: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync"
msgstr "Synchronisation"
#. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079
#: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format
msgid "{what}: {detail}"
msgstr "{what} : {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098
#: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline"
msgstr "Vous êtes hors ligne"
#: crates/pdfs-gui/src/app/main.rs:1099
#: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more"
msgstr "Cet élément n’existe plus"
#: crates/pdfs-gui/src/app/main.rs:1100
#: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that"
msgstr "Vous n’avez pas accès à cet élément"
#: crates/pdfs-gui/src/app/main.rs:1101
#: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first"
msgstr "Quelque chose l’a modifié entre-temps"
#: crates/pdfs-gui/src/app/main.rs:1102
#: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full"
msgstr "Votre Proton Drive est plein"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences"
msgstr "Préférences"
#: crates/pdfs-gui/src/app/main.rs:1144
#: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts"
msgstr "Raccourcis clavier"
#: crates/pdfs-gui/src/app/main.rs:1146
#: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux"
msgstr "À propos de Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151
#: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu"
msgstr "Menu principal"
#: crates/pdfs-gui/src/app/main.rs:1207
#: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215
#: crates/pdfs-gui/src/app/main.rs:1219
msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n"
"\n"
@@ -166,23 +166,23 @@ msgstr ""
"Client non officiel — non affilié à Proton AG, ni approuvé ni pris en charge "
"par Proton AG."
#: crates/pdfs-gui/src/app/main.rs:1220
#: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code"
msgstr "Code source"
#: crates/pdfs-gui/src/app/main.rs:1224
#: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service"
msgstr "Conditions d’utilisation de Proton"
#: crates/pdfs-gui/src/app/main.rs:1228
#: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy"
msgstr "Politique de confidentialité de Proton"
#: crates/pdfs-gui/src/app/main.rs:1233
#: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer"
msgstr "Avertissement"
#: crates/pdfs-gui/src/app/main.rs:1237
#: crates/pdfs-gui/src/app/main.rs:1241
msgid ""
"This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n"
@@ -206,7 +206,7 @@ msgstr ""
"une copie de toutes les données que vous ne pouvez pas vous permettre de "
"perdre."
#: crates/pdfs-gui/src/app/main.rs:1245
#: crates/pdfs-gui/src/app/main.rs:1249
msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -216,7 +216,7 @@ msgstr ""
"www.geonames.org/\">GeoNames</a>, sous licence <a href=\"https://"
"creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253
#: crates/pdfs-gui/src/app/main.rs:1257
msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -226,7 +226,7 @@ msgstr ""
"frontières des pays de <a href=\"https://www.naturalearthdata.com/\">Natural "
"Earth</a>, qui sont dans le domaine public."
#: crates/pdfs-gui/src/app/main.rs:1261
#: crates/pdfs-gui/src/app/main.rs:1265
msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -243,15 +243,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272
#: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits"
msgstr "Les contributeurs de Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310
#: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?"
msgstr "Arrêter Proton Drive ?"
#: crates/pdfs-gui/src/app/main.rs:1311
#: crates/pdfs-gui/src/app/main.rs:1315
msgid ""
"My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login."
@@ -260,7 +260,7 @@ msgstr ""
"vous reconnectez pas. Proton Drive redémarrera à votre prochaine ouverture "
"de session."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588
#: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -275,7 +275,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312
#: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -290,30 +291,30 @@ msgstr ""
msgid "Cancel"
msgstr "Annuler"
#: crates/pdfs-gui/src/app/main.rs:1314
#: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb"
msgid "Stop"
msgstr "Arrêter"
#: crates/pdfs-gui/src/app/main.rs:1331
#: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive"
msgstr "Impossible d’arrêter Proton Drive"
#: crates/pdfs-gui/src/app/main.rs:1332
#: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop."
msgstr "Le service Proton Drive ne s’est pas arrêté."
#: crates/pdfs-gui/src/app/main.rs:1368
#: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General"
msgstr "Général"
#: crates/pdfs-gui/src/app/main.rs:1370
#: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive"
msgstr "Rechercher dans Drive"
#: crates/pdfs-gui/src/app/main.rs:1371
#: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -322,38 +323,38 @@ msgstr "Rechercher dans Drive"
msgid "Refresh"
msgstr "Actualiser"
#: crates/pdfs-gui/src/app/main.rs:1373
#: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts"
msgstr "Raccourcis clavier"
#: crates/pdfs-gui/src/app/main.rs:1377
#: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files"
msgstr "Fichiers"
#: crates/pdfs-gui/src/app/main.rs:1379
#: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder"
msgstr "Nouveau dossier"
#: crates/pdfs-gui/src/app/main.rs:1380
#: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files"
msgstr "Téléverser des fichiers"
#: crates/pdfs-gui/src/app/main.rs:1381
#: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward"
msgstr "Précédent / suivant"
#: crates/pdfs-gui/src/app/main.rs:1382
#: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder"
msgstr "Dossier parent"
#: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list"
msgstr "Grille / liste"
#: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -362,7 +363,7 @@ msgstr "Grille / liste"
msgid "Rename"
msgstr "Renommer"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405
#: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -372,73 +373,73 @@ msgstr "Renommer"
msgid "Move to Trash"
msgstr "Mettre à la corbeille"
#: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection"
msgstr "Effacer la sélection"
#: crates/pdfs-gui/src/app/main.rs:1392
#: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails"
msgstr "Miniatures plus grandes"
#: crates/pdfs-gui/src/app/main.rs:1393
#: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails"
msgstr "Miniatures plus petites"
#: crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size"
msgstr "Réinitialiser la taille des miniatures"
#: crates/pdfs-gui/src/app/main.rs:1395
#: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all"
msgstr "Tout sélectionner"
#: crates/pdfs-gui/src/app/main.rs:1399
#: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer"
msgstr "Visionneuse de photos"
#: crates/pdfs-gui/src/app/main.rs:1401
#: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo"
msgstr "Photo précédente / suivante"
#: crates/pdfs-gui/src/app/main.rs:1402
#: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo"
msgstr "Première / dernière photo"
#: crates/pdfs-gui/src/app/main.rs:1403
#: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details"
msgstr "Afficher les détails"
#: crates/pdfs-gui/src/app/main.rs:1404
#: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen"
msgstr "Plein écran"
#: crates/pdfs-gui/src/app/main.rs:1406
#: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close"
msgstr "Fermer"
#: crates/pdfs-gui/src/app/main.rs:1496
#: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it"
msgstr "Sélectionnez un seul élément pour le renommer"
#: crates/pdfs-gui/src/app/main.rs:1656
#: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370
#: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected"
msgstr "Non connecté"
#: crates/pdfs-gui/src/app/main.rs:1657
#: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running."
msgstr "Le service Proton Drive n’est pas en cours d’exécution."
#: crates/pdfs-gui/src/app/main.rs:1665
#: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444
#: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…"
msgstr "Connexion…"
#: crates/pdfs-gui/src/app/main.rs:1666
#: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start."
msgstr "En attente du démarrage du service Proton Drive."
@@ -1292,7 +1293,7 @@ msgstr "Impossible de charger les albums"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517
#: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1560,7 +1561,7 @@ msgid "Make available offline"
msgstr "Rendre disponible hors ligne"
#: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493
#: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only"
msgstr "Garder en ligne uniquement"
@@ -2724,7 +2725,7 @@ msgid "Sync paused until you resume"
msgstr "Synchronisation en pause jusqu’à la reprise"
#: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237
#: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused"
msgstr "Synchronisation en pause"
@@ -3200,25 +3201,25 @@ msgstr "Saisissez votre adresse électronique et votre mot de passe."
msgid "Signing in…"
msgstr "Connexion…"
#: crates/pdfs-gui/src/app/pages/login.rs:155
#: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…"
msgstr "Terminez la vérification pour continuer…"
#: crates/pdfs-gui/src/app/pages/login.rs:165
#: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled"
msgstr "connexion annulée"
#: crates/pdfs-gui/src/app/pages/login.rs:198
#: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr ""
"Trop de tentatives de connexion. Patientez quelques minutes et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:204
#: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"Impossible de joindre Proton. Vérifiez votre connexion Internet et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:207
#: crates/pdfs-gui/src/app/pages/login.rs:227
msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3227,11 +3228,19 @@ msgstr ""
"système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en "
"cours d’exécution et déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:210
#: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi."
#: crates/pdfs-gui/src/app/pages/login.rs:213
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Connexion annulée : aucun mot de passe de boîte aux lettres n’a été saisi."
#: crates/pdfs-gui/src/app/pages/login.rs:236
msgid "That mailbox password didn't unlock your account."
msgstr "Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte."
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3240,35 +3249,79 @@ msgstr ""
"pour en obtenir une nouvelle."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218
#: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Échec de la connexion : {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298
#: crates/pdfs-gui/src/app/pages/login.rs:354
msgid "That mailbox password didn't unlock your account. Try again."
msgstr "Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte. Réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:356
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr "Ce compte a un mot de passe de boîte aux lettres distinct. Saisissez-le pour déverrouiller vos fichiers."
#: crates/pdfs-gui/src/app/pages/login.rs:359
msgid "Mailbox Password"
msgstr "Mot de passe de la boîte aux lettres"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Mot de passe de la boîte aux lettres"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Garder déverrouillé sur cet ordinateur"
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
msgstr "Enregistre le déverrouillage dans le trousseau de clés du système, afin que Proton Drive s’ouvre sans demande après chaque connexion. Sinon, vous saisissez le mot de passe une fois par session."
#: crates/pdfs-gui/src/app/pages/login.rs:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:431
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "Proton Drive est verrouillé. Saisissez votre mot de passe de boîte aux lettres pour le déverrouiller."
#: crates/pdfs-gui/src/app/pages/login.rs:460
msgid "Unlocked."
msgstr "Déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Impossible de déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication"
msgstr "Authentification à deux facteurs"
#: crates/pdfs-gui/src/app/pages/login.rs:300
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Saisissez le code de votre application d’authentification ou l’un de vos "
"codes de récupération."
#: crates/pdfs-gui/src/app/pages/login.rs:306
#: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code"
msgstr "Code d’authentification"
#: crates/pdfs-gui/src/app/pages/login.rs:313
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm"
msgstr "Confirmer"
#: crates/pdfs-gui/src/app/pages/login.rs:341
#: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?"
msgstr "Se déconnecter ?"
#: crates/pdfs-gui/src/app/pages/login.rs:343
#: crates/pdfs-gui/src/app/pages/login.rs:523
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3277,7 +3330,7 @@ msgstr ""
"vous vous reconnectiez. Les fichiers déjà présents sur cet ordinateur "
"restent en place."
#: crates/pdfs-gui/src/app/pages/login.rs:345
#: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out"
msgstr "Se déconnecter"
@@ -4643,40 +4696,40 @@ msgid "Restart Now"
msgstr "Redémarrer maintenant"
#. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912
#: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format
msgid "{size} used"
msgstr "{size} utilisés"
#: crates/pdfs-gui/src/app/pages/status.rs:923
#: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format
msgid "{used} of {total} used ({percent}%)"
msgstr "{used} utilisés sur {total} ({percent} %)"
#: crates/pdfs-gui/src/app/pages/status.rs:961
#: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected"
msgstr "Proton Drive connecté"
#: crates/pdfs-gui/src/app/pages/status.rs:962
#: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available."
msgstr "Vos fichiers sont disponibles."
#: crates/pdfs-gui/src/app/pages/status.rs:967
#: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected"
msgstr "Proton Drive déconnecté"
#: crates/pdfs-gui/src/app/pages/status.rs:968
#: crates/pdfs-gui/src/app/pages/status.rs:969
msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts."
msgstr ""
"Le service Proton Drive s’est arrêté. Les fichiers ne sont pas disponibles "
"tant qu’il n’a pas redémarré."
#: crates/pdfs-gui/src/app/pages/status.rs:1037
#: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete"
msgstr "Synchronisation terminée"
#: crates/pdfs-gui/src/app/pages/status.rs:1039
#: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format
msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring."
@@ -4685,27 +4738,27 @@ msgstr[1] "Le transfert de {n} fichiers est terminé."
#. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117
#: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format
msgid "{title} — {done} of {total}"
msgstr "{title} — {done} sur {total}"
#. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120
#: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format
msgid "{title} — {detail} ({done} of {total})"
msgstr "{title} — {detail} ({done} sur {total})"
#. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format
msgid "{title}…"
msgstr "{title}…"
#. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125
#: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format
msgid "{title} — {detail}…"
msgstr "{title} — {detail}…"
@@ -4713,7 +4766,7 @@ msgstr "{title} — {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154
#: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name} — {done} ({speed}/s)"
@@ -4721,119 +4774,119 @@ msgstr "{arrow} {name} — {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162
#: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name} — {done} sur {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254
#: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format
msgid "{used} cached — no limit set"
msgstr "{used} en cache — aucune limite définie"
#: crates/pdfs-gui/src/app/pages/status.rs:1260
#: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format
msgid "{used} of {limit} used"
msgstr "{used} utilisés sur {limit}"
#: crates/pdfs-gui/src/app/pages/status.rs:1328
#: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format
msgid "{queued} · resumes {time}"
msgstr "{queued} · reprise {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333
#: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format
msgid "Resumes {time}"
msgstr "Reprise {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335
#: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume"
msgstr "Jusqu’à la reprise"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239
#: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format
msgid "{n} change needs attention"
msgid_plural "{n} changes need attention"
msgstr[0] "{n} modification requiert votre attention"
msgstr[1] "{n} modifications requièrent votre attention"
#: crates/pdfs-gui/src/app/pages/status.rs:1352
#: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state"
msgid "Offline"
msgstr "Hors ligne"
#: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only"
msgstr "Fichiers en cache uniquement"
#: crates/pdfs-gui/src/app/pages/status.rs:1358
#: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state"
msgid "Syncing"
msgstr "Synchronisation"
#: crates/pdfs-gui/src/app/pages/status.rs:1364
#: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date"
msgstr "À jour"
#: crates/pdfs-gui/src/app/pages/status.rs:1371
#: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running"
msgstr "Proton Drive n’est pas en cours d’exécution"
#: crates/pdfs-gui/src/app/pages/status.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding"
msgstr "Ne répond pas"
#: crates/pdfs-gui/src/app/pages/status.rs:1377
#: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive met trop de temps à répondre"
#. Translators: stands in for a time that could not be read, as in
#. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415
#: crates/pdfs-gui/src/app/pages/status.rs:1430
#: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later"
msgstr "plus tard"
#. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419
#: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M"
msgstr "à %H:%M"
#. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423
#: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M"
msgstr "%a %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426
#: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b"
msgstr "%e %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456
#: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline"
msgstr "Aucun fichier disponible hors ligne"
#: crates/pdfs-gui/src/app/pages/status.rs:1458
#: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”."
msgstr ""
"Faites un clic droit sur un fichier et choisissez « Rendre disponible hors "
"ligne »."
#: crates/pdfs-gui/src/app/pages/status.rs:1509
#: crates/pdfs-gui/src/app/pages/status.rs:1516
#: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only"
msgstr "Impossible de le garder en ligne uniquement"
#: crates/pdfs-gui/src/app/pages/status.rs:1533
#: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer"
msgstr "Afficher moins"
#: crates/pdfs-gui/src/app/pages/status.rs:1536
#: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format
msgid "Show all {n} file"
msgid_plural "Show all {n} files"
@@ -5899,40 +5952,45 @@ msgstr[1] "↑ {n} en téléversement"
msgid "Proton Drive isn't responding"
msgstr "Proton Drive ne répond pas"
#: crates/pdfs-gui/src/main.rs:172
#: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Connecté en tant que {username} — verrouillé"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format
msgid "Signed in as {username} — not connected"
msgstr "Connecté en tant que {username} — non connecté"
#: crates/pdfs-gui/src/main.rs:177
#: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in"
msgstr "Non connecté"
#. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180
#: crates/pdfs-gui/src/main.rs:189
#, rust-format
msgid "Error: {error}"
msgstr "Erreur : {error}"
#: crates/pdfs-gui/src/main.rs:201
#: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive a envoyé une réponse inattendue"
#: crates/pdfs-gui/src/main.rs:246
#: crates/pdfs-gui/src/main.rs:255
#, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "À jour dans {mountpoint} ({n} épinglé)"
msgstr[1] "À jour dans {mountpoint} ({n} épinglés)"
#: crates/pdfs-gui/src/main.rs:253
#: crates/pdfs-gui/src/main.rs:262
#, rust-format
msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Synchronisation — {queued} ({n} épinglé)"
msgstr[1] "Synchronisation — {queued} ({n} épinglés)"
#: crates/pdfs-gui/src/main.rs:260
#: crates/pdfs-gui/src/main.rs:269
#, rust-format
msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5940,52 +5998,52 @@ msgstr[0] "Hors ligne — fichiers en cache uniquement ({n} épinglé)"
msgstr[1] "Hors ligne — fichiers en cache uniquement ({n} épinglés)"
#. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266
#: crates/pdfs-gui/src/main.rs:275
#, rust-format
msgid "Offline — {queued}"
msgstr "Hors ligne — {queued}"
#. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296
#: crates/pdfs-gui/src/main.rs:305
#, rust-format
msgid "{n} issue — View"
msgid_plural "{n} issues — View"
msgstr[0] "{n} problème — Afficher"
msgstr[1] "{n} problèmes — Afficher"
#: crates/pdfs-gui/src/main.rs:402
#: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…"
msgstr "Se connecter…"
#: crates/pdfs-gui/src/main.rs:403
#: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive"
msgstr "Ouvrir Proton Drive"
#: crates/pdfs-gui/src/main.rs:409
#: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder"
msgstr "Ouvrir le dossier"
#: crates/pdfs-gui/src/main.rs:421
#: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync"
msgstr "Reprendre la synchronisation"
#: crates/pdfs-gui/src/main.rs:423
#: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync"
msgstr "Mettre en pause la synchronisation"
#: crates/pdfs-gui/src/main.rs:442
#: crates/pdfs-gui/src/main.rs:451
msgid "Connect"
msgstr "Connecter"
#: crates/pdfs-gui/src/main.rs:449
#: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon"
msgstr "Masquer l’icône de la zone de notification"
#: crates/pdfs-gui/src/main.rs:453
#: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…"
msgstr "Arrêter Proton Drive…"
#: crates/pdfs-gui/src/main.rs:457
#: crates/pdfs-gui/src/main.rs:466
msgid "Quit"
msgstr "Quitter"