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.
This commit is contained in:
nvrl committed 2026-10-31 10:49:01 +01:00
1 parent 9460c93b50
commit e9577f953f
18 files changed
+714 -311

No files matched your search

+76 -4
View File
@@ -2375,12 +2375,21 @@ where
/// an external unmount triggers a remount; errors back off and retry. This is /// an external unmount triggers a remount; errors back off and retry. This is
/// the entry point for the systemd user service. /// the entry point for the systemd user service.
fn cmd_daemon(mountpoint: Option<PathBuf>) -> Result<()> { fn cmd_daemon(mountpoint: Option<PathBuf>) -> 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<pdfs_core::mountfail::MountFailure> = None;
loop { loop {
// Wait until a session is stored. The GUI enables this service on login, // 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. // but the service may also start at boot before the user has logged in.
wait_for_session(auth::ready, pdfs_fuse::idle_sleep)?; 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) => { Ok(pdfs_fuse::MountOutcome::Shutdown) => {
tracing::info!("daemon stopping"); tracing::info!("daemon stopping");
return Ok(()); return Ok(());
@@ -2395,13 +2404,51 @@ fn cmd_daemon(mountpoint: Option<PathBuf>) -> Result<()> {
Err(e) => { Err(e) => {
// `{:#}` so the whole anyhow chain lands in the log — the top // `{:#}` so the whole anyhow chain lands in the log — the top
// context alone ("mount failed") never says *why*. // context alone ("mount failed") never says *why*.
tracing::error!(error = format!("{e:#}"), "mount failed; retrying in 5s"); let error = format!("{e:#}");
pdfs_fuse::idle_sleep(std::time::Duration::from_secs(5)); 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 /// One mount run: resume the session, mount, and block until the mount ends
/// (clean shutdown or external unmount). Returns the [`MountOutcome`] so the /// (clean shutdown or external unmount). Returns the [`MountOutcome`] so the
/// daemon loop can decide whether to exit or remount. /// daemon loop can decide whether to exit or remount.
@@ -3857,7 +3904,23 @@ fn cmd_diagnose() -> Result<()> {
" daemon responding", " daemon responding",
format!("stopped or unreachable: {e:#}"), 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)] #[cfg(test)]
mod login_wait_tests { mod login_wait_tests {
use super::*; 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<u64> = (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; use std::time::Duration;
#[test] #[test]
+1
View File
@@ -15,6 +15,7 @@ pub mod kernelkey;
pub mod keycheck; pub mod keycheck;
pub mod localindex; pub mod localindex;
pub mod menu; pub mod menu;
pub mod mountfail;
pub mod mounts; pub mod mounts;
pub mod opener; pub mod opener;
pub mod places; pub mod places;
+75
View File
@@ -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<MountFailure> {
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);
}
}
+1 -1
View File
@@ -124,7 +124,7 @@ use mount::{
}; };
use reads::{BlockFlight, BlockRing, PREFETCH_BUDGET, Prefetch, ReaderSlot, STREAM_BYPASS_MIN}; use reads::{BlockFlight, BlockRing, PREFETCH_BUDGET, Prefetch, ReaderSlot, STREAM_BYPASS_MIN};
use state::{Entry, Intervals, PendingRevision, State, StateGuard, WriteHandle}; 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 tracing::{debug, error, info, warn};
use transfers::{CountingWriter, JobGuard, OwnedCountingReader, TransferRegistry}; use transfers::{CountingWriter, JobGuard, OwnedCountingReader, TransferRegistry};
use r#virtual::{ use r#virtual::{
+71 -28
View File
@@ -540,12 +540,11 @@ pub(crate) fn mount_with(
// and sweeps all operating on a mount that no longer exists (`docs/BUGS.md` B44). // and sweeps all operating on a mount that no longer exists (`docs/BUGS.md` B44).
let mut workers: Vec<std::thread::JoinHandle<()>> = Vec::new(); let mut workers: Vec<std::thread::JoinHandle<()>> = Vec::new();
for worker in 0..DRAIN_WORKERS { for worker in 0..DRAIN_WORKERS {
let core = core.clone(); let drain_core = core.clone();
workers.push( let spawned = std::thread::Builder::new()
std::thread::Builder::new() .name(format!("pdfs-drain-{worker}"))
.name(format!("pdfs-drain-{worker}")) .spawn(move || drain_core.run_pending_drain(worker == 0));
.spawn(move || 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 // 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"); info!("conflict sweep disabled by configuration");
} else { } else {
info!(mode = ?sweep_mode, "conflict sweep enabled"); info!(mode = ?sweep_mode, "conflict sweep enabled");
let core = core.clone(); let sweep_core = core.clone();
workers.push( let spawned = std::thread::Builder::new()
std::thread::Builder::new() .name("pdfs-conflict-sweep".into())
.name("pdfs-conflict-sweep".into()) .spawn(move || sweep_core.run_conflict_sweep_loop());
.spawn(move || 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 // 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 // the network to come back, and an online one can lose it at any moment and
// must notice it coming back just the same. // must notice it coming back just the same.
{ {
let core = core.clone(); let probe_core = core.clone();
workers.push( let spawned = std::thread::Builder::new()
std::thread::Builder::new() .name("pdfs-online-probe".into())
.name("pdfs-online-probe".into()) .spawn(move || probe_core.run_online_probe());
.spawn(move || 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: // 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 transfers = core.transfers.clone();
let mountpoint = mountpoint.to_path_buf(); let mountpoint = mountpoint.to_path_buf();
let shutdown = core.shutdown.clone(); let shutdown = core.shutdown.clone();
workers.push( let spawned = std::thread::Builder::new()
std::thread::Builder::new() .name("pdfs-localindex".into())
.name("pdfs-localindex".into()) .spawn(move || run_local_index(db, indexing, transfers, mountpoint, shutdown));
.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 // 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 old_umask = unsafe { libc::umask(0o77) };
let listener_res = UnixListener::bind(control_socket); let listener_res = UnixListener::bind(control_socket);
unsafe { libc::umask(old_umask) }; 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 // Owner-only before anything can connect: a peer on this socket commands the
// daemon's authenticated session without a credential of its own (B6). // daemon's authenticated session without a credential of its own (B6).
if let Err(e) = pdfs_core::config::restrict_socket(control_socket) { if let Err(e) = pdfs_core::config::restrict_socket(control_socket) {
error!(error = %e, "cannot restrict control socket permissions; refusing to serve"); 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!( return Err(std::io::Error::other(format!(
"control socket permissions: {e}" "control socket permissions: {e}"
))); )));
@@ -622,7 +624,7 @@ pub(crate) fn mount_with(
let bg = match spawn_session(&core, mountpoint, root) { let bg = match spawn_session(&core, mountpoint, root) {
Ok(session) => session, Ok(session) => session,
Err(error) => { Err(error) => {
let _ = std::fs::remove_file(control_socket); abandon_workers(&core, control_socket, workers);
return Err(error); return Err(error);
} }
}; };
@@ -642,7 +644,7 @@ pub(crate) fn mount_with(
Err(error) => { Err(error) => {
// A failure here abandons the mount, so the background threads // A failure here abandons the mount, so the background threads
// started above have to be told to stop with it. // 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(); let secondaries = core.mounts.lock().close_and_drain();
for (id, mount) in secondaries { for (id, mount) in secondaries {
if let Err(unmount_error) = mount.teardown() { 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 // 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(); 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. // 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 // 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<std::thread::Jo
// Say so before the joins: a teardown that takes a while must not be read as // Say so before the joins: a teardown that takes a while must not be read as
// a missed watchdog ping and turned into a kill. // a missed watchdog ping and turned into a kill.
systemd::stopping(); systemd::stopping();
halt_workers(core, control_socket, workers);
}
/// Stop the threads a mount attempt started before it failed.
///
/// The early returns used to leave them running: every retry started another
/// set beside the last one's, and their `Core` kept the database open, so the
/// next attempt could fail on its lock instead of the real error
/// (`docs/BUGS.md` B264). Unlike [`stop_workers`] this does not tell systemd
/// the daemon is stopping, because it is about to try again, and a manager
/// told so would wait for the process to exit and then kill it.
fn abandon_workers(core: &Core, control_socket: &Path, workers: Vec<std::thread::JoinHandle<()>>) {
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<std::thread::JoinHandle<()>>,
spawned: std::io::Result<std::thread::JoinHandle<()>>,
) -> 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<std::thread::JoinHandle<()>>) {
core.shutdown.stop(); core.shutdown.stop();
core.wake_drain(); core.wake_drain();
let _ = core.sync_tx.send(sync::SyncMsg::Stop); let _ = core.sync_tx.send(sync::SyncMsg::Stop);
+9 -1
View File
@@ -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 /// so `systemctl --user start` returns when the mount actually works rather than
/// when the process exists. /// when the process exists.
pub(crate) fn ready() { pub(crate) fn ready() {
if notify("READY=1\n") { if notify("READY=1\nSTATUS=Mounted\n") {
debug!("notified systemd: ready"); 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. /// Tell the manager the daemon is still healthy.
pub(crate) fn watchdog_ping() { pub(crate) fn watchdog_ping() {
let _ = notify("WATCHDOG=1\n"); let _ = notify("WATCHDOG=1\n");
+29 -7
View File
@@ -1797,13 +1797,35 @@ pub(crate) fn service_unreachable(
); );
return; return;
} }
status( // Running but not answering may be a mount that fails on every try,
&ui, // which never opens the socket. Its reason is in a file the daemon
"network-idle-symbolic", // keeps for this (B263); "Connecting…" alone looked like a slow start
&gettext("Connecting…"), // for as long as it lasted.
&gettext("Waiting for the Proton Drive service to start."), let state_dir = ui.dirs.state_dir();
false, 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 || { glib::timeout_add_local_once(CONNECT_RETRY_INTERVAL, move || {
if ui.stack.visible_child_name().as_deref() == Some(page) { if ui.stack.visible_child_name().as_deref() == Some(page) {
reload(&ui); reload(&ui);
+18
View File
@@ -194,6 +194,24 @@ fn poll_state(socket: &Path, default_mountpoint: &Path) -> DriveState {
), ),
Phase::Attention, 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) => ( Ok(s) => (
// Translators: {username} is the Proton account name. // Translators: {username} is the Proton account name.
gettext_f( gettext_f(
+29 -9
View File
@@ -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 | | [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 | | [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 | | [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 | | [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 | | [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 | | [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 | | 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 | | [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 | | [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 | | [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 | | 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 | | [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 | | [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 | | [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 ### 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. **Found:** 2026-10-31, code audit after issue #40.
**Where:** `run_mount` in `crates/pdfs-fuse/src/mount.rs` **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 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. 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 **Fix.** Every early return in `mount` after the first worker starts stops the workers
the workers on every error path. (`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 ### 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 **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 service" for days, `pdfs diagnose` only reported the control socket missing, and the reporter
uninstalled. 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 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. 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 **Fix.**
with a long back-off, and write the last error where the app, the tray and `diagnose` can - The retry doubles from 5 s to a 2-minute ceiling (`mount_retry_delay` in
show it (a state file, and `STATUS=` to systemd). `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.
--- ---
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: German\n" "Language-Team: German\n"
@@ -424,14 +424,25 @@ msgstr "Nicht verbunden"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Der Proton-Drive-Dienst läuft nicht." 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/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/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…" msgid "Connecting…"
msgstr "Verbindung wird hergestellt …" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "Warten auf den Start des Proton-Drive-Dienstes." 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" msgstr "Synchronisierung bis zur Fortsetzung pausiert"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Synchronisierung pausiert" msgstr "Synchronisierung pausiert"
@@ -5136,7 +5147,7 @@ msgstr "Wird {time} fortgesetzt"
msgid "Until you resume" msgid "Until you resume"
msgstr "Bis zur manuellen Fortsetzung" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6371,52 +6382,57 @@ msgstr "Proton Drive reagiert nicht"
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "Angemeldet als {username} – gesperrt" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Angemeldet als {username} – nicht verbunden" msgstr "Angemeldet als {username} – nicht verbunden"
#: crates/pdfs-gui/src/main.rs:205 #: crates/pdfs-gui/src/main.rs:223
msgid "Not signed in" msgid "Not signed in"
msgstr "Nicht angemeldet" msgstr "Nicht angemeldet"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Fehler: {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" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive hat unerwartet geantwortet" 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" msgid "Session expired — sign in again"
msgstr "Sitzung abgelaufen – erneut anmelden" 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" msgid "Sign-in not saved — unlock your keyring"
msgstr "Anmeldung nicht gespeichert – Schlüsselbund entsperren" 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" msgid "Update not finished — restart Proton Drive"
msgstr "Update nicht abgeschlossen – Proton Drive neu starten" msgstr "Update nicht abgeschlossen – Proton Drive neu starten"
#: crates/pdfs-gui/src/main.rs:299 #: crates/pdfs-gui/src/main.rs:317
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Aktuell in {mountpoint} ({n} angeheftet)" msgstr[0] "Aktuell in {mountpoint} ({n} angeheftet)"
msgstr[1] "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 #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Wird synchronisiert – {queued} ({n} angeheftet)" msgstr[0] "Wird synchronisiert – {queued} ({n} angeheftet)"
msgstr[1] "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 #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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)" msgstr[1] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline – {queued}" msgstr "Offline – {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} Problem – Anzeigen" msgstr[0] "{n} Problem – Anzeigen"
msgstr[1] "{n} Probleme – Anzeigen" msgstr[1] "{n} Probleme – Anzeigen"
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "Anmelden …" msgstr "Anmelden …"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "Erneut anmelden …" msgstr "Erneut anmelden …"
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Proton Drive öffnen" msgstr "Proton Drive öffnen"
#: crates/pdfs-gui/src/main.rs:473 #: crates/pdfs-gui/src/main.rs:491
msgid "Restart Proton Drive" msgid "Restart Proton Drive"
msgstr "Proton Drive neu starten" msgstr "Proton Drive neu starten"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Ordner öffnen" msgstr "Ordner öffnen"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Synchronisierung fortsetzen" msgstr "Synchronisierung fortsetzen"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Synchronisierung pausieren" msgstr "Synchronisierung pausieren"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Verbinden" msgstr "Verbinden"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Symbol im Benachrichtigungsfeld ausblenden" msgstr "Symbol im Benachrichtigungsfeld ausblenden"
#: crates/pdfs-gui/src/main.rs:526 #: crates/pdfs-gui/src/main.rs:544
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Proton Drive beenden …" msgstr "Proton Drive beenden …"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Beenden" msgstr "Beenden"
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: English (United Kingdom)\n" "Language-Team: English (United Kingdom)\n"
@@ -420,14 +420,25 @@ msgstr "Not connected"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "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/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/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…" msgid "Connecting…"
msgstr "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." msgid "Waiting for the Proton Drive service to start."
msgstr "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" msgstr "Sync paused until you resume"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Sync paused" msgstr "Sync paused"
@@ -5035,7 +5046,7 @@ msgstr "Resumes {time}"
msgid "Until you resume" msgid "Until you resume"
msgstr "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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6246,52 +6257,57 @@ msgstr "Proton Drive isn't responding"
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "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" msgid "Not signed in"
msgstr "Not signed in" msgstr "Not signed in"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "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" msgid "Proton Drive sent an unexpected reply"
msgstr "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" msgid "Session expired — sign in again"
msgstr "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" msgid "Sign-in not saved — unlock your keyring"
msgstr "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" msgid "Update not finished — restart Proton Drive"
msgstr "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 #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "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[0] "Up to date in {mountpoint} ({n} pinned)"
msgstr[1] "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 #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Syncing — {queued} ({n} pinned)" msgstr[0] "Syncing — {queued} ({n} pinned)"
msgstr[1] "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 #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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)" msgstr[1] "Offline — cached files only ({n} pinned)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} issue — View" msgstr[0] "{n} issue — View"
msgstr[1] "{n} issues — View" msgstr[1] "{n} issues — View"
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "Sign In…" msgstr "Sign In…"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "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" msgid "Open Proton Drive"
msgstr "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" msgid "Restart Proton Drive"
msgstr "Restart Proton Drive" msgstr "Restart Proton Drive"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Open Folder" msgstr "Open Folder"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Resume Sync" msgstr "Resume Sync"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Pause Sync" msgstr "Pause Sync"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Connect" msgstr "Connect"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "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…" msgid "Stop Proton Drive…"
msgstr "Stop Proton Drive…" msgstr "Stop Proton Drive…"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Quit" msgstr "Quit"
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
@@ -422,14 +422,25 @@ msgstr "Sin conexión"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "El servicio de Proton Drive no está en ejecución." 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/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/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…" msgid "Connecting…"
msgstr "Conectando…" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "Esperando a que se inicie el servicio de Proton Drive." 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" msgstr "Sincronización en pausa hasta que la reanude"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Sincronización en pausa" msgstr "Sincronización en pausa"
@@ -5095,7 +5106,7 @@ msgstr "Se reanuda {time}"
msgid "Until you resume" msgid "Until you resume"
msgstr "Hasta que la reanude" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6327,52 +6338,57 @@ msgstr "Proton Drive no responde"
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "Sesión iniciada como {username} — bloqueado" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Sesión iniciada como {username} — sin conexión" 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" msgid "Not signed in"
msgstr "Sesión no iniciada" msgstr "Sesión no iniciada"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "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" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive envió una respuesta inesperada" 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" msgid "Session expired — sign in again"
msgstr "Sesión caducada: vuelva a iniciar sesión" 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" msgid "Sign-in not saved — unlock your keyring"
msgstr "Inicio de sesión no guardado: desbloquee el depósito de claves" 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" msgid "Update not finished — restart Proton Drive"
msgstr "Actualización sin terminar: reinicie 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 #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Actualizado en {mountpoint} ({n} fijado)" msgstr[0] "Actualizado en {mountpoint} ({n} fijado)"
msgstr[1] "Actualizado en {mountpoint} ({n} fijados)" msgstr[1] "Actualizado en {mountpoint} ({n} fijados)"
#: crates/pdfs-gui/src/main.rs:306 #: crates/pdfs-gui/src/main.rs:324
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Sincronizando: {queued} ({n} anclado)" msgstr[0] "Sincronizando: {queued} ({n} anclado)"
msgstr[1] "Sincronizando: {queued} ({n} anclados)" msgstr[1] "Sincronizando: {queued} ({n} anclados)"
#: crates/pdfs-gui/src/main.rs:313 #: crates/pdfs-gui/src/main.rs:331
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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)" msgstr[1] "Sin conexión: solo archivos en caché ({n} anclados)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Sin conexión: {queued}" msgstr "Sin conexión: {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problema: ver" msgstr[0] "{n} problema: ver"
msgstr[1] "{n} problemas: ver" msgstr[1] "{n} problemas: ver"
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "Iniciar sesión…" msgstr "Iniciar sesión…"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "Volver a iniciar sesión…" msgstr "Volver a iniciar sesión…"
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Abrir Proton Drive" msgstr "Abrir Proton Drive"
#: crates/pdfs-gui/src/main.rs:473 #: crates/pdfs-gui/src/main.rs:491
msgid "Restart Proton Drive" msgid "Restart Proton Drive"
msgstr "Reiniciar Proton Drive" msgstr "Reiniciar Proton Drive"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Abrir carpeta" msgstr "Abrir carpeta"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Reanudar la sincronización" msgstr "Reanudar la sincronización"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Pausar la sincronización" msgstr "Pausar la sincronización"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Ocultar el icono de la bandeja" 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…" msgid "Stop Proton Drive…"
msgstr "Detener Proton Drive…" msgstr "Detener Proton Drive…"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Salir" msgstr "Salir"
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: French\n" "Language-Team: French\n"
@@ -424,14 +424,25 @@ msgstr "Non connecté"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Le service Proton Drive n’est pas en cours d’exécution." 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/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/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…" msgid "Connecting…"
msgstr "Connexion…" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "En attente du démarrage du service Proton Drive." 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" msgstr "Synchronisation en pause jusqu’à la reprise"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Synchronisation en pause" msgstr "Synchronisation en pause"
@@ -5138,7 +5149,7 @@ msgstr "Reprise {time}"
msgid "Until you resume" msgid "Until you resume"
msgstr "Jusqu’à la reprise" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6375,52 +6386,57 @@ msgstr "Proton Drive ne répond pas"
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "Connecté en tant que {username} — verrouillé" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Connecté en tant que {username} — non connecté" 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" msgid "Not signed in"
msgstr "Non connecté" msgstr "Non connecté"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Erreur : {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" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive a envoyé une réponse inattendue" 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" msgid "Session expired — sign in again"
msgstr "Session expirée — reconnectez-vous" 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" msgid "Sign-in not saved — unlock your keyring"
msgstr "Connexion non enregistrée — déverrouillez votre trousseau" 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" msgid "Update not finished — restart Proton Drive"
msgstr "Mise à jour inachevée — redémarrez 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 #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "À jour dans {mountpoint} ({n} épinglé)" msgstr[0] "À jour dans {mountpoint} ({n} épinglé)"
msgstr[1] "À jour dans {mountpoint} ({n} épinglés)" msgstr[1] "À jour dans {mountpoint} ({n} épinglés)"
#: crates/pdfs-gui/src/main.rs:306 #: crates/pdfs-gui/src/main.rs:324
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Synchronisation — {queued} ({n} épinglé)" msgstr[0] "Synchronisation — {queued} ({n} épinglé)"
msgstr[1] "Synchronisation — {queued} ({n} épinglés)" msgstr[1] "Synchronisation — {queued} ({n} épinglés)"
#: crates/pdfs-gui/src/main.rs:313 #: crates/pdfs-gui/src/main.rs:331
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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)" msgstr[1] "Hors ligne — fichiers en cache uniquement ({n} épinglés)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Hors ligne — {queued}" msgstr "Hors ligne — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problème — Afficher" msgstr[0] "{n} problème — Afficher"
msgstr[1] "{n} problèmes — Afficher" msgstr[1] "{n} problèmes — Afficher"
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "Se connecter…" msgstr "Se connecter…"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "Se reconnecter…" msgstr "Se reconnecter…"
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Ouvrir Proton Drive" msgstr "Ouvrir Proton Drive"
#: crates/pdfs-gui/src/main.rs:473 #: crates/pdfs-gui/src/main.rs:491
msgid "Restart Proton Drive" msgid "Restart Proton Drive"
msgstr "Redémarrer Proton Drive" msgstr "Redémarrer Proton Drive"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Ouvrir le dossier" msgstr "Ouvrir le dossier"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Reprendre la synchronisation" msgstr "Reprendre la synchronisation"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Mettre en pause la synchronisation" msgstr "Mettre en pause la synchronisation"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Connecter" msgstr "Connecter"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Masquer l’icône de la zone de notification" 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…" msgid "Stop Proton Drive…"
msgstr "Arrêter Proton Drive…" msgstr "Arrêter Proton Drive…"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Quitter" msgstr "Quitter"
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
@@ -420,14 +420,25 @@ msgstr "Non connesso"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Il servizio di Proton Drive non è in esecuzione." 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/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/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…" msgid "Connecting…"
msgstr "Connessione…" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "In attesa dell’avvio del servizio di Proton Drive." 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" msgstr "Sincronizzazione in pausa finché non riprendi"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Sincronizzazione in pausa" msgstr "Sincronizzazione in pausa"
@@ -5114,7 +5125,7 @@ msgstr "Riprende {time}"
msgid "Until you resume" msgid "Until you resume"
msgstr "Finché non riprendi" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6351,52 +6362,57 @@ msgstr "Proton Drive non risponde"
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "Accesso effettuato come {username} — bloccato" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Accesso effettuato come {username} — non connesso" 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" msgid "Not signed in"
msgstr "Accesso non eseguito" msgstr "Accesso non eseguito"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Errore: {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" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive ha inviato una risposta inattesa" 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" msgid "Session expired — sign in again"
msgstr "Sessione scaduta: accedi di nuovo" 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" msgid "Sign-in not saved — unlock your keyring"
msgstr "Accesso non salvato: sblocca il portachiavi" 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" msgid "Update not finished — restart Proton Drive"
msgstr "Aggiornamento non completato: riavvia 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 #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Aggiornato in {mountpoint} ({n} fissato)" msgstr[0] "Aggiornato in {mountpoint} ({n} fissato)"
msgstr[1] "Aggiornato in {mountpoint} ({n} fissati)" msgstr[1] "Aggiornato in {mountpoint} ({n} fissati)"
#: crates/pdfs-gui/src/main.rs:306 #: crates/pdfs-gui/src/main.rs:324
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Sincronizzazione: {queued} ({n} fissato)" msgstr[0] "Sincronizzazione: {queued} ({n} fissato)"
msgstr[1] "Sincronizzazione: {queued} ({n} fissati)" msgstr[1] "Sincronizzazione: {queued} ({n} fissati)"
#: crates/pdfs-gui/src/main.rs:313 #: crates/pdfs-gui/src/main.rs:331
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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)" msgstr[1] "Offline: solo file in cache ({n} fissati)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline: {queued}" msgstr "Offline: {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problema: visualizza" msgstr[0] "{n} problema: visualizza"
msgstr[1] "{n} problemi: visualizza" msgstr[1] "{n} problemi: visualizza"
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "Accedi…" msgstr "Accedi…"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "Accedi di nuovo…" msgstr "Accedi di nuovo…"
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Apri Proton Drive" msgstr "Apri Proton Drive"
#: crates/pdfs-gui/src/main.rs:473 #: crates/pdfs-gui/src/main.rs:491
msgid "Restart Proton Drive" msgid "Restart Proton Drive"
msgstr "Riavvia Proton Drive" msgstr "Riavvia Proton Drive"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Apri cartella" msgstr "Apri cartella"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Riprendi sincronizzazione" msgstr "Riprendi sincronizzazione"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Metti in pausa sincronizzazione" msgstr "Metti in pausa sincronizzazione"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Connetti" msgstr "Connetti"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Nascondi icona nell'area di notifica" 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…" msgid "Stop Proton Drive…"
msgstr "Arresta Proton Drive…" msgstr "Arresta Proton Drive…"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Esci" msgstr "Esci"
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
@@ -421,14 +421,25 @@ msgstr "Niet verbonden"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "De Proton Drive-service draait niet." 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/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/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…" msgid "Connecting…"
msgstr "Verbinden…" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "Wachten tot de Proton Drive-service is gestart." 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" msgstr "Synchronisatie gepauzeerd totdat je hervat"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Synchronisatie gepauzeerd" msgstr "Synchronisatie gepauzeerd"
@@ -5108,7 +5119,7 @@ msgstr "Hervat {time}"
msgid "Until you resume" msgid "Until you resume"
msgstr "Totdat je hervat" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6337,52 +6348,57 @@ msgstr "Proton Drive reageert niet"
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "Aangemeld als {username} — vergrendeld" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Aangemeld als {username} — niet verbonden" msgstr "Aangemeld als {username} — niet verbonden"
#: crates/pdfs-gui/src/main.rs:205 #: crates/pdfs-gui/src/main.rs:223
msgid "Not signed in" msgid "Not signed in"
msgstr "Niet aangemeld" msgstr "Niet aangemeld"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Fout: {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" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive gaf een onverwacht antwoord" 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" msgid "Session expired — sign in again"
msgstr "Sessie verlopen — meld je opnieuw aan" 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" msgid "Sign-in not saved — unlock your keyring"
msgstr "Aanmelding niet opgeslagen — ontgrendel je sleutelbos" 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" msgid "Update not finished — restart Proton Drive"
msgstr "Update niet voltooid — start Proton Drive opnieuw" msgstr "Update niet voltooid — start Proton Drive opnieuw"
#: crates/pdfs-gui/src/main.rs:299 #: crates/pdfs-gui/src/main.rs:317
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Bijgewerkt in {mountpoint} ({n} vastgezet)" msgstr[0] "Bijgewerkt in {mountpoint} ({n} vastgezet)"
msgstr[1] "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 #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Synchroniseren — {queued} ({n} vastgezet)" msgstr[0] "Synchroniseren — {queued} ({n} vastgezet)"
msgstr[1] "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 #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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)" msgstr[1] "Offline — alleen bestanden in cache ({n} vastgezet)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} probleem — Bekijken" msgstr[0] "{n} probleem — Bekijken"
msgstr[1] "{n} problemen — Bekijken" msgstr[1] "{n} problemen — Bekijken"
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "Aanmelden…" msgstr "Aanmelden…"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "Opnieuw aanmelden…" msgstr "Opnieuw aanmelden…"
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Proton Drive openen" msgstr "Proton Drive openen"
#: crates/pdfs-gui/src/main.rs:473 #: crates/pdfs-gui/src/main.rs:491
msgid "Restart Proton Drive" msgid "Restart Proton Drive"
msgstr "Proton Drive opnieuw starten" msgstr "Proton Drive opnieuw starten"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Map openen" msgstr "Map openen"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Synchronisatie hervatten" msgstr "Synchronisatie hervatten"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Synchronisatie pauzeren" msgstr "Synchronisatie pauzeren"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Verbinden" msgstr "Verbinden"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Pictogram in systeemvak verbergen" msgstr "Pictogram in systeemvak verbergen"
#: crates/pdfs-gui/src/main.rs:526 #: crates/pdfs-gui/src/main.rs:544
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Proton Drive stoppen…" msgstr "Proton Drive stoppen…"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Afsluiten" msgstr "Afsluiten"
+45 -29
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 3.6.0\n" "Project-Id-Version: proton-drive-linux 3.6.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -397,14 +397,25 @@ msgstr ""
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "" 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/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/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…" msgid "Connecting…"
msgstr "" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "" msgstr ""
@@ -2788,7 +2799,7 @@ msgid "Sync paused until you resume"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "" msgstr ""
@@ -4883,7 +4894,7 @@ msgstr ""
msgid "Until you resume" msgid "Until you resume"
msgstr "" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6071,52 +6082,57 @@ msgstr ""
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:205 #: crates/pdfs-gui/src/main.rs:223
msgid "Not signed in" msgid "Not signed in"
msgstr "" msgstr ""
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:230 #: crates/pdfs-gui/src/main.rs:248
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:284 #: crates/pdfs-gui/src/main.rs:302
msgid "Session expired — sign in again" msgid "Session expired — sign in again"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:286 #: crates/pdfs-gui/src/main.rs:304
msgid "Sign-in not saved — unlock your keyring" msgid "Sign-in not saved — unlock your keyring"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:289 #: crates/pdfs-gui/src/main.rs:307
msgid "Update not finished — restart Proton Drive" msgid "Update not finished — restart Proton Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:299 #: crates/pdfs-gui/src/main.rs:317
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/main.rs:306 #: crates/pdfs-gui/src/main.rs:324
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/main.rs:313 #: crates/pdfs-gui/src/main.rs:331
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -6124,60 +6140,60 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "" msgstr ""
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:473 #: crates/pdfs-gui/src/main.rs:491
msgid "Restart Proton Drive" msgid "Restart Proton Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:526 #: crates/pdfs-gui/src/main.rs:544
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "" msgstr ""
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Polish\n" "Language-Team: Polish\n"
@@ -425,14 +425,25 @@ msgstr "Brak połączenia"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Usługa Proton Drive nie jest uruchomiona." 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/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/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…" msgid "Connecting…"
msgstr "Łączenie…" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "Oczekiwanie na uruchomienie usługi Proton Drive." msgstr "Oczekiwanie na uruchomienie usługi Proton Drive."
@@ -2961,7 +2972,7 @@ msgid "Sync paused until you resume"
msgstr "Wstrzymano synchronizację do czasu wznowienia" msgstr "Wstrzymano synchronizację do czasu wznowienia"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Wstrzymano synchronizację" msgstr "Wstrzymano synchronizację"
@@ -5188,7 +5199,7 @@ msgstr "Wznowienie {time}"
msgid "Until you resume" msgid "Until you resume"
msgstr "Do czasu wznowienia" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -6439,38 +6450,43 @@ msgstr "Proton Drive nie odpowiada"
msgid "Signed in as {username} — locked" msgid "Signed in as {username} — locked"
msgstr "Zalogowano jako {username} — zablokowane" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Zalogowano jako {username} — brak połączenia" 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" msgid "Not signed in"
msgstr "Nie zalogowano" msgstr "Nie zalogowano"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Błąd: {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" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive wysłał nieoczekiwaną odpowiedź" 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" msgid "Session expired — sign in again"
msgstr "Sesja wygasła — zaloguj się ponownie" 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" msgid "Sign-in not saved — unlock your keyring"
msgstr "Logowanie nie zostało zapisane — odblokuj bazę kluczy" 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" msgid "Update not finished — restart Proton Drive"
msgstr "Aktualizacja niedokończona — uruchom ponownie 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 #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "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[1] "Aktualne w {mountpoint} ({n} przypięte)"
msgstr[2] "Aktualne w {mountpoint} ({n} przypiętych)" msgstr[2] "Aktualne w {mountpoint} ({n} przypiętych)"
#: crates/pdfs-gui/src/main.rs:306 #: crates/pdfs-gui/src/main.rs:324
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "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[1] "Synchronizowanie — {queued} (przypięte: {n})"
msgstr[2] "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 #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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})" msgstr[2] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
@@ -6509,47 +6525,47 @@ msgstr[0] "{n} problem — wyświetl"
msgstr[1] "{n} problemy — wyświetl" msgstr[1] "{n} problemy — wyświetl"
msgstr[2] "{n} problemów — 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…" msgid "Sign In…"
msgstr "Zaloguj się…" msgstr "Zaloguj się…"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "Zaloguj się ponownie…" msgstr "Zaloguj się ponownie…"
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Otwórz 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" msgid "Restart Proton Drive"
msgstr "Uruchom ponownie Proton Drive" msgstr "Uruchom ponownie Proton Drive"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Otwórz katalog" msgstr "Otwórz katalog"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Wznów synchronizację" msgstr "Wznów synchronizację"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Wstrzymaj synchronizację" msgstr "Wstrzymaj synchronizację"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Połącz" msgstr "Połącz"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Ukryj ikonę w obszarze powiadamiania" msgstr "Ukryj ikonę w obszarze powiadamiania"
#: crates/pdfs-gui/src/main.rs:526 #: crates/pdfs-gui/src/main.rs:544
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Zatrzymaj Proton Drive…" msgstr "Zatrzymaj Proton Drive…"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Zakończ" msgstr "Zakończ"
+45 -29
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Portuguese (Brazil)\n" "Language-Team: Portuguese (Brazil)\n"
@@ -420,14 +420,25 @@ msgstr "Não conectado"
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "O serviço do Proton Drive não está em execução." 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/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/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…" msgid "Connecting…"
msgstr "Conectando…" 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." msgid "Waiting for the Proton Drive service to start."
msgstr "Aguardando o serviço do Proton Drive iniciar." 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" msgstr "Sincronização pausada até você retomar"
#: crates/pdfs-gui/src/app/pages/locations.rs:570 #: 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" msgid "Sync paused"
msgstr "Sincronização pausada" msgstr "Sincronização pausada"
@@ -5093,7 +5104,7 @@ msgstr "Retoma {time}"
msgid "Until you resume" msgid "Until you resume"
msgstr "Até você retomar" 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 #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need 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" msgid "Signed in as {username} — locked"
msgstr "Conectado como {username} — bloqueado" 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 #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Conectado como {username} — sem conexão" 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" msgid "Not signed in"
msgstr "Não conectado" msgstr "Não conectado"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:208 #: crates/pdfs-gui/src/main.rs:226
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Erro: {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" msgid "Proton Drive sent an unexpected reply"
msgstr "O Proton Drive enviou uma resposta inesperada" 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" msgid "Session expired — sign in again"
msgstr "Sessão expirada — entre novamente" 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" msgid "Sign-in not saved — unlock your keyring"
msgstr "Login não salvo — desbloqueie o chaveiro" 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" msgid "Update not finished — restart Proton Drive"
msgstr "Atualização não concluída — reinicie o 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 #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Atualizado em {mountpoint} ({n} fixado)" msgstr[0] "Atualizado em {mountpoint} ({n} fixado)"
msgstr[1] "Atualizado em {mountpoint} ({n} fixados)" msgstr[1] "Atualizado em {mountpoint} ({n} fixados)"
#: crates/pdfs-gui/src/main.rs:306 #: crates/pdfs-gui/src/main.rs:324
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Sincronizando — {queued} ({n} fixado)" msgstr[0] "Sincronizando — {queued} ({n} fixado)"
msgstr[1] "Sincronizando — {queued} ({n} fixados)" msgstr[1] "Sincronizando — {queued} ({n} fixados)"
#: crates/pdfs-gui/src/main.rs:313 #: crates/pdfs-gui/src/main.rs:331
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "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)" msgstr[1] "Offline — somente arquivos em cache ({n} fixados)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. 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 #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. 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 #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problema — Ver" msgstr[0] "{n} problema — Ver"
msgstr[1] "{n} problemas — Ver" msgstr[1] "{n} problemas — Ver"
#: crates/pdfs-gui/src/main.rs:465 #: crates/pdfs-gui/src/main.rs:483
msgid "Sign In…" msgid "Sign In…"
msgstr "Entrar…" msgstr "Entrar…"
#: crates/pdfs-gui/src/main.rs:466 #: crates/pdfs-gui/src/main.rs:484
msgid "Sign In Again…" msgid "Sign In Again…"
msgstr "Entrar novamente…" msgstr "Entrar novamente…"
#: crates/pdfs-gui/src/main.rs:469 #: crates/pdfs-gui/src/main.rs:487
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Abrir o 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" msgid "Restart Proton Drive"
msgstr "Reiniciar o Proton Drive" msgstr "Reiniciar o Proton Drive"
#: crates/pdfs-gui/src/main.rs:482 #: crates/pdfs-gui/src/main.rs:500
msgid "Open Folder" msgid "Open Folder"
msgstr "Abrir pasta" msgstr "Abrir pasta"
#: crates/pdfs-gui/src/main.rs:494 #: crates/pdfs-gui/src/main.rs:512
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Retomar sincronização" msgstr "Retomar sincronização"
#: crates/pdfs-gui/src/main.rs:496 #: crates/pdfs-gui/src/main.rs:514
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Pausar sincronização" msgstr "Pausar sincronização"
#: crates/pdfs-gui/src/main.rs:515 #: crates/pdfs-gui/src/main.rs:533
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
#: crates/pdfs-gui/src/main.rs:522 #: crates/pdfs-gui/src/main.rs:540
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Ocultar ícone da bandeja" msgstr "Ocultar ícone da bandeja"
#: crates/pdfs-gui/src/main.rs:526 #: crates/pdfs-gui/src/main.rs:544
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Parar o Proton Drive…" msgstr "Parar o Proton Drive…"
#: crates/pdfs-gui/src/main.rs:530 #: crates/pdfs-gui/src/main.rs:548
msgid "Quit" msgid "Quit"
msgstr "Sair" msgstr "Sair"