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 2136 additions and 805 deletions

No files matched your search

+27
View File
@@ -628,6 +628,15 @@ enum DeviceCmd {
#[arg(long, conflicts_with = "uid")] #[arg(long, conflicts_with = "uid")]
clear: bool, 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)] #[derive(Subcommand)]
@@ -967,6 +976,24 @@ fn cmd_devices(action: DeviceCmd) -> Result<()> {
let uid = if clear { None } else { uid }; let uid = if clear { None } else { uid };
ok_or_bail(control_request(CtlRequest::AdoptDevice { 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(()) Ok(())
} }
+10
View File
@@ -446,6 +446,13 @@ pub enum Request {
/// of registering a duplicate. `uid: None` clears the pin. /// of registering a duplicate. `uid: None` clears the pin.
/// Replies with [`Response::Ok`]. /// Replies with [`Response::Ok`].
AdoptDevice { uid: Option<String> }, 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 ---------------------------------- // ---- device folder sync ----------------------------------
/// Add a local folder to this machine's device, uploading its tree and /// Add a local folder to this machine's device, uploading its tree and
@@ -3082,6 +3089,9 @@ mod tests {
uid: Some("dev-1".into()), uid: Some("dev-1".into()),
}, },
Request::AdoptDevice { uid: None }, Request::AdoptDevice { uid: None },
Request::MigrateDevice {
uid: "dev-2".into(),
},
Request::ListRestorableFolders, Request::ListRestorableFolders,
Request::RestoreSyncFolders { Request::RestoreSyncFolders {
items: vec![RestoreItem { items: vec![RestoreItem {
+11
View File
@@ -139,6 +139,17 @@ impl Db {
Ok(()) 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 /// Queue (or, with `None`, withdraw) a mode the folder should move to once it
/// is safe to switch. /// is safe to switch.
pub fn sync_folder_set_pending_mode(&self, id: i64, mode: Option<&str>) -> Result<()> { 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); 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] #[test]
fn mode_commit_clears_only_the_intent_it_satisfies() { fn mode_commit_clears_only_the_intent_it_satisfies() {
let db = Db::open_in_memory().unwrap(); let db = Db::open_in_memory().unwrap();
+5 -1
View File
@@ -369,7 +369,7 @@ fn touched_topics(request: &CtlRequest) -> &'static [Topic] {
RefreshScope::Photos { .. } => &[], RefreshScope::Photos { .. } => &[],
}, },
R::RenameDevice { .. } | R::DeleteDevice { .. } => &[Topic::Devices], R::RenameDevice { .. } | R::DeleteDevice { .. } => &[Topic::Devices],
R::AdoptDevice { .. } => &[Topic::Devices, Topic::Locations], R::AdoptDevice { .. } | R::MigrateDevice { .. } => &[Topic::Devices, Topic::Locations],
R::AddSyncFolder { .. } R::AddSyncFolder { .. }
| R::RemoveSyncFolder { .. } | R::RemoveSyncFolder { .. }
| R::SetSyncFolderMode { .. } | R::SetSyncFolderMode { .. }
@@ -1297,6 +1297,10 @@ fn handle_control_conn(core: &Core, username: &str, mountpoint: &Path, stream: U
Ok(message) => CtlResponse::Ok { message }, Ok(message) => CtlResponse::Ok { message },
Err(e) => CtlResponse::error(e), 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 }) => { Ok(CtlRequest::AddSyncFolder { local_path }) => {
// Registering the device and uploading a folder tree far outlasts the // Registering the device and uploading a folder tree far outlasts the
// socket read timeout, so ack immediately and work on a background // 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::db::{StoredDevice, StoredSyncFolder};
use pdfs_core::mounts::MountMode; use pdfs_core::mounts::MountMode;
use pdfs_core::profile::PROFILE_DIR_NAME;
use pdfs_core::{CoreError, CoreResult}; use pdfs_core::{CoreError, CoreResult};
use proton_drive_rs::proton_sdk::ids::{DeviceUid, NodeUid}; use proton_drive_rs::proton_sdk::ids::{DeviceUid, NodeUid};
use proton_drive_rs::{DeviceType, Node}; 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}"))) .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 { impl Core {
// ---- devices ---------------------------------------------------------- // ---- 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 ------------------------- // ---- device folder sync -------------------------
/// Auto-register (or recover) this machine as a Proton Drive Device, caching /// Auto-register (or recover) this machine as a Proton Drive Device, caching
@@ -360,21 +478,25 @@ impl Core {
root_uid: &NodeUid, root_uid: &NodeUid,
name: &str, name: &str,
) -> CoreResult<Option<NodeUid>> { ) -> 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 let uids = self
.rt .rt
.block_on(self.drive.enumerate_folder_children_node_uids(root_uid)) .block_on(self.drive.enumerate_folder_children_node_uids(root_uid))
.map_err(|e| CoreError::from_api(&e, "list device root"))?; .map_err(|e| CoreError::from_api(&e, "list device root"))?;
if uids.is_empty() { if uids.is_empty() {
return Ok(None); return Ok(Vec::new());
} }
let nodes = self self.rt
.rt
.block_on(self.drive.enumerate_nodes(&uids)) .block_on(self.drive.enumerate_nodes(&uids))
.map_err(|e| CoreError::from_api(&e, "resolve device root children"))?; .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))
} }
/// Add a local folder to this device's sync set: register the device if /// Add a local folder to this device's sync set: register the device if
@@ -842,6 +964,23 @@ impl Core {
if folder.state != "idle" { if folder.state != "idle" {
return Err(SwitchBlocked::NotNow); 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(|| { let root_uid = parse_uid(&folder.remote_uid).ok_or_else(|| {
SwitchBlocked::Failed(format!("bad remote uid: {}", folder.remote_uid)) SwitchBlocked::Failed(format!("bad remote uid: {}", folder.remote_uid))
})?; })?;
@@ -1107,10 +1246,38 @@ mod tests {
use pdfs_core::db::StoredSyncFolder; use pdfs_core::db::StoredSyncFolder;
use super::{ use super::{
ApplicableMountMode, commit_after_teardown, pending_intent_matches, ApplicableMountMode, commit_after_teardown, migrated_name, pending_intent_matches,
restore_snapshot_matches, select_mode_transition, 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] #[test]
fn unknown_mode_cannot_select_a_destructive_transition() { fn unknown_mode_cannot_select_a_destructive_transition() {
let mut unmounts = 0; 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 /// uploading that same tree — the engine would upload files as they vanish
/// and then walk the FUSE mount as if it were local. /// and then walk the FUSE mount as if it were local.
sync_locks: Arc<Mutex<HashMap<i64, Arc<Mutex<()>>>>>, 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 /// Nodes this daemon changed on the remote itself, and how many echoes of
/// those changes the event feed still owes us. /// those changes the event feed still owes us.
/// ///
+1
View File
@@ -475,6 +475,7 @@ pub(crate) fn mount_with(
sync_tx, sync_tx,
mounts: Arc::new(Mutex::new(SecondaryMountRegistry::default())), mounts: Arc::new(Mutex::new(SecondaryMountRegistry::default())),
sync_locks: Arc::new(Mutex::new(HashMap::new())), sync_locks: Arc::new(Mutex::new(HashMap::new())),
sync_unscanned: Arc::new(Mutex::new(HashMap::new())),
states: Arc::new(StateRegistry::default()), states: Arc::new(StateRegistry::default()),
}; };
// Before anything can queue work against it: the drain thread below reaches // Before anything can queue work against it: the drain thread below reaches
+529 -86
View File
@@ -59,8 +59,9 @@ pub(crate) use planner::base_name;
#[cfg(test)] #[cfg(test)]
use planner::conflict_path; use planner::conflict_path;
use planner::{ use planner::{
FilePlan, classification_order, conflict_path_with_suffix, filter_baseline, guard_local_wipe, FilePlan, Unscanned, classification_order, conflict_path_with_suffix, filter_baseline,
join_rel, parent_rel, plan_file, rel_to_path, remote_sig, unchanged_remote_size, 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 /// What a [`Pending`] op did, so the reconcile can update shared state on the
/// engine thread (never inside a task). /// engine thread (never inside a task).
@@ -187,6 +188,7 @@ impl Core {
"idle" "idle"
}; };
let _ = self.db.sync_folder_set_state(folder.id, state, now_secs()); 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 // Summarise a pass that actually moved something. A poll over an
// unchanged folder does nothing and says nothing — otherwise the // unchanged folder does nothing and says nothing — otherwise the
// feed would fill with "synced, 0 changes" every two minutes. // 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 /// Compile the ignore rules for a synced folder: the global patterns from
/// the config, plus any `.pdfsignore` at `local_root`. /// 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 /// than to "ignore nothing" — the defaults exclude build and VCS trees, and
/// silently uploading those because a config read failed is the outcome this /// silently uploading those because a config read failed is the outcome this
/// feature exists to prevent. /// 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() { let globals = match pdfs_core::config::AppDirs::new() {
Ok(dirs) => dirs.load_config().resolved_ignore_patterns(), Ok(dirs) => dirs.load_config().resolved_ignore_patterns(),
Err(e) => { Err(e) => {
@@ -313,15 +346,23 @@ impl Core {
self.progress_scan_total(folder_id, baseline.len()); self.progress_scan_total(folder_id, baseline.len());
let mut local: HashMap<String, LocalItem> = HashMap::new(); let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut unscanned = Unscanned::default();
let writing = open_for_write_set(local_root); let writing = open_for_write_set(local_root);
self.walk_local( 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 // 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 // ignored or unreadable path is absent from `local` by rule or by
// those as missing would trip the guard on every pass — wedging the // failure, not by loss, and counting those as missing would trip the
// folder's sync permanently — the moment a rule covers the whole tree. // guard on every pass — wedging the folder's sync permanently — the
guard_local_wipe(&filter_baseline(&baseline, rules), &local)?; // 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 // 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 // directory this device has synced recorded its uid there when it was
@@ -391,6 +432,7 @@ impl Core {
let mut outcome = Outcome { let mut outcome = Outcome {
deferred: local.values().filter(|item| item.open_for_write).count(), deferred: local.values().filter(|item| item.open_for_write).count(),
unscanned: unscanned.report(),
..Default::default() ..Default::default()
}; };
let mut order: Vec<&String> = local.keys().collect(); let mut order: Vec<&String> = local.keys().collect();
@@ -515,13 +557,8 @@ impl Core {
// showing the folder's remote contents — otherwise everything they deleted // showing the folder's remote contents — otherwise everything they deleted
// comes back the moment the switch lands. Shallowest first, skipping anything // comes back the moment the switch lands. Shallowest first, skipping anything
// under a folder already trashed (its children went with it). // 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(); let mut trashed: Vec<String> = Vec::new();
for rel in missing { for rel in &local_deletions(&tracked, &local) {
if trashed if trashed
.iter() .iter()
.any(|dir| rel.starts_with(&format!("{dir}/"))) .any(|dir| rel.starts_with(&format!("{dir}/")))
@@ -586,12 +623,18 @@ impl Core {
self.progress_scan_total(folder_id, baseline.len() * 2); self.progress_scan_total(folder_id, baseline.len() * 2);
let mut local: HashMap<String, LocalItem> = HashMap::new(); let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut unscanned = Unscanned::default();
let writing = open_for_write_set(local_root); let writing = open_for_write_set(local_root);
self.walk_local( 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. // See `push_pass`: the guard must not count excluded paths as lost.
guard_local_wipe(&filter_baseline(&baseline, rules), &local)?; guard_local_wipe(&tracked_baseline(&baseline, rules, &unscanned), &local)?;
let mut remote: HashMap<String, RemoteItem> = HashMap::new(); let mut remote: HashMap<String, RemoteItem> = HashMap::new();
let mut remote_dirs: HashMap<String, NodeUid> = HashMap::new(); let mut remote_dirs: HashMap<String, NodeUid> = HashMap::new();
@@ -605,9 +648,15 @@ impl Core {
&baseline, &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 // Folders to delete, collected here and removed deepest-first at the end
// so a parent is never removed before its children. // so a parent is never removed before its children.
let mut delete_local_dirs: Vec<String> = Vec::new(); let mut delete_local_dirs: Vec<String> = Vec::new();
@@ -873,19 +922,19 @@ impl Core {
Ok(outcome) Ok(outcome)
} }
/// Recursively walk a local directory into `out`, keyed by `/`-joined relative /// Recursively walk a local tree into `out`, keyed by `/`-joined relative
/// path. Symlinks and other special files are skipped. Reports each entry to the /// path. Symlinks and other special files are skipped, and paths that cannot
/// pass's scan progress. /// be read go to `unscanned`. Reports each entry to the pass's scan progress.
fn walk_local( fn walk_local(
&self, &self,
folder_id: i64, folder_id: i64,
root: &Path, root: &Path,
dir: &Path,
rules: &IgnoreRules, rules: &IgnoreRules,
writing: &HashSet<PathBuf>, writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>, out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
) -> Result<(), String> { ) -> 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)) 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 /// 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 /// **A path the scan cannot read is left out and recorded in `unscanned`, never
/// fails, an entry that cannot be stat-ed, a name that is not UTF-8 — each of /// silently dropped.** Every pass drops what `unscanned` covers from
/// them would, if skipped, leave `out` describing a *smaller* tree than the one /// classification, so a baseline row under it is neither a local deletion nor a
/// on disk. Reconciliation reads a path present in the baseline and absent from /// download target (`docs/BUGS.md` B55). That covers a subfolder the pass has no
/// the scan as "the user deleted this", and propagates that to Drive. So an /// permission for, an entry that vanished between the listing and its `stat`,
/// unreadable subdirectory would trash its remote counterpart, and the deeper /// and a name that is not UTF-8. Failing the whole pass on any of them, as this
/// the failure, the more it takes with it (`docs/BUGS.md` B55). Refusing the /// did before, left one root-owned folder stopping everything else in the tree
/// whole pass keeps the previous baseline and leaves the remote alone; the next /// from syncing, on every pass, for good (B196).
/// pass retries once the transient condition clears. ///
/// 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 /// 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. /// with a real unreadable directory in it, which needs no `Core` at all.
fn walk_local_tree( 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, root: &Path,
dir: &Path, dir: &Path,
rules: &IgnoreRules, rules: &IgnoreRules,
writing: &HashSet<PathBuf>, writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>, out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
scanned: &mut dyn FnMut(&str), scanned: &mut dyn FnMut(&str),
) -> Result<(), String> { ) -> Result<(), ScanError> {
let entries = std::fs::read_dir(dir).map_err(|e| format!("read {}: {e}", dir.display()))?; 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 { 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 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| { let stripped = path.strip_prefix(root).map_err(|e| {
format!( ScanError::Failed(format!(
"local path {} escaped sync root {}: {e}", "local path {} escaped sync root {}: {e}",
path.display(), path.display(),
root.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. // Ignore our own in-flight download temp files.
if rel.contains(".pdfs-tmp-") { if rel.contains(".pdfs-tmp-") {
continue; 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 // Ignored paths are dropped here as well as from the classification
// union — not for correctness (the union filter is what makes this // union — not for correctness (the union filter is what makes this
// safe) but so an ignored `node_modules/` is never descended into or // safe) but so an ignored `node_modules/` is never descended into or
@@ -1646,7 +1764,15 @@ fn walk_local_tree(
}, },
); );
scanned(rel); 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() { } else if meta.is_file() {
// Check whether any process holds this file open for writing. // Check whether any process holds this file open for writing.
// The canonical path is used because /proc/*/fd links resolve // The canonical path is used because /proc/*/fd links resolve
@@ -1684,7 +1810,7 @@ pub(crate) fn mirror_subtree_unsynced(
baseline: &HashMap<String, StoredSyncEntry>, baseline: &HashMap<String, StoredSyncEntry>,
) -> Option<String> { ) -> Option<String> {
let mut seen = HashSet::new(); 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); return Some(reason);
} }
let prefix = format!("{rel}/"); let prefix = format!("{rel}/");
@@ -1695,18 +1821,64 @@ pub(crate) fn mirror_subtree_unsynced(
.map(|r| format!("{r} was deleted here but not on Proton Drive yet")) .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( fn unsynced_local(
root: &Path, root: &Path,
rel: &str, rel: &str,
baseline: &HashMap<String, StoredSyncEntry>, baseline: &HashMap<String, StoredSyncEntry>,
rules: Option<&IgnoreRules>,
seen: &mut HashSet<String>, seen: &mut HashSet<String>,
) -> Option<String> { ) -> Option<String> {
let path = root.join(rel_to_path(rel)); let path = if rel.is_empty() {
root.to_path_buf()
} else {
root.join(rel_to_path(rel))
};
// 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) { let meta = match std::fs::symlink_metadata(&path) {
Ok(meta) => meta, Ok(meta) => meta,
Err(e) => return Some(format!("cannot read {rel}: {e}")), Err(e) => return Some(format!("cannot read {rel}: {e}")),
}; };
let Some(base) = baseline.get(rel) else { 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")); return Some(format!("{rel} is not on Proton Drive yet"));
}; };
seen.insert(rel.to_string()); seen.insert(rel.to_string());
@@ -1717,23 +1889,25 @@ fn unsynced_local(
if !meta.is_dir() { if !meta.is_dir() {
return Some(format!("{rel} is not a regular file or folder")); 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) { let entries = match std::fs::read_dir(&path) {
Ok(entries) => entries, 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 { for entry in entries {
let name = match entry { let name = match entry {
Ok(entry) => entry.file_name(), 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 { 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. // A download the engine left half done; it is the engine's to clean up.
if name.contains(".pdfs-tmp-") { if name.contains(".pdfs-tmp-") {
continue; 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); return Some(reason);
} }
} }
@@ -2154,7 +2328,15 @@ mod tests {
let writing = HashSet::new(); let writing = HashSet::new();
let mut local: HashMap<String, LocalItem> = HashMap::new(); let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut progress = no_progress(); 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"); assert!(local.is_empty(), "the replacement root is genuinely empty");
for size in 1..=3 { for size in 1..=3 {
@@ -2170,7 +2352,15 @@ mod tests {
// remounted folder resumes rather than staying wedged. // remounted folder resumes rather than staying wedged.
std::fs::write(root.join("file0.txt"), b"back").unwrap(); std::fs::write(root.join("file0.txt"), b"back").unwrap();
let mut local: HashMap<String, LocalItem> = HashMap::new(); 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(); let baseline: HashMap<String, ()> = [("file0.txt".to_string(), ())].into_iter().collect();
assert!(guard_local_wipe(&filter_baseline(&baseline, &rules), &local).is_ok()); assert!(guard_local_wipe(&filter_baseline(&baseline, &rules), &local).is_ok());
@@ -2475,33 +2665,176 @@ mod tests {
|_: &str| {} |_: &str| {}
} }
/// A directory the pass cannot read must fail the pass. Omitting it would /// Scan `root` with no rules, returning what it found and left out.
/// hand reconciliation a baseline-minus-subtree, which it reads as the user fn scan(root: &Path) -> Result<(HashMap<String, LocalItem>, Unscanned), String> {
/// having deleted that subtree and propagates to Drive (B55). 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] #[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 _; use std::os::unix::fs::PermissionsExt as _;
let root = sync_test_dir("scan-eacces"); let root = sync_test_dir("scan-eacces");
std::fs::write(root.join("keep.txt"), b"a").unwrap(); 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::create_dir(&locked).unwrap();
std::fs::write(locked.join("inner.txt"), b"b").unwrap(); std::fs::write(locked.join("inner.txt"), b"b").unwrap();
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o000)).unwrap(); std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o000)).unwrap();
let rules = rules_for(&[]); let result = scan(&root);
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);
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o700)).unwrap(); std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap(); std::fs::remove_dir_all(&root).unwrap();
let error = result.expect_err("an unreadable directory must abort the pass"); let (out, unscanned) = result.expect("one unreadable folder must not fail the pass");
assert!( assert_eq!(
error.contains("locked"), sorted_keys(&out),
"the error should name the subtree it could not read: {error}" 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); 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 /// 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". /// pass sees nothing, and "nothing" must never mean "delete everything".
#[test] #[test]
@@ -2607,7 +3028,14 @@ mod tests {
let writing = HashSet::new(); let writing = HashSet::new();
let mut out = HashMap::new(); let mut out = HashMap::new();
let mut progress = no_progress(); 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::set_permissions(&root, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap(); std::fs::remove_dir_all(&root).unwrap();
@@ -2628,30 +3056,40 @@ mod tests {
let writing = HashSet::new(); let writing = HashSet::new();
let mut out = HashMap::new(); let mut out = HashMap::new();
let mut progress = no_progress(); 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()); assert!(out.is_empty());
} }
/// A name that is not valid UTF-8 cannot be keyed into the scan, so it /// A name that is not valid UTF-8 cannot be keyed into the scan, but it
/// cannot be compared against the baseline either. Refusing the pass is the /// cannot be in the baseline or on Drive either, so leaving it out reads as
/// only safe reading: skipping it would classify the file as deleted. /// the deletion of nothing. It used to fail the pass (B196).
#[test] #[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::ffi::OsStr;
use std::os::unix::ffi::OsStrExt as _; use std::os::unix::ffi::OsStrExt as _;
let root = sync_test_dir("scan-non-utf8"); 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(OsStr::from_bytes(b"bad\xffname")), b"x").unwrap();
std::fs::write(root.join("good.txt"), b"y").unwrap();
let rules = rules_for(&[]); let result = scan(&root);
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);
std::fs::remove_dir_all(&root).unwrap(); std::fs::remove_dir_all(&root).unwrap();
let error = result.expect_err("a name the scan cannot key must abort the pass"); let (out, unscanned) = result.unwrap();
assert!(error.contains("UTF-8"), "{error}"); 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 /// The complement: a scan that *can* read everything reports everything, so
@@ -2670,9 +3108,14 @@ mod tests {
let writing = HashSet::new(); let writing = HashSet::new();
let mut out = HashMap::new(); let mut out = HashMap::new();
let mut seen: Vec<String> = Vec::new(); let mut seen: Vec<String> = Vec::new();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut |rel| { let result = walk_local_tree(
seen.push(rel.to_string()) &root,
}); &rules,
&writing,
&mut out,
&mut Unscanned::default(),
&mut |rel| seen.push(rel.to_string()),
);
std::fs::remove_dir_all(&root).unwrap(); std::fs::remove_dir_all(&root).unwrap();
result.unwrap(); result.unwrap();
+5
View File
@@ -98,6 +98,11 @@ pub(super) struct Outcome {
pub(super) errors: usize, pub(super) errors: usize,
/// Files skipped because another process held them open for writing. /// Files skipped because another process held them open for writing.
pub(super) deferred: usize, 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 { impl Outcome {
+90
View File
@@ -90,6 +90,96 @@ pub(super) fn filter_baseline<'a, B>(
.collect() .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. /// 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 /// 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 || { menu.item(&gettext("Restore to This Computer…"), move || {
prompt_restore_folders(&ui_c, Some((uid_c.clone(), name_c.clone()))) 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(); menu.section();
let (ui_c, uid_c, name_c) = (ui.clone(), uid.clone(), name.clone()); let (ui_c, uid_c, name_c) = (ui.clone(), uid.clone(), name.clone());
menu.item(&gettext("Rename…"), move || { 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()); 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. /// 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) { pub(crate) fn run_devices_mutation(ui: &Rc<Ui>, req: Request, done: &str, failed: &str) {
ui.busy_begin(); 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 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: 30 s). Passes are serialized per daemon. A pass:
1. **Walks the local tree.** Any `readdir`, metadata or permission failure marks the scan 1. **Walks the local tree.** A path the user may not read, an entry that vanishes mid-scan and a
incomplete, and an incomplete scan cannot delete anything. 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.** 2. **Walks the remote tree.**
3. **Loads the baseline**, the `sync_entry` rows: both sides as of the last successful pass. 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 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 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). 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 ## 8. Control protocol
+96
View File
@@ -100,6 +100,9 @@ a live account since.
| Entry | Title | | 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 | | [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 | | [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 | | [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. 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 ### B195 — The app crashes when Proton asks for a CAPTCHA on secureblue
**Status:** Fixed (unverified). Nobody has run the fix on secureblue yet. **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 strictness must not cost a working pass, so a healthy tree still reports every entry and still
skips symlinks by design. 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`. 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 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. `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] ## [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 ## [3.1.2] — 2026-10-08
Schema: **42**, unchanged. 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 rename UID NAME` | Rename a computer. |
| `pdfs devices rm UID` | Remove a computer and its backup from the account. | | `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 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 ## 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 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. 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 ## 3. How the restore works
This section is for the curious and for anyone debugging a restore. 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 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 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 **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 ### 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 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. 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 ## Changes waiting for Proton Drive
A change you made in the Proton Drive folder exists only on this computer until it reaches 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. **Restore to This Computer…** downloads its folders here.
- **Continue This Backup Here…** makes this computer take over another computer's backup, for - **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). 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 ## Search launcher
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux-bin pkgbase = proton-drive-for-linux-bin
pkgdesc = Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (binaries) 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 pkgrel = 1
url = https://proton-drive.narl.io url = https://proton-drive.narl.io
arch = x86_64 arch = x86_64
@@ -21,21 +21,21 @@ pkgbase = proton-drive-for-linux-bin
optdepends = xdg-utils: "Open folder" action in the tray menu optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf) optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding
provides = proton-drive-for-linux=3.1.1 provides = proton-drive-for-linux=3.1.2
provides = proton-drive-linux=3.1.1 provides = proton-drive-linux=3.1.2
provides = pdfs provides = pdfs
conflicts = proton-drive-linux conflicts = proton-drive-linux
conflicts = proton-drive-for-linux conflicts = proton-drive-for-linux
conflicts = proton-drive-for-linux-git conflicts = proton-drive-for-linux-git
options = !strip options = !strip
options = !debug 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 = 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.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-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.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-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.1.svg::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux.svg 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.1.service::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/proton-drive.service 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.1::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/LICENSE source = LICENSE-3.1.2::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/LICENSE
sha256sums = e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6 sha256sums = 71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7
sha256sums = d190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123 sha256sums = d190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123
sha256sums = 1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0 sha256sums = 1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0
sha256sums = e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828 sha256sums = e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io> # Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux-bin pkgname=proton-drive-for-linux-bin
pkgver=3.1.1 pkgver=3.1.2
pkgrel=1 pkgrel=1
pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (binaries)" pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (binaries)"
arch=('x86_64') 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" "io.narl.proton-drive-linux-$pkgver.svg::$_raw/packaging/io.narl.proton-drive-linux.svg"
"proton-drive-$pkgver.service::$_raw/packaging/proton-drive.service" "proton-drive-$pkgver.service::$_raw/packaging/proton-drive.service"
"LICENSE-$pkgver::$_raw/LICENSE") "LICENSE-$pkgver::$_raw/LICENSE")
sha256sums=('e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6' sha256sums=('71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7'
'd190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123' 'd190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123'
'1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0' '1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0'
'e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828' 'e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828'
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux-git pkgbase = proton-drive-for-linux-git
pkgdesc = Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (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 pkgrel = 1
url = https://proton-drive.narl.io url = https://proton-drive.narl.io
arch = x86_64 arch = x86_64
@@ -24,8 +24,8 @@ pkgbase = proton-drive-for-linux-git
optdepends = xdg-utils: "Open folder" action in the tray menu optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf) optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding 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-for-linux=3.1.2.r0.g07c9b67
provides = proton-drive-linux=3.1.1.r0.gedd62c5 provides = proton-drive-linux=3.1.2.r0.g07c9b67
provides = pdfs provides = pdfs
conflicts = proton-drive-linux conflicts = proton-drive-linux
conflicts = proton-drive-for-linux conflicts = proton-drive-for-linux
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io> # Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux-git pkgname=proton-drive-for-linux-git
pkgver=3.1.1.r0.gedd62c5 pkgver=3.1.2.r0.g07c9b67
pkgrel=1 pkgrel=1
pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (git)" pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (git)"
arch=('x86_64') arch=('x86_64')
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux pkgbase = proton-drive-for-linux
pkgdesc = Unofficial Proton Drive client: files-on-demand FUSE mount, CLI, GTK4 app and tray 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 pkgrel = 1
url = https://proton-drive.narl.io url = https://proton-drive.narl.io
arch = x86_64 arch = x86_64
@@ -23,13 +23,13 @@ pkgbase = proton-drive-for-linux
optdepends = xdg-utils: "Open folder" action in the tray menu optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf) optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding 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 provides = pdfs
conflicts = proton-drive-linux conflicts = proton-drive-linux
conflicts = proton-drive-for-linux-bin conflicts = proton-drive-for-linux-bin
conflicts = proton-drive-for-linux-git conflicts = proton-drive-for-linux-git
options = !lto 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 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 = c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256 sha256sums = 260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1
pkgname = proton-drive-for-linux pkgname = proton-drive-for-linux
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io> # Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux pkgname=proton-drive-for-linux
pkgver=3.1.1 pkgver=3.1.2
pkgrel=1 pkgrel=1
pkgdesc="Unofficial Proton Drive client: files-on-demand FUSE mount, CLI, GTK4 app and tray" pkgdesc="Unofficial Proton Drive client: files-on-demand FUSE mount, CLI, GTK4 app and tray"
arch=('x86_64') 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. # LTO has broken GTK/Rust links for this workspace; the release profile keeps it off.
options=('!lto') options=('!lto')
source=("$pkgname-$pkgver.tar.gz::$_repo/archive/refs/tags/v$pkgver.tar.gz") source=("$pkgname-$pkgver.tar.gz::$_repo/archive/refs/tags/v$pkgver.tar.gz")
sha256sums=('c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256') sha256sums=('260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1')
_srcname="proton-drive-linux-$pkgver" _srcname="proton-drive-linux-$pkgver"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: German\n" "Language-Team: German\n"
@@ -90,7 +90,7 @@ msgstr "Von mir geteilt"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "Computer" msgstr "Computer"
@@ -266,11 +266,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: 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:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -316,7 +317,7 @@ msgstr "Drive durchsuchen"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Umbenennen" msgstr "Umbenennen"
@@ -686,7 +687,7 @@ msgid "Couldn't add a sync folder"
msgstr "Synchronisierungsordner konnte nicht hinzugefügt werden" msgstr "Synchronisierungsordner konnte nicht hinzugefügt werden"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58 #: 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" msgid "Couldn't restore folders"
msgstr "Ordner konnten nicht wiederhergestellt werden" 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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "Umbenennen …" 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. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1741,7 +1743,7 @@ msgid "New Folder…"
msgstr "Neuer Ordner …" msgstr "Neuer Ordner …"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1886,7 +1888,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "Neuer Name" msgstr "Neuer Name"
@@ -1916,6 +1918,7 @@ msgid "Choose the folder to move into."
msgstr "Den Zielordner auswählen." msgstr "Den Zielordner auswählen."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Hierher verschieben" msgstr "Hierher verschieben"
@@ -2147,99 +2150,103 @@ msgstr "Dateien durchsuchen"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "Auf diesem Computer wiederherstellen …" 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…" msgid "Continue This Backup Here…"
msgstr "Diese Sicherung hier fortsetzen …" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Entfernen …" msgstr "Entfernen …"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · letzte Sicherung {time}" msgstr "{platform} · letzte Sicherung {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{platform} · noch keine Sicherungen" 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" msgid "No folders backed up yet"
msgstr "Noch keine Ordner gesichert" 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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "{n} Ordner gesichert" msgstr[0] "{n} Ordner gesichert"
msgstr[1] "{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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} erfordert Aufmerksamkeit" msgstr[0] "{folders} · {n} erfordert Aufmerksamkeit"
msgstr[1] "{folders} · {n} erfordern 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…" msgid "syncing…"
msgstr "wird synchronisiert …" msgstr "wird synchronisiert …"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "Synchronisierungsfehler" msgstr "Synchronisierungsfehler"
#: crates/pdfs-gui/src/app/pages/devices.rs:616 #: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention" msgid "needs attention"
msgstr "erfordert Aufmerksamkeit" 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" msgid "up to date"
msgstr "aktuell" msgstr "aktuell"
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "wird auf Änderungen geprüft …" 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 #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "wird auf Änderungen geprüft – {done} von {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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "{done} von {total} wird synchronisiert" 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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "{file} wird synchronisiert – {done} von {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" msgid "Add Folder to Sync"
msgstr "Ordner zur Synchronisierung hinzufügen" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "Ordner wird synchronisiert …" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "Ordner konnte nicht hinzugefügt werden" msgstr "Ordner konnte nicht hinzugefügt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:727 #: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "Wiederherstellbare Ordner konnten nicht aufgelistet werden" 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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2247,19 +2254,19 @@ msgstr ""
"Die Ordner ankreuzen, die mit diesem Rechner synchronisiert werden sollen, " "Die Ordner ankreuzen, die mit diesem Rechner synchronisiert werden sollen, "
"und für jeden den Speicherort anpassen." "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" msgid "Restore Folders"
msgstr "Ordner wiederherstellen" msgstr "Ordner wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "Wiederherstellen" msgstr "Wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Ordner werden wiederhergestellt …" msgstr "Ordner werden wiederhergestellt …"
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "Diese Ordner werden von „{name}“ gesichert. Wiederhergestellte Ordner werden "
"weiterhin mit der Kopie dieses Computers synchronisiert." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Diese Ordner werden in Proton Drive unter diesem Computer gesichert." 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 #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" msgstr ""
"Nichts wiederherzustellen – alle Ordner von „{name}“ werden bereits hier " "Nichts wiederherzustellen – alle Ordner von „{name}“ werden bereits hier "
"synchronisiert." "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" msgstr ""
"Nichts wiederherzustellen – alle Ordner dieses Computers werden bereits hier " "Nichts wiederherzustellen – alle Ordner dieses Computers werden bereits hier "
"synchronisiert." "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" msgid "Folder will switch to online only"
msgstr "Ordner wird auf „Nur online“ umgestellt" 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" msgid "Folder will download and stay synced"
msgstr "Ordner wird heruntergeladen und bleibt synchronisiert" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "Modus konnte nicht geändert werden" 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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2316,7 +2323,7 @@ msgstr ""
"Ordner auf „Synchronisiert“ umstellen und vor dem Entfernen warten, bis der " "Ordner auf „Synchronisiert“ umstellen und vor dem Entfernen warten, bis der "
"Download abgeschlossen ist." "Download abgeschlossen ist."
#: crates/pdfs-gui/src/app/pages/devices.rs:921 #: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2330,68 +2337,68 @@ msgstr ""
"mehr synchronisiert. Es kann zusätzlich ausgewählt werden, die Kopie in " "mehr synchronisiert. Es kann zusätzlich ausgewählt werden, die Kopie in "
"Proton Drive zu löschen." "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?" msgid "Stop Syncing Folder?"
msgstr "Synchronisierung des Ordners beenden?" 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" msgid "Also delete from Proton Drive"
msgstr "Auch aus Proton Drive löschen" 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." msgid "Deletes the only copy of these files."
msgstr "Löscht die einzige Kopie dieser Dateien." 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." msgid "The local copy is unaffected."
msgstr "Die lokale Kopie bleibt unverändert." 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" msgid "Stop Syncing"
msgstr "Synchronisierung beenden" 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" msgid "Stopped syncing folder"
msgstr "Synchronisierung des Ordners beendet" 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" msgid "Couldn't stop syncing the folder"
msgstr "Synchronisierung des Ordners konnte nicht beendet werden" 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" msgid "Rename Computer"
msgstr "Computer umbenennen" msgstr "Computer umbenennen"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "„{name}“ umbenennen." msgstr "„{name}“ umbenennen."
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "Der Computer konnte nicht umbenannt werden" 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." msgid "A name is required."
msgstr "Ein Name ist erforderlich." 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" msgid "Computer renamed"
msgstr "Computer umbenannt" msgstr "Computer umbenannt"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "Zur Bestätigung „{name}“ eingeben" 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?" msgid "Remove Computer?"
msgstr "Computer entfernen?" msgstr "Computer entfernen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026 #: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2406,25 +2413,25 @@ msgstr ""
"gelöscht. Die Dateien auf dem Computer selbst bleiben unberührt – dies kann " "gelöscht. Die Dateien auf dem Computer selbst bleiben unberührt – dies kann "
"jedoch von hier aus nicht rückgängig gemacht werden." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Entfernen" msgstr "Entfernen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "Computer entfernt" 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" msgid "Couldn't remove the computer"
msgstr "Der Computer konnte nicht entfernt werden" 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?" msgid "Continue This Backup Here?"
msgstr "Diese Sicherung hier fortsetzen?" 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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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 " "werden nicht verschoben. Mit „Auf diesem Computer wiederherstellen“ lässt "
"sich danach zurückholen, was „{name}“ synchronisiert hat." "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" msgid "Continue Here"
msgstr "Hier fortsetzen" msgstr "Hier fortsetzen"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "Sicherung jetzt als „{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" msgid "Couldn't continue that backup here"
msgstr "Diese Sicherung konnte hier nicht fortgesetzt werden" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+112 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: English (United Kingdom)\n" "Language-Team: English (United Kingdom)\n"
@@ -90,7 +90,7 @@ msgstr "Shared by me"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "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:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968 #: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -312,7 +313,7 @@ msgstr "Search Drive"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Rename" msgstr "Rename"
@@ -678,7 +679,7 @@ msgid "Couldn't add a sync folder"
msgstr "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/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" msgid "Couldn't restore folders"
msgstr "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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "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. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1725,7 +1727,7 @@ msgid "New Folder…"
msgstr "New Folder…" msgstr "New Folder…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1867,7 +1869,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "New name" msgstr "New name"
@@ -1897,6 +1899,7 @@ msgid "Choose the folder to move into."
msgstr "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/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Move Here" msgstr "Move Here"
@@ -2124,99 +2127,103 @@ msgstr "Browse Files"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "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…" msgid "Continue This Backup Here…"
msgstr "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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Remove…" msgstr "Remove…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · last backup {time}" msgstr "{platform} · last backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{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" msgid "No folders backed up yet"
msgstr "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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "{n} folder backed up" msgstr[0] "{n} folder backed up"
msgstr[1] "{n} folders 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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} needs attention" msgstr[0] "{folders} · {n} needs attention"
msgstr[1] "{folders} · {n} need 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…" msgid "syncing…"
msgstr "syncing…" msgstr "syncing…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "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" msgid "needs attention"
msgstr "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" msgid "up to date"
msgstr "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…" msgid "checking for changes…"
msgstr "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 #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "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" msgid "Add Folder to Sync"
msgstr "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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "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:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2224,19 +2231,19 @@ msgstr ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
#: crates/pdfs-gui/src/app/pages/devices.rs:782 #: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders" msgid "Restore Folders"
msgstr "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" msgid "Restore"
msgstr "Restore" msgstr "Restore"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "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 #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "These folders are backed up from “{name}”. Restored folders keep syncing "
"with that computer's copy." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "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 #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "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" msgid "Folder will switch to online only"
msgstr "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" msgid "Folder will download and stay synced"
msgstr "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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2288,7 +2295,7 @@ msgstr ""
"copy, cancel, switch the folder to Synced, and wait for the download to " "copy, cancel, switch the folder to Synced, and wait for the download to "
"finish before removing it." "finish before removing it."
#: crates/pdfs-gui/src/app/pages/devices.rs:921 #: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2301,68 +2308,68 @@ msgstr ""
"The local files stay on this disk and simply stop being synced. Choose " "The local files stay on this disk and simply stop being synced. Choose "
"whether to also delete the copy in Proton Drive." "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?" msgid "Stop Syncing Folder?"
msgstr "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" msgid "Also delete from Proton Drive"
msgstr "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." msgid "Deletes the only copy of these files."
msgstr "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." msgid "The local copy is unaffected."
msgstr "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" msgid "Stop Syncing"
msgstr "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" msgid "Stopped syncing folder"
msgstr "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" msgid "Couldn't stop syncing the folder"
msgstr "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" msgid "Rename Computer"
msgstr "Rename Computer" msgstr "Rename Computer"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Rename “{name}”." msgstr "Rename “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "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." msgid "A name is required."
msgstr "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" msgid "Computer renamed"
msgstr "Computer renamed" msgstr "Computer renamed"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "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?" msgid "Remove Computer?"
msgstr "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 #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2377,25 +2384,25 @@ msgstr ""
"on that computer itself are not touched — but this cannot be undone from " "on that computer itself are not touched — but this cannot be undone from "
"here." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Remove" msgstr "Remove"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "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" msgid "Couldn't remove the computer"
msgstr "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?" msgid "Continue This Backup Here?"
msgstr "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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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 " "“Restore to This Computer” afterwards to bring back what “{name}” was "
"syncing." "syncing."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076 #: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here" msgid "Continue Here"
msgstr "Continue Here" msgstr "Continue Here"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "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" msgid "Couldn't continue that backup here"
msgstr "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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
@@ -90,7 +90,7 @@ msgstr "Compartido por mí"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "Equipos" msgstr "Equipos"
@@ -264,11 +264,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: 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:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -314,7 +315,7 @@ msgstr "Buscar en Drive"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Renombrar" msgstr "Renombrar"
@@ -683,7 +684,7 @@ msgid "Couldn't add a sync folder"
msgstr "No se pudo añadir una carpeta sincronizada" 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/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" msgid "Couldn't restore folders"
msgstr "No se pudieron restaurar las carpetas" 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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "Renombrar…" 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. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1732,7 +1734,7 @@ msgid "New Folder…"
msgstr "Carpeta nueva…" msgstr "Carpeta nueva…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1878,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "Nombre nuevo" msgstr "Nombre nuevo"
@@ -1908,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Elija la carpeta de destino." msgstr "Elija la carpeta de destino."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Mover aquí" msgstr "Mover aquí"
@@ -2136,99 +2139,103 @@ msgstr "Examinar archivos"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "Restaurar en este equipo…" 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…" msgid "Continue This Backup Here…"
msgstr "Continuar esta copia de seguridad aquí…" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Quitar…" msgstr "Quitar…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · última copia de seguridad {time}" msgstr "{platform} · última copia de seguridad {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{platform} · aún no hay copias de seguridad" 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" msgid "No folders backed up yet"
msgstr "Aún no hay carpetas con copia de seguridad" 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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "{n} carpeta con copia de seguridad" msgstr[0] "{n} carpeta con copia de seguridad"
msgstr[1] "{n} carpetas 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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requiere atención" msgstr[0] "{folders} · {n} requiere atención"
msgstr[1] "{folders} · {n} requieren 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…" msgid "syncing…"
msgstr "sincronizando…" msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "error de sincronización" 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" msgid "needs attention"
msgstr "requiere atención" 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" msgid "up to date"
msgstr "actualizado" msgstr "actualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "buscando cambios…" msgstr "buscando cambios…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632 #: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "buscando cambios: {done} de {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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "sincronizando {done} de {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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "sincronizando {file}: {done} de {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" msgid "Add Folder to Sync"
msgstr "Añadir carpeta para sincronizar" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "Sincronizando la carpeta…" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "No se pudo añadir la carpeta" 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:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "No se pudieron listar las carpetas para restaurar" 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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2236,19 +2243,19 @@ msgstr ""
"Marque las carpetas que sincronizar con esta máquina y ajuste dónde debe " "Marque las carpetas que sincronizar con esta máquina y ajuste dónde debe "
"estar cada una." "estar cada una."
#: crates/pdfs-gui/src/app/pages/devices.rs:782 #: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Restaurar carpetas" msgstr "Restaurar carpetas"
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "Restaurar" msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Restaurando carpetas…" msgstr "Restaurando carpetas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "Estas carpetas tienen copia de seguridad desde “{name}”. Las carpetas "
"restauradas siguen sincronizándose con la copia de ese equipo." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "" msgstr ""
"Estas carpetas tienen copia de seguridad bajo este equipo en Proton Drive." "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 #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" msgstr ""
"Nada que restaurar: todas las carpetas de “{name}” ya se sincronizan aquí." "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" msgstr ""
"Nada que restaurar: todas las carpetas de este equipo ya se sincronizan aquí." "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" msgid "Folder will switch to online only"
msgstr "La carpeta pasará a solo en línea" 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" msgid "Folder will download and stay synced"
msgstr "La carpeta se descargará y permanecerá sincronizada" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "No se pudo cambiar el modo" 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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2303,7 +2310,7 @@ msgstr ""
"Para conservar una copia local, cancele, cambie la carpeta a Sincronizada y " "Para conservar una copia local, cancele, cambie la carpeta a Sincronizada y "
"espere a que termine la descarga antes de quitarla." "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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2316,68 +2323,68 @@ msgstr ""
"Los archivos locales permanecen en este disco y simplemente dejan de " "Los archivos locales permanecen en este disco y simplemente dejan de "
"sincronizarse. Elija si quiere eliminar también la copia en Proton Drive." "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?" msgid "Stop Syncing Folder?"
msgstr "¿Dejar de sincronizar la carpeta?" 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" msgid "Also delete from Proton Drive"
msgstr "Eliminar también de 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." msgid "Deletes the only copy of these files."
msgstr "Elimina la única copia de estos archivos." 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." msgid "The local copy is unaffected."
msgstr "La copia local no se ve afectada." 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" msgid "Stop Syncing"
msgstr "Dejar de sincronizar" 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" msgid "Stopped syncing folder"
msgstr "Se dejó de sincronizar la carpeta" 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" msgid "Couldn't stop syncing the folder"
msgstr "No se pudo dejar de sincronizar la carpeta" 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" msgid "Rename Computer"
msgstr "Renombrar equipo" msgstr "Renombrar equipo"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Renombrar “{name}”." msgstr "Renombrar “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "No se pudo renombrar el equipo" 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." msgid "A name is required."
msgstr "Se necesita un nombre." 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" msgid "Computer renamed"
msgstr "Equipo renombrado" msgstr "Equipo renombrado"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "Escriba “{name}” para confirmar" 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?" msgid "Remove Computer?"
msgstr "¿Quitar el equipo?" msgstr "¿Quitar el equipo?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026 #: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "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 " "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í." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Quitar" msgstr "Quitar"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "Equipo quitado" 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" msgid "Couldn't remove the computer"
msgstr "No se pudo quitar el equipo" 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?" msgid "Continue This Backup Here?"
msgstr "¿Continuar esta copia de seguridad aquí?" 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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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 " "no se mueven. Después, use “Restaurar en este equipo” para recuperar lo que "
"“{name}” sincronizaba." "“{name}” sincronizaba."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076 #: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here" msgid "Continue Here"
msgstr "Continuar aquí" msgstr "Continuar aquí"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "Ahora se hace copia de seguridad como “{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" msgid "Couldn't continue that backup here"
msgstr "No se pudo continuar esa copia de seguridad aquí" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: French\n" "Language-Team: French\n"
@@ -90,7 +90,7 @@ msgstr "Partagés par moi"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "Ordinateurs" msgstr "Ordinateurs"
@@ -266,11 +266,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: 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:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -316,7 +317,7 @@ msgstr "Rechercher dans Drive"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Renommer" msgstr "Renommer"
@@ -686,7 +687,7 @@ msgid "Couldn't add a sync folder"
msgstr "Impossible d’ajouter un dossier synchronisé" msgstr "Impossible d’ajouter un dossier synchronisé"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58 #: 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" msgid "Couldn't restore folders"
msgstr "Impossible de restaurer les dossiers" 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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "Renommer…" 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. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1744,7 +1746,7 @@ msgid "New Folder…"
msgstr "Nouveau dossier…" msgstr "Nouveau dossier…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1890,7 +1892,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "Nouveau nom" msgstr "Nouveau nom"
@@ -1920,6 +1922,7 @@ msgid "Choose the folder to move into."
msgstr "Choisissez le dossier de destination." msgstr "Choisissez le dossier de destination."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Déplacer ici" msgstr "Déplacer ici"
@@ -2149,99 +2152,103 @@ msgstr "Parcourir les fichiers"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "Restaurer sur cet ordinateur…" 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…" msgid "Continue This Backup Here…"
msgstr "Continuer cette sauvegarde ici…" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Retirer…" msgstr "Retirer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · dernière sauvegarde {time}" msgstr "{platform} · dernière sauvegarde {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{platform} · aucune sauvegarde pour l’instant" 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" msgid "No folders backed up yet"
msgstr "Aucun dossier sauvegardé pour l’instant" 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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "{n} dossier sauvegardé" msgstr[0] "{n} dossier sauvegardé"
msgstr[1] "{n} dossiers sauvegardés" 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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requiert votre attention" msgstr[0] "{folders} · {n} requiert votre attention"
msgstr[1] "{folders} · {n} requièrent 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…" msgid "syncing…"
msgstr "synchronisation…" msgstr "synchronisation…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "erreur de synchronisation" 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" msgid "needs attention"
msgstr "attention requise" 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" msgid "up to date"
msgstr "à jour" msgstr "à jour"
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "recherche de modifications…" msgstr "recherche de modifications…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632 #: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "recherche de modifications — {done} sur {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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "synchronisation de {done} sur {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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "synchronisation de {file} — {done} sur {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" msgid "Add Folder to Sync"
msgstr "Ajouter un dossier à synchroniser" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "Synchronisation du dossier…" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "Impossible d’ajouter le dossier" msgstr "Impossible d’ajouter le dossier"
#: crates/pdfs-gui/src/app/pages/devices.rs:727 #: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "Impossible de lister les dossiers à restaurer" 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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2249,19 +2256,19 @@ msgstr ""
"Cochez les dossiers à synchroniser sur cette machine et ajustez " "Cochez les dossiers à synchroniser sur cette machine et ajustez "
"l’emplacement de chacun." "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" msgid "Restore Folders"
msgstr "Restaurer les dossiers" msgstr "Restaurer les dossiers"
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "Restaurer" msgstr "Restaurer"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Restauration des dossiers…" msgstr "Restauration des dossiers…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "Ces dossiers sont sauvegardés depuis « {name} ». Les dossiers restaurés "
"restent synchronisés avec la copie de cet ordinateur." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Ces dossiers sont sauvegardés sous cet ordinateur dans 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 #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" msgstr ""
"Rien à restaurer — les dossiers de « {name} » sont tous synchronisés ici." "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" msgstr ""
"Rien à restaurer — les dossiers de cet ordinateur sont tous synchronisés ici." "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" msgid "Folder will switch to online only"
msgstr "Le dossier passera en ligne uniquement" 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" msgid "Folder will download and stay synced"
msgstr "Le dossier va être téléchargé et rester synchronisé" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "Impossible de changer de 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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2315,7 +2322,7 @@ msgstr ""
"arrêtée. Pour conserver une copie locale, annulez, passez le dossier en " "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." "« 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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2329,68 +2336,68 @@ msgstr ""
"synchronisés. Choisissez s’il faut aussi supprimer la copie dans Proton " "synchronisés. Choisissez s’il faut aussi supprimer la copie dans Proton "
"Drive." "Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926 #: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?" msgid "Stop Syncing Folder?"
msgstr "Arrêter la synchronisation du dossier ?" 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" msgid "Also delete from Proton Drive"
msgstr "Supprimer aussi de 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." msgid "Deletes the only copy of these files."
msgstr "Supprime l’unique copie de ces fichiers." 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." msgid "The local copy is unaffected."
msgstr "La copie locale n’est pas affectée." 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" msgid "Stop Syncing"
msgstr "Arrêter la synchronisation" 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" msgid "Stopped syncing folder"
msgstr "Synchronisation du dossier arrêtée" 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" msgid "Couldn't stop syncing the folder"
msgstr "Impossible d’arrêter la synchronisation du dossier" 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" msgid "Rename Computer"
msgstr "Renommer l’ordinateur" msgstr "Renommer l’ordinateur"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Renommer « {name} »." msgstr "Renommer « {name} »."
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "Impossible de renommer l’ordinateur" 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." msgid "A name is required."
msgstr "Un nom est requis." 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" msgid "Computer renamed"
msgstr "Ordinateur renommé" msgstr "Ordinateur renommé"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "Saisissez « {name} » pour confirmer" 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?" msgid "Remove Computer?"
msgstr "Retirer l’ordinateur ?" msgstr "Retirer l’ordinateur ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026 #: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "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 " "fichiers présents sur cet ordinateur ne sont pas touchés — mais cette action "
"ne peut pas être annulée d’ici." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Retirer" msgstr "Retirer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "Ordinateur retiré" 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" msgid "Couldn't remove the computer"
msgstr "Impossible de retirer l’ordinateur" 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?" msgid "Continue This Backup Here?"
msgstr "Continuer cette sauvegarde ici ?" 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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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 " "ne sont pas déplacés. Utilisez ensuite « Restaurer sur cet ordinateur » pour "
"récupérer ce que « {name} » synchronisait." "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" msgid "Continue Here"
msgstr "Continuer ici" msgstr "Continuer ici"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "Sauvegarde désormais en tant que « {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" msgid "Couldn't continue that backup here"
msgstr "Impossible de continuer cette sauvegarde ici" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
@@ -90,7 +90,7 @@ msgstr "Condivisi da me"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "Computer" msgstr "Computer"
@@ -262,11 +262,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: 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:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -312,7 +313,7 @@ msgstr "Cerca in Drive"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Rinomina" msgstr "Rinomina"
@@ -682,7 +683,7 @@ msgid "Couldn't add a sync folder"
msgstr "Impossibile aggiungere una cartella sincronizzata" msgstr "Impossibile aggiungere una cartella sincronizzata"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58 #: 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" msgid "Couldn't restore folders"
msgstr "Impossibile ripristinare le cartelle" 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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "Rinomina…" 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. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1738,7 +1740,7 @@ msgid "New Folder…"
msgstr "Nuova cartella…" msgstr "Nuova cartella…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1884,7 +1886,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "Nuovo nome" msgstr "Nuovo nome"
@@ -1914,6 +1916,7 @@ msgid "Choose the folder to move into."
msgstr "Scegli la cartella di destinazione." msgstr "Scegli la cartella di destinazione."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Sposta qui" msgstr "Sposta qui"
@@ -2143,99 +2146,103 @@ msgstr "Sfoglia file"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "Ripristina su questo 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…" msgid "Continue This Backup Here…"
msgstr "Continua questo backup qui…" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Rimuovi…" msgstr "Rimuovi…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · ultimo backup {time}" msgstr "{platform} · ultimo backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{platform} · ancora nessun backup" 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" msgid "No folders backed up yet"
msgstr "Ancora nessuna cartella sottoposta a backup" 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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "{n} cartella sottoposta a backup" msgstr[0] "{n} cartella sottoposta a backup"
msgstr[1] "{n} cartelle sottoposte 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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} richiede attenzione" msgstr[0] "{folders} · {n} richiede attenzione"
msgstr[1] "{folders} · {n} richiedono 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…" msgid "syncing…"
msgstr "sincronizzazione…" msgstr "sincronizzazione…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "errore di sincronizzazione" 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" msgid "needs attention"
msgstr "richiede attenzione" 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" msgid "up to date"
msgstr "aggiornato" msgstr "aggiornato"
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "controllo delle modifiche…" msgstr "controllo delle modifiche…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632 #: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "controllo delle modifiche: {done} di {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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "sincronizzazione {done} di {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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "sincronizzazione di {file}: {done} di {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" msgid "Add Folder to Sync"
msgstr "Aggiungi cartella da sincronizzare" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "Sincronizzazione della cartella…" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "Impossibile aggiungere la cartella" msgstr "Impossibile aggiungere la cartella"
#: crates/pdfs-gui/src/app/pages/devices.rs:727 #: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "Impossibile elencare le cartelle da ripristinare" 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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2243,19 +2250,19 @@ msgstr ""
"Seleziona le cartelle da sincronizzare su questa macchina e regola dove deve " "Seleziona le cartelle da sincronizzare su questa macchina e regola dove deve "
"trovarsi ciascuna." "trovarsi ciascuna."
#: crates/pdfs-gui/src/app/pages/devices.rs:782 #: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Ripristina cartelle" msgstr "Ripristina cartelle"
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "Ripristina" msgstr "Ripristina"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Ripristino delle cartelle…" msgstr "Ripristino delle cartelle…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "Queste cartelle sono sottoposte a backup da “{name}”. Le cartelle "
"ripristinate continuano a sincronizzarsi con la copia di quel computer." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "" msgstr ""
"Queste cartelle sono sottoposte a backup sotto questo computer in Proton " "Queste cartelle sono sottoposte a backup sotto questo computer in Proton "
"Drive." "Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846 #: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" msgstr ""
"Niente da ripristinare: le cartelle di “{name}” sono già tutte sincronizzate " "Niente da ripristinare: le cartelle di “{name}” sono già tutte sincronizzate "
"qui." "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" msgstr ""
"Niente da ripristinare: le cartelle di questo computer sono già tutte " "Niente da ripristinare: le cartelle di questo computer sono già tutte "
"sincronizzate qui." "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" msgid "Folder will switch to online only"
msgstr "La cartella passerà a solo online" 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" msgid "Folder will download and stay synced"
msgstr "La cartella verrà scaricata e resterà sincronizzata" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "Impossibile cambiare modalità" msgstr "Impossibile cambiare modalità"
#: crates/pdfs-gui/src/app/pages/devices.rs:915 #: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2314,7 +2321,7 @@ msgstr ""
"cartella a Sincronizzata e attendi il completamento del download prima di " "cartella a Sincronizzata e attendi il completamento del download prima di "
"rimuoverla." "rimuoverla."
#: crates/pdfs-gui/src/app/pages/devices.rs:921 #: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2327,68 +2334,68 @@ msgstr ""
"I file locali restano su questo disco e semplicemente smettono di essere " "I file locali restano su questo disco e semplicemente smettono di essere "
"sincronizzati. Scegli se eliminare anche la copia in Proton Drive." "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?" msgid "Stop Syncing Folder?"
msgstr "Interrompere la sincronizzazione della cartella?" 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" msgid "Also delete from Proton Drive"
msgstr "Elimina anche da 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." msgid "Deletes the only copy of these files."
msgstr "Elimina l'unica copia di questi file." 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." msgid "The local copy is unaffected."
msgstr "La copia locale non viene modificata." 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" msgid "Stop Syncing"
msgstr "Interrompi sincronizzazione" 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" msgid "Stopped syncing folder"
msgstr "Sincronizzazione della cartella interrotta" 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" msgid "Couldn't stop syncing the folder"
msgstr "Impossibile interrompere la sincronizzazione della cartella" 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" msgid "Rename Computer"
msgstr "Rinomina computer" msgstr "Rinomina computer"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Rinomina “{name}”." msgstr "Rinomina “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "Impossibile rinominare il 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." msgid "A name is required."
msgstr "È richiesto un nome." 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" msgid "Computer renamed"
msgstr "Computer rinominato" msgstr "Computer rinominato"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "Digita “{name}” per confermare" 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?" msgid "Remove Computer?"
msgstr "Rimuovere il 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 #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2403,25 +2410,25 @@ msgstr ""
"insieme a esso. I file su quel computer non vengono toccati, ma questa " "insieme a esso. I file su quel computer non vengono toccati, ma questa "
"operazione non può essere annullata da qui." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Rimuovi" msgstr "Rimuovi"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "Computer rimosso" 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" msgid "Couldn't remove the computer"
msgstr "Impossibile rimuovere il 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?" msgid "Continue This Backup Here?"
msgstr "Continuare questo backup qui?" 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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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 " "qui non vengono spostate. Usa poi “Ripristina su questo computer” per "
"recuperare ciò che “{name}” sincronizzava." "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" msgid "Continue Here"
msgstr "Continua qui" msgstr "Continua qui"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "Ora il backup avviene come “{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" msgid "Couldn't continue that backup here"
msgstr "Impossibile continuare quel backup qui" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+112 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
@@ -90,7 +90,7 @@ msgstr "Gedeeld door mij"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "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:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968 #: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -313,7 +314,7 @@ msgstr "Drive doorzoeken"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Hernoemen" msgstr "Hernoemen"
@@ -683,7 +684,7 @@ msgid "Couldn't add a sync folder"
msgstr "Kon geen synchronisatiemap toevoegen" msgstr "Kon geen synchronisatiemap toevoegen"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58 #: 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" msgid "Couldn't restore folders"
msgstr "Kon mappen niet terugzetten" 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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "Hernoemen…" msgstr "Hernoemen…"
@@ -1578,7 +1580,7 @@ msgstr "Pictogramgrootte"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1734,7 +1736,7 @@ msgid "New Folder…"
msgstr "Nieuwe map…" msgstr "Nieuwe map…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1878,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "Nieuwe naam" msgstr "Nieuwe naam"
@@ -1908,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Kies de map waarnaar je wilt verplaatsen." msgstr "Kies de map waarnaar je wilt verplaatsen."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Hierheen verplaatsen" msgstr "Hierheen verplaatsen"
@@ -2137,99 +2140,103 @@ msgstr "Bestanden bekijken"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "Terugzetten op deze 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…" msgid "Continue This Backup Here…"
msgstr "Deze back-up hier voortzetten…" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Verwijderen…" msgstr "Verwijderen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · laatste back-up {time}" msgstr "{platform} · laatste back-up {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{platform} · nog geen back-ups" 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" msgid "No folders backed up yet"
msgstr "Nog geen mappen geback-upt" 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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "{n} map in back-up" msgstr[0] "{n} map in back-up"
msgstr[1] "{n} mappen 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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} vereist aandacht" msgstr[0] "{folders} · {n} vereist aandacht"
msgstr[1] "{folders} · {n} vereisen 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…" msgid "syncing…"
msgstr "synchroniseren…" msgstr "synchroniseren…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "synchronisatiefout" msgstr "synchronisatiefout"
#: crates/pdfs-gui/src/app/pages/devices.rs:616 #: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention" msgid "needs attention"
msgstr "vereist aandacht" 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" msgid "up to date"
msgstr "bijgewerkt" msgstr "bijgewerkt"
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "controleren op wijzigingen…" msgstr "controleren op wijzigingen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632 #: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "controleren op wijzigingen — {done} van {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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "synchroniseren: {done} van {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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "{file} synchroniseren — {done} van {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" msgid "Add Folder to Sync"
msgstr "Map toevoegen aan synchronisatie" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "Map synchroniseren…" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "Kon map niet toevoegen" msgstr "Kon map niet toevoegen"
#: crates/pdfs-gui/src/app/pages/devices.rs:727 #: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "Kon mappen om terug te zetten niet weergeven" 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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2237,19 +2244,19 @@ msgstr ""
"Vink de mappen aan die je met dit apparaat wilt synchroniseren en pas aan " "Vink de mappen aan die je met dit apparaat wilt synchroniseren en pas aan "
"waar elke map moet komen." "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" msgid "Restore Folders"
msgstr "Mappen herstellen" msgstr "Mappen herstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "Terugzetten" msgstr "Terugzetten"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Mappen terugzetten…" msgstr "Mappen terugzetten…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "Van deze mappen is een back-up gemaakt vanaf “{name}”. Teruggezette mappen "
"blijven synchroniseren met de kopie van die computer." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "" msgstr ""
"Van deze mappen is een back-up gemaakt onder deze computer in Proton Drive." "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 #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" msgstr ""
"Niets om terug te zetten — de mappen van “{name}” worden hier al allemaal " "Niets om terug te zetten — de mappen van “{name}” worden hier al allemaal "
"gesynchroniseerd." "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" msgstr ""
"Niets om terug te zetten — de mappen van deze computer worden hier al " "Niets om terug te zetten — de mappen van deze computer worden hier al "
"allemaal gesynchroniseerd." "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" msgid "Folder will switch to online only"
msgstr "Map wordt alleen online" 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" msgid "Folder will download and stay synced"
msgstr "Map wordt gedownload en blijft gesynchroniseerd" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "Kon modus niet wijzigen" 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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2306,7 +2313,7 @@ msgstr ""
"kopie houden, annuleer dan, zet de map op Gesynchroniseerd en wacht tot de " "kopie houden, annuleer dan, zet de map op Gesynchroniseerd en wacht tot de "
"download klaar is voordat je hem verwijdert." "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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2319,68 +2326,68 @@ msgstr ""
"De lokale bestanden blijven op deze schijf en worden gewoon niet meer " "De lokale bestanden blijven op deze schijf en worden gewoon niet meer "
"gesynchroniseerd. Kies of je ook de kopie in Proton Drive wilt verwijderen." "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?" msgid "Stop Syncing Folder?"
msgstr "Synchroniseren van map stoppen?" 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" msgid "Also delete from Proton Drive"
msgstr "Ook uit Proton Drive verwijderen" 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." msgid "Deletes the only copy of these files."
msgstr "Verwijdert de enige kopie van deze bestanden." 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." msgid "The local copy is unaffected."
msgstr "De lokale kopie blijft ongewijzigd." 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" msgid "Stop Syncing"
msgstr "Synchroniseren stoppen" 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" msgid "Stopped syncing folder"
msgstr "Synchroniseren van map gestopt" 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" msgid "Couldn't stop syncing the folder"
msgstr "Kon het synchroniseren van de map niet stoppen" 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" msgid "Rename Computer"
msgstr "Computer hernoemen" msgstr "Computer hernoemen"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "“{name}” hernoemen." msgstr "“{name}” hernoemen."
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "Kon de computer niet hernoemen" 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." msgid "A name is required."
msgstr "Een naam is vereist." 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" msgid "Computer renamed"
msgstr "Computer hernoemd" msgstr "Computer hernoemd"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "Typ “{name}” om te bevestigen" 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?" msgid "Remove Computer?"
msgstr "Computer verwijderen?" msgstr "Computer verwijderen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026 #: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2395,25 +2402,25 @@ msgstr ""
"mee verwijderd. De bestanden op die computer zelf blijven onaangeroerd — " "mee verwijderd. De bestanden op die computer zelf blijven onaangeroerd — "
"maar dit kan hier niet ongedaan worden gemaakt." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Verwijderen" msgstr "Verwijderen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "Computer verwijderd" 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" msgid "Couldn't remove the computer"
msgstr "Kon de computer niet verwijderen" 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?" msgid "Continue This Backup Here?"
msgstr "Deze back-up hier voortzetten?" 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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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 " "gesynchroniseerd, worden niet verplaatst. Gebruik daarna “Terugzetten op "
"deze computer” om terug te halen wat “{name}” synchroniseerde." "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" msgid "Continue Here"
msgstr "Hier voortzetten" msgstr "Hier voortzetten"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "Back-up nu als “{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" msgid "Couldn't continue that backup here"
msgstr "Kon die back-up hier niet voortzetten" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+107 -76
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 3.1.2\n" "Project-Id-Version: proton-drive-linux 3.1.2\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -93,7 +93,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "" msgstr ""
@@ -239,11 +239,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: 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:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -289,7 +290,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "" msgstr ""
@@ -653,7 +654,7 @@ msgid "Couldn't add a sync folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58 #: 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" msgid "Couldn't restore folders"
msgstr "" msgstr ""
@@ -1219,10 +1220,11 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1848 #: 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:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "" msgstr ""
@@ -1536,7 +1538,7 @@ msgstr ""
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1690,7 +1692,7 @@ msgid "New Folder…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1832,7 +1834,7 @@ msgid "{status}. {message}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "" msgstr ""
@@ -1862,6 +1864,7 @@ msgid "Choose the folder to move into."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "" msgstr ""
@@ -2089,150 +2092,154 @@ msgstr ""
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "" 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…" msgid "Continue This Backup Here…"
msgstr "" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "" msgstr ""
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "" 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" msgid "No folders backed up yet"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:590 #: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/devices.rs:603 #: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/devices.rs:614 #: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…" msgid "syncing…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:616 #: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention" msgid "needs attention"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:617 #: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date" msgid "up to date"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:632 #: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:644 #: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:650 #: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:662 #: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync" msgid "Add Folder to Sync"
msgstr "" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:727 #: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:759 #: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:782 #: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders" msgid "Restore Folders"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "These folders are backed up from “{name}”. Restored folders keep syncing "
"with that computer's copy." "with that computer's copy."
msgstr "" 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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:846 #: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" 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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" 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" msgid "Folder will switch to online only"
msgstr "" 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" msgid "Folder will download and stay synced"
msgstr "" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:915 #: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2243,7 +2250,7 @@ msgid ""
"finish before removing it." "finish before removing it."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:921 #: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2252,68 +2259,68 @@ msgid ""
"whether to also delete the copy in Proton Drive." "whether to also delete the copy in Proton Drive."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:926 #: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?" msgid "Stop Syncing Folder?"
msgstr "" 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" msgid "Also delete from Proton Drive"
msgstr "" 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." msgid "Deletes the only copy of these files."
msgstr "" 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." msgid "The local copy is unaffected."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:942 #: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:955 #: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder" msgid "Stopped syncing folder"
msgstr "" 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" msgid "Couldn't stop syncing the folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:967 #: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer" msgid "Rename Computer"
msgstr "" msgstr ""
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:995 #: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required." msgid "A name is required."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1005 #: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed" msgid "Computer renamed"
msgstr "" msgstr ""
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1023 #: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1026 #: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2323,25 +2330,25 @@ msgid ""
"here." "here."
msgstr "" 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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "" 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" msgid "Couldn't remove the computer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1068 #: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?" msgid "Continue This Backup Here?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1071 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "This computer takes over the backup of “{name}”, for example after a "
@@ -2353,20 +2360,44 @@ msgid ""
"syncing." "syncing."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1076 #: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here" msgid "Continue Here"
msgstr "" msgstr ""
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "" 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" msgid "Couldn't continue that backup here"
msgstr "" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+114 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Polish\n" "Language-Team: Polish\n"
@@ -92,7 +92,7 @@ msgstr "Udostępnione przeze mnie"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "Komputery" msgstr "Komputery"
@@ -267,11 +267,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: 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:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -317,7 +318,7 @@ msgstr "Przeszukaj Drive"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Zmień nazwę" msgstr "Zmień nazwę"
@@ -700,7 +701,7 @@ msgid "Couldn't add a sync folder"
msgstr "Nie można dodać katalogu synchronizacji" msgstr "Nie można dodać katalogu synchronizacji"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58 #: 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" msgid "Couldn't restore folders"
msgstr "Nie można przywrócić katalogów" 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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "Zmień nazwę…" 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. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1778,7 +1780,7 @@ msgid "New Folder…"
msgstr "Nowy katalog…" msgstr "Nowy katalog…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1924,7 +1926,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "Nowa nazwa" msgstr "Nowa nazwa"
@@ -1955,6 +1957,7 @@ msgid "Choose the folder to move into."
msgstr "Proszę wybrać katalog docelowy." msgstr "Proszę wybrać katalog docelowy."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Przenieś tutaj" msgstr "Przenieś tutaj"
@@ -2189,31 +2192,35 @@ msgstr "Przeglądaj pliki"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "Przywróć na tym komputerze…" 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…" msgid "Continue This Backup Here…"
msgstr "Kontynuuj tę kopię zapasową tutaj…" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Usuń…" msgstr "Usuń…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · ostatnia kopia zapasowa: {time}" msgstr "{platform} · ostatnia kopia zapasowa: {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{platform} · brak kopii zapasowych" 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" msgid "No folders backed up yet"
msgstr "Brak zarchiwizowanych katalogów" 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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders 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[1] "{n} katalogi z kopią zapasową"
msgstr[2] "{n} katalogów 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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
@@ -2229,61 +2236,61 @@ msgstr[0] "{folders} · {n} wymaga uwagi"
msgstr[1] "{folders} · {n} wymagają uwagi" msgstr[1] "{folders} · {n} wymagają uwagi"
msgstr[2] "{folders} · {n} wymaga 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…" msgid "syncing…"
msgstr "synchronizowanie…" msgstr "synchronizowanie…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "błąd synchronizacji" 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" msgid "needs attention"
msgstr "wymaga uwagi" 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" msgid "up to date"
msgstr "aktualne" msgstr "aktualne"
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "sprawdzanie zmian…" msgstr "sprawdzanie zmian…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632 #: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "sprawdzanie zmian — {done} z {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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "synchronizowanie {done} z {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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "synchronizowanie {file} — {done} z {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" msgid "Add Folder to Sync"
msgstr "Dodaj katalog do synchronizacji" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "Synchronizowanie katalogu…" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "Nie można dodać katalogu" msgstr "Nie można dodać katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:727 #: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "Nie można wyświetlić listy katalogów do przywrócenia" 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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2291,19 +2298,19 @@ msgstr ""
"Należy zaznaczyć katalogi do synchronizacji z tym komputerem i dostosować " "Należy zaznaczyć katalogi do synchronizacji z tym komputerem i dostosować "
"położenie każdego z nich." "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" msgid "Restore Folders"
msgstr "Przywróć katalogi" msgstr "Przywróć katalogi"
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "Przywróć" msgstr "Przywróć"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Przywracanie katalogów…" msgstr "Przywracanie katalogów…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "Te katalogi mają kopię zapasową z komputera „{name}”. Przywrócone katalogi "
"nadal będą synchronizowane z kopią tego komputera." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Te katalogi mają kopię zapasową w Proton Drive pod tym komputerem." 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 #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" msgstr ""
"Nie ma nic do przywrócenia — wszystkie katalogi komputera „{name}” są tutaj " "Nie ma nic do przywrócenia — wszystkie katalogi komputera „{name}” są tutaj "
"synchronizowane." "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" msgstr ""
"Nie ma nic do przywrócenia — wszystkie katalogi tego komputera są tutaj " "Nie ma nic do przywrócenia — wszystkie katalogi tego komputera są tutaj "
"synchronizowane." "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" msgid "Folder will switch to online only"
msgstr "Katalog przejdzie w tryb tylko online" 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" msgid "Folder will download and stay synced"
msgstr "Katalog zostanie pobrany i będzie synchronizowany" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "Nie można zmienić trybu" 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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2359,7 +2366,7 @@ msgstr ""
"pusty. Aby zachować lokalną kopię, należy anulować, przełączyć katalog na " "pusty. Aby zachować lokalną kopię, należy anulować, przełączyć katalog na "
"tryb Synchronizowany i poczekać na ukończenie pobierania przed usunięciem." "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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2372,68 +2379,68 @@ msgstr ""
"Lokalne pliki pozostaną na tym dysku i po prostu przestaną być " "Lokalne pliki pozostaną na tym dysku i po prostu przestaną być "
"synchronizowane. Można też usunąć kopię w Proton Drive." "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?" msgid "Stop Syncing Folder?"
msgstr "Zatrzymać synchronizację katalogu?" 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" msgid "Also delete from Proton Drive"
msgstr "Usuń także z 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." msgid "Deletes the only copy of these files."
msgstr "Usuwa jedyną kopię tych plików." 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." msgid "The local copy is unaffected."
msgstr "Lokalna kopia pozostanie bez zmian." 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" msgid "Stop Syncing"
msgstr "Zatrzymaj synchronizację" 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" msgid "Stopped syncing folder"
msgstr "Zatrzymano synchronizację katalogu" 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" msgid "Couldn't stop syncing the folder"
msgstr "Nie można zatrzymać synchronizacji katalogu" 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" msgid "Rename Computer"
msgstr "Zmiana nazwy komputera" msgstr "Zmiana nazwy komputera"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Proszę podać nową nazwę komputera „{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:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "Nie można zmienić nazwy komputera" 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." msgid "A name is required."
msgstr "Nazwa jest wymagana." 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" msgid "Computer renamed"
msgstr "Zmieniono nazwę komputera" msgstr "Zmieniono nazwę komputera"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "Proszę wpisać „{name}”, aby potwierdzić" 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?" msgid "Remove Computer?"
msgstr "Usunąć komputer?" msgstr "Usunąć komputer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026 #: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2448,25 +2455,25 @@ msgstr ""
"z nim. Pliki na samym komputerze pozostaną nietknięte — ale tej operacji nie " "z nim. Pliki na samym komputerze pozostaną nietknięte — ale tej operacji nie "
"można tutaj cofnąć." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Usuń" msgstr "Usuń"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "Usunięto komputer" 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" msgid "Couldn't remove the computer"
msgstr "Nie można usunąć komputera" 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?" msgid "Continue This Backup Here?"
msgstr "Kontynuować tę kopię zapasową tutaj?" 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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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ć " "przeniesione. Aby odzyskać to, co synchronizował „{name}”, proszę potem użyć "
"opcji „Przywróć na tym komputerze”." "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" msgid "Continue Here"
msgstr "Kontynuuj tutaj" msgstr "Kontynuuj tutaj"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "Kopia zapasowa jest teraz tworzona jako „{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" msgid "Couldn't continue that backup here"
msgstr "Nie można kontynuować tej kopii zapasowej tutaj" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"
+113 -76
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-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" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Portuguese (Brazil)\n" "Language-Team: Portuguese (Brazil)\n"
@@ -90,7 +90,7 @@ msgstr "Compartilhados por mim"
#: crates/pdfs-gui/src/app/main.rs:776 #: 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:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers" msgid "Computers"
msgstr "Computadores" msgstr "Computadores"
@@ -262,11 +262,12 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: 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:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381 #: 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:792
#: crates/pdfs-gui/src/app/pages/devices.rs:941 #: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:979 #: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1031 #: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: 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:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
@@ -312,7 +313,7 @@ msgstr "Pesquisar no Drive"
#: crates/pdfs-gui/src/app/main.rs:1388 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: 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.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246 #: 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/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: 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 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "Renomear" msgstr "Renomear"
@@ -682,7 +683,7 @@ msgid "Couldn't add a sync folder"
msgstr "Não foi possível adicionar uma pasta sincronizada" 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/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" msgid "Couldn't restore folders"
msgstr "Não foi possível restaurar as pastas" 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:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315 #: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491 #: 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:698
#: crates/pdfs-gui/src/app/pages/devices.rs:734 #: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:884 #: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1120 #: 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/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536 #: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783 #: 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/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840 #: 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/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541 #: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474 #: 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/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882 #: 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:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444 #: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…" msgid "Rename…"
msgstr "Renomear…" 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. #. 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:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925 #: 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/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565 #: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1733,7 +1735,7 @@ msgid "New Folder…"
msgstr "Nova pasta…" msgstr "Nova pasta…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953 #: 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.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242 #: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1878,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}" msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875 #: 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" msgid "New name"
msgstr "Novo nome" msgstr "Novo nome"
@@ -1908,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Escolha a pasta de destino." msgstr "Escolha a pasta de destino."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969 #: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here" msgid "Move Here"
msgstr "Mover para cá" msgstr "Mover para cá"
@@ -2136,99 +2139,103 @@ msgstr "Navegar pelos arquivos"
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "Restaurar neste computador…" 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…" msgid "Continue This Backup Here…"
msgstr "Continuar este backup aqui…" 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 #: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…" msgid "Remove…"
msgstr "Remover…" msgstr "Remover…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · last backup {time}" msgid "{platform} · last backup {time}"
msgstr "{platform} · último backup {time}" msgstr "{platform} · último backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux". #. 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 #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "{platform} · nenhum backup ainda" 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" msgid "No folders backed up yet"
msgstr "Nenhuma pasta com backup ainda" 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 #, rust-format
msgid "{n} folder backed up" msgid "{n} folder backed up"
msgid_plural "{n} folders backed up" msgid_plural "{n} folders backed up"
msgstr[0] "{n} pasta com backup" msgstr[0] "{n} pasta com backup"
msgstr[1] "{n} pastas 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 #, rust-format
msgid "{folders} · {n} needs attention" msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention" msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requer atenção" msgstr[0] "{folders} · {n} requer atenção"
msgstr[1] "{folders} · {n} requerem 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…" msgid "syncing…"
msgstr "sincronizando…" msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615 #: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error" msgid "sync error"
msgstr "erro de sincronização" 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" msgid "needs attention"
msgstr "requer atenção" 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" msgid "up to date"
msgstr "atualizado" msgstr "atualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:629 #: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…" msgid "checking for changes…"
msgstr "verificando alterações…" msgstr "verificando alterações…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632 #: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format #, rust-format
msgid "checking for changes — {done} of {total}" msgid "checking for changes — {done} of {total}"
msgstr "verificando alterações — {done} de {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 #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "sincronizando {done} de {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 #, rust-format
msgid "syncing {file} — {done} of {total}" msgid "syncing {file} — {done} of {total}"
msgstr "sincronizando {file} — {done} de {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" msgid "Add Folder to Sync"
msgstr "Adicionar pasta à sincronização" 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 #: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…" msgid "Syncing folder…"
msgstr "Sincronizando pasta…" 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:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder" msgid "Couldn't add folder"
msgstr "Não foi possível adicionar a pasta" 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:731
#: crates/pdfs-gui/src/app/pages/devices.rs:733 #: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "Não foi possível listar as pastas para restaurar" 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 "" msgid ""
"Tick the folders to sync to this machine, and adjust where each one should " "Tick the folders to sync to this machine, and adjust where each one should "
"live." "live."
@@ -2236,19 +2243,19 @@ msgstr ""
"Marque as pastas a sincronizar com esta máquina e ajuste onde cada uma deve " "Marque as pastas a sincronizar com esta máquina e ajuste onde cada uma deve "
"ficar." "ficar."
#: crates/pdfs-gui/src/app/pages/devices.rs:782 #: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Restaurar pastas" msgstr "Restaurar pastas"
#: crates/pdfs-gui/src/app/pages/devices.rs:789 #: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore" msgid "Restore"
msgstr "Restaurar" msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:822 #: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Restaurando pastas…" msgstr "Restaurando pastas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834 #: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format #, rust-format
msgid "" msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing " "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 " "Estas pastas têm backup a partir de “{name}”. As pastas restauradas "
"continuam sincronizando com a cópia daquele computador." "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." msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Estas pastas têm backup sob este computador no 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 #, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here." msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "" msgstr ""
"Nada a restaurar — as pastas de “{name}” já estão todas sincronizadas aqui." "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." msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "" msgstr ""
"Nada a restaurar — as pastas deste computador já estão todas sincronizadas " "Nada a restaurar — as pastas deste computador já estão todas sincronizadas "
"aqui." "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" msgid "Folder will switch to online only"
msgstr "A pasta passará a ser somente online" 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" msgid "Folder will download and stay synced"
msgstr "A pasta será baixada e permanecerá sincronizada" 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:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode" msgid "Couldn't change mode"
msgstr "Não foi possível alterar o modo" 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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2303,7 +2310,7 @@ msgstr ""
"uma cópia local, cancele, mude a pasta para Sincronizada e aguarde o " "uma cópia local, cancele, mude a pasta para Sincronizada e aguarde o "
"download terminar antes de removê-la." "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 #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2316,68 +2323,68 @@ msgstr ""
"Os arquivos locais permanecem neste disco e simplesmente deixam de ser " "Os arquivos locais permanecem neste disco e simplesmente deixam de ser "
"sincronizados. Escolha se também deseja excluir a cópia no Proton Drive." "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?" msgid "Stop Syncing Folder?"
msgstr "Parar de sincronizar a pasta?" 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" msgid "Also delete from Proton Drive"
msgstr "Também excluir do 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." msgid "Deletes the only copy of these files."
msgstr "Exclui a única cópia destes arquivos." 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." msgid "The local copy is unaffected."
msgstr "A cópia local não é afetada." 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" msgid "Stop Syncing"
msgstr "Parar de sincronizar" 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" msgid "Stopped syncing folder"
msgstr "A pasta deixou de ser sincronizada" 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" msgid "Couldn't stop syncing the folder"
msgstr "Não foi possível parar de sincronizar a pasta" 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" msgid "Rename Computer"
msgstr "Renomear computador" msgstr "Renomear computador"
#. Translators: {name} is the computer's current name. #. 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 #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Renomear “{name}”." msgstr "Renomear “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994 #: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1006 #: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "Não foi possível renomear o computador" 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." msgid "A name is required."
msgstr "Um nome é obrigatório." 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" msgid "Computer renamed"
msgstr "Computador renomeado" msgstr "Computador renomeado"
#. Translators: {name} is the computer's name, which the user must type. #. 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 #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "Digite “{name}” para confirmar" 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?" msgid "Remove Computer?"
msgstr "Remover computador?" msgstr "Remover computador?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026 #: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "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 " "naquele próprio computador não são tocados — mas isso não pode ser desfeito "
"daqui." "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/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove" msgid "Remove"
msgstr "Remover" msgstr "Remover"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049 #: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed" msgid "Computer removed"
msgstr "Computador removido" 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" msgid "Couldn't remove the computer"
msgstr "Não foi possível remover o computador" 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?" msgid "Continue This Backup Here?"
msgstr "Continuar este backup aqui?" 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 #, rust-format
msgid "" msgid ""
"This computer takes over the backup of “{name}”, for example after a " "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 " "movidas. Depois, use “Restaurar neste computador” para recuperar o que "
"“{name}” sincronizava." "“{name}” sincronizava."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076 #: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here" msgid "Continue Here"
msgstr "Continuar aqui" msgstr "Continuar aqui"
#. Translators: {name} is the name of the computer whose backup this one took over. #. 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 #, rust-format
msgid "Now backing up as “{name}”" msgid "Now backing up as “{name}”"
msgstr "Agora fazendo backup como “{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" msgid "Couldn't continue that backup here"
msgstr "Não foi possível continuar esse backup aqui" 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 #: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates" msgctxt "duplicates"
msgid "Exact" msgid "Exact"