From e9577f953fb15745496094d3c144f817adb87a9a Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Sat, 31 Oct 2026 10:49:01 +0100 Subject: [PATCH] fix(cli,core,fuse,gui): say why the mount keeps failing, and back off A mount that failed on every try retried every 5 s forever, and the reason was only in the journal: the app and the tray said Connecting... for days (B263, issue #40). The retry now doubles to a 2-minute ceiling, and the last failure is kept in mount-failure.json for the app, the tray, pdfs diagnose and systemctl status. The early returns in mount left the workers they had started running beside the next attempt (B264). They are now stopped on every error path, without telling systemd the daemon is stopping. --- crates/pdfs-cli/src/main.rs | 80 +++++++++++++++++++++++-- crates/pdfs-core/src/lib.rs | 1 + crates/pdfs-core/src/mountfail.rs | 75 +++++++++++++++++++++++ crates/pdfs-fuse/src/lib.rs | 2 +- crates/pdfs-fuse/src/mount.rs | 99 ++++++++++++++++++++++--------- crates/pdfs-fuse/src/systemd.rs | 10 +++- crates/pdfs-gui/src/app/main.rs | 36 ++++++++--- crates/pdfs-gui/src/main.rs | 18 ++++++ docs/BUGS.md | 38 +++++++++--- po/de.po | 74 ++++++++++++++--------- po/en_GB.po | 74 ++++++++++++++--------- po/es.po | 74 ++++++++++++++--------- po/fr.po | 74 ++++++++++++++--------- po/it.po | 74 ++++++++++++++--------- po/nl.po | 74 ++++++++++++++--------- po/pdfs.pot | 74 ++++++++++++++--------- po/pl.po | 74 ++++++++++++++--------- po/pt_BR.po | 74 ++++++++++++++--------- 18 files changed, 714 insertions(+), 311 deletions(-) create mode 100644 crates/pdfs-core/src/mountfail.rs diff --git a/crates/pdfs-cli/src/main.rs b/crates/pdfs-cli/src/main.rs index 75f6e3b..3076f68 100644 --- a/crates/pdfs-cli/src/main.rs +++ b/crates/pdfs-cli/src/main.rs @@ -2375,12 +2375,21 @@ where /// an external unmount triggers a remount; errors back off and retry. This is /// the entry point for the systemd user service. fn cmd_daemon(mountpoint: Option) -> Result<()> { + let state_dir = AppDirs::new()?.state_dir(); + // A failure an earlier daemon recorded is not this one's. + pdfs_core::mountfail::clear(&state_dir); + let mut failure: Option = None; loop { // Wait until a session is stored. The GUI enables this service on login, // but the service may also start at boot before the user has logged in. wait_for_session(auth::ready, pdfs_fuse::idle_sleep)?; - match mount_once(mountpoint.clone()) { + let outcome = mount_once(mountpoint.clone()); + if outcome.is_ok() { + // The mount came up, so the next failure starts a new run of them. + failure = None; + } + match outcome { Ok(pdfs_fuse::MountOutcome::Shutdown) => { tracing::info!("daemon stopping"); return Ok(()); @@ -2395,13 +2404,51 @@ fn cmd_daemon(mountpoint: Option) -> Result<()> { Err(e) => { // `{:#}` so the whole anyhow chain lands in the log — the top // context alone ("mount failed") never says *why*. - tracing::error!(error = format!("{e:#}"), "mount failed; retrying in 5s"); - pdfs_fuse::idle_sleep(std::time::Duration::from_secs(5)); + let error = format!("{e:#}"); + let now = unix_now(); + let attempts = failure.as_ref().map_or(1, |f| f.attempts.saturating_add(1)); + let delay = mount_retry_delay(attempts); + tracing::error!( + error, + attempts, + retry_secs = delay.as_secs(), + "mount failed; retrying" + ); + let record = pdfs_core::mountfail::MountFailure { + error: error.clone(), + since: failure.as_ref().map_or(now, |f| f.since), + attempts, + next_attempt: now + delay.as_secs() as i64, + }; + if let Err(e) = pdfs_core::mountfail::record(&state_dir, &record) { + tracing::warn!(error = %e, "could not record the mount failure"); + } + pdfs_fuse::notify_status(&format!("Mount failing: {error}")); + failure = Some(record); + pdfs_fuse::idle_sleep(delay); } } } } +/// How long to wait before mount attempt `attempts + 1`, after `attempts` +/// failures in a row. +/// +/// Doubles from 5 s to a 2-minute ceiling. A flat 5 s retry sent about four +/// requests to Proton per attempt, tens of thousands a day from an account +/// whose mount fails on a key, which no retry fixes (`docs/BUGS.md` B263). The +/// ceiling stays at minutes because a cold start without a network fails the +/// same way, and must mount soon after the network returns. +fn mount_retry_delay(attempts: u32) -> std::time::Duration { + const BASE_SECS: u64 = 5; + const MAX_SECS: u64 = 120; + + let factor = 1u64 + .checked_shl(attempts.saturating_sub(1)) + .unwrap_or(u64::MAX); + std::time::Duration::from_secs(BASE_SECS.saturating_mul(factor).min(MAX_SECS)) +} + /// One mount run: resume the session, mount, and block until the mount ends /// (clean shutdown or external unmount). Returns the [`MountOutcome`] so the /// daemon loop can decide whether to exit or remount. @@ -3857,7 +3904,23 @@ fn cmd_diagnose() -> Result<()> { " daemon responding", format!("stopped or unreachable: {e:#}"), ); - println!(" (start it with `systemctl --user start proton-drive.service`)"); + match pdfs_core::mountfail::read(&dirs.state_dir()) { + // A daemon whose mount keeps failing never opens the socket, + // so this is the only place its reason shows (B263). + Some(failure) => report.finding( + DiagnoseLevel::Fail, + " mount", + format!( + "failing for {}, {} attempt(s): {}", + human_secs(unix_now().saturating_sub(failure.since).max(0) as u64), + failure.attempts, + failure.error + ), + ), + None => println!( + " (start it with `systemctl --user start proton-drive.service`)" + ), + } } } @@ -4017,6 +4080,15 @@ mod diagnose_tests { #[cfg(test)] mod login_wait_tests { use super::*; + + /// The mount retry backs off from 5 s to a ceiling of minutes, rather than + /// asking Proton every 5 s forever (`docs/BUGS.md` B263). + #[test] + fn a_failing_mount_backs_off_to_a_ceiling() { + let secs: Vec = (1..=8).map(|n| mount_retry_delay(n).as_secs()).collect(); + assert_eq!(secs, [5, 10, 20, 40, 80, 120, 120, 120]); + assert_eq!(mount_retry_delay(u32::MAX).as_secs(), 120); + } use std::time::Duration; #[test] diff --git a/crates/pdfs-core/src/lib.rs b/crates/pdfs-core/src/lib.rs index ed19c4f..0f79ec4 100644 --- a/crates/pdfs-core/src/lib.rs +++ b/crates/pdfs-core/src/lib.rs @@ -15,6 +15,7 @@ pub mod kernelkey; pub mod keycheck; pub mod localindex; pub mod menu; +pub mod mountfail; pub mod mounts; pub mod opener; pub mod places; diff --git a/crates/pdfs-core/src/mountfail.rs b/crates/pdfs-core/src/mountfail.rs new file mode 100644 index 0000000..130a155 --- /dev/null +++ b/crates/pdfs-core/src/mountfail.rs @@ -0,0 +1,75 @@ +//! Why the daemon's mount keeps failing, for the front ends to read. +//! +//! The control socket opens only once a mount has succeeded, so a daemon whose +//! mount fails on every try had no way to say why. The app and the tray showed +//! "Connecting…" for days while the reason sat in the journal (`docs/BUGS.md` +//! B263). The daemon now writes its last failure to a small file in the state +//! directory, next to the control socket, and removes it once a mount is up. + +use std::path::{Path, PathBuf}; + +use serde::{Deserialize, Serialize}; + +/// The file's name inside the state directory. +const FILE_NAME: &str = "mount-failure.json"; + +/// The last failed mount attempt. +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] +pub struct MountFailure { + /// The error, in English, as the journal has it. + pub error: String, + /// Unix seconds of the first failure in this run of failures. + pub since: i64, + /// Failed attempts in a row. + pub attempts: u32, + /// Unix seconds of the next attempt. + pub next_attempt: i64, +} + +/// Where the failure is kept for the state directory `state_dir`. +pub fn path(state_dir: &Path) -> PathBuf { + state_dir.join(FILE_NAME) +} + +/// Record `failure`, replacing the one before it. Written to a temporary file +/// and renamed, so a reader never sees half of it. +pub fn record(state_dir: &Path, failure: &MountFailure) -> std::io::Result<()> { + let json = serde_json::to_vec(failure).map_err(std::io::Error::other)?; + let tmp = state_dir.join(format!("{FILE_NAME}.tmp")); + std::fs::write(&tmp, json)?; + std::fs::rename(&tmp, path(state_dir)) +} + +/// Forget the failure: a mount is up, or a new daemon has started. +pub fn clear(state_dir: &Path) { + let _ = std::fs::remove_file(path(state_dir)); +} + +/// The recorded failure, if there is one and it can be read. +pub fn read(state_dir: &Path) -> Option { + let bytes = std::fs::read(path(state_dir)).ok()?; + serde_json::from_slice(&bytes).ok() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn a_recorded_failure_reads_back_until_cleared() { + let dir = std::env::temp_dir().join(format!("pdfs-mountfail-{}", std::process::id())); + std::fs::create_dir_all(&dir).unwrap(); + assert_eq!(read(&dir), None); + let failure = MountFailure { + error: "fetch My Files root: missing key".into(), + since: 1_700_000_000, + attempts: 3, + next_attempt: 1_700_000_040, + }; + record(&dir, &failure).unwrap(); + assert_eq!(read(&dir), Some(failure)); + clear(&dir); + assert_eq!(read(&dir), None); + let _ = std::fs::remove_dir_all(&dir); + } +} diff --git a/crates/pdfs-fuse/src/lib.rs b/crates/pdfs-fuse/src/lib.rs index d9bbb0e..75dc15b 100644 --- a/crates/pdfs-fuse/src/lib.rs +++ b/crates/pdfs-fuse/src/lib.rs @@ -124,7 +124,7 @@ use mount::{ }; use reads::{BlockFlight, BlockRing, PREFETCH_BUDGET, Prefetch, ReaderSlot, STREAM_BYPASS_MIN}; use state::{Entry, Intervals, PendingRevision, State, StateGuard, WriteHandle}; -pub use systemd::idle_sleep; +pub use systemd::{idle_sleep, status as notify_status}; use tracing::{debug, error, info, warn}; use transfers::{CountingWriter, JobGuard, OwnedCountingReader, TransferRegistry}; use r#virtual::{ diff --git a/crates/pdfs-fuse/src/mount.rs b/crates/pdfs-fuse/src/mount.rs index 1aeccdc..a35c3a5 100644 --- a/crates/pdfs-fuse/src/mount.rs +++ b/crates/pdfs-fuse/src/mount.rs @@ -540,12 +540,11 @@ pub(crate) fn mount_with( // and sweeps all operating on a mount that no longer exists (`docs/BUGS.md` B44). let mut workers: Vec> = Vec::new(); for worker in 0..DRAIN_WORKERS { - let core = core.clone(); - workers.push( - std::thread::Builder::new() - .name(format!("pdfs-drain-{worker}")) - .spawn(move || core.run_pending_drain(worker == 0))?, - ); + let drain_core = core.clone(); + let spawned = std::thread::Builder::new() + .name(format!("pdfs-drain-{worker}")) + .spawn(move || drain_core.run_pending_drain(worker == 0)); + keep_or_abandon(&core, control_socket, &mut workers, spawned)?; } // Start the folder-sync engine. It watches every mirror folder, polls the @@ -565,24 +564,22 @@ pub(crate) fn mount_with( info!("conflict sweep disabled by configuration"); } else { info!(mode = ?sweep_mode, "conflict sweep enabled"); - let core = core.clone(); - workers.push( - std::thread::Builder::new() - .name("pdfs-conflict-sweep".into()) - .spawn(move || core.run_conflict_sweep_loop())?, - ); + let sweep_core = core.clone(); + let spawned = std::thread::Builder::new() + .name("pdfs-conflict-sweep".into()) + .spawn(move || sweep_core.run_conflict_sweep_loop()); + keep_or_abandon(&core, control_socket, &mut workers, spawned)?; } // Watch the link for the life of the mount: a mount from the cache waits for // the network to come back, and an online one can lose it at any moment and // must notice it coming back just the same. { - let core = core.clone(); - workers.push( - std::thread::Builder::new() - .name("pdfs-online-probe".into()) - .spawn(move || core.run_online_probe())?, - ); + let probe_core = core.clone(); + let spawned = std::thread::Builder::new() + .name("pdfs-online-probe".into()) + .spawn(move || probe_core.run_online_probe()); + keep_or_abandon(&core, control_socket, &mut workers, spawned)?; } // Keep the launcher prompt's "This computer" index fresh. Its own thread: @@ -593,11 +590,10 @@ pub(crate) fn mount_with( let transfers = core.transfers.clone(); let mountpoint = mountpoint.to_path_buf(); let shutdown = core.shutdown.clone(); - workers.push( - std::thread::Builder::new() - .name("pdfs-localindex".into()) - .spawn(move || run_local_index(db, indexing, transfers, mountpoint, shutdown))?, - ); + let spawned = std::thread::Builder::new() + .name("pdfs-localindex".into()) + .spawn(move || run_local_index(db, indexing, transfers, mountpoint, shutdown)); + keep_or_abandon(&core, control_socket, &mut workers, spawned)?; } // Bind the control socket before the FUSE session takes over the thread. A @@ -606,12 +602,18 @@ pub(crate) fn mount_with( let old_umask = unsafe { libc::umask(0o77) }; let listener_res = UnixListener::bind(control_socket); unsafe { libc::umask(old_umask) }; - let listener = listener_res?; + let listener = match listener_res { + Ok(listener) => listener, + Err(error) => { + abandon_workers(&core, control_socket, workers); + return Err(error); + } + }; // Owner-only before anything can connect: a peer on this socket commands the // daemon's authenticated session without a credential of its own (B6). if let Err(e) = pdfs_core::config::restrict_socket(control_socket) { error!(error = %e, "cannot restrict control socket permissions; refusing to serve"); - let _ = std::fs::remove_file(control_socket); + abandon_workers(&core, control_socket, workers); return Err(std::io::Error::other(format!( "control socket permissions: {e}" ))); @@ -622,7 +624,7 @@ pub(crate) fn mount_with( let bg = match spawn_session(&core, mountpoint, root) { Ok(session) => session, Err(error) => { - let _ = std::fs::remove_file(control_socket); + abandon_workers(&core, control_socket, workers); return Err(error); } }; @@ -642,7 +644,7 @@ pub(crate) fn mount_with( Err(error) => { // A failure here abandons the mount, so the background threads // started above have to be told to stop with it. - stop_workers(&core, control_socket, workers); + abandon_workers(&core, control_socket, workers); let secondaries = core.mounts.lock().close_and_drain(); for (id, mount) in secondaries { if let Err(unmount_error) = mount.teardown() { @@ -692,8 +694,12 @@ pub(crate) fn mount_with( } } // The mount is live and the control socket answers: this is the moment the - // unit is actually usable, which is what `Type=notify` reports. + // unit is actually usable, which is what `Type=notify` reports. Whatever + // failure an earlier attempt recorded for the front ends is over. systemd::ready(); + if let Some(state_dir) = control_socket.parent() { + pdfs_core::mountfail::clear(state_dir); + } // Re-establish on-demand mounts only after the primary session is live. // Keep the worker so shutdown can close publication, wait for any in-flight @@ -859,6 +865,43 @@ fn stop_workers(core: &Core, control_socket: &Path, workers: Vec>) { + halt_workers(core, control_socket, workers); +} + +/// Keep a worker the mount just spawned, or, if the spawn failed, stop the +/// ones already running and hand the error back. +fn keep_or_abandon( + core: &Core, + control_socket: &Path, + workers: &mut Vec>, + spawned: std::io::Result>, +) -> std::io::Result<()> { + match spawned { + Ok(handle) => { + workers.push(handle); + Ok(()) + } + Err(error) => { + abandon_workers(core, control_socket, std::mem::take(workers)); + Err(error) + } + } +} + +/// Signal every worker to stop, then join them up to [`WORKER_JOIN_DEADLINE`]. +fn halt_workers(core: &Core, control_socket: &Path, workers: Vec>) { core.shutdown.stop(); core.wake_drain(); let _ = core.sync_tx.send(sync::SyncMsg::Stop); diff --git a/crates/pdfs-fuse/src/systemd.rs b/crates/pdfs-fuse/src/systemd.rs index 22683bc..f54091e 100644 --- a/crates/pdfs-fuse/src/systemd.rs +++ b/crates/pdfs-fuse/src/systemd.rs @@ -64,11 +64,19 @@ fn send_abstract(socket: &UnixDatagram, name: &str, message: &str) -> bool { /// so `systemctl --user start` returns when the mount actually works rather than /// when the process exists. pub(crate) fn ready() { - if notify("READY=1\n") { + if notify("READY=1\nSTATUS=Mounted\n") { debug!("notified systemd: ready"); } } +/// Set the one-line status `systemctl --user status` shows for the unit, such +/// as why the mount keeps failing (`docs/BUGS.md` B263). +pub fn status(text: &str) { + // A newline would end the `STATUS=` line and start another variable. + let line = text.replace('\n', " "); + notify(&format!("STATUS={line}\n")); +} + /// Tell the manager the daemon is still healthy. pub(crate) fn watchdog_ping() { let _ = notify("WATCHDOG=1\n"); diff --git a/crates/pdfs-gui/src/app/main.rs b/crates/pdfs-gui/src/app/main.rs index 5db14d0..a30fa50 100644 --- a/crates/pdfs-gui/src/app/main.rs +++ b/crates/pdfs-gui/src/app/main.rs @@ -1797,13 +1797,35 @@ pub(crate) fn service_unreachable( ); return; } - status( - &ui, - "network-idle-symbolic", - &gettext("Connecting…"), - &gettext("Waiting for the Proton Drive service to start."), - false, - ); + // Running but not answering may be a mount that fails on every try, + // which never opens the socket. Its reason is in a file the daemon + // keeps for this (B263); "Connecting…" alone looked like a slow start + // for as long as it lasted. + let state_dir = ui.dirs.state_dir(); + let failure = gio::spawn_blocking(move || pdfs_core::mountfail::read(&state_dir)) + .await + .ok() + .flatten(); + match failure { + Some(failure) => status( + &ui, + "dialog-warning-symbolic", + &gettext("Can't open your Drive"), + // Translators: {error} is an error message, in English. + &gettext_f( + "The Proton Drive service keeps failing to start and tries again on its own. The last error was: {error}", + &[("error", &failure.error)], + ), + true, + ), + None => status( + &ui, + "network-idle-symbolic", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive service to start."), + false, + ), + } glib::timeout_add_local_once(CONNECT_RETRY_INTERVAL, move || { if ui.stack.visible_child_name().as_deref() == Some(page) { reload(&ui); diff --git a/crates/pdfs-gui/src/main.rs b/crates/pdfs-gui/src/main.rs index 083466e..8471f79 100644 --- a/crates/pdfs-gui/src/main.rs +++ b/crates/pdfs-gui/src/main.rs @@ -194,6 +194,24 @@ fn poll_state(socket: &Path, default_mountpoint: &Path) -> DriveState { ), Phase::Attention, ), + // A daemon whose mount fails on every try never opens the + // socket; the app says why (B263). + Ok(s) + if socket + .parent() + .and_then(pdfs_core::mountfail::read) + .is_some() => + { + ( + // Translators: {username} is the Proton account name. The + // service keeps failing to start; the app shows the error. + gettext_f( + "Signed in as {username} — can't open your Drive", + &[("username", &s.username)], + ), + Phase::Attention, + ) + } Ok(s) => ( // Translators: {username} is the Proton account name. gettext_f( diff --git a/docs/BUGS.md b/docs/BUGS.md index 319b4ca..63536a2 100644 --- a/docs/BUGS.md +++ b/docs/BUGS.md @@ -77,8 +77,6 @@ original wording. | [B267](#b267--a-key-failure-at-a-start-from-a-warm-cache-shows-as-offline-for-good) | A key failure at a start from a warm cache shows as offline for good | Not fixed | | [B266](#b266--pin-unpin-search-and-node-loads-report-a-database-error-as-offline) | Pin, unpin, search and node loads report a database error as "offline" | Not fixed | | [B265](#b265--address-keys-whose-token-is-for-an-inactive-account-key-never-open) | Address keys whose token is for an inactive account key never open | Needs an SDK change; not reproduced | -| [B264](#b264--a-mount-that-fails-after-starting-its-workers-leaves-them-running) | A mount that fails after starting its workers leaves them running | Not fixed | -| [B263](#b263--a-mount-that-can-never-succeed-retries-every-5-s-and-tells-only-the-journal) | A mount that can never succeed retries every 5 s and tells only the journal | Not fixed | | [B262](#b262--watching-a-large-synced-folder-holds-up-the-sync-engine-and-a-failed-watch-is-never-retried) | Watching a large synced folder holds up the sync engine, and a failed watch is never retried | Not fixed | | [B261](#b261--a-folder-that-has-never-synced-reads-up-to-date) | A folder that has never synced reads "up to date" | Not fixed | | [B260](#b260--the-poll-pushes-a-new-folders-first-sync-behind-every-other-folder) | The poll pushes a new folder's first sync behind every other folder | Not fixed | @@ -96,6 +94,7 @@ original wording. | Entry | Title | What is left | |---|---|---| +| [B263](#b263--a-mount-that-can-never-succeed-retries-every-5-s-and-tells-only-the-journal) | A mount that can never succeed retries every 5 s and tells only the journal | Errors no retry fixes back off like network errors | | [B199](#b199--a-stopped-share-stays-on-the-shared-by-me-page-for-minutes) | A stopped share stays on the Shared by me page for minutes | The share itself is not deleted; the SDK has no call for it | | [B88](#b88--pdfs-pin-rename-move-delete-and-sharing-still-cannot-name-a-path-under-a-secondary-mount) | `pdfs pin`, `rename`, `move`, `delete` and sharing still cannot name a path under a secondary mount | `pin`, `unpin`, opening a file, thumbnails, uploads, sharing and versions | | [B72](#b72--pdfs-trash-never-returns) | `pdfs trash` never returns | The slowness of the first refresh is unmeasured | @@ -116,6 +115,7 @@ a live account since. | Entry | Title | |---|---| +| [B264](#b264--a-mount-that-fails-after-starting-its-workers-leaves-them-running) | A mount that fails after starting its workers leaves them running | | [B256](#b256--pdfs-copy-right-after-a-save-copies-the-old-version) | `pdfs copy` right after a save copies the old version | | [B255](#b255--a-synced-folder-whose-files-are-all-gone-here-is-stuck-for-good) | A synced folder whose files are all gone here is stuck for good | | [B254](#b254--an-edit-in-the-same-second-as-a-new-upload-never-arrives) | An edit in the same second as a new upload never arrives | @@ -567,7 +567,7 @@ tokens, and only the active ones for signing. Skip and log an address that canno ### B264 — A mount that fails after starting its workers leaves them running -**Status:** Open +**Status:** Fixed, not verified live **Found:** 2026-10-31, code audit after issue #40. **Where:** `run_mount` in `crates/pdfs-fuse/src/mount.rs` @@ -581,14 +581,20 @@ permission check, a `spawn_session` error, and a `?` on a later thread spawn) sk the `flock` held, every later attempt fails with "another daemon is using cache.db" instead of the real error. That part is inferred from the code and not observed. -**Fix.** Not done. Bind the socket and check the mountpoint before any worker starts, and stop -the workers on every error path. +**Fix.** Every early return in `mount` after the first worker starts stops the workers +(`abandon_workers`, `keep_or_abandon` in `crates/pdfs-fuse/src/mount.rs`). Unlike a normal stop +it does not send `STOPPING=1`, because the daemon is about to retry and systemd would +otherwise wait for it to exit and then kill it. The control-thread failure path, which already +stopped its workers, no longer sends it either. + +**Test:** none of its own; the simulations (`sim::daemon`, 55 passed) cover the normal start +and stop. --- ### B263 — A mount that can never succeed retries every 5 s and tells only the journal -**Status:** Open +**Status:** Partly fixed. Errors that no retry fixes are not told apart from network errors yet. **Found:** 2026-10-31, issue #40: the app showed "Connecting… waiting for the Proton Drive service" for days, `pdfs diagnose` only reported the control socket missing, and the reporter uninstalled. @@ -605,9 +611,23 @@ four requests, so a broken account sends tens of thousands a day, which may also Proton's sign-in blocks (#39). The control socket is bound only after the mount succeeds, and the error is written nowhere a front end can read it. -**Fix.** Not done. Back off exponentially, treat key, `KeysLocked` and 4xx errors as permanent -with a long back-off, and write the last error where the app, the tray and `diagnose` can -show it (a state file, and `STATUS=` to systemd). +**Fix.** +- The retry doubles from 5 s to a 2-minute ceiling (`mount_retry_delay` in + `crates/pdfs-cli/src/main.rs`), about 720 attempts a day instead of 17,000. The ceiling stays + at minutes because a cold start without a network fails the same way and has to mount soon + after the network returns. +- Each failure is written to `mount-failure.json` in the state directory + (`crates/pdfs-core/src/mountfail.rs`), with the error, since when it fails and the attempt + count. A mount that comes up removes it, and so does a new daemon. +- The app shows "Can't open your Drive" with the error and a Retry button instead of + "Connecting…". The tray says "Signed in as … — can't open your Drive". `pdfs diagnose` reports + `[FAIL] mount: failing for …`. `systemctl --user status` shows the error as the unit's status. +- Not done: key, `KeysLocked` and 4xx errors still retry like network errors, only less often. + +**Test:** `a_failing_mount_backs_off_to_a_ceiling` in `pdfs-cli`; +`a_recorded_failure_reads_back_until_cleared` in `pdfs-core`. On 2026-10-31 a second +`pdfs daemon` beside the running one failed on the database lock three times in 18 s (at 0, 5 +and 15 s) and recorded `attempts: 3` with the lock error. --- diff --git a/po/de.po b/po/de.po index 7ac1044..5f4b380 100644 --- a/po/de.po +++ b/po/de.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: German\n" @@ -424,14 +424,25 @@ msgstr "Nicht verbunden" msgid "The Proton Drive service isn't running." msgstr "Der Proton-Drive-Dienst läuft nicht." -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "Proton Drive kann nicht geöffnet werden" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "Der Proton-Drive-Dienst kann wiederholt nicht starten und versucht es selbstständig erneut. Letzter Fehler: {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Verbindung wird hergestellt …" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "Warten auf den Start des Proton-Drive-Dienstes." @@ -2908,7 +2919,7 @@ msgid "Sync paused until you resume" msgstr "Synchronisierung bis zur Fortsetzung pausiert" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Synchronisierung pausiert" @@ -5136,7 +5147,7 @@ msgstr "Wird {time} fortgesetzt" msgid "Until you resume" msgstr "Bis zur manuellen Fortsetzung" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6371,52 +6382,57 @@ msgstr "Proton Drive reagiert nicht" msgid "Signed in as {username} — locked" msgstr "Angemeldet als {username} – gesperrt" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Angemeldet als {username} – Proton Drive kann nicht geöffnet werden" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Angemeldet als {username} – nicht verbunden" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Nicht angemeldet" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Fehler: {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "Proton Drive hat unerwartet geantwortet" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Sitzung abgelaufen – erneut anmelden" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Anmeldung nicht gespeichert – Schlüsselbund entsperren" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Update nicht abgeschlossen – Proton Drive neu starten" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, rust-format msgid "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgstr[0] "Aktuell in {mountpoint} ({n} angeheftet)" msgstr[1] "Aktuell in {mountpoint} ({n} angeheftet)" -#: crates/pdfs-gui/src/main.rs:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" msgstr[0] "Wird synchronisiert – {queued} ({n} angeheftet)" msgstr[1] "Wird synchronisiert – {queued} ({n} angeheftet)" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6424,60 +6440,60 @@ msgstr[0] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)" msgstr[1] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "Offline – {queued}" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" msgstr[0] "{n} Problem – Anzeigen" msgstr[1] "{n} Probleme – Anzeigen" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Anmelden …" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Erneut anmelden …" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Proton Drive öffnen" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Proton Drive neu starten" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Ordner öffnen" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Synchronisierung fortsetzen" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Synchronisierung pausieren" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Verbinden" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Symbol im Benachrichtigungsfeld ausblenden" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Proton Drive beenden …" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Beenden" diff --git a/po/en_GB.po b/po/en_GB.po index 5a2e3c1..33a2a9c 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: English (United Kingdom)\n" @@ -420,14 +420,25 @@ msgstr "Not connected" msgid "The Proton Drive service isn't running." msgstr "The Proton Drive service isn't running." -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "Can't open your Drive" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "The Proton Drive service keeps failing to start and tries again on its own. The last error was: {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Connecting…" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "Waiting for the Proton Drive service to start." @@ -2869,7 +2880,7 @@ msgid "Sync paused until you resume" msgstr "Sync paused until you resume" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Sync paused" @@ -5035,7 +5046,7 @@ msgstr "Resumes {time}" msgid "Until you resume" msgstr "Until you resume" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6246,52 +6257,57 @@ msgstr "Proton Drive isn't responding" msgid "Signed in as {username} — locked" msgstr "Signed in as {username} — locked" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Signed in as {username} — can't open your Drive" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Signed in as {username} — not connected" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Not signed in" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Error: {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "Proton Drive sent an unexpected reply" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Session expired — sign in again" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Sign-in not saved — unlock your keyring" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Update not finished — restart Proton Drive" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, rust-format msgid "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgstr[0] "Up to date in {mountpoint} ({n} pinned)" msgstr[1] "Up to date in {mountpoint} ({n} pinned)" -#: crates/pdfs-gui/src/main.rs:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" msgstr[0] "Syncing — {queued} ({n} pinned)" msgstr[1] "Syncing — {queued} ({n} pinned)" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6299,60 +6315,60 @@ msgstr[0] "Offline — cached files only ({n} pinned)" msgstr[1] "Offline — cached files only ({n} pinned)" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "Offline — {queued}" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" msgstr[0] "{n} issue — View" msgstr[1] "{n} issues — View" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Sign In…" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Sign In Again…" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Open Proton Drive" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Restart Proton Drive" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Open Folder" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Resume Sync" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Pause Sync" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Connect" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Hide Tray Icon" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Stop Proton Drive…" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Quit" diff --git a/po/es.po b/po/es.po index 9ecbbaf..25156aa 100644 --- a/po/es.po +++ b/po/es.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Spanish\n" @@ -422,14 +422,25 @@ msgstr "Sin conexión" msgid "The Proton Drive service isn't running." msgstr "El servicio de Proton Drive no está en ejecución." -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "No se puede abrir Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "El servicio de Proton Drive no consigue iniciarse y vuelve a intentarlo por sí solo. Último error: {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Conectando…" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "Esperando a que se inicie el servicio de Proton Drive." @@ -2891,7 +2902,7 @@ msgid "Sync paused until you resume" msgstr "Sincronización en pausa hasta que la reanude" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Sincronización en pausa" @@ -5095,7 +5106,7 @@ msgstr "Se reanuda {time}" msgid "Until you resume" msgstr "Hasta que la reanude" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6327,52 +6338,57 @@ msgstr "Proton Drive no responde" msgid "Signed in as {username} — locked" msgstr "Sesión iniciada como {username} — bloqueado" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Sesión iniciada como {username} — no se puede abrir Proton Drive" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Sesión iniciada como {username} — sin conexión" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Sesión no iniciada" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Error: {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "Proton Drive envió una respuesta inesperada" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Sesión caducada: vuelva a iniciar sesión" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Inicio de sesión no guardado: desbloquee el depósito de claves" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Actualización sin terminar: reinicie Proton Drive" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, rust-format msgid "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgstr[0] "Actualizado en {mountpoint} ({n} fijado)" msgstr[1] "Actualizado en {mountpoint} ({n} fijados)" -#: crates/pdfs-gui/src/main.rs:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" msgstr[0] "Sincronizando: {queued} ({n} anclado)" msgstr[1] "Sincronizando: {queued} ({n} anclados)" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6380,60 +6396,60 @@ msgstr[0] "Sin conexión: solo archivos en caché ({n} anclado)" msgstr[1] "Sin conexión: solo archivos en caché ({n} anclados)" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "Sin conexión: {queued}" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" msgstr[0] "{n} problema: ver" msgstr[1] "{n} problemas: ver" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Iniciar sesión…" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Volver a iniciar sesión…" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Abrir Proton Drive" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Reiniciar Proton Drive" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Abrir carpeta" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Reanudar la sincronización" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Pausar la sincronización" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Conectar" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Ocultar el icono de la bandeja" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Detener Proton Drive…" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Salir" diff --git a/po/fr.po b/po/fr.po index 8a20308..80269d4 100644 --- a/po/fr.po +++ b/po/fr.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: French\n" @@ -424,14 +424,25 @@ msgstr "Non connecté" 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:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "Impossible d’ouvrir Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "Le service Proton Drive n’arrive pas à démarrer et réessaie de lui-même. Dernière erreur : {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Connexion…" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "En attente du démarrage du service Proton Drive." @@ -2908,7 +2919,7 @@ msgid "Sync paused until you resume" msgstr "Synchronisation en pause jusqu’à la reprise" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Synchronisation en pause" @@ -5138,7 +5149,7 @@ msgstr "Reprise {time}" msgid "Until you resume" msgstr "Jusqu’à la reprise" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6375,52 +6386,57 @@ msgstr "Proton Drive ne répond pas" msgid "Signed in as {username} — locked" msgstr "Connecté en tant que {username} — verrouillé" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Connecté en tant que {username} — impossible d’ouvrir Proton Drive" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Connecté en tant que {username} — non connecté" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Non connecté" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Erreur : {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "Proton Drive a envoyé une réponse inattendue" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Session expirée — reconnectez-vous" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Connexion non enregistrée — déverrouillez votre trousseau" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Mise à jour inachevée — redémarrez Proton Drive" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, 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:306 +#: crates/pdfs-gui/src/main.rs:324 #, 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:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6428,60 +6444,60 @@ 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:319 +#: crates/pdfs-gui/src/main.rs:337 #, 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:358 +#: crates/pdfs-gui/src/main.rs:376 #, 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:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Se connecter…" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Se reconnecter…" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Ouvrir Proton Drive" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Redémarrer Proton Drive" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Ouvrir le dossier" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Reprendre la synchronisation" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Mettre en pause la synchronisation" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Connecter" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Masquer l’icône de la zone de notification" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Arrêter Proton Drive…" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Quitter" diff --git a/po/it.po b/po/it.po index c035843..8487641 100644 --- a/po/it.po +++ b/po/it.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Italian\n" @@ -420,14 +420,25 @@ msgstr "Non connesso" msgid "The Proton Drive service isn't running." msgstr "Il servizio di Proton Drive non è in esecuzione." -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "Impossibile aprire Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "Il servizio di Proton Drive non riesce ad avviarsi e riprova da solo. Ultimo errore: {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Connessione…" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "In attesa dell’avvio del servizio di Proton Drive." @@ -2906,7 +2917,7 @@ msgid "Sync paused until you resume" msgstr "Sincronizzazione in pausa finché non riprendi" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Sincronizzazione in pausa" @@ -5114,7 +5125,7 @@ msgstr "Riprende {time}" msgid "Until you resume" msgstr "Finché non riprendi" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6351,52 +6362,57 @@ msgstr "Proton Drive non risponde" msgid "Signed in as {username} — locked" msgstr "Accesso effettuato come {username} — bloccato" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Accesso effettuato come {username} — impossibile aprire Proton Drive" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Accesso effettuato come {username} — non connesso" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Accesso non eseguito" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Errore: {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "Proton Drive ha inviato una risposta inattesa" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Sessione scaduta: accedi di nuovo" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Accesso non salvato: sblocca il portachiavi" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Aggiornamento non completato: riavvia Proton Drive" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, rust-format msgid "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgstr[0] "Aggiornato in {mountpoint} ({n} fissato)" msgstr[1] "Aggiornato in {mountpoint} ({n} fissati)" -#: crates/pdfs-gui/src/main.rs:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" msgstr[0] "Sincronizzazione: {queued} ({n} fissato)" msgstr[1] "Sincronizzazione: {queued} ({n} fissati)" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6404,60 +6420,60 @@ msgstr[0] "Offline: solo file in cache ({n} fissato)" msgstr[1] "Offline: solo file in cache ({n} fissati)" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "Offline: {queued}" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" msgstr[0] "{n} problema: visualizza" msgstr[1] "{n} problemi: visualizza" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Accedi…" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Accedi di nuovo…" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Apri Proton Drive" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Riavvia Proton Drive" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Apri cartella" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Riprendi sincronizzazione" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Metti in pausa sincronizzazione" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Connetti" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Nascondi icona nell'area di notifica" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Arresta Proton Drive…" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Esci" diff --git a/po/nl.po b/po/nl.po index 1de0e6f..26a0fbc 100644 --- a/po/nl.po +++ b/po/nl.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Dutch\n" @@ -421,14 +421,25 @@ msgstr "Niet verbonden" msgid "The Proton Drive service isn't running." msgstr "De Proton Drive-service draait niet." -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "Kan Proton Drive niet openen" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "De Proton Drive-service kan steeds niet starten en probeert het zelf opnieuw. Laatste fout: {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Verbinden…" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "Wachten tot de Proton Drive-service is gestart." @@ -2896,7 +2907,7 @@ msgid "Sync paused until you resume" msgstr "Synchronisatie gepauzeerd totdat je hervat" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Synchronisatie gepauzeerd" @@ -5108,7 +5119,7 @@ msgstr "Hervat {time}" msgid "Until you resume" msgstr "Totdat je hervat" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6337,52 +6348,57 @@ msgstr "Proton Drive reageert niet" msgid "Signed in as {username} — locked" msgstr "Aangemeld als {username} — vergrendeld" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Aangemeld als {username} — kan Proton Drive niet openen" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Aangemeld als {username} — niet verbonden" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Niet aangemeld" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Fout: {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "Proton Drive gaf een onverwacht antwoord" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Sessie verlopen — meld je opnieuw aan" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Aanmelding niet opgeslagen — ontgrendel je sleutelbos" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Update niet voltooid — start Proton Drive opnieuw" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, rust-format msgid "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgstr[0] "Bijgewerkt in {mountpoint} ({n} vastgezet)" msgstr[1] "Bijgewerkt in {mountpoint} ({n} vastgezet)" -#: crates/pdfs-gui/src/main.rs:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" msgstr[0] "Synchroniseren — {queued} ({n} vastgezet)" msgstr[1] "Synchroniseren — {queued} ({n} vastgezet)" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6390,60 +6406,60 @@ msgstr[0] "Offline — alleen bestanden in cache ({n} vastgezet)" msgstr[1] "Offline — alleen bestanden in cache ({n} vastgezet)" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "Offline — {queued}" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" msgstr[0] "{n} probleem — Bekijken" msgstr[1] "{n} problemen — Bekijken" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Aanmelden…" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Opnieuw aanmelden…" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Proton Drive openen" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Proton Drive opnieuw starten" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Map openen" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Synchronisatie hervatten" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Synchronisatie pauzeren" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Verbinden" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Pictogram in systeemvak verbergen" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Proton Drive stoppen…" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Afsluiten" diff --git a/po/pdfs.pot b/po/pdfs.pot index 90860e8..dad3a5c 100644 --- a/po/pdfs.pot +++ b/po/pdfs.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: proton-drive-linux 3.6.0\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" -"POT-Creation-Date: 2026-10-26 22:28+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -397,14 +397,25 @@ msgstr "" msgid "The Proton Drive service isn't running." msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "" @@ -2788,7 +2799,7 @@ msgid "Sync paused until you resume" msgstr "" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "" @@ -4883,7 +4894,7 @@ msgstr "" msgid "Until you resume" msgstr "" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6071,52 +6082,57 @@ msgstr "" msgid "Signed in as {username} — locked" msgstr "" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, 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:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6124,60 +6140,60 @@ msgstr[0] "" msgstr[1] "" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "" diff --git a/po/pl.po b/po/pl.po index 8acb1fb..41a7913 100644 --- a/po/pl.po +++ b/po/pl.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Polish\n" @@ -425,14 +425,25 @@ msgstr "Brak połączenia" msgid "The Proton Drive service isn't running." msgstr "Usługa Proton Drive nie jest uruchomiona." -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "Nie można otworzyć Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "Usługa Proton Drive nie może się uruchomić i sama ponawia próby. Ostatni błąd: {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Łączenie…" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "Oczekiwanie na uruchomienie usługi Proton Drive." @@ -2961,7 +2972,7 @@ msgid "Sync paused until you resume" msgstr "Wstrzymano synchronizację do czasu wznowienia" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Wstrzymano synchronizację" @@ -5188,7 +5199,7 @@ msgstr "Wznowienie {time}" msgid "Until you resume" msgstr "Do czasu wznowienia" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6439,38 +6450,43 @@ msgstr "Proton Drive nie odpowiada" msgid "Signed in as {username} — locked" msgstr "Zalogowano jako {username} — zablokowane" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Zalogowano jako {username} — nie można otworzyć Proton Drive" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Zalogowano jako {username} — brak połączenia" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Nie zalogowano" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Błąd: {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "Proton Drive wysłał nieoczekiwaną odpowiedź" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Sesja wygasła — zaloguj się ponownie" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Logowanie nie zostało zapisane — odblokuj bazę kluczy" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Aktualizacja niedokończona — uruchom ponownie Proton Drive" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, rust-format msgid "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)" @@ -6478,7 +6494,7 @@ msgstr[0] "Aktualne w {mountpoint} ({n} przypięty)" msgstr[1] "Aktualne w {mountpoint} ({n} przypięte)" msgstr[2] "Aktualne w {mountpoint} ({n} przypiętych)" -#: crates/pdfs-gui/src/main.rs:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" @@ -6486,7 +6502,7 @@ msgstr[0] "Synchronizowanie — {queued} (przypięte: {n})" msgstr[1] "Synchronizowanie — {queued} (przypięte: {n})" msgstr[2] "Synchronizowanie — {queued} (przypięte: {n})" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6495,13 +6511,13 @@ msgstr[1] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})" msgstr[2] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "Offline — {queued}" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" @@ -6509,47 +6525,47 @@ msgstr[0] "{n} problem — wyświetl" msgstr[1] "{n} problemy — wyświetl" msgstr[2] "{n} problemów — wyświetl" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Zaloguj się…" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Zaloguj się ponownie…" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Otwórz Proton Drive" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Uruchom ponownie Proton Drive" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Otwórz katalog" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Wznów synchronizację" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Wstrzymaj synchronizację" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Połącz" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Ukryj ikonę w obszarze powiadamiania" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Zatrzymaj Proton Drive…" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Zakończ" diff --git a/po/pt_BR.po b/po/pt_BR.po index 56b0d45..3080c77 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -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-26 22:26+0100\n" +"POT-Creation-Date: 2026-10-31 10:37+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Portuguese (Brazil)\n" @@ -420,14 +420,25 @@ msgstr "Não conectado" msgid "The Proton Drive service isn't running." msgstr "O serviço do Proton Drive não está em execução." -#: crates/pdfs-gui/src/app/main.rs:1803 +#: crates/pdfs-gui/src/app/main.rs:1813 +msgid "Can't open your Drive" +msgstr "Não foi possível abrir o Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1816 +#, rust-format +msgid "" +"The Proton Drive service keeps failing to start and tries again on its own. " +"The last error was: {error}" +msgstr "O serviço do Proton Drive não consegue iniciar e tenta de novo sozinho. Último erro: {error}" + +#: crates/pdfs-gui/src/app/main.rs:1824 #: crates/pdfs-gui/src/app/pages/status.rs:355 #: crates/pdfs-gui/src/hud/mod.rs:269 crates/pdfs-gui/src/hud/mod.rs:579 -#: crates/pdfs-gui/src/main.rs:475 crates/pdfs-gui/src/main.rs:517 +#: crates/pdfs-gui/src/main.rs:493 crates/pdfs-gui/src/main.rs:535 msgid "Connecting…" msgstr "Conectando…" -#: crates/pdfs-gui/src/app/main.rs:1804 +#: crates/pdfs-gui/src/app/main.rs:1825 msgid "Waiting for the Proton Drive service to start." msgstr "Aguardando o serviço do Proton Drive iniciar." @@ -2892,7 +2903,7 @@ msgid "Sync paused until you resume" msgstr "Sincronização pausada até você retomar" #: crates/pdfs-gui/src/app/pages/locations.rs:570 -#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:290 +#: crates/pdfs-gui/src/app/pages/status.rs:1445 crates/pdfs-gui/src/main.rs:308 msgid "Sync paused" msgstr "Sincronização pausada" @@ -5093,7 +5104,7 @@ msgstr "Retoma {time}" msgid "Until you resume" msgstr "Até você retomar" -#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:292 +#: crates/pdfs-gui/src/app/pages/status.rs:1464 crates/pdfs-gui/src/main.rs:310 #, rust-format msgid "{n} change needs attention" msgid_plural "{n} changes need attention" @@ -6324,52 +6335,57 @@ msgstr "O Proton Drive não está respondendo" msgid "Signed in as {username} — locked" msgstr "Conectado como {username} — bloqueado" -#: crates/pdfs-gui/src/main.rs:200 +#: crates/pdfs-gui/src/main.rs:209 +#, rust-format +msgid "Signed in as {username} — can't open your Drive" +msgstr "Conectado como {username} — não foi possível abrir o Proton Drive" + +#: crates/pdfs-gui/src/main.rs:218 #, rust-format msgid "Signed in as {username} — not connected" msgstr "Conectado como {username} — sem conexão" -#: crates/pdfs-gui/src/main.rs:205 +#: crates/pdfs-gui/src/main.rs:223 msgid "Not signed in" msgstr "Não conectado" #. Translators: {error} is an error message, in English. -#: crates/pdfs-gui/src/main.rs:208 +#: crates/pdfs-gui/src/main.rs:226 #, rust-format msgid "Error: {error}" msgstr "Erro: {error}" -#: crates/pdfs-gui/src/main.rs:230 +#: crates/pdfs-gui/src/main.rs:248 msgid "Proton Drive sent an unexpected reply" msgstr "O Proton Drive enviou uma resposta inesperada" -#: crates/pdfs-gui/src/main.rs:284 +#: crates/pdfs-gui/src/main.rs:302 msgid "Session expired — sign in again" msgstr "Sessão expirada — entre novamente" -#: crates/pdfs-gui/src/main.rs:286 +#: crates/pdfs-gui/src/main.rs:304 msgid "Sign-in not saved — unlock your keyring" msgstr "Login não salvo — desbloqueie o chaveiro" -#: crates/pdfs-gui/src/main.rs:289 +#: crates/pdfs-gui/src/main.rs:307 msgid "Update not finished — restart Proton Drive" msgstr "Atualização não concluída — reinicie o Proton Drive" -#: crates/pdfs-gui/src/main.rs:299 +#: crates/pdfs-gui/src/main.rs:317 #, rust-format msgid "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgstr[0] "Atualizado em {mountpoint} ({n} fixado)" msgstr[1] "Atualizado em {mountpoint} ({n} fixados)" -#: crates/pdfs-gui/src/main.rs:306 +#: crates/pdfs-gui/src/main.rs:324 #, rust-format msgid "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)" msgstr[0] "Sincronizando — {queued} ({n} fixado)" msgstr[1] "Sincronizando — {queued} ({n} fixados)" -#: crates/pdfs-gui/src/main.rs:313 +#: crates/pdfs-gui/src/main.rs:331 #, rust-format msgid "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)" @@ -6377,60 +6393,60 @@ msgstr[0] "Offline — somente arquivos em cache ({n} fixado)" msgstr[1] "Offline — somente arquivos em cache ({n} fixados)" #. Translators: {queued} is a queue summary such as "3 uploads queued". -#: crates/pdfs-gui/src/main.rs:319 +#: crates/pdfs-gui/src/main.rs:337 #, rust-format msgid "Offline — {queued}" msgstr "Offline — {queued}" #. Translators: a menu item that opens the list of failing changes. -#: crates/pdfs-gui/src/main.rs:358 +#: crates/pdfs-gui/src/main.rs:376 #, rust-format msgid "{n} issue — View" msgid_plural "{n} issues — View" msgstr[0] "{n} problema — Ver" msgstr[1] "{n} problemas — Ver" -#: crates/pdfs-gui/src/main.rs:465 +#: crates/pdfs-gui/src/main.rs:483 msgid "Sign In…" msgstr "Entrar…" -#: crates/pdfs-gui/src/main.rs:466 +#: crates/pdfs-gui/src/main.rs:484 msgid "Sign In Again…" msgstr "Entrar novamente…" -#: crates/pdfs-gui/src/main.rs:469 +#: crates/pdfs-gui/src/main.rs:487 msgid "Open Proton Drive" msgstr "Abrir o Proton Drive" -#: crates/pdfs-gui/src/main.rs:473 +#: crates/pdfs-gui/src/main.rs:491 msgid "Restart Proton Drive" msgstr "Reiniciar o Proton Drive" -#: crates/pdfs-gui/src/main.rs:482 +#: crates/pdfs-gui/src/main.rs:500 msgid "Open Folder" msgstr "Abrir pasta" -#: crates/pdfs-gui/src/main.rs:494 +#: crates/pdfs-gui/src/main.rs:512 msgid "Resume Sync" msgstr "Retomar sincronização" -#: crates/pdfs-gui/src/main.rs:496 +#: crates/pdfs-gui/src/main.rs:514 msgid "Pause Sync" msgstr "Pausar sincronização" -#: crates/pdfs-gui/src/main.rs:515 +#: crates/pdfs-gui/src/main.rs:533 msgid "Connect" msgstr "Conectar" -#: crates/pdfs-gui/src/main.rs:522 +#: crates/pdfs-gui/src/main.rs:540 msgid "Hide Tray Icon" msgstr "Ocultar ícone da bandeja" -#: crates/pdfs-gui/src/main.rs:526 +#: crates/pdfs-gui/src/main.rs:544 msgid "Stop Proton Drive…" msgstr "Parar o Proton Drive…" -#: crates/pdfs-gui/src/main.rs:530 +#: crates/pdfs-gui/src/main.rs:548 msgid "Quit" msgstr "Sair"