Compare commits

...
Author SHA1 Message Date
nvrl 07d4ee42d9 Merge branch 'main' into fix/sync-unreadable-subfolder 2026-10-08 20:59:21 +02:00
nvrl 0ac5e2e4fe Merge pull request #31 from narrrl/feature/windows-migration
Feature/windows migration
2026-10-08 20:57:31 +02:00
nvrl 7eb6aa0640 fix(fuse): skip unreadable folders in sync, never evict local-only files
An unreadable subfolder, such as a container's root-owned cache, failed
every pass of its synced folder, so nothing else in the tree reached
Drive (#33, B196). The scan now leaves such a path out, together with an
entry that vanished mid-scan and a name that is not UTF-8, and the pass
drops everything under it from classification, the wipe guard and the
push pass's deletions. It is never read as deleted and never downloaded
into. An unreadable or absent root still fails the pass. The activity
feed names unreadable paths once each time the set changes.

Two related bugs on the way to online-only:

- The push pass read deletions from the raw baseline, so a synced path
  that later became ignored was trashed on Drive (B197).
- The switch evicted everything once the folder was idle, including
  ignored paths such as .git/, symlinks, unreadable folders and files
  changed after the pass, none of which are on Drive (B198). It now
  refuses and names the path.

Closes #33
2026-10-08 20:45:54 +02:00
Nils Pukropp c0d211238b chore(aur): update packages to 3.1.2 2026-10-08 13:55:27 +00:00
nvrl 3e3dd7db41 feat(fuse,core,cli,gui): move another computer's backup to this one
A user switching from a Windows PC to Linux had two half answers:
adopting the old device makes this machine back up as it, and restoring
its folders keeps them in the old device's tree. Neither puts the data
under this machine's own device.

Device roots are separate shares on the main volume, so each top-level
folder of the other device can move under this device's root in one
server-side move. Nothing is uploaded again, and the other device stays
registered, without those folders.

- core: `Request::MigrateDevice { uid }` and
  `Db::sync_folder_set_share`
- fuse: `Core::migrate_device` moves every folder, suffixes a name
  already taken here with the other device's name, keeps going past a
  failed folder, and re-points sync folders that already tracked a
  moved folder at the new share
- cli: `pdfs devices migrate UID [--yes]` confirms, moves, then runs
  the ordinary restore picker
- gui: "Move to This Computer…" on another computer's row, followed by
  the restore picker
- i18n: translate the new strings in every catalog
- docs: CLI.md, USER_GUIDE.md, RECOVERY.md, ARCHITECTURE.md, changelog
2026-10-08 13:34:28 +02:00
33 changed files with 2149 additions and 818 deletions

No files matched your search

+27
View File
@@ -628,6 +628,15 @@ enum DeviceCmd {
#[arg(long, conflicts_with = "uid")]
clear: bool,
},
/// Move another computer's folders into this computer's backup and sync
/// them here. The other computer stays registered, without those folders.
Migrate {
/// Device uid (from `devices list`).
uid: String,
/// Skip the confirmation and accept every proposed local path.
#[arg(long)]
yes: bool,
},
}
#[derive(Subcommand)]
@@ -967,6 +976,24 @@ fn cmd_devices(action: DeviceCmd) -> Result<()> {
let uid = if clear { None } else { uid };
ok_or_bail(control_request(CtlRequest::AdoptDevice { uid })?)?
}
DeviceCmd::Migrate { uid, yes } => {
if !yes {
println!(
"Every folder that device backs up moves into this computer's backup.\n\
The device stays registered, without those folders. Stop Proton Drive\n\
on that computer first, or it sees its folders disappear."
);
confirm("Move them here?")?;
}
let response = control_request(CtlRequest::MigrateDevice { uid })?;
// A script gets the one reply and runs `sync restore` itself.
if emit_json(&response)? {
return Ok(());
}
ok_or_bail(response)?;
// The folders are this device's now, so the plain restore offers them.
cmd_sync_restore(yes, None)?
}
}
Ok(())
}
+10
View File
@@ -446,6 +446,13 @@ pub enum Request {
/// of registering a duplicate. `uid: None` clears the pin.
/// Replies with [`Response::Ok`].
AdoptDevice { uid: Option<String> },
/// Move every folder another device backs up into this machine's own
/// device, as server-side moves on the main volume. The other device stays
/// registered, without those folders. Sync folders here that already track
/// one of them follow it to its new share. Nothing is downloaded: the moved
/// folders are then offered by [`Request::ListRestorableFolders`].
/// Replies with [`Response::Ok`].
MigrateDevice { uid: String },
// ---- device folder sync ----------------------------------
/// Add a local folder to this machine's device, uploading its tree and
@@ -3082,6 +3089,9 @@ mod tests {
uid: Some("dev-1".into()),
},
Request::AdoptDevice { uid: None },
Request::MigrateDevice {
uid: "dev-2".into(),
},
Request::ListRestorableFolders,
Request::RestoreSyncFolders {
items: vec![RestoreItem {
+11
View File
@@ -139,6 +139,17 @@ impl Db {
Ok(())
}
/// Re-point a synced folder at the share that now holds its remote folder,
/// after the folder moved to another device without changing its uid.
pub fn sync_folder_set_share(&self, id: i64, share_id: &str) -> Result<()> {
let conn = self.conn.lock();
conn.execute(
"UPDATE sync_folder SET remote_share_id = ?2 WHERE id = ?1",
params![id, share_id],
)?;
Ok(())
}
/// Queue (or, with `None`, withdraw) a mode the folder should move to once it
/// is safe to switch.
pub fn sync_folder_set_pending_mode(&self, id: i64, mode: Option<&str>) -> Result<()> {
+22
View File
@@ -4940,6 +4940,28 @@ fn pending_mode_is_queued_until_the_mode_is_reached() {
assert_eq!(folder.pending_mode, None);
}
#[test]
fn moved_sync_folder_points_at_its_new_share() {
let db = Db::open_in_memory().unwrap();
let id = db
.sync_folder_add("/tmp/pdfs-moved-share", "vol~folder", "windows-share")
.unwrap();
let other = db
.sync_folder_add("/tmp/pdfs-unmoved-share", "vol~other", "windows-share")
.unwrap();
db.sync_folder_set_share(id, "linux-share").unwrap();
let folder = db.sync_folder_get(id).unwrap().unwrap();
assert_eq!(folder.remote_share_id, "linux-share");
// A move keeps the uid, so nothing but the share changes.
assert_eq!(folder.remote_uid, "vol~folder");
assert_eq!(
db.sync_folder_get(other).unwrap().unwrap().remote_share_id,
"windows-share"
);
}
#[test]
fn mode_commit_clears_only_the_intent_it_satisfies() {
let db = Db::open_in_memory().unwrap();
+5 -1
View File
@@ -369,7 +369,7 @@ fn touched_topics(request: &CtlRequest) -> &'static [Topic] {
RefreshScope::Photos { .. } => &[],
},
R::RenameDevice { .. } | R::DeleteDevice { .. } => &[Topic::Devices],
R::AdoptDevice { .. } => &[Topic::Devices, Topic::Locations],
R::AdoptDevice { .. } | R::MigrateDevice { .. } => &[Topic::Devices, Topic::Locations],
R::AddSyncFolder { .. }
| R::RemoveSyncFolder { .. }
| R::SetSyncFolderMode { .. }
@@ -1297,6 +1297,10 @@ fn handle_control_conn(core: &Core, username: &str, mountpoint: &Path, stream: U
Ok(message) => CtlResponse::Ok { message },
Err(e) => CtlResponse::error(e),
},
Ok(CtlRequest::MigrateDevice { uid }) => match core.migrate_device(&uid) {
Ok(message) => CtlResponse::Ok { message },
Err(e) => CtlResponse::error(e),
},
Ok(CtlRequest::AddSyncFolder { local_path }) => {
// Registering the device and uploading a folder tree far outlasts the
// socket read timeout, so ack immediately and work on a background
+176 -9
View File
@@ -19,6 +19,7 @@ use pdfs_core::control::{
};
use pdfs_core::db::{StoredDevice, StoredSyncFolder};
use pdfs_core::mounts::MountMode;
use pdfs_core::profile::PROFILE_DIR_NAME;
use pdfs_core::{CoreError, CoreResult};
use proton_drive_rs::proton_sdk::ids::{DeviceUid, NodeUid};
use proton_drive_rs::{DeviceType, Node};
@@ -114,6 +115,22 @@ pub(crate) fn set_adopted_device_uid(uid: Option<&str>) -> CoreResult<()> {
.map_err(|e| CoreError::internal(format!("write config: {e}")))
}
/// The name a folder moved in from `device` takes when `name` is already
/// taken under this device's root, or `None` when it can keep its own.
fn migrated_name(name: &str, device: &str, taken: &[String]) -> Option<String> {
let free = |candidate: &str| !taken.iter().any(|t| t == candidate);
if free(name) {
return None;
}
let base = format!("{name} ({device})");
if free(&base) {
return Some(base);
}
(2..)
.map(|n| format!("{base} {n}"))
.find(|candidate| free(candidate))
}
impl Core {
// ---- devices ----------------------------------------------------------
@@ -260,6 +277,107 @@ impl Core {
})
}
/// Move every folder another device backs up into this machine's own
/// device, so this machine carries on backing them up as itself. The other
/// device stays registered, without those folders.
///
/// Device roots all live on the main volume, so each folder is one
/// server-side move: nothing is downloaded or uploaded, and no quota is
/// used twice. A folder whose name is taken here keeps its content under
/// "<name> (<device>)". A failed folder does not stop the others, and a
/// second run picks up whatever is still left on the other device.
///
/// Nothing is synced to this disk here. The moved folders are now this
/// device's, so the ordinary restore offers them. Only folders that were
/// already synced here from the other device are touched: their uid
/// survives the move but their share does not.
pub(crate) fn migrate_device(&self, uid: &str) -> CoreResult<String> {
let source = self.restore_source(Some(uid))?;
let target = self.ensure_device()?;
if source.uid == target.uid {
return Err(CoreError::invalid(format!(
"{} is this computer's own device",
source.name
)));
}
let bad_root = |d: &StoredDevice| {
parse_uid(&d.root_uid)
.ok_or_else(|| CoreError::internal(format!("bad device root uid: {}", d.root_uid)))
};
let (source_root, target_root) = (bad_root(&source)?, bad_root(&target)?);
if source_root.volume_id != target_root.volume_id {
return Err(CoreError::invalid(
"the two devices are on different Proton Drive volumes; copy it instead",
));
}
let mut taken: Vec<String> = self
.device_root_nodes(&target_root)?
.into_iter()
.filter(|n| !n.trashed)
.map(|n| n.name)
.collect();
let synced = self
.db
.sync_folder_list()
.map_err(|e| CoreError::internal(format!("db: {e:?}")))?;
let mut moved = 0usize;
let mut renamed: Vec<String> = Vec::new();
let mut left: Vec<String> = Vec::new();
let mut failed: Vec<String> = Vec::new();
for node in self.device_root_nodes(&source_root)? {
if node.trashed || node.name == PROFILE_DIR_NAME {
continue;
}
// A device root only ever holds folders (B68); anything else was
// put there by hand and is left for the user to deal with.
if !node.is_folder() {
left.push(node.name);
continue;
}
let new_name = migrated_name(&node.name, &source.name, &taken);
if let Err(e) = self.move_rename_remote(&node.uid, &target_root, new_name.as_deref()) {
warn!(name = %node.name, error = %e, "migrate: could not move folder");
failed.push(format!("{}: {e}", node.name));
continue;
}
let landed = new_name.clone().unwrap_or_else(|| node.name.clone());
if new_name.is_some() {
renamed.push(format!("{} -> {landed}", node.name));
}
taken.push(landed);
moved += 1;
let uid = node.uid.to_string();
for folder in synced.iter().filter(|f| f.remote_uid == uid) {
if let Err(e) = self.db.sync_folder_set_share(folder.id, &target.share_id) {
warn!(id = folder.id, error = ?e, "migrate: could not re-point sync folder");
}
self.sync_now(Some(folder.id));
}
}
self.invalidate_children_of(&source_root);
self.invalidate_children_of(&target_root);
let mut message = format!("moved {moved} folder(s) from {}", source.name);
if !renamed.is_empty() {
message.push_str(&format!("; renamed: {}", renamed.join(", ")));
}
if !left.is_empty() {
message.push_str(&format!("; left behind: {}", left.join(", ")));
}
if !failed.is_empty() {
message.push_str(&format!("; failed: {}", failed.join(", ")));
}
info!(from = %source.name, to = %target.name, moved, failed = failed.len(),
"device migrated");
if moved == 0 && !failed.is_empty() {
return Err(CoreError::conflict(message));
}
Ok(message)
}
// ---- device folder sync -------------------------
/// Auto-register (or recover) this machine as a Proton Drive Device, caching
@@ -360,21 +478,25 @@ impl Core {
root_uid: &NodeUid,
name: &str,
) -> CoreResult<Option<NodeUid>> {
Ok(self
.device_root_nodes(root_uid)?
.into_iter()
.find(|n| n.is_folder() && !n.trashed && n.name == name)
.map(|n| n.uid))
}
/// Everything directly under a device root, trashed nodes included.
fn device_root_nodes(&self, root_uid: &NodeUid) -> CoreResult<Vec<Node>> {
let uids = self
.rt
.block_on(self.drive.enumerate_folder_children_node_uids(root_uid))
.map_err(|e| CoreError::from_api(&e, "list device root"))?;
if uids.is_empty() {
return Ok(None);
return Ok(Vec::new());
}
let nodes = self
.rt
self.rt
.block_on(self.drive.enumerate_nodes(&uids))
.map_err(|e| CoreError::from_api(&e, "resolve device root children"))?;
Ok(nodes
.into_iter()
.find(|n| n.is_folder() && !n.trashed && n.name == name)
.map(|n| n.uid))
.map_err(|e| CoreError::from_api(&e, "resolve device root children"))
}
/// Add a local folder to this device's sync set: register the device if
@@ -842,6 +964,23 @@ impl Core {
if folder.state != "idle" {
return Err(SwitchBlocked::NotNow);
}
// `idle` only says the last pass applied everything it tried.
// It never tries an ignored path, a symlink or a folder it
// cannot read, it defers a file open for writing, and a file can
// change after it ends. The eviction below deletes all of those
// for good, so it waits until nothing here is missing from Drive
// (B198).
let baseline = self
.db
.sync_entries(id)
.map_err(|e| SwitchBlocked::Failed(format!("db: {e:?}")))?;
if let Some(reason) =
sync::mirror_tree_unsynced(&local, &baseline, &self.ignore_rules(&local))
{
return Err(SwitchBlocked::Failed(format!(
"going online-only would delete what is only on this computer: {reason}"
)));
}
let root_uid = parse_uid(&folder.remote_uid).ok_or_else(|| {
SwitchBlocked::Failed(format!("bad remote uid: {}", folder.remote_uid))
})?;
@@ -1107,10 +1246,38 @@ mod tests {
use pdfs_core::db::StoredSyncFolder;
use super::{
ApplicableMountMode, commit_after_teardown, pending_intent_matches,
ApplicableMountMode, commit_after_teardown, migrated_name, pending_intent_matches,
restore_snapshot_matches, select_mode_transition,
};
#[test]
fn migrated_folder_keeps_its_name_when_it_is_free() {
let taken = vec!["Pictures".to_string()];
assert_eq!(migrated_name("Documents", "DESKTOP-1", &taken), None);
}
#[test]
fn migrated_folder_is_named_after_its_device_on_a_clash() {
let taken = vec!["Documents".to_string()];
assert_eq!(
migrated_name("Documents", "DESKTOP-1", &taken).as_deref(),
Some("Documents (DESKTOP-1)")
);
}
#[test]
fn migrated_folder_is_numbered_when_the_device_name_is_taken_too() {
let taken = vec![
"Documents".to_string(),
"Documents (DESKTOP-1)".to_string(),
"Documents (DESKTOP-1) 2".to_string(),
];
assert_eq!(
migrated_name("Documents", "DESKTOP-1", &taken).as_deref(),
Some("Documents (DESKTOP-1) 3")
);
}
#[test]
fn unknown_mode_cannot_select_a_destructive_transition() {
let mut unmounts = 0;
+3
View File
@@ -744,6 +744,9 @@ struct Core {
/// uploading that same tree — the engine would upload files as they vanish
/// and then walk the FUSE mount as if it were local.
sync_locks: Arc<Mutex<HashMap<i64, Arc<Mutex<()>>>>>,
/// Per-sync-folder paths the last pass could not read, so the activity feed
/// says so when the set changes rather than on every poll (B196).
sync_unscanned: Arc<Mutex<HashMap<i64, Vec<String>>>>,
/// Nodes this daemon changed on the remote itself, and how many echoes of
/// those changes the event feed still owes us.
///
+1
View File
@@ -475,6 +475,7 @@ pub(crate) fn mount_with(
sync_tx,
mounts: Arc::new(Mutex::new(SecondaryMountRegistry::default())),
sync_locks: Arc::new(Mutex::new(HashMap::new())),
sync_unscanned: Arc::new(Mutex::new(HashMap::new())),
states: Arc::new(StateRegistry::default()),
};
// Before anything can queue work against it: the drain thread below reaches
+542 -99
View File
@@ -59,8 +59,9 @@ pub(crate) use planner::base_name;
#[cfg(test)]
use planner::conflict_path;
use planner::{
FilePlan, classification_order, conflict_path_with_suffix, filter_baseline, guard_local_wipe,
join_rel, parent_rel, plan_file, rel_to_path, remote_sig, unchanged_remote_size,
FilePlan, Unscanned, classification_order, conflict_path_with_suffix, filter_baseline,
guard_local_wipe, join_rel, local_deletions, parent_rel, plan_file, rel_to_path, remote_sig,
tracked_baseline, unchanged_remote_size,
};
/// What a [`Pending`] op did, so the reconcile can update shared state on the
/// engine thread (never inside a task).
@@ -187,6 +188,7 @@ impl Core {
"idle"
};
let _ = self.db.sync_folder_set_state(folder.id, state, now_secs());
self.report_unscanned(folder.id, name, &outcome.unscanned);
// Summarise a pass that actually moved something. A poll over an
// unchanged folder does nothing and says nothing — otherwise the
// feed would fill with "synced, 0 changes" every two minutes.
@@ -243,6 +245,37 @@ impl Core {
}
}
/// Tell the activity feed what a pass over this folder had to leave out
/// because it cannot be read, once each time that changes. Every other path
/// in the folder still synced, so this does not make the folder's state an
/// error; but a folder the user has no permission for is never going to
/// reach Drive, and they should hear that once rather than not at all
/// (B196).
fn report_unscanned(&self, folder_id: i64, name: &str, unscanned: &[String]) {
let previous = {
let mut last = self.sync_unscanned.lock();
if unscanned.is_empty() {
last.remove(&folder_id)
} else {
last.insert(folder_id, unscanned.to_vec())
}
};
if unscanned.is_empty() || previous.as_deref() == Some(unscanned) {
return;
}
const SHOWN: usize = 3;
let mut detail = unscanned[..unscanned.len().min(SHOWN)].join(", ");
if unscanned.len() > SHOWN {
detail.push_str(&format!(" and {} more", unscanned.len() - SHOWN));
}
self.log_activity(
ActivityKind::Sync,
format!("{} item(s) in {name} cannot be synced", unscanned.len()),
detail,
false,
);
}
/// Compile the ignore rules for a synced folder: the global patterns from
/// the config, plus any `.pdfsignore` at `local_root`.
///
@@ -250,7 +283,7 @@ impl Core {
/// than to "ignore nothing" — the defaults exclude build and VCS trees, and
/// silently uploading those because a config read failed is the outcome this
/// feature exists to prevent.
fn ignore_rules(&self, local_root: &Path) -> IgnoreRules {
pub(crate) fn ignore_rules(&self, local_root: &Path) -> IgnoreRules {
let globals = match pdfs_core::config::AppDirs::new() {
Ok(dirs) => dirs.load_config().resolved_ignore_patterns(),
Err(e) => {
@@ -313,15 +346,23 @@ impl Core {
self.progress_scan_total(folder_id, baseline.len());
let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut unscanned = Unscanned::default();
let writing = open_for_write_set(local_root);
self.walk_local(
folder_id, local_root, local_root, rules, &writing, &mut local,
folder_id,
local_root,
rules,
&writing,
&mut local,
&mut unscanned,
)?;
// The guard compares against the paths this pass could still see: an
// ignored path is absent from `local` by rule, not by loss, and counting
// those as missing would trip the guard on every pass — wedging the
// folder's sync permanently — the moment a rule covers the whole tree.
guard_local_wipe(&filter_baseline(&baseline, rules), &local)?;
// ignored or unreadable path is absent from `local` by rule or by
// failure, not by loss, and counting those as missing would trip the
// guard on every pass — wedging the folder's sync permanently — the
// moment a rule covers the whole tree.
let tracked = tracked_baseline(&baseline, rules, &unscanned);
guard_local_wipe(&tracked, &local)?;
// The remote folder uids come from the baseline instead of a walk: every
// directory this device has synced recorded its uid there when it was
@@ -391,6 +432,7 @@ impl Core {
let mut outcome = Outcome {
deferred: local.values().filter(|item| item.open_for_write).count(),
unscanned: unscanned.report(),
..Default::default()
};
let mut order: Vec<&String> = local.keys().collect();
@@ -515,13 +557,8 @@ impl Core {
// showing the folder's remote contents — otherwise everything they deleted
// comes back the moment the switch lands. Shallowest first, skipping anything
// under a folder already trashed (its children went with it).
let mut missing: Vec<&String> = baseline
.keys()
.filter(|rel| !local.contains_key(*rel))
.collect();
missing.sort_by_key(|p| p.matches('/').count());
let mut trashed: Vec<String> = Vec::new();
for rel in missing {
for rel in &local_deletions(&tracked, &local) {
if trashed
.iter()
.any(|dir| rel.starts_with(&format!("{dir}/")))
@@ -586,12 +623,18 @@ impl Core {
self.progress_scan_total(folder_id, baseline.len() * 2);
let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut unscanned = Unscanned::default();
let writing = open_for_write_set(local_root);
self.walk_local(
folder_id, local_root, local_root, rules, &writing, &mut local,
folder_id,
local_root,
rules,
&writing,
&mut local,
&mut unscanned,
)?;
// See `push_pass`: the guard must not count rule-excluded paths as lost.
guard_local_wipe(&filter_baseline(&baseline, rules), &local)?;
// See `push_pass`: the guard must not count excluded paths as lost.
guard_local_wipe(&tracked_baseline(&baseline, rules, &unscanned), &local)?;
let mut remote: HashMap<String, RemoteItem> = HashMap::new();
let mut remote_dirs: HashMap<String, NodeUid> = HashMap::new();
@@ -605,9 +648,15 @@ impl Core {
&baseline,
)?;
let order = classification_order(&local, &remote, &baseline, rules);
let mut order = classification_order(&local, &remote, &baseline, rules);
// A path the scan could not read is no more a local deletion than an
// ignored one, and a remote path under it has nowhere to be written.
order.retain(|rel| !unscanned.covers(rel));
let mut outcome = Outcome::default();
let mut outcome = Outcome {
unscanned: unscanned.report(),
..Default::default()
};
// Folders to delete, collected here and removed deepest-first at the end
// so a parent is never removed before its children.
let mut delete_local_dirs: Vec<String> = Vec::new();
@@ -873,19 +922,19 @@ impl Core {
Ok(outcome)
}
/// Recursively walk a local directory into `out`, keyed by `/`-joined relative
/// path. Symlinks and other special files are skipped. Reports each entry to the
/// pass's scan progress.
/// Recursively walk a local tree into `out`, keyed by `/`-joined relative
/// path. Symlinks and other special files are skipped, and paths that cannot
/// be read go to `unscanned`. Reports each entry to the pass's scan progress.
fn walk_local(
&self,
folder_id: i64,
root: &Path,
dir: &Path,
rules: &IgnoreRules,
writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
) -> Result<(), String> {
walk_local_tree(root, dir, rules, writing, out, &mut |rel| {
walk_local_tree(root, rules, writing, out, unscanned, &mut |rel| {
self.progress_scanned(folder_id, base_name(rel))
})
}
@@ -1582,51 +1631,120 @@ fn removed_locally(result: std::io::Result<()>) -> std::io::Result<()> {
}
/// The body of [`Core::walk_local`], without a `Core`: recursively collect the
/// local tree under `dir` into `out`, reporting each entry to `scanned`.
/// local tree under `root` into `out`, reporting each entry to `scanned`.
///
/// **Every failure here is fatal to the pass, deliberately.** A `read_dir` that
/// fails, an entry that cannot be stat-ed, a name that is not UTF-8 — each of
/// them would, if skipped, leave `out` describing a *smaller* tree than the one
/// on disk. Reconciliation reads a path present in the baseline and absent from
/// the scan as "the user deleted this", and propagates that to Drive. So an
/// unreadable subdirectory would trash its remote counterpart, and the deeper
/// the failure, the more it takes with it (`docs/BUGS.md` B55). Refusing the
/// whole pass keeps the previous baseline and leaves the remote alone; the next
/// pass retries once the transient condition clears.
/// **A path the scan cannot read is left out and recorded in `unscanned`, never
/// silently dropped.** Every pass drops what `unscanned` covers from
/// classification, so a baseline row under it is neither a local deletion nor a
/// download target (`docs/BUGS.md` B55). That covers a subfolder the pass has no
/// permission for, an entry that vanished between the listing and its `stat`,
/// and a name that is not UTF-8. Failing the whole pass on any of them, as this
/// did before, left one root-owned folder stopping everything else in the tree
/// from syncing, on every pass, for good (B196).
///
/// The root is the exception, and so is any other I/O error: an absent or
/// unreadable root fails the pass, since leaving the root out would leave
/// nothing in, and an error this cannot name a cause for is not one to guess
/// about.
///
/// Split out from the method so exactly that can be tested against a real tree
/// with a real unreadable directory in it, which needs no `Core` at all.
fn walk_local_tree(
root: &Path,
rules: &IgnoreRules,
writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
scanned: &mut dyn FnMut(&str),
) -> Result<(), String> {
walk_local_dir(root, root, rules, writing, out, unscanned, scanned).map_err(|e| e.to_string())
}
/// Why [`walk_local_dir`] could not finish a folder.
enum ScanError {
/// An I/O error on `what`, which the caller may leave out of the pass.
Io { what: String, error: std::io::Error },
/// Anything else, which fails the pass.
Failed(String),
}
impl std::fmt::Display for ScanError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ScanError::Io { what, error } => write!(f, "{what}: {error}"),
ScanError::Failed(message) => f.write_str(message),
}
}
}
/// Leave `rel` out of the pass for `failure`, or hand it back when it is one
/// that fails the pass. Permission denied is reported to the user; an entry
/// that vanished mid-scan is not, since the next pass sees it settled.
fn leave_out(rel: &str, failure: ScanError, unscanned: &mut Unscanned) -> Result<(), ScanError> {
let ScanError::Io { what, error } = &failure else {
return Err(failure);
};
match error.kind() {
std::io::ErrorKind::PermissionDenied => {
warn!(%what, %error, "sync: cannot read; leaving it out of the pass");
unscanned.unreadable(rel.to_string(), &error.to_string());
Ok(())
}
std::io::ErrorKind::NotFound => {
debug!(%what, "sync: gone mid-scan; leaving it out of the pass");
unscanned.vanished(rel.to_string());
Ok(())
}
_ => Err(failure),
}
}
fn walk_local_dir(
root: &Path,
dir: &Path,
rules: &IgnoreRules,
writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
scanned: &mut dyn FnMut(&str),
) -> Result<(), String> {
let entries = std::fs::read_dir(dir).map_err(|e| format!("read {}: {e}", dir.display()))?;
) -> Result<(), ScanError> {
let io = |what: String| move |error| ScanError::Io { what, error };
let entries = std::fs::read_dir(dir).map_err(io(format!("read {}", dir.display())))?;
for entry in entries {
let entry = entry.map_err(|e| format!("read entry in {}: {e}", dir.display()))?;
let entry = entry.map_err(io(format!("read entry in {}", dir.display())))?;
let path = entry.path();
let meta = std::fs::symlink_metadata(&path)
.map_err(|e| format!("stat {}: {e}", path.display()))?;
let stripped = path.strip_prefix(root).map_err(|e| {
format!(
ScanError::Failed(format!(
"local path {} escaped sync root {}: {e}",
path.display(),
root.display()
)
})?;
let rel = stripped.to_str().ok_or_else(|| {
format!(
"local path {} is not valid UTF-8; refusing a destructive sync pass",
path.display()
)
))
})?;
let Some(rel) = stripped.to_str() else {
// Nothing can be keyed by this name: not the baseline, which only
// ever held paths this scan produced, and not Drive, whose names are
// UTF-8. Leaving it out cannot read as a deletion of anything.
warn!(path = %path.display(), "sync: name is not valid UTF-8; leaving it out of the pass");
unscanned.unreadable(
stripped.to_string_lossy().into_owned(),
"name is not valid UTF-8",
);
continue;
};
// Ignore our own in-flight download temp files.
if rel.contains(".pdfs-tmp-") {
continue;
}
let meta = match std::fs::symlink_metadata(&path) {
Ok(meta) => meta,
// Gone since the listing, or in a folder that lists but does not
// allow `stat`. Either way this pass cannot say what it is.
Err(error) => {
let what = format!("stat {}", path.display());
leave_out(rel, ScanError::Io { what, error }, unscanned)?;
continue;
}
};
// Ignored paths are dropped here as well as from the classification
// union — not for correctness (the union filter is what makes this
// safe) but so an ignored `node_modules/` is never descended into or
@@ -1646,7 +1764,15 @@ fn walk_local_tree(
},
);
scanned(rel);
walk_local_tree(root, &path, rules, writing, out, scanned)?;
if let Err(failure) =
walk_local_dir(root, &path, rules, writing, out, unscanned, scanned)
{
leave_out(rel, failure, unscanned)?;
// What the folder did list before failing goes with it: a
// half-read folder is as unknown as an unread one.
let prefix = format!("{rel}/");
out.retain(|k, _| k != rel && !k.starts_with(&prefix));
}
} else if meta.is_file() {
// Check whether any process holds this file open for writing.
// The canonical path is used because /proc/*/fd links resolve
@@ -1684,7 +1810,7 @@ pub(crate) fn mirror_subtree_unsynced(
baseline: &HashMap<String, StoredSyncEntry>,
) -> Option<String> {
let mut seen = HashSet::new();
if let Some(reason) = unsynced_local(root, rel, baseline, &mut seen) {
if let Some(reason) = unsynced_local(root, rel, baseline, None, &mut seen) {
return Some(reason);
}
let prefix = format!("{rel}/");
@@ -1695,45 +1821,93 @@ pub(crate) fn mirror_subtree_unsynced(
.map(|r| format!("{r} was deleted here but not on Proton Drive yet"))
}
/// [`mirror_subtree_unsynced`] for a whole mirror folder: why its local copy
/// holds something Proton Drive does not, or `None` when evicting it loses
/// nothing. The switch to on-demand asks this before it empties the folder.
///
/// A push pass that ends `idle` is not enough on its own. It never uploads an
/// ignored path, a symlink or a folder it cannot read, it defers a file open
/// for writing, and a file can change after it finishes; the eviction deleted
/// all of those for good (B198).
///
/// A tracked path deleted here but still in the baseline counts, since the
/// mount would show it again. An ignored one does not: ignoring never carries
/// a deletion to Drive, so its row stays in the baseline for good, and holding
/// the switch on it would hold it forever.
pub(crate) fn mirror_tree_unsynced(
root: &Path,
baseline: &HashMap<String, StoredSyncEntry>,
rules: &IgnoreRules,
) -> Option<String> {
let mut seen = HashSet::new();
if let Some(reason) = unsynced_local(root, "", baseline, Some(rules), &mut seen) {
return Some(reason);
}
let mut missing: Vec<String> = filter_baseline(baseline, rules)
.into_keys()
.filter(|r| !seen.contains(r.as_str()))
.collect();
missing.sort_unstable();
missing
.first()
.map(|r| format!("{r} was deleted here but not on Proton Drive yet"))
}
/// The walk behind both checks. `rules`, when given, only names an ignored
/// path as such in the reason; it is still something only this disk has.
fn unsynced_local(
root: &Path,
rel: &str,
baseline: &HashMap<String, StoredSyncEntry>,
rules: Option<&IgnoreRules>,
seen: &mut HashSet<String>,
) -> Option<String> {
let path = root.join(rel_to_path(rel));
let meta = match std::fs::symlink_metadata(&path) {
Ok(meta) => meta,
Err(e) => return Some(format!("cannot read {rel}: {e}")),
let path = if rel.is_empty() {
root.to_path_buf()
} else {
root.join(rel_to_path(rel))
};
let Some(base) = baseline.get(rel) else {
return Some(format!("{rel} is not on Proton Drive yet"));
};
seen.insert(rel.to_string());
if meta.is_file() {
return (!LocalSig::from(&meta).same_content(&LocalSig::from(base)))
.then(|| format!("{rel} has changes that are not on Proton Drive yet"));
}
if !meta.is_dir() {
return Some(format!("{rel} is not a regular file or folder"));
// The folder itself has no baseline row; only what is in it does.
if !rel.is_empty() {
let meta = match std::fs::symlink_metadata(&path) {
Ok(meta) => meta,
Err(e) => return Some(format!("cannot read {rel}: {e}")),
};
let Some(base) = baseline.get(rel) else {
if rules.is_some_and(|rules| rules.is_ignored(rel, meta.is_dir())) {
return Some(format!(
"{rel} is excluded from sync, so it is only on this computer"
));
}
return Some(format!("{rel} is not on Proton Drive yet"));
};
seen.insert(rel.to_string());
if meta.is_file() {
return (!LocalSig::from(&meta).same_content(&LocalSig::from(base)))
.then(|| format!("{rel} has changes that are not on Proton Drive yet"));
}
if !meta.is_dir() {
return Some(format!("{rel} is not a regular file or folder"));
}
}
let shown = if rel.is_empty() { "the folder" } else { rel };
let entries = match std::fs::read_dir(&path) {
Ok(entries) => entries,
Err(e) => return Some(format!("cannot read {rel}: {e}")),
Err(e) => return Some(format!("cannot read {shown}: {e}")),
};
for entry in entries {
let name = match entry {
Ok(entry) => entry.file_name(),
Err(e) => return Some(format!("cannot read {rel}: {e}")),
Err(e) => return Some(format!("cannot read {shown}: {e}")),
};
let Some(name) = name.to_str() else {
return Some(format!("{rel} holds a name that is not valid UTF-8"));
return Some(format!("{shown} holds a name that is not valid UTF-8"));
};
// A download the engine left half done; it is the engine's to clean up.
if name.contains(".pdfs-tmp-") {
continue;
}
if let Some(reason) = unsynced_local(root, &format!("{rel}/{name}"), baseline, seen) {
if let Some(reason) = unsynced_local(root, &join_rel(rel, name), baseline, rules, seen) {
return Some(reason);
}
}
@@ -2154,7 +2328,15 @@ mod tests {
let writing = HashSet::new();
let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut progress = no_progress();
walk_local_tree(&root, &root, &rules, &writing, &mut local, &mut progress).unwrap();
walk_local_tree(
&root,
&rules,
&writing,
&mut local,
&mut Unscanned::default(),
&mut progress,
)
.unwrap();
assert!(local.is_empty(), "the replacement root is genuinely empty");
for size in 1..=3 {
@@ -2170,7 +2352,15 @@ mod tests {
// remounted folder resumes rather than staying wedged.
std::fs::write(root.join("file0.txt"), b"back").unwrap();
let mut local: HashMap<String, LocalItem> = HashMap::new();
walk_local_tree(&root, &root, &rules, &writing, &mut local, &mut progress).unwrap();
walk_local_tree(
&root,
&rules,
&writing,
&mut local,
&mut Unscanned::default(),
&mut progress,
)
.unwrap();
let baseline: HashMap<String, ()> = [("file0.txt".to_string(), ())].into_iter().collect();
assert!(guard_local_wipe(&filter_baseline(&baseline, &rules), &local).is_ok());
@@ -2475,33 +2665,176 @@ mod tests {
|_: &str| {}
}
/// A directory the pass cannot read must fail the pass. Omitting it would
/// hand reconciliation a baseline-minus-subtree, which it reads as the user
/// having deleted that subtree and propagates to Drive (B55).
/// Scan `root` with no rules, returning what it found and left out.
fn scan(root: &Path) -> Result<(HashMap<String, LocalItem>, Unscanned), String> {
let mut out = HashMap::new();
let mut unscanned = Unscanned::default();
let mut progress = no_progress();
walk_local_tree(
root,
&rules_for(&[]),
&HashSet::new(),
&mut out,
&mut unscanned,
&mut progress,
)?;
Ok((out, unscanned))
}
fn sorted_keys<V>(map: &HashMap<String, V>) -> Vec<&str> {
let mut keys: Vec<&str> = map.keys().map(String::as_str).collect();
keys.sort_unstable();
keys
}
/// B196, the report in #33: a folder the user may not read, such as a
/// container's root-owned cache, is left out of the pass and named, and
/// everything around it still scans. It used to fail the whole pass, so
/// nothing else in the tree ever synced again.
#[test]
fn an_unreadable_subdirectory_fails_the_scan_instead_of_shrinking_it() {
fn an_unreadable_subdirectory_is_left_out_and_the_rest_scans() {
use std::os::unix::fs::PermissionsExt as _;
let root = sync_test_dir("scan-eacces");
std::fs::write(root.join("keep.txt"), b"a").unwrap();
let locked = root.join("locked");
std::fs::create_dir_all(root.join("docker/cache")).unwrap();
std::fs::write(root.join("docker/compose.yml"), b"c").unwrap();
let locked = root.join("docker/cache/locked");
std::fs::create_dir(&locked).unwrap();
std::fs::write(locked.join("inner.txt"), b"b").unwrap();
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o000)).unwrap();
let rules = rules_for(&[]);
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
let result = scan(&root);
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
let error = result.expect_err("an unreadable directory must abort the pass");
assert!(
error.contains("locked"),
"the error should name the subtree it could not read: {error}"
let (out, unscanned) = result.expect("one unreadable folder must not fail the pass");
assert_eq!(
sorted_keys(&out),
vec!["docker", "docker/cache", "docker/compose.yml", "keep.txt"]
);
assert!(unscanned.covers("docker/cache/locked"));
assert!(unscanned.covers("docker/cache/locked/inner.txt"));
assert!(!unscanned.covers("docker/cache"));
let report = unscanned.report();
assert_eq!(report.len(), 1);
assert!(report[0].starts_with("docker/cache/locked ("), "{report:?}");
}
/// A folder with read but no search permission lists its names but cannot
/// `stat` them. Whatever it did list must go with it: a half-read folder
/// is as unknown as an unread one.
#[test]
fn a_listable_but_unsearchable_folder_is_left_out_whole() {
use std::os::unix::fs::PermissionsExt as _;
let root = sync_test_dir("scan-no-search");
std::fs::write(root.join("keep.txt"), b"a").unwrap();
let half = root.join("half");
std::fs::create_dir(&half).unwrap();
std::fs::write(half.join("one.txt"), b"1").unwrap();
std::fs::write(half.join("two.txt"), b"2").unwrap();
std::fs::set_permissions(&half, std::fs::Permissions::from_mode(0o400)).unwrap();
let result = scan(&root);
std::fs::set_permissions(&half, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
let (out, unscanned) = result.unwrap();
// Each entry fails its own `stat` and is left out by name.
assert_eq!(sorted_keys(&out), vec!["half", "keep.txt"]);
assert!(unscanned.covers("half/one.txt"));
assert!(unscanned.covers("half/two.txt"));
}
/// The other half of B196: what was left out is not a deletion, and not a
/// download target either. Its baseline rows leave the wipe guard's set
/// and a push pass's deletions, and its paths leave classification.
#[test]
fn a_path_the_scan_left_out_is_never_a_local_deletion() {
let mut baseline = baseline_with("keep.txt", 1, 1);
baseline.extend(baseline_with("locked", 0, 0));
baseline.extend(baseline_with("locked/inner.txt", 1, 1));
baseline.extend(baseline_with("gone.txt", 1, 1));
let local: HashMap<String, LocalItem> = [("keep.txt".to_string(), local_item(false))]
.into_iter()
.collect();
let mut unscanned = Unscanned::default();
unscanned.unreadable("locked".to_string(), "Permission denied");
let rules = rules_for(&[]);
let tracked = tracked_baseline(&baseline, &rules, &unscanned);
assert_eq!(sorted_keys(&tracked), vec!["gone.txt", "keep.txt"]);
assert_eq!(local_deletions(&tracked, &local), vec!["gone.txt"]);
// Every tracked path but one is gone, and the guard still lets the
// pass run: one survivor proves the tree is there.
assert!(guard_local_wipe(&tracked, &local).is_ok());
// With everything readable left out, nothing is tracked, so nothing
// can be lost and the guard has nothing to object to.
let mut all = Unscanned::default();
all.unreadable("keep.txt".to_string(), "Permission denied");
all.unreadable("locked".to_string(), "Permission denied");
all.vanished("gone.txt".to_string());
assert!(tracked_baseline(&baseline, &rules, &all).is_empty());
let remote: HashMap<String, RemoteItem> = HashMap::new();
let mut order = classification_order(&local, &remote, &baseline, &rules);
order.retain(|rel| !unscanned.covers(rel));
order.sort_unstable();
assert_eq!(order, vec!["gone.txt", "keep.txt"]);
}
#[test]
fn unscanned_covers_a_path_and_what_is_under_it_but_not_its_siblings() {
let mut unscanned = Unscanned::default();
unscanned.unreadable("a/locked".to_string(), "Permission denied");
unscanned.vanished("b.txt".to_string());
assert!(unscanned.covers("a/locked"));
assert!(unscanned.covers("a/locked/x/y.txt"));
assert!(unscanned.covers("b.txt"));
assert!(!unscanned.covers("a"));
assert!(!unscanned.covers("a/locked2"));
assert!(!unscanned.covers("b.txt.bak"));
// A file that only vanished mid-scan is not worth telling anyone about.
assert_eq!(unscanned.report(), vec!["a/locked (Permission denied)"]);
}
/// B197: a push pass read its deletions from the raw baseline, so a path
/// synced before it became ignored, which the walk skips, was trashed on
/// Drive, and the switch the push pass ran for then evicted the local copy.
#[test]
fn a_push_pass_never_reads_an_ignored_path_as_deleted() {
let mut baseline = baseline_with("notes.md", 1, 1);
baseline.extend(baseline_with("node_modules", 0, 0));
baseline.extend(baseline_with("node_modules/x/index.js", 1, 1));
baseline.extend(baseline_with("old.md", 1, 1));
let local: HashMap<String, LocalItem> = [("notes.md".to_string(), local_item(false))]
.into_iter()
.collect();
let rules = rules_for(&["node_modules/"]);
let tracked = tracked_baseline(&baseline, &rules, &Unscanned::default());
assert_eq!(local_deletions(&tracked, &local), vec!["old.md"]);
}
/// Deletions come out shallowest first, so a trashed folder can take its
/// children with it.
#[test]
fn local_deletions_come_out_shallowest_first() {
let mut baseline = baseline_with("d/e/f.txt", 1, 1);
baseline.extend(baseline_with("d", 0, 0));
baseline.extend(baseline_with("d/e", 0, 0));
let local: HashMap<String, LocalItem> = HashMap::new();
let tracked = tracked_baseline(&baseline, &rules_for(&[]), &Unscanned::default());
assert_eq!(
local_deletions(&tracked, &local),
vec!["d", "d/e", "d/e/f.txt"]
);
}
@@ -2593,6 +2926,94 @@ mod tests {
assert_eq!(reason, None);
}
// ---- B198: going online-only never evicts what Drive does not have -----
#[test]
fn a_fully_synced_mirror_folder_may_go_online_only() {
let (root, baseline) = synced_subtree("evict-synced");
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert_eq!(reason, None);
}
/// The case that lost data: `.git/` is ignored by default, so no pass ever
/// uploads it, and the eviction deleted it with the rest.
#[test]
fn an_ignored_folder_only_this_disk_has_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-ignored");
std::fs::create_dir(root.join(".git")).unwrap();
std::fs::write(root.join(".git/HEAD"), b"ref").unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[".git/"]));
std::fs::remove_dir_all(&root).unwrap();
let reason = reason.expect("an ignored folder is only on this disk");
assert!(
reason.contains(".git") && reason.contains("excluded"),
"{reason}"
);
}
/// An ignored row stays in the baseline for good once its file is gone, so
/// counting it as a deletion not carried up would hold the switch forever.
#[test]
fn a_deleted_ignored_path_does_not_hold_the_switch_back() {
let (root, mut baseline) = synced_subtree("evict-ignored-gone");
baseline.insert(
"build/out.o".to_string(),
StoredSyncEntry {
rel_path: "build/out.o".to_string(),
..baseline["dir/a.txt"].clone()
},
);
let rules = rules_for(&["build/"]);
let ignored = mirror_tree_unsynced(&root, &baseline, &rules);
let tracked = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert_eq!(ignored, None);
assert!(tracked.unwrap().contains("build/out.o"));
}
#[test]
fn an_edit_after_the_last_pass_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-edit");
std::fs::write(root.join("dir/sub/b.txt"), b"edited since").unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("dir/sub/b.txt"));
}
#[test]
fn a_new_file_at_the_root_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-new");
std::fs::write(root.join("new.txt"), b"n").unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("new.txt"));
}
/// The folder B196 now leaves out of the pass instead of failing it is,
/// by the same token, something the eviction must not delete.
#[test]
fn an_unreadable_folder_holds_the_switch_back() {
use std::os::unix::fs::PermissionsExt as _;
let (root, baseline) = synced_subtree("evict-eacces");
let locked = root.join("dir/sub");
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o000)).unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("dir/sub"));
}
#[test]
fn a_symlink_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-symlink");
std::os::unix::fs::symlink("dir/a.txt", root.join("link")).unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("link"));
}
/// The same rule one level up: if the sync root itself cannot be read, the
/// pass sees nothing, and "nothing" must never mean "delete everything".
#[test]
@@ -2607,7 +3028,14 @@ mod tests {
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
let result = walk_local_tree(
&root,
&rules,
&writing,
&mut out,
&mut Unscanned::default(),
&mut progress,
);
std::fs::set_permissions(&root, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
@@ -2628,30 +3056,40 @@ mod tests {
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
assert!(walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress).is_err());
assert!(
walk_local_tree(
&root,
&rules,
&writing,
&mut out,
&mut Unscanned::default(),
&mut progress
)
.is_err()
);
assert!(out.is_empty());
}
/// A name that is not valid UTF-8 cannot be keyed into the scan, so it
/// cannot be compared against the baseline either. Refusing the pass is the
/// only safe reading: skipping it would classify the file as deleted.
/// A name that is not valid UTF-8 cannot be keyed into the scan, but it
/// cannot be in the baseline or on Drive either, so leaving it out reads as
/// the deletion of nothing. It used to fail the pass (B196).
#[test]
fn a_non_utf8_name_fails_the_scan() {
fn a_non_utf8_name_is_left_out_and_reported() {
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt as _;
let root = sync_test_dir("scan-non-utf8");
std::fs::write(root.join(OsStr::from_bytes(b"bad\xffname")), b"x").unwrap();
std::fs::write(root.join("good.txt"), b"y").unwrap();
let rules = rules_for(&[]);
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
let result = scan(&root);
std::fs::remove_dir_all(&root).unwrap();
let error = result.expect_err("a name the scan cannot key must abort the pass");
assert!(error.contains("UTF-8"), "{error}");
let (out, unscanned) = result.unwrap();
assert_eq!(sorted_keys(&out), vec!["good.txt"]);
let report = unscanned.report();
assert_eq!(report.len(), 1);
assert!(report[0].contains("UTF-8"), "{report:?}");
}
/// The complement: a scan that *can* read everything reports everything, so
@@ -2670,9 +3108,14 @@ mod tests {
let writing = HashSet::new();
let mut out = HashMap::new();
let mut seen: Vec<String> = Vec::new();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut |rel| {
seen.push(rel.to_string())
});
let result = walk_local_tree(
&root,
&rules,
&writing,
&mut out,
&mut Unscanned::default(),
&mut |rel| seen.push(rel.to_string()),
);
std::fs::remove_dir_all(&root).unwrap();
result.unwrap();
+5
View File
@@ -98,6 +98,11 @@ pub(super) struct Outcome {
pub(super) errors: usize,
/// Files skipped because another process held them open for writing.
pub(super) deferred: usize,
/// Paths the local scan could not read, left out of the pass. Not part of
/// [`is_empty`](Self::is_empty) or the summary: an unreadable folder stays
/// unreadable from one poll to the next, so the pass reports it once, when
/// the set changes, rather than on every poll.
pub(super) unscanned: Vec<String>,
}
impl Outcome {
+90
View File
@@ -90,6 +90,96 @@ pub(super) fn filter_baseline<'a, B>(
.collect()
}
/// The paths a local scan left out because it could not read them: a folder
/// it has no permission for, an entry that vanished between the listing and
/// its `stat`, a name that is not UTF-8.
///
/// A left-out path is not a deleted one. A pass drops everything an entry
/// covers from classification, exactly as it drops ignored paths, so a
/// baseline row under an unreadable folder is neither read as a local deletion
/// nor answered with a download into a folder the pass cannot write. Failing
/// the whole pass instead is what B55 did, and it left one root-owned folder
/// stopping every other file in the tree from syncing (B196).
#[derive(Default)]
pub(super) struct Unscanned {
covered: HashSet<String>,
/// The subset worth telling the user about, with why: an entry that only
/// vanished mid-scan is not, since the next pass sees it settled.
unreadable: Vec<String>,
}
impl Unscanned {
/// Leave out `rel`, which vanished while the scan looked at it.
pub(super) fn vanished(&mut self, rel: String) {
self.covered.insert(rel);
}
/// Leave out `rel`, which cannot be read for `reason`.
pub(super) fn unreadable(&mut self, rel: String, reason: &str) {
self.unreadable.push(format!("{rel} ({reason})"));
self.covered.insert(rel);
}
/// Whether `rel` is a left-out path or lies under one.
pub(super) fn covers(&self, rel: &str) -> bool {
if self.covered.is_empty() {
return false;
}
let mut at = rel;
loop {
if self.covered.contains(at) {
return true;
}
match at.rfind('/') {
Some(i) => at = &at[..i],
None => return false,
}
}
}
/// The unreadable paths with their reasons, sorted, for the activity feed.
pub(super) fn report(&self) -> Vec<String> {
let mut lines = self.unreadable.clone();
lines.sort_unstable();
lines
}
}
/// The baseline paths a pass can see: [`filter_baseline`], minus everything
/// under a path the scan could not read. This is the set [`guard_local_wipe`]
/// checks and the set a push pass reads deletions from, since a path outside
/// it is absent from the local walk by rule or by failure, never by loss.
pub(super) fn tracked_baseline<'a, B>(
baseline: &'a HashMap<String, B>,
rules: &IgnoreRules,
unscanned: &Unscanned,
) -> HashMap<String, &'a B> {
let mut tracked = filter_baseline(baseline, rules);
tracked.retain(|rel, _| !unscanned.covers(rel));
tracked
}
/// The baseline paths a push pass has to trash on Drive: tracked, and gone
/// from the local walk. Shallowest first, so a trashed folder takes its
/// children with it.
///
/// Built from [`tracked_baseline`] rather than from the raw baseline. Reading
/// it raw trashed every synced path that later became ignored, because the walk
/// skips those, and the switch to on-demand that the push pass runs for then
/// deleted the local copy too (B197).
pub(super) fn local_deletions<B, L>(
tracked: &HashMap<String, &B>,
local: &HashMap<String, L>,
) -> Vec<String> {
let mut missing: Vec<String> = tracked
.keys()
.filter(|rel| !local.contains_key(*rel))
.cloned()
.collect();
missing.sort_by_key(|p| p.matches('/').count());
missing
}
/// Refuse to run a pass whose local side has vanished in its entirety.
///
/// When every baseline path is absent locally, the likely cause is an unavailable
+65
View File
@@ -439,6 +439,10 @@ fn other_computer_row(ui: &Rc<Ui>, dev: &DeviceInfo) -> adw::ActionRow {
menu.item(&gettext("Restore to This Computer…"), move || {
prompt_restore_folders(&ui_c, Some((uid_c.clone(), name_c.clone())))
});
let (ui_c, uid_c, name_c) = (ui.clone(), uid.clone(), name.clone());
menu.item(&gettext("Move to This Computer…"), move || {
prompt_migrate_device(&ui_c, &uid_c, &name_c)
});
menu.section();
let (ui_c, uid_c, name_c) = (ui.clone(), uid.clone(), name.clone());
menu.item(&gettext("Rename…"), move || {
@@ -1096,6 +1100,67 @@ pub(crate) fn prompt_adopt_device(ui: &Rc<Ui>, uid: &str, name: &str) {
dialog.present(win.as_ref());
}
/// Ask before moving another computer's folders into this computer's backup,
/// then offer them for syncing here.
///
/// Destructive-looking on purpose: the other computer keeps its device but
/// loses its folders, and a copy of Proton Drive still running there would
/// watch them vanish.
pub(crate) fn prompt_migrate_device(ui: &Rc<Ui>, uid: &str, name: &str) {
let win = ui_window(ui);
let dialog = adw::AlertDialog::builder()
.heading(gettext("Move Backup to This Computer?"))
// Translators: {name} is the name of the other computer whose folders move to this one.
.body(gettext_f(
"The folders backed up by “{name}” move into this computer's backup in Proton Drive, and you choose where they go on this computer. “{name}” stays in your account, without those folders.\n\nStop Proton Drive on “{name}” first. Otherwise it sees its folders disappear.",
&[("name", name)],
))
.build();
dialog.add_response("cancel", &gettext("Cancel"));
dialog.add_response("move", &gettext("Move Here"));
dialog.set_response_appearance("move", adw::ResponseAppearance::Destructive);
dialog.set_default_response(Some("cancel"));
dialog.set_close_response("cancel");
let ui = ui.clone();
let uid = uid.to_string();
// Translators: {name} is the name of the computer whose folders moved to this one.
let done = gettext_f("Moved the backup of “{name}”", &[("name", name)]);
dialog.connect_response(None, move |_, resp| {
if resp != "move" {
return;
}
ui.busy_begin();
let rx = spawn_request(
ui.dirs.control_socket(),
Request::MigrateDevice { uid: uid.clone() },
);
let (ui, done) = (ui.clone(), done.clone());
glib::spawn_future_local(async move {
let result = rx.recv().await;
ui.busy_end();
let failed = gettext("Couldn't move that backup");
match result {
Ok(Ok(Response::Ok { .. })) => {
reload_sync_pages(&ui);
toast(&ui, &done);
// The folders are this computer's now, so its own restore
// picker is where the user chooses their local paths.
prompt_restore_folders(&ui, None);
}
Ok(Ok(Response::Error { message, kind })) => {
toast_failure(&ui, &failed, &message, kind)
}
_ => toast_error(
&ui,
&failed,
&gettext("The Proton Drive service didn't respond."),
),
}
});
});
dialog.present(win.as_ref());
}
/// Run a mutation raised from Computers or Locations and reload the page on success.
pub(crate) fn run_devices_mutation(ui: &Rc<Ui>, req: Request, done: &str, failed: &str) {
ui.busy_begin();
+10 -2
View File
@@ -310,8 +310,10 @@ its changes go through the queue like My files.
A filesystem watcher (`notify`) and a remote poll every 120 s feed a debounced pass (2 s, at most
30 s). Passes are serialized per daemon. A pass:
1. **Walks the local tree.** Any `readdir`, metadata or permission failure marks the scan
incomplete, and an incomplete scan cannot delete anything.
1. **Walks the local tree.** A path the user may not read, an entry that vanishes mid-scan and a
name that is not UTF-8 are left out, and the pass drops everything under them, as it drops
ignored paths, so a left-out path is never read as deleted. An unreadable root and any other
I/O error fail the pass.
2. **Walks the remote tree.**
3. **Loads the baseline**, the `sync_entry` rows: both sides as of the last successful pass.
4. **Classifies each path** by comparing local, remote and baseline, with `(mtime, size)` as the
@@ -377,6 +379,12 @@ Restore lists the device's folders, proposes a local path from the profile, and
adds a synced folder bound to the remote uid. The download is an ordinary pass against an empty
baseline. The user side is in [RECOVERY.md](RECOVERY.md).
`Core::migrate_device` moves another device's top-level folders under this machine's device root.
Device roots are separate shares on the main volume, so each folder is one server-side move that
keeps its uid. A name already taken here gets the other device's name as a suffix. A synced folder
that already tracked one of them keeps its `remote_uid` and only has its `remote_share_id`
re-pointed. The moved folders are then offered by the ordinary restore.
---
## 8. Control protocol
+96
View File
@@ -100,6 +100,9 @@ a live account since.
| Entry | Title |
|---|---|
| [B198](#b198--switching-to-online-only-deletes-local-files-that-never-reached-drive) | Switching to online-only deletes local files that never reached Drive |
| [B197](#b197--switching-to-online-only-trashes-synced-files-that-became-ignored) | Switching to online-only trashes synced files that became ignored |
| [B196](#b196--one-unreadable-folder-stops-the-whole-synced-folder-from-syncing) | One unreadable folder stops the whole synced folder from syncing |
| [B195](#b195--the-app-crashes-when-proton-asks-for-a-captcha-on-secureblue) | The app crashes when Proton asks for a CAPTCHA on secureblue |
| [B193](#b193--deleting-a-file-whose-create-failed-can-trash-a-file-of-the-users-on-drive) | Deleting a file whose create failed can trash a file of the user's on Drive |
| [B191](#b191--a-file-deleted-after-its-create-failed-and-was-written-again-can-stay-on-drive) | A file deleted after its create failed and was written again can stay on Drive |
@@ -298,6 +301,95 @@ a live account since.
Newest first.
### B198 — Switching to online-only deletes local files that never reached Drive
**Status:** Fixed (unverified).
**Found:** 2026-10-08, reading the switch while fixing B196.
**Where:** `crates/pdfs-fuse/src/devices.rs`, `Core::apply_sync_folder_mode`;
`crates/pdfs-fuse/src/sync.rs`, `mirror_tree_unsynced`
**Repro:** Mirror a project folder with a `.git/` in it, then switch it to **Online only**.
`.git/` is gone from the disk and was never on Drive.
**Cause.** The switch evicts the whole local tree once the folder is `idle`. `idle` only says the
last pass applied everything it tried, and a pass never tries an ignored path (`.git/` is ignored
by default), a symlink, or a folder it cannot read (B196). It also defers a file that is open for
writing without leaving `idle`, and a file can change after the pass ends. The eviction deleted
all of those.
**Fix.** Before the mode is written and anything is evicted, the switch walks the folder against
the baseline, as a move out of a mirror folder already does, and refuses when something is only on
this disk. The message names the path; an ignored one is called excluded from sync. A tracked file
deleted here but not yet on Drive also refuses. An ignored one does not, since its baseline row
stays for good and would hold the switch forever.
**Test:** unit tests `a_fully_synced_mirror_folder_may_go_online_only`,
`an_ignored_folder_only_this_disk_has_holds_the_switch_back`,
`a_deleted_ignored_path_does_not_hold_the_switch_back`,
`an_edit_after_the_last_pass_holds_the_switch_back`, `a_new_file_at_the_root_holds_the_switch_back`,
`an_unreadable_folder_holds_the_switch_back` and `a_symlink_holds_the_switch_back`. The switch
itself has not been driven against a live account.
---
### B197 — Switching to online-only trashes synced files that became ignored
**Status:** Fixed (unverified).
**Found:** 2026-10-08, reading the push pass while fixing B196.
**Where:** `crates/pdfs-fuse/src/sync.rs`, `Core::push_pass`; `crates/pdfs-fuse/src/sync/planner.rs`,
`local_deletions`
**Repro:** Mirror a folder until `build/` is on Drive, add `build/` to `.pdfsignore`, then switch
the folder to **Online only**. `build/` goes to the Drive trash, and the switch then deletes the
local copy.
**Cause.** The push pass that runs before the switch read its deletions as "in the baseline, not in
the local walk". The walk skips ignored paths, so every synced path that later became ignored read
as deleted. A full pass does not do this: it drops ignored paths from classification, which is
what the user guide promises ("Ignoring never deletes anything").
**Fix.** The push pass reads its deletions from the same filtered baseline the wipe guard checks:
without ignored paths, and without paths the scan could not read (B196).
**Test:** unit tests `a_push_pass_never_reads_an_ignored_path_as_deleted` and
`local_deletions_come_out_shallowest_first`.
---
### B196 — One unreadable folder stops the whole synced folder from syncing
**Status:** Fixed (unverified). The reporter has not run the fix yet.
**Found:** 2026-10-08, [#33](https://github.com/narrrl/proton-drive-linux/issues/33). A synced
`~/Documents` held a restic cache a Docker container had created, which the user may not read.
Every pass failed with `Couldn't sync Documents: read …/restic/cache/…/snapshots: Permission
denied`, and nothing else in `Documents` synced.
**Where:** `crates/pdfs-fuse/src/sync.rs`, `walk_local_tree`; `crates/pdfs-fuse/src/sync/planner.rs`,
`Unscanned`
**Repro:** In a mirror folder, `sudo mkdir locked && sudo chmod 700 locked`, then sync.
**Cause.** B55 made every scan failure fatal to the pass, because a path left out of the scan read
as a local deletion and was trashed on Drive. That was safe, but a folder the user may not read is
not transient: the pass failed on every poll, for good. The same held for a file deleted between
the listing and its `stat`, which a busy folder hits now and then, and for a name that is not UTF-8.
**Fix.** The scan leaves such a path out and records it, and the pass drops everything under it
from classification, the wipe guard and the push pass's deletions, as it already did for ignored
paths. A left-out path is then neither deleted on Drive nor downloaded into. A folder that lists
but does not allow `stat` is left out whole. An unreadable or absent root, and every other I/O
error, still fails the pass. The activity feed names the unreadable paths once each time the set
changes, and the folder stays `idle`. Adding the folder to `.pdfsignore` was already a workaround
and still silences the report.
**Test:** unit tests `an_unreadable_subdirectory_is_left_out_and_the_rest_scans`,
`a_listable_but_unsearchable_folder_is_left_out_whole`,
`a_path_the_scan_left_out_is_never_a_local_deletion`,
`unscanned_covers_a_path_and_what_is_under_it_but_not_its_siblings` and
`a_non_utf8_name_is_left_out_and_reported`. `an_unreadable_root_fails_the_scan` and
`an_absent_root_fails_the_scan` still hold.
---
### B195 — The app crashes when Proton asks for a CAPTCHA on secureblue
**Status:** Fixed (unverified). Nobody has run the fix on secureblue yet.
@@ -4822,6 +4914,10 @@ subdirectory holding a file, asserting the error names the subtree),
strictness must not cost a working pass, so a healthy tree still reports every entry and still
skips symlinks by design.
B196 later relaxed this: a path the user may not read, an entry that vanishes mid-scan and a name
that is not UTF-8 are left out of the pass instead of failing it, and the pass drops everything
under them from classification, so the B55 guarantee holds without the wedge.
Not covered: transient I/O errors, and an entry that disappears between `read_dir` and `stat`.
Both are races that would need a filesystem shim to force; the code path they take is the same
`symlink_metadata` failure the permission test drives.
+21
View File
@@ -11,6 +11,27 @@ scratch (user data in `staging/` and `recovery/` is never touched by this).
## [Unreleased]
### Fixed
- **One unreadable folder stopped a synced folder from syncing at all.** A folder you may not
read, such as a cache a container created, failed every pass, so nothing else in the synced
folder reached Drive. Such a folder is now left out and named once in the activity feed, and
everything around it syncs. A file deleted during a scan, and a name that is not UTF-8, no
longer fail the pass either.
([#33](https://github.com/narrrl/proton-drive-linux/issues/33))
- **Switching a folder to online-only could delete files that were never on Drive.** Ignored
folders such as `.git/`, symlinks, unreadable folders and files changed after the last sync were
deleted with the local copy. The switch now refuses and names what is only on this computer.
- **Switching to online-only trashed synced files that had become ignored.** Adding a synced path
to `.pdfsignore` and then switching moved it to the Drive trash. Ignoring never deletes now, as
the user guide says.
### Added
- **Move another computer's backup to this one.** **Move to This Computer…** on the Computers page,
or `pdfs devices migrate UID`, moves every folder another computer backs up, for example an old
Windows PC, into this computer's backup on Proton Drive. Then it offers them for syncing here. The
folders move on Proton Drive itself, so nothing is uploaded again. The other computer stays in the
account, without those folders.
## [3.1.2] — 2026-10-08
Schema: **42**, unchanged.
+1
View File
@@ -103,6 +103,7 @@ commands are for scripts and for cases where the mount is not available.
| `pdfs devices rename UID NAME` | Rename a computer. |
| `pdfs devices rm UID` | Remove a computer and its backup from the account. |
| `pdfs devices adopt UID` | Make this machine continue another computer's backup, for example after a reinstall. `--clear` returns to matching by hostname. |
| `pdfs devices migrate UID [--yes]` | Move another computer's folders into this computer's backup, then restore them here like `pdfs sync restore`. The other computer stays registered, without those folders. `--yes` skips the confirmation and accepts every proposed path. See [RECOVERY.md](RECOVERY.md). |
## Trash
+23
View File
@@ -133,6 +133,29 @@ pdfs sync restore --device UID
The folders stay part of the other computer's backup and sync in both directions. This machine
does not take over that computer's backup.
### Moving another computer's backup here
To switch computers for good, for example from a Windows PC to this Linux machine, move the old
computer's folders into this computer's backup instead. Use **Move to This Computer…** on that
computer's row, or:
```bash
pdfs devices list # find the old computer's UID
pdfs devices migrate UID
```
Each folder moves on Proton Drive itself, so nothing is uploaded again and no storage is used
twice. A folder whose name this computer already uses gets the old computer's name added, for
example `Documents (DESKTOP-1)`. The restore picker then opens, as in
[Step 3](#step-3-restore-the-folders), so you choose where each folder goes here.
The old computer stays in your account, without those folders. Unlike
[adoption](#step-2-continue-the-old-computers-backup), this machine keeps its own name and backup.
> [!WARNING]
> Stop Proton Drive on the old computer first. A client still running there sees its folders
> disappear, and may upload them again as new.
## 3. How the restore works
This section is for the curious and for anyone debugging a restore.
+9 -1
View File
@@ -96,7 +96,9 @@ app and in the web app.
Each synced folder can also be switched to **Online only**. The local copy is replaced by a mount
of the folder, so the files stay visible but take no disk space until opened. Switch with the
**Synced / Online only** switch on the folder's card, or `pdfs sync mode <id> ondemand` and back
with `pdfs sync mode <id> mirror`. `pdfs locations` lists every local place the service occupies.
with `pdfs sync mode <id> mirror`. The switch waits until everything in the folder is on Proton
Drive, and refuses while the folder holds something that never goes there: an ignored path such
as `.git/`, a symlink, or a folder you may not read. The message names it. `pdfs locations` lists every local place the service occupies.
### Moving between synced folders and My files
@@ -146,6 +148,9 @@ places, and both apply:
Rules are re-read on every pass. Ignoring never deletes anything: a file that becomes ignored is
simply no longer tracked, and its copy on Proton Drive stays.
A folder you may not read, such as a cache a container created as root, is skipped the same way,
and the activity feed names it once. Add it to `.pdfsignore` to stop that message.
## Changes waiting for Proton Drive
A change you made in the Proton Drive folder exists only on this computer until it reaches
@@ -278,6 +283,9 @@ Proton Drive keeps earlier versions of every file. **Details → Versions…** i
**Restore to This Computer…** downloads its folders here.
- **Continue This Backup Here…** makes this computer take over another computer's backup, for
example after reinstalling or replacing a machine. See [RECOVERY.md](RECOVERY.md).
- **Move to This Computer…** moves another computer's folders into this computer's backup, for
example when you switch from Windows to Linux, and then offers them for syncing here. The other
computer stays in the list, without those folders.
## Search launcher
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux-bin
pkgdesc = Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (binaries)
pkgver = 3.1.1
pkgver = 3.1.2
pkgrel = 1
url = https://proton-drive.narl.io
arch = x86_64
@@ -21,21 +21,21 @@ pkgbase = proton-drive-for-linux-bin
optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding
provides = proton-drive-for-linux=3.1.1
provides = proton-drive-linux=3.1.1
provides = proton-drive-for-linux=3.1.2
provides = proton-drive-linux=3.1.2
provides = pdfs
conflicts = proton-drive-linux
conflicts = proton-drive-for-linux
conflicts = proton-drive-for-linux-git
options = !strip
options = !debug
source = proton-drive-linux-3.1.1-x86_64.tar.gz::https://github.com/narrrl/proton-drive-linux/releases/download/v3.1.1/proton-drive-linux-3.1.1-x86_64.tar.gz
source = io.narl.proton-drive-linux-3.1.1.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux.desktop
source = io.narl.proton-drive-linux-tray-3.1.1.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux-tray.desktop
source = io.narl.proton-drive-linux-3.1.1.svg::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux.svg
source = proton-drive-3.1.1.service::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/proton-drive.service
source = LICENSE-3.1.1::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/LICENSE
sha256sums = e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6
source = proton-drive-linux-3.1.2-x86_64.tar.gz::https://github.com/narrrl/proton-drive-linux/releases/download/v3.1.2/proton-drive-linux-3.1.2-x86_64.tar.gz
source = io.narl.proton-drive-linux-3.1.2.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/io.narl.proton-drive-linux.desktop
source = io.narl.proton-drive-linux-tray-3.1.2.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/io.narl.proton-drive-linux-tray.desktop
source = io.narl.proton-drive-linux-3.1.2.svg::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/io.narl.proton-drive-linux.svg
source = proton-drive-3.1.2.service::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/proton-drive.service
source = LICENSE-3.1.2::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/LICENSE
sha256sums = 71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7
sha256sums = d190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123
sha256sums = 1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0
sha256sums = e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux-bin
pkgver=3.1.1
pkgver=3.1.2
pkgrel=1
pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (binaries)"
arch=('x86_64')
@@ -34,7 +34,7 @@ source=("proton-drive-linux-$pkgver-x86_64.tar.gz::$_repo/releases/download/$_ta
"io.narl.proton-drive-linux-$pkgver.svg::$_raw/packaging/io.narl.proton-drive-linux.svg"
"proton-drive-$pkgver.service::$_raw/packaging/proton-drive.service"
"LICENSE-$pkgver::$_raw/LICENSE")
sha256sums=('e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6'
sha256sums=('71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7'
'd190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123'
'1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0'
'e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828'
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux-git
pkgdesc = Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (git)
pkgver = 3.1.1.r0.gedd62c5
pkgver = 3.1.2.r0.g07c9b67
pkgrel = 1
url = https://proton-drive.narl.io
arch = x86_64
@@ -24,8 +24,8 @@ pkgbase = proton-drive-for-linux-git
optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding
provides = proton-drive-for-linux=3.1.1.r0.gedd62c5
provides = proton-drive-linux=3.1.1.r0.gedd62c5
provides = proton-drive-for-linux=3.1.2.r0.g07c9b67
provides = proton-drive-linux=3.1.2.r0.g07c9b67
provides = pdfs
conflicts = proton-drive-linux
conflicts = proton-drive-for-linux
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux-git
pkgver=3.1.1.r0.gedd62c5
pkgver=3.1.2.r0.g07c9b67
pkgrel=1
pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (git)"
arch=('x86_64')
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux
pkgdesc = Unofficial Proton Drive client: files-on-demand FUSE mount, CLI, GTK4 app and tray
pkgver = 3.1.1
pkgver = 3.1.2
pkgrel = 1
url = https://proton-drive.narl.io
arch = x86_64
@@ -23,13 +23,13 @@ pkgbase = proton-drive-for-linux
optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding
provides = proton-drive-linux=3.1.1
provides = proton-drive-linux=3.1.2
provides = pdfs
conflicts = proton-drive-linux
conflicts = proton-drive-for-linux-bin
conflicts = proton-drive-for-linux-git
options = !lto
source = proton-drive-for-linux-3.1.1.tar.gz::https://github.com/narrrl/proton-drive-linux/archive/refs/tags/v3.1.1.tar.gz
sha256sums = c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256
source = proton-drive-for-linux-3.1.2.tar.gz::https://github.com/narrrl/proton-drive-linux/archive/refs/tags/v3.1.2.tar.gz
sha256sums = 260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1
pkgname = proton-drive-for-linux
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux
pkgver=3.1.1
pkgver=3.1.2
pkgrel=1
pkgdesc="Unofficial Proton Drive client: files-on-demand FUSE mount, CLI, GTK4 app and tray"
arch=('x86_64')
@@ -24,7 +24,7 @@ conflicts=('proton-drive-linux' 'proton-drive-for-linux-bin' 'proton-drive-for-l
# LTO has broken GTK/Rust links for this workspace; the release profile keeps it off.
options=('!lto')
source=("$pkgname-$pkgver.tar.gz::$_repo/archive/refs/tags/v$pkgver.tar.gz")
sha256sums=('c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256')
sha256sums=('260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1')
_srcname="proton-drive-linux-$pkgver"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: German\n"
@@ -90,7 +90,7 @@ msgstr "Von mir geteilt"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computer"
@@ -266,11 +266,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -316,7 +317,7 @@ msgstr "Drive durchsuchen"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -358,7 +359,7 @@ msgstr "Raster / Liste"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Umbenennen"
@@ -686,7 +687,7 @@ msgid "Couldn't add a sync folder"
msgstr "Synchronisierungsordner konnte nicht hinzugefügt werden"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Ordner konnten nicht wiederhergestellt werden"
@@ -1266,10 +1267,11 @@ msgstr "Alben konnten nicht geladen werden"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1301,7 +1303,7 @@ msgstr "Der Proton-Drive-Dienst hat nicht geantwortet."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1315,7 +1317,7 @@ msgstr "Öffnen"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Umbenennen …"
@@ -1583,7 +1585,7 @@ msgstr "Symbolgröße"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1741,7 +1743,7 @@ msgid "New Folder…"
msgstr "Neuer Ordner …"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1886,7 +1888,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Neuer Name"
@@ -1916,6 +1918,7 @@ msgid "Choose the folder to move into."
msgstr "Den Zielordner auswählen."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Hierher verschieben"
@@ -2147,99 +2150,103 @@ msgstr "Dateien durchsuchen"
msgid "Restore to This Computer…"
msgstr "Auf diesem Computer wiederherstellen …"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Auf diesen Computer verschieben …"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Diese Sicherung hier fortsetzen …"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Entfernen …"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · letzte Sicherung {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · noch keine Sicherungen"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Noch keine Ordner gesichert"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} Ordner gesichert"
msgstr[1] "{n} Ordner gesichert"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} erfordert Aufmerksamkeit"
msgstr[1] "{folders} · {n} erfordern Aufmerksamkeit"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "wird synchronisiert …"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "Synchronisierungsfehler"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "erfordert Aufmerksamkeit"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "aktuell"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "wird auf Änderungen geprüft …"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "wird auf Änderungen geprüft – {done} von {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "{done} von {total} wird synchronisiert"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "{file} wird synchronisiert – {done} von {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Ordner zur Synchronisierung hinzufügen"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Ordner wird synchronisiert …"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Ordner konnte nicht hinzugefügt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Wiederherstellbare Ordner konnten nicht aufgelistet werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2247,19 +2254,19 @@ msgstr ""
"Die Ordner ankreuzen, die mit diesem Rechner synchronisiert werden sollen, "
"und für jeden den Speicherort anpassen."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Ordner wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Ordner werden wiederhergestellt …"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2268,37 +2275,37 @@ msgstr ""
"Diese Ordner werden von „{name}“ gesichert. Wiederhergestellte Ordner werden "
"weiterhin mit der Kopie dieses Computers synchronisiert."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Diese Ordner werden in Proton Drive unter diesem Computer gesichert."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nichts wiederherzustellen – alle Ordner von „{name}“ werden bereits hier "
"synchronisiert."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nichts wiederherzustellen – alle Ordner dieses Computers werden bereits hier "
"synchronisiert."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Ordner wird auf „Nur online“ umgestellt"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Ordner wird heruntergeladen und bleibt synchronisiert"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Modus konnte nicht geändert werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2316,7 +2323,7 @@ msgstr ""
"Ordner auf „Synchronisiert“ umstellen und vor dem Entfernen warten, bis der "
"Download abgeschlossen ist."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2330,68 +2337,68 @@ msgstr ""
"mehr synchronisiert. Es kann zusätzlich ausgewählt werden, die Kopie in "
"Proton Drive zu löschen."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Synchronisierung des Ordners beenden?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Auch aus Proton Drive löschen"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Löscht die einzige Kopie dieser Dateien."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "Die lokale Kopie bleibt unverändert."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Synchronisierung beenden"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Synchronisierung des Ordners beendet"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Synchronisierung des Ordners konnte nicht beendet werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Computer umbenennen"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "„{name}“ umbenennen."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Der Computer konnte nicht umbenannt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Ein Name ist erforderlich."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer umbenannt"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Zur Bestätigung „{name}“ eingeben"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Computer entfernen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2406,25 +2413,25 @@ msgstr ""
"gelöscht. Die Dateien auf dem Computer selbst bleiben unberührt – dies kann "
"jedoch von hier aus nicht rückgängig gemacht werden."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Entfernen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer entfernt"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Der Computer konnte nicht entfernt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Diese Sicherung hier fortsetzen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2443,20 +2450,50 @@ msgstr ""
"werden nicht verschoben. Mit „Auf diesem Computer wiederherstellen“ lässt "
"sich danach zurückholen, was „{name}“ synchronisiert hat."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Hier fortsetzen"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Sicherung jetzt als „{name}“"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Diese Sicherung konnte hier nicht fortgesetzt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Sicherung auf diesen Computer verschieben?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Die von „{name}“ gesicherten Ordner werden in Proton Drive in die Sicherung "
"dieses Computers verschoben, und Sie wählen, wo sie auf diesem Computer "
"liegen. „{name}“ bleibt in Ihrem Konto, ohne diese Ordner.\n"
"\n"
"Beenden Sie Proton Drive zuerst auf „{name}“. Sonst sieht es seine Ordner "
"verschwinden."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Sicherung von „{name}“ verschoben"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Diese Sicherung konnte nicht verschoben werden"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+112 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: English (United Kingdom)\n"
@@ -90,7 +90,7 @@ msgstr "Shared by me"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computers"
@@ -262,11 +262,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -312,7 +313,7 @@ msgstr "Search Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -354,7 +355,7 @@ msgstr "Grid / list"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Rename"
@@ -678,7 +679,7 @@ msgid "Couldn't add a sync folder"
msgstr "Couldn't add a sync folder"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Couldn't restore folders"
@@ -1254,10 +1255,11 @@ msgstr "Couldn't load albums"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1289,7 +1291,7 @@ msgstr "The Proton Drive service didn't respond."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1303,7 +1305,7 @@ msgstr "Open"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Rename…"
@@ -1571,7 +1573,7 @@ msgstr "Icon size"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1725,7 +1727,7 @@ msgid "New Folder…"
msgstr "New Folder…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1867,7 +1869,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "New name"
@@ -1897,6 +1899,7 @@ msgid "Choose the folder to move into."
msgstr "Choose the folder to move into."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Move Here"
@@ -2124,99 +2127,103 @@ msgstr "Browse Files"
msgid "Restore to This Computer…"
msgstr "Restore to This Computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Move to This Computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continue This Backup Here…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Remove…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · last backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · no backups yet"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "No folders backed up yet"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} folder backed up"
msgstr[1] "{n} folders backed up"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} needs attention"
msgstr[1] "{folders} · {n} need attention"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "syncing…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "sync error"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "needs attention"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "up to date"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "checking for changes…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "checking for changes — {done} of {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "syncing {done} of {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "syncing {file} — {done} of {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Add Folder to Sync"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Syncing folder…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Couldn't add folder"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Couldn't list folders to restore"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2224,19 +2231,19 @@ msgstr ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restore Folders"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restore"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restoring folders…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2245,33 +2252,33 @@ msgstr ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
"with that computer's copy."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "These folders are backed up under this computer in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "Nothing to restore — “{name}”'s folders are all synced here."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "Nothing to restore — this computer's folders are all synced here."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Folder will switch to online only"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Folder will download and stay synced"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Couldn't change mode"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2288,7 +2295,7 @@ msgstr ""
"copy, cancel, switch the folder to Synced, and wait for the download to "
"finish before removing it."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2301,68 +2308,68 @@ msgstr ""
"The local files stay on this disk and simply stop being synced. Choose "
"whether to also delete the copy in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Stop Syncing Folder?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Also delete from Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Deletes the only copy of these files."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "The local copy is unaffected."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Stop Syncing"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Stopped syncing folder"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Couldn't stop syncing the folder"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Rename Computer"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Rename “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Couldn't rename the computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "A name is required."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer renamed"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Type “{name}” to confirm"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Remove Computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2377,25 +2384,25 @@ msgstr ""
"on that computer itself are not touched — but this cannot be undone from "
"here."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Remove"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer removed"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Couldn't remove the computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continue This Backup Here?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2414,20 +2421,49 @@ msgstr ""
"“Restore to This Computer” afterwards to bring back what “{name}” was "
"syncing."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continue Here"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Now backing up as “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Couldn't continue that backup here"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Move Backup to This Computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Moved the backup of “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Couldn't move that backup"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Spanish\n"
@@ -90,7 +90,7 @@ msgstr "Compartido por mí"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Equipos"
@@ -264,11 +264,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -314,7 +315,7 @@ msgstr "Buscar en Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -356,7 +357,7 @@ msgstr "Cuadrícula / lista"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Renombrar"
@@ -683,7 +684,7 @@ msgid "Couldn't add a sync folder"
msgstr "No se pudo añadir una carpeta sincronizada"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "No se pudieron restaurar las carpetas"
@@ -1260,10 +1261,11 @@ msgstr "No se pudieron cargar los álbumes"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1295,7 +1297,7 @@ msgstr "El servicio de Proton Drive no respondió."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1309,7 +1311,7 @@ msgstr "Abrir"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Renombrar…"
@@ -1577,7 +1579,7 @@ msgstr "Tamaño de los iconos"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1732,7 +1734,7 @@ msgid "New Folder…"
msgstr "Carpeta nueva…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1878,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nombre nuevo"
@@ -1908,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Elija la carpeta de destino."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Mover aquí"
@@ -2136,99 +2139,103 @@ msgstr "Examinar archivos"
msgid "Restore to This Computer…"
msgstr "Restaurar en este equipo…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Mover a este equipo…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continuar esta copia de seguridad aquí…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Quitar…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · última copia de seguridad {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · aún no hay copias de seguridad"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Aún no hay carpetas con copia de seguridad"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} carpeta con copia de seguridad"
msgstr[1] "{n} carpetas con copia de seguridad"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requiere atención"
msgstr[1] "{folders} · {n} requieren atención"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "error de sincronización"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "requiere atención"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "actualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "buscando cambios…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "buscando cambios: {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "sincronizando {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "sincronizando {file}: {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Añadir carpeta para sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Sincronizando la carpeta…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "No se pudo añadir la carpeta"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "No se pudieron listar las carpetas para restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2236,19 +2243,19 @@ msgstr ""
"Marque las carpetas que sincronizar con esta máquina y ajuste dónde debe "
"estar cada una."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restaurar carpetas"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restaurando carpetas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2257,36 +2264,36 @@ msgstr ""
"Estas carpetas tienen copia de seguridad desde “{name}”. Las carpetas "
"restauradas siguen sincronizándose con la copia de ese equipo."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
"Estas carpetas tienen copia de seguridad bajo este equipo en Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nada que restaurar: todas las carpetas de “{name}” ya se sincronizan aquí."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nada que restaurar: todas las carpetas de este equipo ya se sincronizan aquí."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "La carpeta pasará a solo en línea"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "La carpeta se descargará y permanecerá sincronizada"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "No se pudo cambiar el modo"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2303,7 +2310,7 @@ msgstr ""
"Para conservar una copia local, cancele, cambie la carpeta a Sincronizada y "
"espere a que termine la descarga antes de quitarla."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2316,68 +2323,68 @@ msgstr ""
"Los archivos locales permanecen en este disco y simplemente dejan de "
"sincronizarse. Elija si quiere eliminar también la copia en Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "¿Dejar de sincronizar la carpeta?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Eliminar también de Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Elimina la única copia de estos archivos."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "La copia local no se ve afectada."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Dejar de sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Se dejó de sincronizar la carpeta"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "No se pudo dejar de sincronizar la carpeta"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Renombrar equipo"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Renombrar “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "No se pudo renombrar el equipo"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Se necesita un nombre."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Equipo renombrado"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Escriba “{name}” para confirmar"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "¿Quitar el equipo?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2391,25 +2398,25 @@ msgstr ""
"Todo lo que respaldó en Proton Drive se eliminará con él. Los archivos de "
"ese equipo no se tocan, pero esto no se puede deshacer desde aquí."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Quitar"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Equipo quitado"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "No se pudo quitar el equipo"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "¿Continuar esta copia de seguridad aquí?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2428,20 +2435,50 @@ msgstr ""
"no se mueven. Después, use “Restaurar en este equipo” para recuperar lo que "
"“{name}” sincronizaba."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continuar aquí"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Ahora se hace copia de seguridad como “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "No se pudo continuar esa copia de seguridad aquí"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "¿Mover la copia de seguridad a este equipo?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Las carpetas de las que “{name}” hace copia de seguridad pasan a la copia de "
"seguridad de este equipo en Proton Drive, y tú eliges dónde van en este "
"equipo. “{name}” sigue en tu cuenta, sin esas carpetas.\n"
"\n"
"Cierra primero Proton Drive en “{name}”. Si no, verá desaparecer sus "
"carpetas."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Se movió la copia de seguridad de “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "No se pudo mover esa copia de seguridad"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: French\n"
@@ -90,7 +90,7 @@ msgstr "Partagés par moi"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Ordinateurs"
@@ -266,11 +266,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -316,7 +317,7 @@ msgstr "Rechercher dans Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -358,7 +359,7 @@ msgstr "Grille / liste"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Renommer"
@@ -686,7 +687,7 @@ msgid "Couldn't add a sync folder"
msgstr "Impossible d’ajouter un dossier synchronisé"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Impossible de restaurer les dossiers"
@@ -1271,10 +1272,11 @@ msgstr "Impossible de charger les albums"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1306,7 +1308,7 @@ msgstr "Le service Proton Drive n’a pas répondu."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1320,7 +1322,7 @@ msgstr "Ouvrir"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Renommer…"
@@ -1588,7 +1590,7 @@ msgstr "Taille des icônes"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1744,7 +1746,7 @@ msgid "New Folder…"
msgstr "Nouveau dossier…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1890,7 +1892,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nouveau nom"
@@ -1920,6 +1922,7 @@ msgid "Choose the folder to move into."
msgstr "Choisissez le dossier de destination."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Déplacer ici"
@@ -2149,99 +2152,103 @@ msgstr "Parcourir les fichiers"
msgid "Restore to This Computer…"
msgstr "Restaurer sur cet ordinateur…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Déplacer vers cet ordinateur…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continuer cette sauvegarde ici…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Retirer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · dernière sauvegarde {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · aucune sauvegarde pour l’instant"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Aucun dossier sauvegardé pour l’instant"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} dossier sauvegardé"
msgstr[1] "{n} dossiers sauvegardés"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requiert votre attention"
msgstr[1] "{folders} · {n} requièrent votre attention"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "synchronisation…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "erreur de synchronisation"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "attention requise"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "à jour"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "recherche de modifications…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "recherche de modifications — {done} sur {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "synchronisation de {done} sur {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "synchronisation de {file} — {done} sur {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Ajouter un dossier à synchroniser"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Synchronisation du dossier…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Impossible d’ajouter le dossier"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Impossible de lister les dossiers à restaurer"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2249,19 +2256,19 @@ msgstr ""
"Cochez les dossiers à synchroniser sur cette machine et ajustez "
"l’emplacement de chacun."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restaurer les dossiers"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restaurer"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restauration des dossiers…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2270,35 +2277,35 @@ msgstr ""
"Ces dossiers sont sauvegardés depuis « {name} ». Les dossiers restaurés "
"restent synchronisés avec la copie de cet ordinateur."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Ces dossiers sont sauvegardés sous cet ordinateur dans Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Rien à restaurer — les dossiers de « {name} » sont tous synchronisés ici."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Rien à restaurer — les dossiers de cet ordinateur sont tous synchronisés ici."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Le dossier passera en ligne uniquement"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Le dossier va être téléchargé et rester synchronisé"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Impossible de changer de mode"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2315,7 +2322,7 @@ msgstr ""
"arrêtée. Pour conserver une copie locale, annulez, passez le dossier en "
"« Synchronisé » et attendez la fin du téléchargement avant de le retirer."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2329,68 +2336,68 @@ msgstr ""
"synchronisés. Choisissez s’il faut aussi supprimer la copie dans Proton "
"Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Arrêter la synchronisation du dossier ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Supprimer aussi de Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Supprime l’unique copie de ces fichiers."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "La copie locale n’est pas affectée."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Arrêter la synchronisation"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Synchronisation du dossier arrêtée"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Impossible d’arrêter la synchronisation du dossier"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Renommer l’ordinateur"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Renommer « {name} »."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Impossible de renommer l’ordinateur"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Un nom est requis."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Ordinateur renommé"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Saisissez « {name} » pour confirmer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Retirer l’ordinateur ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2405,25 +2412,25 @@ msgstr ""
"fichiers présents sur cet ordinateur ne sont pas touchés — mais cette action "
"ne peut pas être annulée d’ici."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Retirer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Ordinateur retiré"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Impossible de retirer l’ordinateur"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continuer cette sauvegarde ici ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2442,20 +2449,50 @@ msgstr ""
"ne sont pas déplacés. Utilisez ensuite « Restaurer sur cet ordinateur » pour "
"récupérer ce que « {name} » synchronisait."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continuer ici"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Sauvegarde désormais en tant que « {name} »"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Impossible de continuer cette sauvegarde ici"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Déplacer la sauvegarde vers cet ordinateur ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Les dossiers sauvegardés par « {name} » passent dans la sauvegarde de cet "
"ordinateur dans Proton Drive, et vous choisissez où les placer sur cet "
"ordinateur. « {name} » reste dans votre compte, sans ces dossiers.\n"
"\n"
"Arrêtez d'abord Proton Drive sur « {name} ». Sinon, il verra ses dossiers "
"disparaître."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Sauvegarde de « {name} » déplacée"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Impossible de déplacer cette sauvegarde"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Italian\n"
@@ -90,7 +90,7 @@ msgstr "Condivisi da me"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computer"
@@ -262,11 +262,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -312,7 +313,7 @@ msgstr "Cerca in Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -354,7 +355,7 @@ msgstr "Griglia / elenco"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Rinomina"
@@ -682,7 +683,7 @@ msgid "Couldn't add a sync folder"
msgstr "Impossibile aggiungere una cartella sincronizzata"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Impossibile ripristinare le cartelle"
@@ -1265,10 +1266,11 @@ msgstr "Impossibile caricare gli album"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1300,7 +1302,7 @@ msgstr "Il servizio di Proton Drive non ha risposto."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1314,7 +1316,7 @@ msgstr "Apri"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Rinomina…"
@@ -1582,7 +1584,7 @@ msgstr "Dimensione icone"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1738,7 +1740,7 @@ msgid "New Folder…"
msgstr "Nuova cartella…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1884,7 +1886,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nuovo nome"
@@ -1914,6 +1916,7 @@ msgid "Choose the folder to move into."
msgstr "Scegli la cartella di destinazione."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Sposta qui"
@@ -2143,99 +2146,103 @@ msgstr "Sfoglia file"
msgid "Restore to This Computer…"
msgstr "Ripristina su questo computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Sposta su questo computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continua questo backup qui…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Rimuovi…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · ultimo backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · ancora nessun backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Ancora nessuna cartella sottoposta a backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} cartella sottoposta a backup"
msgstr[1] "{n} cartelle sottoposte a backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} richiede attenzione"
msgstr[1] "{folders} · {n} richiedono attenzione"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "sincronizzazione…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "errore di sincronizzazione"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "richiede attenzione"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "aggiornato"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "controllo delle modifiche…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "controllo delle modifiche: {done} di {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "sincronizzazione {done} di {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "sincronizzazione di {file}: {done} di {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Aggiungi cartella da sincronizzare"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Sincronizzazione della cartella…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Impossibile aggiungere la cartella"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Impossibile elencare le cartelle da ripristinare"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2243,19 +2250,19 @@ msgstr ""
"Seleziona le cartelle da sincronizzare su questa macchina e regola dove deve "
"trovarsi ciascuna."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Ripristina cartelle"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Ripristina"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Ripristino delle cartelle…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2264,39 +2271,39 @@ msgstr ""
"Queste cartelle sono sottoposte a backup da “{name}”. Le cartelle "
"ripristinate continuano a sincronizzarsi con la copia di quel computer."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
"Queste cartelle sono sottoposte a backup sotto questo computer in Proton "
"Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Niente da ripristinare: le cartelle di “{name}” sono già tutte sincronizzate "
"qui."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Niente da ripristinare: le cartelle di questo computer sono già tutte "
"sincronizzate qui."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "La cartella passerà a solo online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "La cartella verrà scaricata e resterà sincronizzata"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Impossibile cambiare modalità"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2314,7 +2321,7 @@ msgstr ""
"cartella a Sincronizzata e attendi il completamento del download prima di "
"rimuoverla."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2327,68 +2334,68 @@ msgstr ""
"I file locali restano su questo disco e semplicemente smettono di essere "
"sincronizzati. Scegli se eliminare anche la copia in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Interrompere la sincronizzazione della cartella?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Elimina anche da Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Elimina l'unica copia di questi file."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "La copia locale non viene modificata."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Interrompi sincronizzazione"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Sincronizzazione della cartella interrotta"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Impossibile interrompere la sincronizzazione della cartella"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Rinomina computer"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Rinomina “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Impossibile rinominare il computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "È richiesto un nome."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer rinominato"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Digita “{name}” per confermare"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Rimuovere il computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2403,25 +2410,25 @@ msgstr ""
"insieme a esso. I file su quel computer non vengono toccati, ma questa "
"operazione non può essere annullata da qui."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Rimuovi"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer rimosso"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Impossibile rimuovere il computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continuare questo backup qui?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2440,20 +2447,50 @@ msgstr ""
"qui non vengono spostate. Usa poi “Ripristina su questo computer” per "
"recuperare ciò che “{name}” sincronizzava."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continua qui"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Ora il backup avviene come “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Impossibile continuare quel backup qui"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Spostare il backup su questo computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Le cartelle di cui “{name}” esegue il backup passano nel backup di questo "
"computer su Proton Drive, e scegli tu dove metterle su questo computer. "
"“{name}” resta nel tuo account, senza quelle cartelle.\n"
"\n"
"Chiudi prima Proton Drive su “{name}”. Altrimenti vedrà sparire le sue "
"cartelle."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Backup di “{name}” spostato"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Impossibile spostare quel backup"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+112 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Dutch\n"
@@ -90,7 +90,7 @@ msgstr "Gedeeld door mij"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computers"
@@ -263,11 +263,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -313,7 +314,7 @@ msgstr "Drive doorzoeken"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -355,7 +356,7 @@ msgstr "Raster / lijst"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Hernoemen"
@@ -683,7 +684,7 @@ msgid "Couldn't add a sync folder"
msgstr "Kon geen synchronisatiemap toevoegen"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Kon mappen niet terugzetten"
@@ -1261,10 +1262,11 @@ msgstr "Kon albums niet laden"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1296,7 +1298,7 @@ msgstr "De Proton Drive-service reageerde niet."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1310,7 +1312,7 @@ msgstr "Openen"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Hernoemen…"
@@ -1578,7 +1580,7 @@ msgstr "Pictogramgrootte"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1734,7 +1736,7 @@ msgid "New Folder…"
msgstr "Nieuwe map…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1878,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nieuwe naam"
@@ -1908,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Kies de map waarnaar je wilt verplaatsen."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Hierheen verplaatsen"
@@ -2137,99 +2140,103 @@ msgstr "Bestanden bekijken"
msgid "Restore to This Computer…"
msgstr "Terugzetten op deze computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Naar deze computer verplaatsen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Deze back-up hier voortzetten…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Verwijderen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · laatste back-up {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · nog geen back-ups"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Nog geen mappen geback-upt"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} map in back-up"
msgstr[1] "{n} mappen in back-up"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} vereist aandacht"
msgstr[1] "{folders} · {n} vereisen aandacht"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "synchroniseren…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "synchronisatiefout"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "vereist aandacht"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "bijgewerkt"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "controleren op wijzigingen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "controleren op wijzigingen — {done} van {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "synchroniseren: {done} van {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "{file} synchroniseren — {done} van {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Map toevoegen aan synchronisatie"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Map synchroniseren…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Kon map niet toevoegen"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Kon mappen om terug te zetten niet weergeven"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2237,19 +2244,19 @@ msgstr ""
"Vink de mappen aan die je met dit apparaat wilt synchroniseren en pas aan "
"waar elke map moet komen."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Mappen herstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Terugzetten"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Mappen terugzetten…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2258,38 +2265,38 @@ msgstr ""
"Van deze mappen is een back-up gemaakt vanaf “{name}”. Teruggezette mappen "
"blijven synchroniseren met de kopie van die computer."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
"Van deze mappen is een back-up gemaakt onder deze computer in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Niets om terug te zetten — de mappen van “{name}” worden hier al allemaal "
"gesynchroniseerd."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Niets om terug te zetten — de mappen van deze computer worden hier al "
"allemaal gesynchroniseerd."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Map wordt alleen online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Map wordt gedownload en blijft gesynchroniseerd"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Kon modus niet wijzigen"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2306,7 +2313,7 @@ msgstr ""
"kopie houden, annuleer dan, zet de map op Gesynchroniseerd en wacht tot de "
"download klaar is voordat je hem verwijdert."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2319,68 +2326,68 @@ msgstr ""
"De lokale bestanden blijven op deze schijf en worden gewoon niet meer "
"gesynchroniseerd. Kies of je ook de kopie in Proton Drive wilt verwijderen."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Synchroniseren van map stoppen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Ook uit Proton Drive verwijderen"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Verwijdert de enige kopie van deze bestanden."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "De lokale kopie blijft ongewijzigd."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Synchroniseren stoppen"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Synchroniseren van map gestopt"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Kon het synchroniseren van de map niet stoppen"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Computer hernoemen"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "“{name}” hernoemen."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Kon de computer niet hernoemen"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Een naam is vereist."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer hernoemd"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Typ “{name}” om te bevestigen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Computer verwijderen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2395,25 +2402,25 @@ msgstr ""
"mee verwijderd. De bestanden op die computer zelf blijven onaangeroerd — "
"maar dit kan hier niet ongedaan worden gemaakt."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Verwijderen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer verwijderd"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Kon de computer niet verwijderen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Deze back-up hier voortzetten?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2432,20 +2439,49 @@ msgstr ""
"gesynchroniseerd, worden niet verplaatst. Gebruik daarna “Terugzetten op "
"deze computer” om terug te halen wat “{name}” synchroniseerde."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Hier voortzetten"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Back-up nu als “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Kon die back-up hier niet voortzetten"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Back-up naar deze computer verplaatsen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"De mappen waarvan “{name}” een back-up maakt, gaan naar de back-up van deze "
"computer in Proton Drive, en je kiest zelf waar ze op deze computer komen. "
"“{name}” blijft in je account, zonder die mappen.\n"
"\n"
"Stop Proton Drive eerst op “{name}”. Anders ziet het zijn mappen verdwijnen."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Back-up van “{name}” verplaatst"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Kon die back-up niet verplaatsen"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+107 -76
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 3.1.2\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:25+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -93,7 +93,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr ""
@@ -239,11 +239,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -289,7 +290,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -331,7 +332,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr ""
@@ -653,7 +654,7 @@ msgid "Couldn't add a sync folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr ""
@@ -1219,10 +1220,11 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1254,7 +1256,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1268,7 +1270,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr ""
@@ -1536,7 +1538,7 @@ msgstr ""
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1690,7 +1692,7 @@ msgid "New Folder…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1832,7 +1834,7 @@ msgid "{status}. {message}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr ""
@@ -1862,6 +1864,7 @@ msgid "Choose the folder to move into."
msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr ""
@@ -2089,150 +2092,154 @@ msgstr ""
msgid "Restore to This Computer…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr ""
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] ""
msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] ""
msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
"with that computer's copy."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2243,7 +2250,7 @@ msgid ""
"finish before removing it."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2252,68 +2259,68 @@ msgid ""
"whether to also delete the copy in Proton Drive."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr ""
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr ""
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2323,25 +2330,25 @@ msgid ""
"here."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2353,20 +2360,44 @@ msgid ""
"syncing."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr ""
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr ""
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+114 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Polish\n"
@@ -92,7 +92,7 @@ msgstr "Udostępnione przeze mnie"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Komputery"
@@ -267,11 +267,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -317,7 +318,7 @@ msgstr "Przeszukaj Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -359,7 +360,7 @@ msgstr "Siatka/lista"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Zmień nazwę"
@@ -700,7 +701,7 @@ msgid "Couldn't add a sync folder"
msgstr "Nie można dodać katalogu synchronizacji"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Nie można przywrócić katalogów"
@@ -1292,10 +1293,11 @@ msgstr "Nie można wczytać albumów"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1327,7 +1329,7 @@ msgstr "Usługa Proton Drive nie odpowiedziała."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1341,7 +1343,7 @@ msgstr "Otwórz"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Zmień nazwę…"
@@ -1615,7 +1617,7 @@ msgstr "Rozmiar ikon"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1778,7 +1780,7 @@ msgid "New Folder…"
msgstr "Nowy katalog…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1924,7 +1926,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nowa nazwa"
@@ -1955,6 +1957,7 @@ msgid "Choose the folder to move into."
msgstr "Proszę wybrać katalog docelowy."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Przenieś tutaj"
@@ -2189,31 +2192,35 @@ msgstr "Przeglądaj pliki"
msgid "Restore to This Computer…"
msgstr "Przywróć na tym komputerze…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Przenieś na ten komputer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Kontynuuj tę kopię zapasową tutaj…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Usuń…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · ostatnia kopia zapasowa: {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · brak kopii zapasowych"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Brak zarchiwizowanych katalogów"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
@@ -2221,7 +2228,7 @@ msgstr[0] "{n} katalog z kopią zapasową"
msgstr[1] "{n} katalogi z kopią zapasową"
msgstr[2] "{n} katalogów z kopią zapasową"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
@@ -2229,61 +2236,61 @@ msgstr[0] "{folders} · {n} wymaga uwagi"
msgstr[1] "{folders} · {n} wymagają uwagi"
msgstr[2] "{folders} · {n} wymaga uwagi"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "synchronizowanie…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "błąd synchronizacji"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "wymaga uwagi"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "aktualne"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "sprawdzanie zmian…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "sprawdzanie zmian — {done} z {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "synchronizowanie {done} z {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "synchronizowanie {file} — {done} z {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Dodaj katalog do synchronizacji"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Synchronizowanie katalogu…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Nie można dodać katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Nie można wyświetlić listy katalogów do przywrócenia"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2291,19 +2298,19 @@ msgstr ""
"Należy zaznaczyć katalogi do synchronizacji z tym komputerem i dostosować "
"położenie każdego z nich."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Przywróć katalogi"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Przywróć"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Przywracanie katalogów…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2312,37 +2319,37 @@ msgstr ""
"Te katalogi mają kopię zapasową z komputera „{name}”. Przywrócone katalogi "
"nadal będą synchronizowane z kopią tego komputera."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Te katalogi mają kopię zapasową w Proton Drive pod tym komputerem."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nie ma nic do przywrócenia — wszystkie katalogi komputera „{name}” są tutaj "
"synchronizowane."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nie ma nic do przywrócenia — wszystkie katalogi tego komputera są tutaj "
"synchronizowane."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Katalog przejdzie w tryb tylko online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Katalog zostanie pobrany i będzie synchronizowany"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Nie można zmienić trybu"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2359,7 +2366,7 @@ msgstr ""
"pusty. Aby zachować lokalną kopię, należy anulować, przełączyć katalog na "
"tryb Synchronizowany i poczekać na ukończenie pobierania przed usunięciem."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2372,68 +2379,68 @@ msgstr ""
"Lokalne pliki pozostaną na tym dysku i po prostu przestaną być "
"synchronizowane. Można też usunąć kopię w Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Zatrzymać synchronizację katalogu?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Usuń także z Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Usuwa jedyną kopię tych plików."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "Lokalna kopia pozostanie bez zmian."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Zatrzymaj synchronizację"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Zatrzymano synchronizację katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Nie można zatrzymać synchronizacji katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Zmiana nazwy komputera"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Proszę podać nową nazwę komputera „{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Nie można zmienić nazwy komputera"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Nazwa jest wymagana."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Zmieniono nazwę komputera"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Proszę wpisać „{name}”, aby potwierdzić"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Usunąć komputer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2448,25 +2455,25 @@ msgstr ""
"z nim. Pliki na samym komputerze pozostaną nietknięte — ale tej operacji nie "
"można tutaj cofnąć."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Usuń"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Usunięto komputer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Nie można usunąć komputera"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Kontynuować tę kopię zapasową tutaj?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2485,20 +2492,51 @@ msgstr ""
"przeniesione. Aby odzyskać to, co synchronizował „{name}”, proszę potem użyć "
"opcji „Przywróć na tym komputerze”."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Kontynuuj tutaj"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Kopia zapasowa jest teraz tworzona jako „{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Nie można kontynuować tej kopii zapasowej tutaj"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Przenieść kopię zapasową na ten komputer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Foldery, których kopię zapasową tworzy „{name}”, zostaną przeniesione do "
"kopii zapasowej tego komputera w Proton Drive, a Ty wybierzesz, gdzie mają "
"się znaleźć na tym komputerze. „{name}” pozostanie na Twoim koncie, bez tych "
"folderów.\n"
"\n"
"Najpierw zamknij Proton Drive na „{name}”. W przeciwnym razie zobaczy, jak "
"jego foldery znikają."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Przeniesiono kopię zapasową „{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Nie można przenieść tej kopii zapasowej"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 10:15+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Portuguese (Brazil)\n"
@@ -90,7 +90,7 @@ msgstr "Compartilhados por mim"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computadores"
@@ -262,11 +262,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -312,7 +313,7 @@ msgstr "Pesquisar no Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -354,7 +355,7 @@ msgstr "Grade / lista"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Renomear"
@@ -682,7 +683,7 @@ msgid "Couldn't add a sync folder"
msgstr "Não foi possível adicionar uma pasta sincronizada"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Não foi possível restaurar as pastas"
@@ -1262,10 +1263,11 @@ msgstr "Não foi possível carregar os álbuns"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1297,7 +1299,7 @@ msgstr "O serviço do Proton Drive não respondeu."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1311,7 +1313,7 @@ msgstr "Abrir"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Renomear…"
@@ -1579,7 +1581,7 @@ msgstr "Tamanho dos ícones"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1733,7 +1735,7 @@ msgid "New Folder…"
msgstr "Nova pasta…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1878,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Novo nome"
@@ -1908,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Escolha a pasta de destino."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Mover para cá"
@@ -2136,99 +2139,103 @@ msgstr "Navegar pelos arquivos"
msgid "Restore to This Computer…"
msgstr "Restaurar neste computador…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Mover para este computador…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continuar este backup aqui…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Remover…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · último backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · nenhum backup ainda"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Nenhuma pasta com backup ainda"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} pasta com backup"
msgstr[1] "{n} pastas com backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requer atenção"
msgstr[1] "{folders} · {n} requerem atenção"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "erro de sincronização"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "requer atenção"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "atualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "verificando alterações…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "verificando alterações — {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "sincronizando {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "sincronizando {file} — {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Adicionar pasta à sincronização"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Sincronizando pasta…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Não foi possível adicionar a pasta"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Não foi possível listar as pastas para restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2236,19 +2243,19 @@ msgstr ""
"Marque as pastas a sincronizar com esta máquina e ajuste onde cada uma deve "
"ficar."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restaurar pastas"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restaurando pastas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2257,36 +2264,36 @@ msgstr ""
"Estas pastas têm backup a partir de “{name}”. As pastas restauradas "
"continuam sincronizando com a cópia daquele computador."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Estas pastas têm backup sob este computador no Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nada a restaurar — as pastas de “{name}” já estão todas sincronizadas aqui."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nada a restaurar — as pastas deste computador já estão todas sincronizadas "
"aqui."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "A pasta passará a ser somente online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "A pasta será baixada e permanecerá sincronizada"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Não foi possível alterar o modo"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2303,7 +2310,7 @@ msgstr ""
"uma cópia local, cancele, mude a pasta para Sincronizada e aguarde o "
"download terminar antes de removê-la."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2316,68 +2323,68 @@ msgstr ""
"Os arquivos locais permanecem neste disco e simplesmente deixam de ser "
"sincronizados. Escolha se também deseja excluir a cópia no Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Parar de sincronizar a pasta?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Também excluir do Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Exclui a única cópia destes arquivos."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "A cópia local não é afetada."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Parar de sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "A pasta deixou de ser sincronizada"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Não foi possível parar de sincronizar a pasta"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Renomear computador"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Renomear “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Não foi possível renomear o computador"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Um nome é obrigatório."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computador renomeado"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Digite “{name}” para confirmar"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Remover computador?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2392,25 +2399,25 @@ msgstr ""
"naquele próprio computador não são tocados — mas isso não pode ser desfeito "
"daqui."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Remover"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computador removido"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Não foi possível remover o computador"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continuar este backup aqui?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2429,20 +2436,50 @@ msgstr ""
"movidas. Depois, use “Restaurar neste computador” para recuperar o que "
"“{name}” sincronizava."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continuar aqui"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Agora fazendo backup como “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Não foi possível continuar esse backup aqui"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Mover o backup para este computador?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"As pastas cujo backup é feito por “{name}” passam para o backup deste "
"computador no Proton Drive, e você escolhe onde ficam neste computador. "
"“{name}” continua na sua conta, sem essas pastas.\n"
"\n"
"Feche primeiro o Proton Drive em “{name}”. Caso contrário, ele verá as "
"pastas sumirem."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Backup de “{name}” movido"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Não foi possível mover esse backup"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"