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

+199 -141
View File
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.10.0\n"
"Project-Id-Version: proton-drive-linux 3.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: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -60,7 +60,7 @@ msgstr ""
msgid "%A, %B %-d, %Y, %H:%M"
msgstr ""
#: 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
@@ -73,91 +73,91 @@ msgstr ""
msgid "My files"
msgstr ""
#: 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 ""
#: 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 ""
#: 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 ""
#: 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 ""
#: 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 ""
#. 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 ""
#. 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 ""
#: crates/pdfs-gui/src/app/main.rs:1098
#: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1099
#: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more"
msgstr ""
#: 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 ""
#: crates/pdfs-gui/src/app/main.rs:1101
#: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1102
#: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full"
msgstr ""
#: 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 ""
#: 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 ""
#: crates/pdfs-gui/src/app/main.rs:1146
#: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1151
#: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1207
#: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux"
msgstr ""
#: 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"
@@ -165,23 +165,23 @@ msgid ""
"AG."
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1220
#: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1224
#: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1228
#: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1233
#: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer"
msgstr ""
#: 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"
@@ -194,21 +194,21 @@ msgid ""
"of any data you cannot afford to lose."
msgstr ""
#: 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/"
"licenses/by/4.0/\">CC BY 4.0</a>."
msgstr ""
#: 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 "
"public domain."
msgstr ""
#: 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/"
@@ -219,21 +219,21 @@ 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 ""
#: crates/pdfs-gui/src/app/main.rs:1310
#: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?"
msgstr ""
#: 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."
msgstr ""
#: 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
@@ -248,7 +248,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
@@ -263,30 +264,30 @@ msgstr ""
msgid "Cancel"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1314
#: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb"
msgid "Stop"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1331
#: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive"
msgstr ""
#: 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 ""
#: 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 ""
#: 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 ""
#: 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
@@ -295,38 +296,38 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1373
#: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1377
#: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files"
msgstr ""
#: 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 ""
#: 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 ""
#: crates/pdfs-gui/src/app/main.rs:1381
#: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward"
msgstr ""
#: 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 ""
#: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list"
msgstr ""
#: 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
@@ -335,7 +336,7 @@ msgstr ""
msgid "Rename"
msgstr ""
#: 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
@@ -345,73 +346,73 @@ msgstr ""
msgid "Move to Trash"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1392
#: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1393
#: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1395
#: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1399
#: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1401
#: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1402
#: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1403
#: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1404
#: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen"
msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1406
#: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close"
msgstr ""
#: 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 ""
#: 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 ""
#: 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 ""
#: 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 ""
#: 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 ""
@@ -1240,7 +1241,7 @@ msgstr ""
#: 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
@@ -1508,7 +1509,7 @@ msgid "Make available offline"
msgstr ""
#: 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 ""
@@ -2616,7 +2617,7 @@ msgid "Sync paused until you resume"
msgstr ""
#: 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 ""
@@ -3052,72 +3053,124 @@ msgstr ""
msgid "Signing in…"
msgstr ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/login.rs:165
#: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled"
msgstr ""
#: 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 ""
#: 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 ""
#: 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."
msgstr ""
#: 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 ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/login.rs:236
msgid "That mailbox password didn't unlock your account."
msgstr ""
#: 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."
msgstr ""
#. 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 ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/login.rs:356
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:359
msgid "Mailbox Password"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/login.rs:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:431
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:460
msgid "Unlocked."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication"
msgstr ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/login.rs:306
#: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:313
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:341
#: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?"
msgstr ""
#: 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."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:345
#: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out"
msgstr ""
@@ -4433,38 +4486,38 @@ msgid "Restart Now"
msgstr ""
#. 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 ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/status.rs:961
#: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected"
msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:962
#: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available."
msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:967
#: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected"
msgstr ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/status.rs:1037
#: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete"
msgstr ""
#: 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."
@@ -4473,27 +4526,27 @@ msgstr[1] ""
#. 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
@@ -4501,7 +4554,7 @@ msgstr ""
#. 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 ""
@@ -4509,117 +4562,117 @@ msgstr ""
#. 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 ""
#: 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 ""
#: 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 ""
#: 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 ""
#. 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 ""
#: crates/pdfs-gui/src/app/pages/status.rs:1335
#: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume"
msgstr ""
#: 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] ""
msgstr[1] ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only"
msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1358
#: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state"
msgid "Syncing"
msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1364
#: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date"
msgstr ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/status.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding"
msgstr ""
#: 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
#: crates/pdfs-gui/src/app/pages/status.rs:1456
#: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline"
msgstr ""
#: 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 ""
#: 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 ""
#: crates/pdfs-gui/src/app/pages/status.rs:1533
#: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer"
msgstr ""
#: 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"
@@ -5644,40 +5697,45 @@ msgstr[1] ""
msgid "Proton Drive isn't responding"
msgstr ""
#: crates/pdfs-gui/src/main.rs:172
#: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr ""
#: crates/pdfs-gui/src/main.rs:181
#, rust-format
msgid "Signed in as {username} — not connected"
msgstr ""
#: crates/pdfs-gui/src/main.rs:177
#: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in"
msgstr ""
#. 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 ""
#: crates/pdfs-gui/src/main.rs:201
#: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply"
msgstr ""
#: 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] ""
msgstr[1] ""
#: 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] ""
msgstr[1] ""
#: 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)"
@@ -5685,52 +5743,52 @@ msgstr[0] ""
msgstr[1] ""
#. 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 ""
#. 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] ""
msgstr[1] ""
#: crates/pdfs-gui/src/main.rs:402
#: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…"
msgstr ""
#: crates/pdfs-gui/src/main.rs:403
#: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive"
msgstr ""
#: crates/pdfs-gui/src/main.rs:409
#: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder"
msgstr ""
#: crates/pdfs-gui/src/main.rs:421
#: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync"
msgstr ""
#: crates/pdfs-gui/src/main.rs:423
#: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync"
msgstr ""
#: crates/pdfs-gui/src/main.rs:442
#: crates/pdfs-gui/src/main.rs:451
msgid "Connect"
msgstr ""
#: crates/pdfs-gui/src/main.rs:449
#: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon"
msgstr ""
#: crates/pdfs-gui/src/main.rs:453
#: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…"
msgstr ""
#: crates/pdfs-gui/src/main.rs:457
#: crates/pdfs-gui/src/main.rs:466
msgid "Quit"
msgstr ""