feat(sharing,gui,cli): change public links and show folder sizes

The share dialog gets Link settings under an existing link: role, password
and expiry apply at once and keep the URL. The daemon fills in the options a
change keeps from the link as it stands, and refuses to keep a password it
cannot read rather than dropping it. pdfs public-link update does the same
from a terminal, and pdfs members shows the expiry.

Details shows a folder's size and item count as Proton Drive counts it,
trash included, and pdfs du prints it. Both are refused offline and for a
folder that is not on Drive yet.

Needs proton-drive-rs with update_public_link, get_folder_size and
PublicLink::custom_password.
This commit is contained in:
nvrl committed 2026-10-25 22:18:11 +01:00
1 parent ee59e338b6
commit 4edcff3f87
21 files changed
+1824 -686

No files matched your search

+130 -72
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-25 21:32+0100\n"
"POT-Creation-Date: 2026-10-25 22:10+0100\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Spanish\n"
@@ -512,7 +512,7 @@ msgstr "Opciones de vista"
#: crates/pdfs-gui/src/app/pages/shared.rs:424
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349
#: crates/pdfs-gui/src/app/pages/trash.rs:284
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:145
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:187
msgid "Loading…"
msgstr "Cargando…"
@@ -1294,9 +1294,10 @@ msgstr "No se pudieron cargar los álbumes"
#: crates/pdfs-gui/src/app/pages/status.rs:1642
#: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:618
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:449
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:765
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:803
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:516
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:922
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:957
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:995
#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170
#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:381
msgid "The Proton Drive service didn't respond."
@@ -1309,7 +1310,7 @@ msgstr "El servicio de Proton Drive no respondió."
#: crates/pdfs-gui/src/app/pages/shared.rs:536
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476
#: crates/pdfs-gui/src/app/widgets/details.rs:157
#: crates/pdfs-gui/src/app/widgets/details.rs:406
#: crates/pdfs-gui/src/app/widgets/details.rs:413
#: crates/pdfs-gui/src/hud/preview.rs:277
msgctxt "verb"
msgid "Open"
@@ -1501,6 +1502,7 @@ msgstr "Nombre"
#: crates/pdfs-gui/src/app/pages/shared.rs:273
#: crates/pdfs-gui/src/app/pages/trash.rs:153
#: crates/pdfs-gui/src/app/widgets/details.rs:88
#: crates/pdfs-gui/src/app/widgets/details.rs:380
#: crates/pdfs-gui/src/hud/preview.rs:143
msgctxt "column"
msgid "Size"
@@ -1610,7 +1612,7 @@ msgstr "No se pudo mover a la papelera"
#: crates/pdfs-gui/src/app/pages/browser.rs:2376
#: crates/pdfs-gui/src/app/pages/browser.rs:2432
#: crates/pdfs-gui/src/app/pages/browser.rs:2620
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:274
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341
#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91
msgid "Proton Drive isn't connected."
msgstr "Proton Drive no está conectado."
@@ -1791,7 +1793,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/shared.rs:888
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:494
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:633
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:700
msgid "Link copied"
msgstr "Enlace copiado"
@@ -2490,7 +2492,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1040
#: crates/pdfs-gui/src/app/pages/shared.rs:1025
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:567
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876
msgid "Remove"
msgstr "Quitar"
@@ -4278,14 +4281,14 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/shared.rs:646
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:675
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:93
msgctxt "role"
msgid "Viewer"
msgstr "Lector"
#: crates/pdfs-gui/src/app/pages/shared.rs:647
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:675
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:93
msgctxt "role"
msgid "Editor"
msgstr "Editor"
@@ -4444,7 +4447,7 @@ msgid "Link removed"
msgstr "Enlace quitado"
#: crates/pdfs-gui/src/app/pages/shared.rs:1039
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:662
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:729
msgid "Couldn't remove the link"
msgstr "No se pudo quitar el enlace"
@@ -4507,7 +4510,7 @@ msgid "People"
msgstr "Personas"
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:198
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:624
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:691
msgid "Copy link"
msgstr "Copiar enlace"
@@ -5585,7 +5588,7 @@ msgid "Info"
msgstr "Información"
#: crates/pdfs-gui/src/app/widgets/details.rs:115
#: crates/pdfs-gui/src/app/widgets/details.rs:399
#: crates/pdfs-gui/src/app/widgets/details.rs:406
msgid "Keep a copy on this computer, even without a connection."
msgstr "Conservar una copia en este equipo, incluso sin conexión."
@@ -5623,17 +5626,25 @@ msgstr "Carpeta"
msgid "File"
msgstr "Archivo"
#: crates/pdfs-gui/src/app/widgets/details.rs:385
#: crates/pdfs-gui/src/app/widgets/details.rs:374
msgid "Size on Proton Drive"
msgstr "Tamaño en Proton Drive"
#: crates/pdfs-gui/src/app/widgets/details.rs:377
msgid "Counted by Proton Drive, including items in the trash."
msgstr "Calculado por Proton Drive, incluidos los elementos de la papelera."
#: crates/pdfs-gui/src/app/widgets/details.rs:392
msgid "Proton Drive"
msgstr "Proton Drive"
#: crates/pdfs-gui/src/app/widgets/details.rs:393
#: crates/pdfs-gui/src/app/widgets/details.rs:400
msgid "Kept on this computer because a folder it is in is available offline."
msgstr ""
"Se conserva en este equipo porque una carpeta que lo contiene está "
"disponible sin conexión."
#: crates/pdfs-gui/src/app/widgets/details.rs:396
#: crates/pdfs-gui/src/app/widgets/details.rs:403
msgid ""
"Keep a copy of everything in this folder on this computer, even without a "
"connection."
@@ -5641,57 +5652,68 @@ msgstr ""
"Conservar una copia de todo el contenido de esta carpeta en este equipo, "
"incluso sin conexión."
#: crates/pdfs-gui/src/app/widgets/details.rs:404
#: crates/pdfs-gui/src/app/widgets/details.rs:411
#: crates/pdfs-gui/src/hud/preview.rs:275
msgid "Open folder"
msgstr "Abrir carpeta"
#: crates/pdfs-gui/src/app/widgets/details.rs:448
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:442
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:448
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:465
#: crates/pdfs-gui/src/app/widgets/details.rs:455
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:509
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:532
msgid "Couldn't load sharing"
msgstr "No se pudo cargar la compartición"
#: crates/pdfs-gui/src/app/widgets/details.rs:470
#: crates/pdfs-gui/src/app/widgets/details.rs:475
msgid "Couldn't load the size"
msgstr "No se pudo cargar el tamaño"
#: crates/pdfs-gui/src/app/widgets/details.rs:495
#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165
#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169
msgid "Couldn't load versions"
msgstr "No se pudieron cargar las versiones"
#: crates/pdfs-gui/src/app/widgets/details.rs:490
#: crates/pdfs-gui/src/app/widgets/details.rs:515
msgid "Only you"
msgstr "Solo usted"
#: crates/pdfs-gui/src/app/widgets/details.rs:491
#: crates/pdfs-gui/src/app/widgets/details.rs:516
msgid "Anyone with the link"
msgstr "Cualquiera con el enlace"
#: crates/pdfs-gui/src/app/widgets/details.rs:492
#: crates/pdfs-gui/src/app/widgets/details.rs:517
#, rust-format
msgid "Shared with {n} person"
msgid_plural "Shared with {n} people"
msgstr[0] "Compartido con {n} persona"
msgstr[1] "Compartido con {n} personas"
#: crates/pdfs-gui/src/app/widgets/details.rs:494
#: crates/pdfs-gui/src/app/widgets/details.rs:519
#, rust-format
msgid "Shared with {n} person · Public link"
msgid_plural "Shared with {n} people · Public link"
msgstr[0] "Compartido con {n} persona · Enlace público"
msgstr[1] "Compartido con {n} personas · Enlace público"
#: crates/pdfs-gui/src/app/widgets/details.rs:506
#: crates/pdfs-gui/src/app/widgets/details.rs:532
#, rust-format
msgid "{size} · {n} item"
msgid_plural "{size} · {n} items"
msgstr[0] "{size} · {n} elemento"
msgstr[1] "{size} · {n} elementos"
#: crates/pdfs-gui/src/app/widgets/details.rs:543
msgid "No earlier versions"
msgstr "No hay versiones anteriores"
#. Translators: {date} is the date of the only version.
#: crates/pdfs-gui/src/app/widgets/details.rs:508
#: crates/pdfs-gui/src/app/widgets/details.rs:545
#, rust-format
msgid "1 version · {date}"
msgstr "1 versión · {date}"
#: crates/pdfs-gui/src/app/widgets/details.rs:511
#: crates/pdfs-gui/src/app/widgets/details.rs:548
#, rust-format
msgid "{n} version · latest {date}"
msgid_plural "{n} versions · latest {date}"
@@ -5715,124 +5737,124 @@ msgstr "7 días"
msgid "30 days"
msgstr "30 días"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:273
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:340
msgid "Can't share"
msgstr "No se puede compartir"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:289
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:343
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:356
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:410
msgctxt "verb"
msgid "Share"
msgstr "Compartir"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:363
msgid "Invite people"
msgstr "Invitar a personas"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:298
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:365
msgid "Proton and non-Proton email addresses, separated by spaces or commas."
msgstr ""
"Direcciones de correo electrónico de Proton y de otros proveedores, "
"separadas por espacios o comas."
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:302
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:369
msgid "Email addresses"
msgstr "Direcciones de correo electrónico"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:311
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:378
msgid "Role"
msgstr "Rol"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:314
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:381
msgid "Message (optional)"
msgstr "Mensaje (opcional)"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:316
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:383
msgid "Send Invitations"
msgstr "Enviar invitaciones"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:323
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:390
msgid "People with access"
msgstr "Personas con acceso"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:326
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:393
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:679
msgid "Public link"
msgstr "Enlace público"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:369
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:436
#, rust-format
msgid "“{text}” isn't an email address"
msgstr "“{text}” no es una dirección de correo electrónico"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:408
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:475
msgid "Invitations sent"
msgstr "Invitaciones enviadas"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:409
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:476
msgid "Couldn't send invitations"
msgstr "No se pudieron enviar las invitaciones"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:477
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:544
msgid "No one else has access yet."
msgstr "Nadie más tiene acceso todavía."
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:488
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555
msgid "Invitation pending"
msgstr "Invitación pendiente"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:489
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:556
msgid "Invitation pending, no Proton account yet"
msgstr "Invitación pendiente, aún sin cuenta de Proton"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:594
msgid "Role updated"
msgstr "Rol actualizado"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:528
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:595
msgid "Couldn't update the role"
msgstr "No se pudo actualizar el rol"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:545
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612
msgid "Remove access"
msgstr "Quitar el acceso"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:561
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:628
msgid "Remove Access?"
msgstr "¿Quitar el acceso?"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:564
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:631
#, rust-format
msgid "{email} will no longer be able to open this item."
msgstr "{email} ya no podrá abrir este elemento."
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:572
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:639
msgid "Access removed"
msgstr "Acceso quitado"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:573
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:640
msgid "Couldn't remove access"
msgstr "No se pudo quitar el acceso"
#. Translators: {role} is the link's role, such as "Viewer".
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:601
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:668
#, rust-format
msgid "Anyone with the link ({role})"
msgstr "Cualquiera con el enlace ({role})"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:671
msgid "password-protected"
msgstr "protegido con contraseña"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:640
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:707
msgid "Remove link"
msgstr "Quitar el enlace"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:654
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721
msgid "Remove Public Link?"
msgstr "¿Quitar el enlace público?"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:655
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:722
msgid ""
"The link stops working for everyone who has it. A new link will have a "
"different address."
@@ -5840,51 +5862,87 @@ msgstr ""
"El enlace deja de funcionar para todas las personas que lo tienen. Un enlace "
"nuevo tendrá una dirección distinta."
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:656
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:723
msgid "Remove Link"
msgstr "Quitar enlace"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:661
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:728
msgid "Public link removed"
msgstr "Enlace público quitado"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:682
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:746
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:807
msgid "Link role"
msgstr "Rol del enlace"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:686
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:748
msgid "Password (optional)"
msgstr "Contraseña (opcional)"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:695
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:752
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:830
msgid "Expires"
msgstr "Caduca"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:697
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:753
msgid "Create Public Link"
msgstr "Crear enlace público"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:756
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:800
msgid "Link settings"
msgstr "Ajustes del enlace"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:802
msgid ""
"Change who can edit, the password or the expiry. The link stays the same."
msgstr "Cambie quién puede editar, la contraseña o la caducidad. El enlace no cambia."
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:849
msgid "New password"
msgstr "Nueva contraseña"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:851
msgid "Add a password"
msgstr "Añadir una contraseña"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:881
msgid "Remove the password"
msgstr "Quitar la contraseña"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:883
msgid "Anyone with the link can open it without a password."
msgstr "Cualquiera con el enlace puede abrirlo sin contraseña."
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:915
msgid "Link updated"
msgstr "Enlace actualizado"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:917
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:921
msgid "Couldn't change the link"
msgstr "No se pudo cambiar el enlace"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:948
msgid "Public link created"
msgstr "Enlace público creado"
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:760
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:764
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:952
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:956
msgid "Couldn't create the link"
msgstr "No se pudo crear el enlace"
#. Translators: a public link past its expiry date.
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:816
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:1008
msgid "expired"
msgstr "caducado"
#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26".
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:819
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:1011
msgid "%x"
msgstr "%x"
#. Translators: {date} is the date a public link stops working.
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:826
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:1018
#, rust-format
msgid "expires {date}"
msgstr "caduca el {date}"