Compare commits

..
Author SHA1 Message Date
nvrl d13e74fc12 fix(gui,cli,core): offer the CAPTCHA in the browser when the web view cannot start (B195)
The verification window now runs in its own process, so the app survives
when WebKit cannot start its sandbox on secureblue, but the CAPTCHA still
could not be solved there (#29). WebKit binds the journal socket with
`--ro-bind-try`, bubblewrap only skips a missing path, not an unreadable
one, and WebKit has no switch to leave the socket out.

Proton Mail Bridge never uses a web view: it opens verify.proton.me in the
system browser and retries with the original challenge token, typed with
the offered methods. Do the same as a fallback.

- core: `browser_verification_url` and `browser_verified` build the page
  URL and the retry credential from the challenge
- gui: when the verification window fails, a dialog opens the page in the
  browser and continues the sign-in once the user is done
- cli: `pdfs login` handles a CAPTCHA the same way instead of failing
- i18n: translate the new dialog in every catalog
- docs: B195, TROUBLESHOOTING.md, ARCHITECTURE.md, changelog

Fixes #29
2026-10-08 19:02:29 +02:00
36 changed files with 1559 additions and 2564 deletions

No files matched your search

+22 -40
View File
@@ -628,15 +628,6 @@ 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)]
@@ -976,24 +967,6 @@ 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(())
} }
@@ -1843,20 +1816,29 @@ fn cmd_login(username: Option<String>, remember: bool) -> Result<()> {
// Only a two-password account is ever asked for this. // Only a two-password account is ever asked for this.
let get_mailbox = |attempt: u32| prompt_mailbox(attempt, remember); let get_mailbox = |attempt: u32| prompt_mailbox(attempt, remember);
// Proton may ask for a CAPTCHA first, usually on a VPN. The CLI has no
// browser engine, so the user solves the page in their own browser and says
// when they are done; the retry then carries the challenge token.
let get_hv = |hv: pdfs_core::proton_sdk::api::HumanVerification| {
println!(
"Proton is asking for a CAPTCHA before it will accept this sign-in.\n\
Open this page in your browser and complete it:\n\n {}\n",
auth::browser_verification_url(&hv)
);
prompt_line("Press Enter once the page says you are verified")
.map_err(|e| pdfs_core::Error::Other(format!("read verification answer: {e}")))?;
Ok(auth::browser_verified(&hv))
};
let rt = tokio::runtime::Runtime::new()?; let rt = tokio::runtime::Runtime::new()?;
// Solving a CAPTCHA needs a browser engine, which the CLI has no business rt.block_on(auth::login_interactive(
// carrying. Point at the app that does rather than failing with the raw API &username,
// message, which reads as "your login is broken". &password,
rt.block_on(auth::login(&username, &password, get_totp, get_mailbox)) get_totp,
.map_err(|e| match e { get_mailbox,
pdfs_core::Error::HumanVerificationRequired(_) => anyhow::anyhow!( get_hv,
"Proton is asking for a CAPTCHA before it will accept this sign-in.\n\ ))
Run `pdfs-app` and sign in there — it can show the verification page.\n\ .context("login failed")?;
(This is usually triggered by a VPN or an unfamiliar IP; signing in from \
your usual network often avoids it.)"
),
other => anyhow::Error::new(other).context("login failed"),
})?;
// A daemon that is already up is parked in `wait_for_session`, sleeping // A daemon that is already up is parked in `wait_for_session`, sleeping
// between keyring checks; restart it so the mount appears now instead of // between keyring checks; restart it so the mount appears now instead of
+62
View File
@@ -206,6 +206,44 @@ pub async fn login_interactive(
} }
} }
/// Proton's verification page for the user's own browser, for a front-end that
/// cannot host it in a webview.
///
/// Unlike [`HumanVerification::verification_url`] this asks for the full page,
/// not the embedded one: a browser tab has no host to post the token to, so the
/// page has to tell the user they are done instead. Proton Mail Bridge opens the
/// same URL.
pub fn browser_verification_url(hv: &HumanVerification) -> String {
let token: String = hv
.token
.bytes()
.map(|b| match b {
b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => {
(b as char).to_string()
}
_ => format!("%{b:02X}"),
})
.collect();
format!(
"https://verify.proton.me/?methods={}&token={token}",
hv.methods.join(","),
)
}
/// The credential to retry with once the user has solved the challenge in
/// their browser.
///
/// The browser keeps the page's own token, so the retry carries the challenge
/// token instead: solving the page marks that token as verified on Proton's
/// side. The type is every offered method, as Proton Mail Bridge sends it, since
/// the user may have picked any of them on the page.
pub fn browser_verified(hv: &HumanVerification) -> HumanVerificationCredential {
HumanVerificationCredential {
token: hv.token.clone(),
method: hv.methods.join(","),
}
}
/// [`login`], replaying a human-verification token the user has already earned. /// [`login`], replaying a human-verification token the user has already earned.
/// ///
/// A gated login fails with [`Error::HumanVerificationRequired`] carrying the /// A gated login fails with [`Error::HumanVerificationRequired`] carrying the
@@ -674,6 +712,30 @@ mod tests {
) )
} }
fn challenge() -> HumanVerification {
serde_json::from_str(
r#"{"HumanVerificationToken":"ab+c/d=","HumanVerificationMethods":["captcha","email"]}"#,
)
.unwrap()
}
#[test]
fn the_browser_gets_the_full_verification_page() {
assert_eq!(
browser_verification_url(&challenge()),
"https://verify.proton.me/?methods=captcha,email&token=ab%2Bc%2Fd%3D"
);
}
/// The browser keeps the page's token, so the retry replays the challenge
/// itself, typed with every method the page offered.
#[test]
fn a_browser_verification_retries_with_the_challenge_token() {
let credential = browser_verified(&challenge());
assert_eq!(credential.token, "ab+c/d=");
assert_eq!(credential.method, "captcha,email");
}
#[test] #[test]
fn passphrases_survive_the_blob_encoding() { fn passphrases_survive_the_blob_encoding() {
let decoded = decode(&encode(&passphrases())).expect("decodes"); let decoded = decode(&encode(&passphrases())).expect("decodes");
-10
View File
@@ -446,13 +446,6 @@ 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
@@ -3089,9 +3082,6 @@ 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,17 +139,6 @@ 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,28 +4940,6 @@ 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();
+1 -5
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 { .. } | R::MigrateDevice { .. } => &[Topic::Devices, Topic::Locations], R::AdoptDevice { .. } => &[Topic::Devices, Topic::Locations],
R::AddSyncFolder { .. } R::AddSyncFolder { .. }
| R::RemoveSyncFolder { .. } | R::RemoveSyncFolder { .. }
| R::SetSyncFolderMode { .. } | R::SetSyncFolderMode { .. }
@@ -1297,10 +1297,6 @@ 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
+9 -176
View File
@@ -19,7 +19,6 @@ 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};
@@ -115,22 +114,6 @@ 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 ----------------------------------------------------------
@@ -277,107 +260,6 @@ 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
@@ -478,25 +360,21 @@ 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(Vec::new()); return Ok(None);
} }
self.rt let nodes = self
.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
@@ -964,23 +842,6 @@ 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))
})?; })?;
@@ -1246,38 +1107,10 @@ mod tests {
use pdfs_core::db::StoredSyncFolder; use pdfs_core::db::StoredSyncFolder;
use super::{ use super::{
ApplicableMountMode, commit_after_teardown, migrated_name, pending_intent_matches, ApplicableMountMode, commit_after_teardown, 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,9 +744,6 @@ 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,7 +475,6 @@ 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
+99 -542
View File
@@ -59,9 +59,8 @@ pub(crate) use planner::base_name;
#[cfg(test)] #[cfg(test)]
use planner::conflict_path; use planner::conflict_path;
use planner::{ use planner::{
FilePlan, Unscanned, classification_order, conflict_path_with_suffix, filter_baseline, FilePlan, classification_order, conflict_path_with_suffix, filter_baseline, guard_local_wipe,
guard_local_wipe, join_rel, local_deletions, parent_rel, plan_file, rel_to_path, remote_sig, join_rel, parent_rel, plan_file, rel_to_path, remote_sig, unchanged_remote_size,
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).
@@ -188,7 +187,6 @@ 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.
@@ -245,37 +243,6 @@ 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`.
/// ///
@@ -283,7 +250,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.
pub(crate) fn ignore_rules(&self, local_root: &Path) -> IgnoreRules { 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) => {
@@ -346,23 +313,15 @@ 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, folder_id, local_root, local_root, rules, &writing, &mut local,
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 or unreadable path is absent from `local` by rule or by // ignored path is absent from `local` by rule, not by loss, and counting
// failure, not by loss, and counting those as missing would trip the // those as missing would trip the guard on every pass — wedging the
// guard on every pass — wedging the folder's sync permanently — the // folder's sync permanently — the moment a rule covers the whole tree.
// moment a rule covers the whole tree. guard_local_wipe(&filter_baseline(&baseline, rules), &local)?;
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
@@ -432,7 +391,6 @@ 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();
@@ -557,8 +515,13 @@ 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 &local_deletions(&tracked, &local) { for rel in missing {
if trashed if trashed
.iter() .iter()
.any(|dir| rel.starts_with(&format!("{dir}/"))) .any(|dir| rel.starts_with(&format!("{dir}/")))
@@ -623,18 +586,12 @@ 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, folder_id, local_root, local_root, rules, &writing, &mut local,
local_root,
rules,
&writing,
&mut local,
&mut unscanned,
)?; )?;
// See `push_pass`: the guard must not count excluded paths as lost. // See `push_pass`: the guard must not count rule-excluded paths as lost.
guard_local_wipe(&tracked_baseline(&baseline, rules, &unscanned), &local)?; guard_local_wipe(&filter_baseline(&baseline, rules), &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();
@@ -648,15 +605,9 @@ impl Core {
&baseline, &baseline,
)?; )?;
let mut order = classification_order(&local, &remote, &baseline, rules); let 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 { let mut outcome = Outcome::default();
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();
@@ -922,19 +873,19 @@ impl Core {
Ok(outcome) Ok(outcome)
} }
/// Recursively walk a local tree into `out`, keyed by `/`-joined relative /// Recursively walk a local directory into `out`, keyed by `/`-joined relative
/// path. Symlinks and other special files are skipped, and paths that cannot /// path. Symlinks and other special files are skipped. Reports each entry to the
/// be read go to `unscanned`. Reports each entry to the pass's scan progress. /// 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, rules, writing, out, unscanned, &mut |rel| { walk_local_tree(root, dir, rules, writing, out, &mut |rel| {
self.progress_scanned(folder_id, base_name(rel)) self.progress_scanned(folder_id, base_name(rel))
}) })
} }
@@ -1631,120 +1582,51 @@ 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 `root` into `out`, reporting each entry to `scanned`. /// local tree under `dir` into `out`, reporting each entry to `scanned`.
/// ///
/// **A path the scan cannot read is left out and recorded in `unscanned`, never /// **Every failure here is fatal to the pass, deliberately.** A `read_dir` that
/// silently dropped.** Every pass drops what `unscanned` covers from /// fails, an entry that cannot be stat-ed, a name that is not UTF-8 — each of
/// classification, so a baseline row under it is neither a local deletion nor a /// them would, if skipped, leave `out` describing a *smaller* tree than the one
/// download target (`docs/BUGS.md` B55). That covers a subfolder the pass has no /// on disk. Reconciliation reads a path present in the baseline and absent from
/// permission for, an entry that vanished between the listing and its `stat`, /// the scan as "the user deleted this", and propagates that to Drive. So an
/// and a name that is not UTF-8. Failing the whole pass on any of them, as this /// unreadable subdirectory would trash its remote counterpart, and the deeper
/// did before, left one root-owned folder stopping everything else in the tree /// the failure, the more it takes with it (`docs/BUGS.md` B55). Refusing the
/// from syncing, on every pass, for good (B196). /// whole pass keeps the previous baseline and leaves the remote alone; the next
/// /// 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<(), ScanError> { ) -> Result<(), String> {
let io = |what: String| move |error| ScanError::Io { what, error }; let entries = std::fs::read_dir(dir).map_err(|e| format!("read {}: {e}", dir.display()))?;
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(io(format!("read entry in {}", dir.display())))?; let entry = entry.map_err(|e| format!("read entry in {}: {e}", 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| {
ScanError::Failed(format!( 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
@@ -1764,15 +1646,7 @@ fn walk_local_dir(
}, },
); );
scanned(rel); scanned(rel);
if let Err(failure) = walk_local_tree(root, &path, rules, writing, out, scanned)?;
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
@@ -1810,7 +1684,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, None, &mut seen) { if let Some(reason) = unsynced_local(root, rel, baseline, &mut seen) {
return Some(reason); return Some(reason);
} }
let prefix = format!("{rel}/"); let prefix = format!("{rel}/");
@@ -1821,93 +1695,45 @@ 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 = if rel.is_empty() { let path = root.join(rel_to_path(rel));
root.to_path_buf() let meta = match std::fs::symlink_metadata(&path) {
} else { Ok(meta) => meta,
root.join(rel_to_path(rel)) Err(e) => return Some(format!("cannot read {rel}: {e}")),
}; };
// The folder itself has no baseline row; only what is in it does. let Some(base) = baseline.get(rel) else {
if !rel.is_empty() { return Some(format!("{rel} is not on Proton Drive yet"));
let meta = match std::fs::symlink_metadata(&path) { };
Ok(meta) => meta, seen.insert(rel.to_string());
Err(e) => return Some(format!("cannot read {rel}: {e}")), if meta.is_file() {
}; return (!LocalSig::from(&meta).same_content(&LocalSig::from(base)))
let Some(base) = baseline.get(rel) else { .then(|| format!("{rel} has changes that are not on Proton Drive yet"));
if rules.is_some_and(|rules| rules.is_ignored(rel, meta.is_dir())) { }
return Some(format!( if !meta.is_dir() {
"{rel} is excluded from sync, so it is only on this computer" return Some(format!("{rel} is not a regular file or folder"));
));
}
return Some(format!("{rel} is not on Proton Drive yet"));
};
seen.insert(rel.to_string());
if meta.is_file() {
return (!LocalSig::from(&meta).same_content(&LocalSig::from(base)))
.then(|| format!("{rel} has changes that are not on Proton Drive yet"));
}
if !meta.is_dir() {
return Some(format!("{rel} is not a regular file or folder"));
}
} }
let shown = if rel.is_empty() { "the folder" } else { rel };
let entries = match std::fs::read_dir(&path) { let entries = match std::fs::read_dir(&path) {
Ok(entries) => entries, Ok(entries) => entries,
Err(e) => return Some(format!("cannot read {shown}: {e}")), Err(e) => return Some(format!("cannot read {rel}: {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 {shown}: {e}")), Err(e) => return Some(format!("cannot read {rel}: {e}")),
}; };
let Some(name) = name.to_str() else { let Some(name) = name.to_str() else {
return Some(format!("{shown} holds a name that is not valid UTF-8")); return Some(format!("{rel} 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, &join_rel(rel, name), baseline, rules, seen) { if let Some(reason) = unsynced_local(root, &format!("{rel}/{name}"), baseline, seen) {
return Some(reason); return Some(reason);
} }
} }
@@ -2328,15 +2154,7 @@ 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( walk_local_tree(&root, &root, &rules, &writing, &mut local, &mut progress).unwrap();
&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 {
@@ -2352,15 +2170,7 @@ 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( walk_local_tree(&root, &root, &rules, &writing, &mut local, &mut progress).unwrap();
&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());
@@ -2665,176 +2475,33 @@ mod tests {
|_: &str| {} |_: &str| {}
} }
/// Scan `root` with no rules, returning what it found and left out. /// A directory the pass cannot read must fail the pass. Omitting it would
fn scan(root: &Path) -> Result<(HashMap<String, LocalItem>, Unscanned), String> { /// hand reconciliation a baseline-minus-subtree, which it reads as the user
let mut out = HashMap::new(); /// having deleted that subtree and propagates to Drive (B55).
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_is_left_out_and_the_rest_scans() { fn an_unreadable_subdirectory_fails_the_scan_instead_of_shrinking_it() {
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();
std::fs::create_dir_all(root.join("docker/cache")).unwrap(); let locked = root.join("locked");
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 result = scan(&root); let rules = rules_for(&[]);
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
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 (out, unscanned) = result.expect("one unreadable folder must not fail the pass"); let error = result.expect_err("an unreadable directory must abort the pass");
assert_eq!( assert!(
sorted_keys(&out), error.contains("locked"),
vec!["docker", "docker/cache", "docker/compose.yml", "keep.txt"] "the error should name the subtree it could not read: {error}"
);
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"]
); );
} }
@@ -2926,94 +2593,6 @@ 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]
@@ -3028,14 +2607,7 @@ 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( let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
&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();
@@ -3056,40 +2628,30 @@ 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!( assert!(walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress).is_err());
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, but it /// A name that is not valid UTF-8 cannot be keyed into the scan, so it
/// cannot be in the baseline or on Drive either, so leaving it out reads as /// cannot be compared against the baseline either. Refusing the pass is the
/// the deletion of nothing. It used to fail the pass (B196). /// only safe reading: skipping it would classify the file as deleted.
#[test] #[test]
fn a_non_utf8_name_is_left_out_and_reported() { fn a_non_utf8_name_fails_the_scan() {
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 result = scan(&root); let rules = rules_for(&[]);
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
std::fs::remove_dir_all(&root).unwrap(); std::fs::remove_dir_all(&root).unwrap();
let (out, unscanned) = result.unwrap(); let error = result.expect_err("a name the scan cannot key must abort the pass");
assert_eq!(sorted_keys(&out), vec!["good.txt"]); assert!(error.contains("UTF-8"), "{error}");
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
@@ -3108,14 +2670,9 @@ 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( let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut |rel| {
&root, seen.push(rel.to_string())
&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,11 +98,6 @@ 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,96 +90,6 @@ 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,10 +439,6 @@ 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 || {
@@ -1100,67 +1096,6 @@ 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();
+82 -29
View File
@@ -1,5 +1,5 @@
use crate::*; use crate::*;
use pdfs_core::proton_sdk::api::HumanVerificationCredential; use pdfs_core::proton_sdk::api::{HumanVerification, HumanVerificationCredential};
pub(crate) struct LoginState { pub(crate) struct LoginState {
// Login page. // Login page.
@@ -150,26 +150,24 @@ pub(crate) fn wire_login(ui: &Rc<Ui>) {
}); });
// Same shape for human verification: only fires when the API gates the // Same shape for human verification: only fires when the API gates the
// sign-in, and the worker is blocked on the token until it does. A // sign-in, and the worker is blocked on the credential until it does.
// window that never came up is told apart from one the user closed, so
// the result below can say why the sign-in stopped.
let ui_hv = ui.clone(); let ui_hv = ui.clone();
let verification_failed = Rc::new(Cell::new(false));
let hv_failed = verification_failed.clone();
glib::spawn_future_local(async move { glib::spawn_future_local(async move {
if let Ok((url, token_tx)) = hv_req_rx.recv().await { if let Ok((hv, credential_tx)) = hv_req_rx.recv().await {
ui_hv ui_hv
.login .login
.login_status .login_status
.set_text(&gettext("Complete the verification to continue…")); .set_text(&gettext("Complete the verification to continue…"));
// Anything but a token drops the sender, which the worker reads // Anything but a credential drops the sender, which the worker
// as a cancelled sign-in. // reads as a cancelled sign-in.
match verify_human(url).await { match verify_human(hv.verification_url()).await {
Verification::Solved(token) => { Verification::Solved(token) => {
let _ = token_tx.send(token); let _ = credential_tx.send(HumanVerificationCredential::captcha(token));
} }
Verification::Cancelled => {} Verification::Cancelled => {}
Verification::Failed => hv_failed.set(true), // The web view could not start, most likely its sandbox
// (B195): the user's browser can show the page instead.
Verification::Failed => verify_in_browser(&ui_hv, &hv, credential_tx),
} }
} }
}); });
@@ -206,9 +204,6 @@ pub(crate) fn wire_login(ui: &Rc<Ui>) {
let _ = gio::spawn_blocking(service::enable_start).await; let _ = gio::spawn_blocking(service::enable_start).await;
refresh(&ui); refresh(&ui);
} }
Err(_) if verification_failed.get() => ui.login.login_status.set_text(&gettext(
"The verification page couldn't be opened, so the sign-in was cancelled. Your system may keep the web view's sandbox from starting; the troubleshooting guide explains what to do.",
)),
Err(e) => ui.login.login_status.set_text(&e), Err(e) => ui.login.login_status.set_text(&e),
} }
}); });
@@ -267,9 +262,12 @@ pub(crate) struct LoginChannels {
pub(crate) result: async_channel::Receiver<Result<(), String>>, pub(crate) result: async_channel::Receiver<Result<(), String>>,
/// Fires only if the account needs a 2FA code; carries the sender for it. /// Fires only if the account needs a 2FA code; carries the sender for it.
pub(crate) totp: async_channel::Receiver<std::sync::mpsc::Sender<String>>, pub(crate) totp: async_channel::Receiver<std::sync::mpsc::Sender<String>>,
/// Fires only if the sign-in is gated: the page to show, and the sender for /// Fires only if the sign-in is gated: the challenge, and the sender for the
/// the token the user earns on it. /// credential the user earns by solving it.
pub(crate) hv: async_channel::Receiver<(String, std::sync::mpsc::Sender<String>)>, pub(crate) hv: async_channel::Receiver<(
HumanVerification,
std::sync::mpsc::Sender<HumanVerificationCredential>,
)>,
/// Fires only for a two-password account: how many answers were already /// Fires only for a two-password account: how many answers were already
/// wrong, and the sender for the password and the "remember" choice. /// wrong, and the sender for the password and the "remember" choice.
pub(crate) mailbox: async_channel::Receiver<(u32, std::sync::mpsc::Sender<(String, bool)>)>, pub(crate) mailbox: async_channel::Receiver<(u32, std::sync::mpsc::Sender<(String, bool)>)>,
@@ -327,18 +325,16 @@ pub(crate) fn spawn_login(username: String, password: String) -> LoginChannels {
}) })
}, },
|hv| { |hv| {
// Gated: hand the UI the page to show, block on the token the // Gated: hand the UI the challenge, block on the credential
// user earns by solving it. // the user earns by solving it.
let (token_tx, token_rx) = std::sync::mpsc::channel::<String>(); let (credential_tx, credential_rx) =
hv_req_tx std::sync::mpsc::channel::<HumanVerificationCredential>();
.send_blocking((hv.verification_url(), token_tx)) hv_req_tx.send_blocking((hv, credential_tx)).map_err(|_| {
.map_err(|_| { pdfs_core::Error::Other("verification prompt closed".into())
pdfs_core::Error::Other("verification prompt closed".into()) })?;
})?; credential_rx
let token = token_rx
.recv() .recv()
.map_err(|_| pdfs_core::Error::Other("verification cancelled".into()))?; .map_err(|_| pdfs_core::Error::Other("verification cancelled".into()))
Ok(HumanVerificationCredential::captcha(token))
}, },
) )
.await .await
@@ -525,6 +521,63 @@ pub(crate) fn prompt_2fa(ui: &Rc<Ui>, code_tx: std::sync::mpsc::Sender<String>)
dialog.present(parent.as_ref()); dialog.present(parent.as_ref());
} }
/// Let the user solve the challenge in their own browser, for when the
/// verification window could not come up. The page cannot hand its token back
/// to us, so the user says when they are done, and the retry carries the
/// challenge token, which the solved page made good (see
/// [`auth::browser_verified`]).
fn verify_in_browser(
ui: &Rc<Ui>,
hv: &HumanVerification,
credential_tx: std::sync::mpsc::Sender<HumanVerificationCredential>,
) {
let dialog = adw::AlertDialog::builder()
.heading(gettext("Verify in Your Browser"))
.body(gettext(
"The verification page can't be shown in the app on this system. Open it in your browser, complete it there, then come back and choose Continue.",
))
.build();
let url = auth::browser_verification_url(hv);
let open = gtk4::Button::builder()
.label(gettext("Open Verification Page"))
.halign(gtk4::Align::Center)
.build();
open.add_css_class("pill");
dialog.set_extra_child(Some(&open));
dialog.add_response("cancel", &gettext("Cancel"));
dialog.add_response("continue", &gettext("Continue"));
dialog.set_response_appearance("continue", adw::ResponseAppearance::Suggested);
// Continuing before the page was even opened would only fail the retry.
dialog.set_response_enabled("continue", false);
dialog.set_default_response(Some("continue"));
dialog.set_close_response("cancel");
let dialog_weak = dialog.downgrade();
open.connect_clicked(move |_| {
open_uri(&url);
if let Some(dialog) = dialog_weak.upgrade() {
dialog.set_response_enabled("continue", true);
}
});
let credential = auth::browser_verified(hv);
let credential_tx = RefCell::new(Some(credential_tx));
dialog.connect_response(None, move |_, resp| {
// On cancel/close we take + drop `tx` without sending, so the worker's
// recv errors out and the login is reported as cancelled.
if let Some(tx) = credential_tx.borrow_mut().take()
&& resp == "continue"
{
let _ = tx.send(credential.clone());
}
});
let parent = ui.login.login_button.root().and_downcast::<gtk4::Window>();
dialog.present(parent.as_ref());
}
/// Sign out, after a confirmation: disable+stop the mount service (so the /// Sign out, after a confirmation: disable+stop the mount service (so the
/// daemon isn't left running without credentials), forget the stored session, /// daemon isn't left running without credentials), forget the stored session,
/// and drop back to the login page. /// and drop back to the login page.
+9 -13
View File
@@ -310,10 +310,8 @@ 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.** A path the user may not read, an entry that vanishes mid-scan and a 1. **Walks the local tree.** Any `readdir`, metadata or permission failure marks the scan
name that is not UTF-8 are left out, and the pass drops everything under them, as it drops incomplete, and an incomplete scan cannot delete anything.
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
@@ -379,12 +377,6 @@ 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
@@ -571,9 +563,13 @@ sequenceDiagram
- The page may post the token as an object or as a JSON string; both are accepted. - The page may post the token as an object or as a JSON string; both are accepted.
- The page runs in a WebKitGTK view inside a child `pdfs-app`. WebKit aborts its process when its - The page runs in a WebKitGTK view inside a child `pdfs-app`. WebKit aborts its process when its
sandbox cannot start, as on hardened systems such as secureblue (B195). In the child, that ends sandbox cannot start, as on hardened systems such as secureblue (B195). In the child, that ends
the verification, and the app says why, instead of closing the app. the web view, not the app.
- The CLI has no web view. It fails with a message to sign in once with `pdfs-app`; the stored - When the child fails, the app offers the page in the user's own browser instead, as Proton Mail
session then works for the CLI and the service. Bridge does. A browser tab cannot post the token back, so the user says when they are done, and
the retry carries the challenge token itself, which the solved page made good. Its type header
lists every offered method (`auth::browser_verified`).
- The CLI has no web view, so it always takes the browser path: it prints the page's URL and waits
for Enter.
--- ---
+15 -102
View File
@@ -100,9 +100,6 @@ 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 |
@@ -301,120 +298,40 @@ 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). On 2026-10-08 the reporter confirmed that the app survives, but
the CAPTCHA still could not be solved; the browser fallback below has not run on secureblue yet.
**Found:** 2026-10-07, [#29](https://github.com/narrrl/proton-drive-linux/issues/29). On **Found:** 2026-10-07, [#29](https://github.com/narrrl/proton-drive-linux/issues/29). On
secureblue 44 (a hardened Fedora Atomic), `pdfs-app` aborted a few seconds after the sign-in, with secureblue 44 (a hardened Fedora Atomic), `pdfs-app` aborted a few seconds after the sign-in, with
`bwrap: Can't get type of source /run/systemd/journal/socket: Permission denied` and `bwrap: Can't get type of source /run/systemd/journal/socket: Permission denied` and
`Failed to fully launch dbus-proxy`. `Failed to fully launch dbus-proxy`.
**Where:** `crates/pdfs-gui/src/app/pages/verify.rs`, `crates/pdfs-gui/src/app/pages/login.rs` **Where:** `crates/pdfs-gui/src/app/pages/verify.rs`, `crates/pdfs-gui/src/app/pages/login.rs`,
`crates/pdfs-core/src/auth.rs`, `crates/pdfs-cli/src/main.rs`
**Repro:** Sign in on secureblue from a network Proton asks a CAPTCHA for, such as a VPN. **Repro:** Sign in on secureblue from a network Proton asks a CAPTCHA for, such as a VPN.
**Cause.** The CAPTCHA page runs in a WebKitGTK view (B8). Before it loads anything, WebKit starts **Cause.** The CAPTCHA page runs in a WebKitGTK view (B8). Before it loads anything, WebKit starts
its sandbox: bubblewrap, with the journal socket bound in, and `xdg-dbus-proxy`. secureblue keeps its sandbox: bubblewrap, with the journal socket bound in, and `xdg-dbus-proxy`. secureblue keeps
bubblewrap from the socket, the proxy does not start, and WebKit ends its process with `g_error`. bubblewrap from the socket, the proxy does not start, and WebKit ends its process with `g_error`.
WebKit binds the socket with `--ro-bind-try`, but bubblewrap skips only a missing path, not one it
may not read, and WebKit has no switch to leave the socket out.
The view was in the app's own process, so the whole app went down, and nothing in our code can The view was in the app's own process, so the whole app went down, and nothing in our code can
catch that. catch that.
**Fix.** The view runs in a child, `pdfs-app --human-verification`, that reads the URL on stdin **Fix.** The view runs in a child, `pdfs-app --human-verification`, that reads the URL on stdin
and prints the token on stdout. A child that exits without a token after a crash or a non-zero and prints the token on stdout. A child that exits without a token after a crash or a non-zero
status ends the sign-in with a message that says the page could not be opened. TROUBLESHOOTING.md status no longer ends the sign-in: the app offers the page in the user's own browser, as Proton
gives the cause and a one-time workaround. The sandbox is not switched off by the app: users choose Mail Bridge does. The tab cannot post the token back, so the user says when they are done, and the
a hardened system for that isolation. retry carries the challenge token, typed with every offered method. `pdfs login` takes the same
path. The sandbox is not switched off by the app: users choose a hardened system for that
isolation. TROUBLESHOOTING.md keeps the one-time workaround as a last resort.
**Test:** unit tests `a_window_that_died_fails`, `a_window_closed_without_a_token_cancels`, **Test:** unit tests `a_window_that_died_fails`, `a_window_closed_without_a_token_cancels`,
`a_token_counts_even_if_the_window_died_after_it` and `the_token_is_found_among_other_output`. `a_token_counts_even_if_the_window_died_after_it`, `the_token_is_found_among_other_output`,
`the_browser_gets_the_full_verification_page` and
`a_browser_verification_retries_with_the_challenge_token`. The browser retry has not run against a
live challenge: Proton only asks for one from a network it distrusts.
On 2026-10-08 the child ran under real WebKit on Arch against a local page that posts a completion, On 2026-10-08 the child ran under real WebKit on Arch against a local page that posts a completion,
and handed back its token. and handed back its token.
@@ -4914,10 +4831,6 @@ 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.
+4 -19
View File
@@ -12,25 +12,10 @@ scratch (user data in `staging/` and `recovery/` is never touched by this).
## [Unreleased] ## [Unreleased]
### Fixed ### Fixed
- **One unreadable folder stopped a synced folder from syncing at all.** A folder you may not - **A CAPTCHA could not be solved on hardened systems.** When the verification page cannot open in
read, such as a cache a container created, failed every pass, so nothing else in the synced the app, as on secureblue, the app now offers it in your browser and continues the sign-in
folder reached Drive. Such a folder is now left out and named once in the activity feed, and once you are done. `pdfs login` now handles a CAPTCHA the same way instead of failing.
everything around it syncs. A file deleted during a scan, and a name that is not UTF-8, no ([#29](https://github.com/narrrl/proton-drive-linux/issues/29))
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
-1
View File
@@ -103,7 +103,6 @@ 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,29 +133,6 @@ 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 -7
View File
@@ -69,14 +69,16 @@ pdfs status
## Signing in ## Signing in
**"Proton is asking for a CAPTCHA"** — Proton wants human verification, usually on a VPN or an **"Proton is asking for a CAPTCHA"** — Proton wants human verification, usually on a VPN or an
unfamiliar network. The CLI cannot show it. Sign in with `pdfs-app`, which displays the challenge; unfamiliar network. `pdfs login` prints the verification page's address: open it in your browser,
the stored session then works for the CLI too. complete it, then press Enter. The app shows the page in its own window.
**"The verification page couldn't be opened"** — WebKit, which shows the CAPTCHA page, could not **"Verify in Your Browser"** — WebKit, which shows the CAPTCHA page in the app, could not start
start its sandbox. Hardened systems such as secureblue keep its bubblewrap from the journal socket, its sandbox. Hardened systems such as secureblue keep its bubblewrap from the journal socket, and
and the log then shows `bwrap: Can't get type of source /run/systemd/journal/socket: Permission the log then shows `bwrap: Can't get type of source /run/systemd/journal/socket: Permission
denied` and `Failed to fully launch dbus-proxy`. Check that `bwrap` and `xdg-dbus-proxy` are denied` and `Failed to fully launch dbus-proxy`. Choose **Open Verification Page**, complete the
installed. If they are, sign in once with the sandbox switched off for this one run: page in your browser, then choose **Continue**. If that sign-in is refused too, check that `bwrap`
and `xdg-dbus-proxy` are installed. As a last resort, sign in once with the sandbox switched off
for this one run:
```bash ```bash
WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1 pdfs-app WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1 pdfs-app
+1 -9
View File
@@ -96,9 +96,7 @@ 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`. The switch waits until everything in the folder is on Proton with `pdfs sync mode <id> mirror`. `pdfs locations` lists every local place the service occupies.
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
@@ -148,9 +146,6 @@ 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
@@ -283,9 +278,6 @@ 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.2 pkgver = 3.1.1
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.2 provides = proton-drive-for-linux=3.1.1
provides = proton-drive-linux=3.1.2 provides = proton-drive-linux=3.1.1
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.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 = proton-drive-linux-3.1.1-x86_64.tar.gz::https://github.com/narrrl/proton-drive-linux/releases/download/v3.1.1/proton-drive-linux-3.1.1-x86_64.tar.gz
source = io.narl.proton-drive-linux-3.1.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-3.1.1.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux.desktop
source = io.narl.proton-drive-linux-tray-3.1.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-tray-3.1.1.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux-tray.desktop
source = io.narl.proton-drive-linux-3.1.2.svg::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/io.narl.proton-drive-linux.svg source = io.narl.proton-drive-linux-3.1.1.svg::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux.svg
source = proton-drive-3.1.2.service::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/proton-drive.service source = proton-drive-3.1.1.service::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/proton-drive.service
source = LICENSE-3.1.2::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/LICENSE source = LICENSE-3.1.1::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/LICENSE
sha256sums = 71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7 sha256sums = e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6
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.2 pkgver=3.1.1
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=('71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7' sha256sums=('e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6'
'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.2.r0.g07c9b67 pkgver = 3.1.1.r0.gedd62c5
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.2.r0.g07c9b67 provides = proton-drive-for-linux=3.1.1.r0.gedd62c5
provides = proton-drive-linux=3.1.2.r0.g07c9b67 provides = proton-drive-linux=3.1.1.r0.gedd62c5
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.2.r0.g07c9b67 pkgver=3.1.1.r0.gedd62c5
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.2 pkgver = 3.1.1
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.2 provides = proton-drive-linux=3.1.1
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.2.tar.gz::https://github.com/narrrl/proton-drive-linux/archive/refs/tags/v3.1.2.tar.gz source = proton-drive-for-linux-3.1.1.tar.gz::https://github.com/narrrl/proton-drive-linux/archive/refs/tags/v3.1.1.tar.gz
sha256sums = 260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1 sha256sums = c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256
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.2 pkgver=3.1.1
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=('260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1') sha256sums=('c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256')
_srcname="proton-drive-linux-$pkgver" _srcname="proton-drive-linux-$pkgver"
+138 -154
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computer" msgstr "Computer"
@@ -266,18 +266,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -317,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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 +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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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"
@@ -687,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
msgid "Couldn't restore folders" msgid "Couldn't restore folders"
msgstr "Ordner konnten nicht wiederhergestellt werden" msgstr "Ordner konnten nicht wiederhergestellt werden"
@@ -1267,11 +1267,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1303,7 +1302,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1317,7 +1316,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Umbenennen …" msgstr "Umbenennen …"
@@ -1585,7 +1584,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1743,7 +1742,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1888,7 +1887,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "Neuer Name" msgstr "Neuer Name"
@@ -1918,7 +1917,6 @@ 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"
@@ -2150,103 +2148,99 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "wird synchronisiert …" msgstr "wird synchronisiert …"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "Synchronisierungsfehler" msgstr "Synchronisierungsfehler"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "erfordert Aufmerksamkeit" msgstr "erfordert Aufmerksamkeit"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "aktuell" msgstr "aktuell"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
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:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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."
@@ -2254,19 +2248,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Ordner wiederherstellen" msgstr "Ordner wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Wiederherstellen" msgstr "Wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Ordner werden wiederhergestellt …" msgstr "Ordner werden wiederhergestellt …"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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 "
@@ -2275,37 +2269,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2323,7 +2317,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2337,68 +2331,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
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:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Synchronisierung beenden" msgstr "Synchronisierung beenden"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
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:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "„{name}“ umbenennen." msgstr "„{name}“ umbenennen."
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "Computer entfernen?" msgstr "Computer entfernen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2413,25 +2407,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Computer entfernt" msgstr "Computer entfernt"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2450,50 +2444,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3238,36 +3202,25 @@ msgstr "E-Mail-Adresse und Passwort eingeben."
msgid "Signing in…" msgid "Signing in…"
msgstr "Anmeldung läuft …" msgstr "Anmeldung läuft …"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Zum Fortfahren die Überprüfung abschließen …" msgstr "Zum Fortfahren die Überprüfung abschließen …"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "Anmeldung abgebrochen" msgstr "Anmeldung abgebrochen"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"Die Überprüfungsseite konnte nicht geöffnet werden, daher wurde die "
"Anmeldung abgebrochen. Möglicherweise verhindert das System, dass die "
"Sandbox der Webansicht startet; die Anleitung zur Fehlerbehebung erklärt, "
"was zu tun ist."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Zu viele Anmeldeversuche. Einige Minuten warten und erneut versuchen." msgstr "Zu viele Anmeldeversuche. Einige Minuten warten und erneut versuchen."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Proton ist nicht erreichbar. Bitte die Internetverbindung prüfen und erneut " "Proton ist nicht erreichbar. Bitte die Internetverbindung prüfen und erneut "
"versuchen." "versuchen."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3276,19 +3229,19 @@ msgstr ""
"gespeichert werden. Bitte sicherstellen, dass ein Schlüsselbund (GNOME " "gespeichert werden. Bitte sicherstellen, dass ein Schlüsselbund (GNOME "
"Keyring oder KWallet) läuft und entsperrt ist." "Keyring oder KWallet) läuft und entsperrt ist."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Anmeldung abgebrochen: Es wurde kein Zwei-Faktor-Code eingegeben." msgstr "Anmeldung abgebrochen: Es wurde kein Zwei-Faktor-Code eingegeben."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Anmeldung abgebrochen: Es wurde kein Postfach-Passwort eingegeben." msgstr "Anmeldung abgebrochen: Es wurde kein Postfach-Passwort eingegeben."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "Das Postfach-Passwort hat Ihr Konto nicht entsperrt." msgstr "Das Postfach-Passwort hat Ihr Konto nicht entsperrt."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3297,36 +3250,36 @@ msgstr ""
"neue Überprüfung erneut anmelden." "neue Überprüfung erneut anmelden."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Anmeldung fehlgeschlagen: {error}" msgstr "Anmeldung fehlgeschlagen: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "" msgstr ""
"Das Postfach-Passwort hat Ihr Konto nicht entsperrt. Versuchen Sie es erneut." "Das Postfach-Passwort hat Ihr Konto nicht entsperrt. Versuchen Sie es erneut."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"Dieses Konto hat ein separates Postfach-Passwort. Geben Sie es ein, um Ihre " "Dieses Konto hat ein separates Postfach-Passwort. Geben Sie es ein, um Ihre "
"Dateien zu entsperren." "Dateien zu entsperren."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Postfach-Passwort" msgstr "Postfach-Passwort"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Postfach-Passwort" msgstr "Postfach-Passwort"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Auf diesem Computer entsperrt lassen" msgstr "Auf diesem Computer entsperrt lassen"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3335,49 +3288,70 @@ msgstr ""
"nach jeder Anmeldung ohne Nachfrage öffnet. Andernfalls geben Sie das " "nach jeder Anmeldung ohne Nachfrage öffnet. Andernfalls geben Sie das "
"Passwort einmal pro Sitzung ein." "Passwort einmal pro Sitzung ein."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Entsperren" msgstr "Entsperren"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
"Proton Drive ist gesperrt. Geben Sie Ihr Postfach-Passwort ein, um es zu " "Proton Drive ist gesperrt. Geben Sie Ihr Postfach-Passwort ein, um es zu "
"entsperren." "entsperren."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Entsperrt." msgstr "Entsperrt."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "Entsperren fehlgeschlagen" msgstr "Entsperren fehlgeschlagen"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Zwei-Faktor-Authentifizierung" msgstr "Zwei-Faktor-Authentifizierung"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Den Code aus der Authentifizierungs-App oder einen der " "Den Code aus der Authentifizierungs-App oder einen der "
"Wiederherstellungscodes eingeben." "Wiederherstellungscodes eingeben."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Authentifizierungscode" msgstr "Authentifizierungscode"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Bestätigen" msgstr "Bestätigen"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Im Browser überprüfen"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "Die Überprüfungsseite kann auf diesem System nicht in der App angezeigt werden. Öffne sie in deinem Browser, schließe sie dort ab, komm dann zurück und wähle „Weiter“."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Überprüfungsseite öffnen"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Weiter"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Abmelden?" msgstr "Abmelden?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3386,7 +3360,7 @@ msgstr ""
"nächsten Anmeldung. Dateien, die sich bereits auf diesem Computer befinden, " "nächsten Anmeldung. Dateien, die sich bereits auf diesem Computer befinden, "
"bleiben, wo sie sind." "bleiben, wo sie sind."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Abmelden" msgstr "Abmelden"
@@ -6173,6 +6147,16 @@ msgstr "{count} J."
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "Proton-Drive-Hintergrunddienst nicht erreichbar: {error}" msgstr "Proton-Drive-Hintergrunddienst nicht erreichbar: {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "Die Überprüfungsseite konnte nicht geöffnet werden, daher wurde die "
#~ "Anmeldung abgebrochen. Möglicherweise verhindert das System, dass die "
#~ "Sandbox der Webansicht startet; die Anleitung zur Fehlerbehebung erklärt, "
#~ "was zu tun ist."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Zu einem Monat springen" #~ msgstr "Zu einem Monat springen"
+137 -152
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computers" msgstr "Computers"
@@ -262,18 +262,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -313,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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 +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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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"
@@ -679,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
msgid "Couldn't restore folders" msgid "Couldn't restore folders"
msgstr "Couldn't restore folders" msgstr "Couldn't restore folders"
@@ -1255,11 +1255,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1291,7 +1290,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1305,7 +1304,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Rename…" msgstr "Rename…"
@@ -1573,7 +1572,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1727,7 +1726,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1869,7 +1868,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "New name" msgstr "New name"
@@ -1899,7 +1898,6 @@ 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"
@@ -2127,103 +2125,99 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "syncing…" msgstr "syncing…"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "sync error" msgstr "sync error"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "needs attention" msgstr "needs attention"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "up to date" msgstr "up to date"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "checking for changes…" msgstr "checking for changes…"
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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."
@@ -2231,19 +2225,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Restore Folders" msgstr "Restore Folders"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Restore" msgstr "Restore"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Restoring folders…" msgstr "Restoring folders…"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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 "
@@ -2252,33 +2246,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2295,7 +2289,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2308,68 +2302,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
msgid "Stop Syncing Folder?" msgid "Stop Syncing Folder?"
msgstr "Stop Syncing Folder?" msgstr "Stop Syncing Folder?"
#: crates/pdfs-gui/src/app/pages/devices.rs:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Stop Syncing" msgstr "Stop Syncing"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
msgid "Stopped syncing folder" msgid "Stopped syncing folder"
msgstr "Stopped syncing folder" msgstr "Stopped syncing folder"
#: crates/pdfs-gui/src/app/pages/devices.rs:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Rename “{name}”." msgstr "Rename “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "Remove Computer?" msgstr "Remove Computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2384,25 +2378,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Computer removed" msgstr "Computer removed"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2421,49 +2415,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3186,33 +3151,23 @@ msgstr "Enter your email and password."
msgid "Signing in…" msgid "Signing in…"
msgstr "Signing in…" msgstr "Signing in…"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Complete the verification to continue…" msgstr "Complete the verification to continue…"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "login cancelled" msgstr "login cancelled"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Too many sign-in attempts. Wait a few minutes and try again." msgstr "Too many sign-in attempts. Wait a few minutes and try again."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "Couldn't reach Proton. Check your internet connection and try again." msgstr "Couldn't reach Proton. Check your internet connection and try again."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3220,19 +3175,19 @@ msgstr ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Sign-in cancelled: no two-factor code was entered." msgstr "Sign-in cancelled: no two-factor code was entered."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Sign-in cancelled: no mailbox password was entered." msgstr "Sign-in cancelled: no mailbox password was entered."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "That mailbox password didn't unlock your account." msgstr "That mailbox password didn't unlock your account."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3241,34 +3196,34 @@ msgstr ""
"new one." "new one."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Sign-in failed: {error}" msgstr "Sign-in failed: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "That mailbox password didn't unlock your account. Try again." msgstr "That mailbox password didn't unlock your account. Try again."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Mailbox Password" msgstr "Mailbox Password"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Mailbox password" msgstr "Mailbox password"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Keep unlocked on this computer" msgstr "Keep unlocked on this computer"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3276,46 +3231,67 @@ msgstr ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Unlock" msgstr "Unlock"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "Proton Drive is locked. Enter your mailbox password to unlock it." msgstr "Proton Drive is locked. Enter your mailbox password to unlock it."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Unlocked." msgstr "Unlocked."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "Couldn't unlock" msgstr "Couldn't unlock"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Two-Factor Authentication" msgstr "Two-Factor Authentication"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Authentication code" msgstr "Authentication code"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Confirm" msgstr "Confirm"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Verify in Your Browser"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "The verification page can't be shown in the app on this system. Open it in your browser, complete it there, then come back and choose Continue."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Open Verification Page"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Continue"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Sign Out?" msgstr "Sign Out?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3323,7 +3299,7 @@ msgstr ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Sign Out" msgstr "Sign Out"
@@ -6056,6 +6032,15 @@ msgstr "{count}y"
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "cannot reach the Proton Drive daemon: {error}" msgstr "cannot reach the Proton Drive daemon: {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Jump to a month" #~ msgstr "Jump to a month"
+138 -153
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Equipos" msgstr "Equipos"
@@ -264,18 +264,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -315,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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
@@ -357,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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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"
@@ -684,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
msgid "Couldn't restore folders" msgid "Couldn't restore folders"
msgstr "No se pudieron restaurar las carpetas" msgstr "No se pudieron restaurar las carpetas"
@@ -1261,11 +1261,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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 +1296,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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 +1310,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Renombrar…" msgstr "Renombrar…"
@@ -1579,7 +1578,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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 +1733,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1880,7 +1879,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "Nombre nuevo" msgstr "Nombre nuevo"
@@ -1910,7 +1909,6 @@ 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í"
@@ -2139,103 +2137,99 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "sincronizando…" msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "error de sincronización" msgstr "error de sincronización"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "requiere atención" msgstr "requiere atención"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "actualizado" msgstr "actualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "buscando cambios…" msgstr "buscando cambios…"
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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 +2237,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Restaurar carpetas" msgstr "Restaurar carpetas"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Restaurar" msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Restaurando carpetas…" msgstr "Restaurando carpetas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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,36 +2258,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2310,7 +2304,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2323,68 +2317,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
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:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Dejar de sincronizar" msgstr "Dejar de sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
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:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Renombrar “{name}”." msgstr "Renombrar “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "¿Quitar el equipo?" msgstr "¿Quitar el equipo?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2398,25 +2392,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Equipo quitado" msgstr "Equipo quitado"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2435,50 +2429,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3212,37 +3176,27 @@ msgstr "Introduzca su correo electrónico y su contraseña."
msgid "Signing in…" msgid "Signing in…"
msgstr "Iniciando sesión…" msgstr "Iniciando sesión…"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Complete la verificación para continuar…" msgstr "Complete la verificación para continuar…"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "inicio de sesión cancelado" msgstr "inicio de sesión cancelado"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"No se pudo abrir la página de verificación, así que se canceló el inicio de "
"sesión. Es posible que su sistema impida que se inicie el entorno aislado de "
"la vista web; la guía de solución de problemas explica qué hacer."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Demasiados intentos de inicio de sesión. Espere unos minutos e inténtelo de " "Demasiados intentos de inicio de sesión. Espere unos minutos e inténtelo de "
"nuevo." "nuevo."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"No se pudo contactar con Proton. Compruebe su conexión a Internet e " "No se pudo contactar con Proton. Compruebe su conexión a Internet e "
"inténtelo de nuevo." "inténtelo de nuevo."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3251,20 +3205,20 @@ msgstr ""
"sistema. Asegúrese de que un depósito de claves (GNOME Keyring o KWallet) " "sistema. Asegúrese de que un depósito de claves (GNOME Keyring o KWallet) "
"esté en ejecución y desbloqueado." "esté en ejecución y desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "" msgstr ""
"Inicio de sesión cancelado: no se introdujo ningún código de dos factores." "Inicio de sesión cancelado: no se introdujo ningún código de dos factores."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Inicio de sesión cancelado: no se introdujo la contraseña del buzón." msgstr "Inicio de sesión cancelado: no se introdujo la contraseña del buzón."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "Esa contraseña del buzón no desbloqueó tu cuenta." msgstr "Esa contraseña del buzón no desbloqueó tu cuenta."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3273,35 +3227,35 @@ msgstr ""
"sesión para obtener una nueva." "sesión para obtener una nueva."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Falló el inicio de sesión: {error}" msgstr "Falló el inicio de sesión: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "Esa contraseña del buzón no desbloqueó tu cuenta. Inténtalo de nuevo." msgstr "Esa contraseña del buzón no desbloqueó tu cuenta. Inténtalo de nuevo."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"Esta cuenta tiene una contraseña del buzón independiente. Introdúcela para " "Esta cuenta tiene una contraseña del buzón independiente. Introdúcela para "
"desbloquear tus archivos." "desbloquear tus archivos."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Contraseña del buzón" msgstr "Contraseña del buzón"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Contraseña del buzón" msgstr "Contraseña del buzón"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Mantener desbloqueado en este equipo" msgstr "Mantener desbloqueado en este equipo"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3310,49 +3264,70 @@ msgstr ""
"abra sin preguntar después de cada inicio de sesión. De lo contrario, " "abra sin preguntar después de cada inicio de sesión. De lo contrario, "
"introduces la contraseña una vez por sesión." "introduces la contraseña una vez por sesión."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
"Proton Drive está bloqueado. Introduce la contraseña del buzón para " "Proton Drive está bloqueado. Introduce la contraseña del buzón para "
"desbloquearlo." "desbloquearlo."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Desbloqueado." msgstr "Desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "No se pudo desbloquear" msgstr "No se pudo desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Autenticación en dos pasos" msgstr "Autenticación en dos pasos"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Introduzca el código de su aplicación de autenticación o uno de sus códigos " "Introduzca el código de su aplicación de autenticación o uno de sus códigos "
"de recuperación." "de recuperación."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Código de autenticación" msgstr "Código de autenticación"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Confirmar" msgstr "Confirmar"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Verificar en el navegador"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "La página de verificación no se puede mostrar en la aplicación en este sistema. Ábrala en su navegador, complétela allí y luego vuelva y elija “Continuar”."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Abrir página de verificación"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Continuar"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "¿Cerrar la sesión?" msgstr "¿Cerrar la sesión?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3361,7 +3336,7 @@ msgstr ""
"iniciar sesión. Los archivos que ya están en este equipo se quedan donde " "iniciar sesión. Los archivos que ya están en este equipo se quedan donde "
"están." "están."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Cerrar la sesión" msgstr "Cerrar la sesión"
@@ -6131,6 +6106,16 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "no se puede contactar con el demonio de Proton Drive: {error}" msgstr "no se puede contactar con el demonio de Proton Drive: {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "No se pudo abrir la página de verificación, así que se canceló el inicio "
#~ "de sesión. Es posible que su sistema impida que se inicie el entorno "
#~ "aislado de la vista web; la guía de solución de problemas explica qué "
#~ "hacer."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Saltar a un mes" #~ msgstr "Saltar a un mes"
+137 -153
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Ordinateurs" msgstr "Ordinateurs"
@@ -266,18 +266,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -317,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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 +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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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"
@@ -687,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
msgid "Couldn't restore folders" msgid "Couldn't restore folders"
msgstr "Impossible de restaurer les dossiers" msgstr "Impossible de restaurer les dossiers"
@@ -1272,11 +1272,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1308,7 +1307,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1322,7 +1321,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Renommer…" msgstr "Renommer…"
@@ -1590,7 +1589,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1746,7 +1745,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1892,7 +1891,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "Nouveau nom" msgstr "Nouveau nom"
@@ -1922,7 +1921,6 @@ 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"
@@ -2152,103 +2150,99 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "synchronisation…" msgstr "synchronisation…"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "erreur de synchronisation" msgstr "erreur de synchronisation"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "attention requise" msgstr "attention requise"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "à jour" msgstr "à jour"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "recherche de modifications…" msgstr "recherche de modifications…"
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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."
@@ -2256,19 +2250,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Restaurer les dossiers" msgstr "Restaurer les dossiers"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Restaurer" msgstr "Restaurer"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Restauration des dossiers…" msgstr "Restauration des dossiers…"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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 "
@@ -2277,35 +2271,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2322,7 +2316,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2336,68 +2330,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
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:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Arrêter la synchronisation" msgstr "Arrêter la synchronisation"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
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:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Renommer « {name} »." msgstr "Renommer « {name} »."
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "Retirer l’ordinateur ?" msgstr "Retirer l’ordinateur ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2412,25 +2406,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Ordinateur retiré" msgstr "Ordinateur retiré"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2449,50 +2443,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3238,35 +3202,25 @@ msgstr "Saisissez votre adresse électronique et votre mot de passe."
msgid "Signing in…" msgid "Signing in…"
msgstr "Connexion…" msgstr "Connexion…"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Terminez la vérification pour continuer…" msgstr "Terminez la vérification pour continuer…"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "connexion annulée" msgstr "connexion annulée"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"La page de vérification n’a pas pu s’ouvrir, la connexion a donc été "
"annulée. Votre système empêche peut-être le démarrage du bac à sable de la "
"vue web ; le guide de dépannage explique la marche à suivre."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Trop de tentatives de connexion. Patientez quelques minutes et réessayez." "Trop de tentatives de connexion. Patientez quelques minutes et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Impossible de joindre Proton. Vérifiez votre connexion Internet et réessayez." "Impossible de joindre Proton. Vérifiez votre connexion Internet et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3275,21 +3229,21 @@ msgstr ""
"système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en " "système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en "
"cours d’exécution et déverrouillé." "cours d’exécution et déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi." msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "" msgstr ""
"Connexion annulée : aucun mot de passe de boîte aux lettres n’a été saisi." "Connexion annulée : aucun mot de passe de boîte aux lettres n’a été saisi."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "" msgstr ""
"Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte." "Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3298,37 +3252,37 @@ msgstr ""
"pour en obtenir une nouvelle." "pour en obtenir une nouvelle."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Échec de la connexion : {error}" msgstr "Échec de la connexion : {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "" msgstr ""
"Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte. " "Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte. "
"Réessayez." "Réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"Ce compte a un mot de passe de boîte aux lettres distinct. Saisissez-le pour " "Ce compte a un mot de passe de boîte aux lettres distinct. Saisissez-le pour "
"déverrouiller vos fichiers." "déverrouiller vos fichiers."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Mot de passe de la boîte aux lettres" msgstr "Mot de passe de la boîte aux lettres"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Mot de passe de la boîte aux lettres" msgstr "Mot de passe de la boîte aux lettres"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Garder déverrouillé sur cet ordinateur" msgstr "Garder déverrouillé sur cet ordinateur"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3337,49 +3291,70 @@ msgstr ""
"Proton Drive s’ouvre sans demande après chaque connexion. Sinon, vous " "Proton Drive s’ouvre sans demande après chaque connexion. Sinon, vous "
"saisissez le mot de passe une fois par session." "saisissez le mot de passe une fois par session."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Déverrouiller" msgstr "Déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
"Proton Drive est verrouillé. Saisissez votre mot de passe de boîte aux " "Proton Drive est verrouillé. Saisissez votre mot de passe de boîte aux "
"lettres pour le déverrouiller." "lettres pour le déverrouiller."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Déverrouillé." msgstr "Déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "Impossible de déverrouiller" msgstr "Impossible de déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Authentification à deux facteurs" msgstr "Authentification à deux facteurs"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Saisissez le code de votre application d’authentification ou l’un de vos " "Saisissez le code de votre application d’authentification ou l’un de vos "
"codes de récupération." "codes de récupération."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Code d’authentification" msgstr "Code d’authentification"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Confirmer" msgstr "Confirmer"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Vérifier dans le navigateur"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "La page de vérification ne peut pas s’afficher dans l’application sur ce système. Ouvrez-la dans votre navigateur, terminez-la, puis revenez et choisissez « Continuer »."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Ouvrir la page de vérification"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Continuer"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Se déconnecter ?" msgstr "Se déconnecter ?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3388,7 +3363,7 @@ msgstr ""
"vous vous reconnectiez. Les fichiers déjà présents sur cet ordinateur " "vous vous reconnectiez. Les fichiers déjà présents sur cet ordinateur "
"restent en place." "restent en place."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Se déconnecter" msgstr "Se déconnecter"
@@ -6176,6 +6151,15 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "impossible de joindre le démon Proton Drive : {error}" msgstr "impossible de joindre le démon Proton Drive : {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "La page de vérification n’a pas pu s’ouvrir, la connexion a donc été "
#~ "annulée. Votre système empêche peut-être le démarrage du bac à sable de "
#~ "la vue web ; le guide de dépannage explique la marche à suivre."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Aller à un mois" #~ msgstr "Aller à un mois"
+137 -153
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computer" msgstr "Computer"
@@ -262,18 +262,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -313,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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 +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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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"
@@ -683,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
msgid "Couldn't restore folders" msgid "Couldn't restore folders"
msgstr "Impossibile ripristinare le cartelle" msgstr "Impossibile ripristinare le cartelle"
@@ -1266,11 +1266,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1302,7 +1301,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1316,7 +1315,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Rinomina…" msgstr "Rinomina…"
@@ -1584,7 +1583,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1740,7 +1739,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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 +1885,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "Nuovo nome" msgstr "Nuovo nome"
@@ -1916,7 +1915,6 @@ 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"
@@ -2146,103 +2144,99 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "sincronizzazione…" msgstr "sincronizzazione…"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "errore di sincronizzazione" msgstr "errore di sincronizzazione"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "richiede attenzione" msgstr "richiede attenzione"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "aggiornato" msgstr "aggiornato"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "controllo delle modifiche…" msgstr "controllo delle modifiche…"
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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."
@@ -2250,19 +2244,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Ripristina cartelle" msgstr "Ripristina cartelle"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Ripristina" msgstr "Ripristina"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Ripristino delle cartelle…" msgstr "Ripristino delle cartelle…"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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 "
@@ -2271,39 +2265,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2321,7 +2315,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2334,68 +2328,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
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:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Interrompi sincronizzazione" msgstr "Interrompi sincronizzazione"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
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:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Rinomina “{name}”." msgstr "Rinomina “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "Rimuovere il computer?" msgstr "Rimuovere il computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2410,25 +2404,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Computer rimosso" msgstr "Computer rimosso"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2447,50 +2441,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3230,35 +3194,25 @@ msgstr "Inserisci la tua email e la password."
msgid "Signing in…" msgid "Signing in…"
msgstr "Accesso in corso…" msgstr "Accesso in corso…"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Completa la verifica per continuare…" msgstr "Completa la verifica per continuare…"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "accesso annullato" msgstr "accesso annullato"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"Impossibile aprire la pagina di verifica, quindi l'accesso è stato "
"annullato. Il sistema potrebbe impedire l'avvio della sandbox della vista "
"web; la guida alla risoluzione dei problemi spiega cosa fare."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Troppi tentativi di accesso. Attendi qualche minuto e riprova." msgstr "Troppi tentativi di accesso. Attendi qualche minuto e riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Impossibile raggiungere Proton. Controlla la connessione a Internet e " "Impossibile raggiungere Proton. Controlla la connessione a Internet e "
"riprova." "riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3267,24 +3221,24 @@ msgstr ""
"portachiavi di sistema. Assicurati che un portachiavi (GNOME Keyring o " "portachiavi di sistema. Assicurati che un portachiavi (GNOME Keyring o "
"KWallet) sia in esecuzione e sbloccato." "KWallet) sia in esecuzione e sbloccato."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "" msgstr ""
"Accesso annullato: non è stato inserito alcun codice di autenticazione a due " "Accesso annullato: non è stato inserito alcun codice di autenticazione a due "
"fattori." "fattori."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "" msgstr ""
"Accesso annullato: non è stata inserita alcuna password della casella di " "Accesso annullato: non è stata inserita alcuna password della casella di "
"posta." "posta."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "" msgstr ""
"Quella password della casella di posta non ha sbloccato il tuo account." "Quella password della casella di posta non ha sbloccato il tuo account."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3293,37 +3247,37 @@ msgstr ""
"riceverne una nuova." "riceverne una nuova."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Accesso non riuscito: {error}" msgstr "Accesso non riuscito: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "" msgstr ""
"Quella password della casella di posta non ha sbloccato il tuo account. " "Quella password della casella di posta non ha sbloccato il tuo account. "
"Riprova." "Riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"Questo account ha una password della casella di posta separata. Inseriscila " "Questo account ha una password della casella di posta separata. Inseriscila "
"per sbloccare i tuoi file." "per sbloccare i tuoi file."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Password della casella di posta" msgstr "Password della casella di posta"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Password della casella di posta" msgstr "Password della casella di posta"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Mantieni sbloccato su questo computer" msgstr "Mantieni sbloccato su questo computer"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3332,49 +3286,70 @@ msgstr ""
"chiedere dopo ogni accesso. Altrimenti inserisci la password una volta per " "chiedere dopo ogni accesso. Altrimenti inserisci la password una volta per "
"sessione." "sessione."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Sblocca" msgstr "Sblocca"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
"Proton Drive è bloccato. Inserisci la password della casella di posta per " "Proton Drive è bloccato. Inserisci la password della casella di posta per "
"sbloccarlo." "sbloccarlo."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Sbloccato." msgstr "Sbloccato."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "Impossibile sbloccare" msgstr "Impossibile sbloccare"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Autenticazione a due fattori" msgstr "Autenticazione a due fattori"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Inserisci il codice dell'app di autenticazione o uno dei tuoi codici di " "Inserisci il codice dell'app di autenticazione o uno dei tuoi codici di "
"recupero." "recupero."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Codice di autenticazione" msgstr "Codice di autenticazione"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Conferma" msgstr "Conferma"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Verifica nel browser"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "La pagina di verifica non può essere mostrata nell’app su questo sistema. Aprila nel browser, completala lì, poi torna qui e scegli “Continua”."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Apri pagina di verifica"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Continua"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Disconnettersi?" msgstr "Disconnettersi?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3382,7 +3357,7 @@ msgstr ""
"Proton Drive si disconnetterà e interromperà la sincronizzazione finché non " "Proton Drive si disconnetterà e interromperà la sincronizzazione finché non "
"accedi di nuovo. I file già presenti su questo computer restano dove sono." "accedi di nuovo. I file già presenti su questo computer restano dove sono."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Disconnetti" msgstr "Disconnetti"
@@ -6154,6 +6129,15 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "impossibile raggiungere il demone di Proton Drive: {error}" msgstr "impossibile raggiungere il demone di Proton Drive: {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "Impossibile aprire la pagina di verifica, quindi l'accesso è stato "
#~ "annullato. Il sistema potrebbe impedire l'avvio della sandbox della vista "
#~ "web; la guida alla risoluzione dei problemi spiega cosa fare."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Vai a un mese" #~ msgstr "Vai a un mese"
+138 -153
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computers" msgstr "Computers"
@@ -263,18 +263,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -314,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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 +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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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"
@@ -684,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
msgid "Couldn't restore folders" msgid "Couldn't restore folders"
msgstr "Kon mappen niet terugzetten" msgstr "Kon mappen niet terugzetten"
@@ -1262,11 +1262,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1298,7 +1297,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1312,7 +1311,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Hernoemen…" msgstr "Hernoemen…"
@@ -1580,7 +1579,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1736,7 +1735,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1880,7 +1879,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "Nieuwe naam" msgstr "Nieuwe naam"
@@ -1910,7 +1909,6 @@ 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"
@@ -2140,103 +2138,99 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "synchroniseren…" msgstr "synchroniseren…"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "synchronisatiefout" msgstr "synchronisatiefout"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "vereist aandacht" msgstr "vereist aandacht"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "bijgewerkt" msgstr "bijgewerkt"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "controleren op wijzigingen…" msgstr "controleren op wijzigingen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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."
@@ -2244,19 +2238,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Mappen herstellen" msgstr "Mappen herstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Terugzetten" msgstr "Terugzetten"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Mappen terugzetten…" msgstr "Mappen terugzetten…"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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 "
@@ -2265,38 +2259,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2313,7 +2307,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2326,68 +2320,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
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:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Synchroniseren stoppen" msgstr "Synchroniseren stoppen"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
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:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "“{name}” hernoemen." msgstr "“{name}” hernoemen."
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "Computer verwijderen?" msgstr "Computer verwijderen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2402,25 +2396,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Computer verwijderd" msgstr "Computer verwijderd"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2439,49 +2433,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3222,37 +3187,26 @@ msgstr "Voer je e-mailadres en wachtwoord in."
msgid "Signing in…" msgid "Signing in…"
msgstr "Aanmelden…" msgstr "Aanmelden…"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Voltooi de verificatie om verder te gaan…" msgstr "Voltooi de verificatie om verder te gaan…"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "aanmelden geannuleerd" msgstr "aanmelden geannuleerd"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"De verificatiepagina kon niet worden geopend, dus het aanmelden is "
"geannuleerd. Mogelijk verhindert je systeem dat de sandbox van de "
"webweergave start; de handleiding voor probleemoplossing legt uit wat je "
"kunt doen."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Te veel aanmeldpogingen. Wacht een paar minuten en probeer het opnieuw." "Te veel aanmeldpogingen. Wacht een paar minuten en probeer het opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Kon Proton niet bereiken. Controleer je internetverbinding en probeer het " "Kon Proton niet bereiken. Controleer je internetverbinding en probeer het "
"opnieuw." "opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3261,19 +3215,19 @@ msgstr ""
"opgeslagen. Zorg dat een sleutelbos (GNOME Keyring of KWallet) actief en " "opgeslagen. Zorg dat een sleutelbos (GNOME Keyring of KWallet) actief en "
"ontgrendeld is." "ontgrendeld is."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Aanmelden geannuleerd: er is geen tweestapscode ingevoerd." msgstr "Aanmelden geannuleerd: er is geen tweestapscode ingevoerd."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Aanmelden geannuleerd: er is geen mailboxwachtwoord ingevoerd." msgstr "Aanmelden geannuleerd: er is geen mailboxwachtwoord ingevoerd."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "Dat mailboxwachtwoord heeft je account niet ontgrendeld." msgstr "Dat mailboxwachtwoord heeft je account niet ontgrendeld."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3282,36 +3236,36 @@ msgstr ""
"om een nieuwe te krijgen." "om een nieuwe te krijgen."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Aanmelden mislukt: {error}" msgstr "Aanmelden mislukt: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "" msgstr ""
"Dat mailboxwachtwoord heeft je account niet ontgrendeld. Probeer het opnieuw." "Dat mailboxwachtwoord heeft je account niet ontgrendeld. Probeer het opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"Dit account heeft een apart mailboxwachtwoord. Voer het in om je bestanden " "Dit account heeft een apart mailboxwachtwoord. Voer het in om je bestanden "
"te ontgrendelen." "te ontgrendelen."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Mailboxwachtwoord" msgstr "Mailboxwachtwoord"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Mailboxwachtwoord" msgstr "Mailboxwachtwoord"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Ontgrendeld houden op deze computer" msgstr "Ontgrendeld houden op deze computer"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3320,47 +3274,68 @@ msgstr ""
"Drive na elke aanmelding opent zonder te vragen. Anders voer je het " "Drive na elke aanmelding opent zonder te vragen. Anders voer je het "
"wachtwoord één keer per sessie in." "wachtwoord één keer per sessie in."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Ontgrendelen" msgstr "Ontgrendelen"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
"Proton Drive is vergrendeld. Voer je mailboxwachtwoord in om het te " "Proton Drive is vergrendeld. Voer je mailboxwachtwoord in om het te "
"ontgrendelen." "ontgrendelen."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Ontgrendeld." msgstr "Ontgrendeld."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "Ontgrendelen mislukt" msgstr "Ontgrendelen mislukt"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Tweestapsverificatie" msgstr "Tweestapsverificatie"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "Voer de code uit je authenticator-app in, of een van je herstelcodes." msgstr "Voer de code uit je authenticator-app in, of een van je herstelcodes."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Verificatiecode" msgstr "Verificatiecode"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Bevestigen" msgstr "Bevestigen"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Verifiëren in je browser"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "De verificatiepagina kan op dit systeem niet in de app worden getoond. Open hem in je browser, voltooi hem daar, kom dan terug en kies “Doorgaan”."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Verificatiepagina openen"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Doorgaan"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Afmelden?" msgstr "Afmelden?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3369,7 +3344,7 @@ msgstr ""
"je opnieuw aanmeldt. Bestanden die al op deze computer staan, blijven waar " "je opnieuw aanmeldt. Bestanden die al op deze computer staan, blijven waar "
"ze zijn." "ze zijn."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Afmelden" msgstr "Afmelden"
@@ -6142,6 +6117,16 @@ msgstr "{count}j"
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "kan de achtergronddienst van Proton Drive niet bereiken: {error}" msgstr "kan de achtergronddienst van Proton Drive niet bereiken: {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "De verificatiepagina kon niet worden geopend, dus het aanmelden is "
#~ "geannuleerd. Mogelijk verhindert je systeem dat de sandbox van de "
#~ "webweergave start; de handleiding voor probleemoplossing legt uit wat je "
#~ "kunt doen."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Naar een maand springen" #~ msgstr "Naar een maand springen"
+125 -144
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "" msgstr ""
@@ -239,18 +239,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -290,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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
@@ -332,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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/widgets/details.rs:159 #: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename" msgid "Rename"
msgstr "" msgstr ""
@@ -654,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
msgid "Couldn't restore folders" msgid "Couldn't restore folders"
msgstr "" msgstr ""
@@ -1220,11 +1220,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1256,7 +1255,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1270,7 +1269,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "" msgstr ""
@@ -1538,7 +1537,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1692,7 +1691,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1834,7 +1833,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "" msgstr ""
@@ -1864,7 +1863,6 @@ 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 ""
@@ -2092,154 +2090,150 @@ msgstr ""
msgid "Restore to This Computer…" msgid "Restore to This Computer…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format #, rust-format
msgid "{platform} · no backups yet" msgid "{platform} · no backups yet"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
msgid "No folders backed up yet" msgid "No folders backed up yet"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, rust-format #, rust-format
msgid "syncing {done} of {total}" msgid "syncing {done} of {total}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
msgid "Add Folder to Sync" msgid "Add Folder to Sync"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
msgid "Couldn't list folders to restore" msgid "Couldn't list folders to restore"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
msgid "Folder will switch to online only" msgid "Folder will switch to online only"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2250,7 +2244,7 @@ msgid ""
"finish before removing it." "finish before removing it."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2259,68 +2253,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
msgid "Stop Syncing Folder?" msgid "Stop Syncing Folder?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
msgid "Also delete from Proton Drive" msgid "Also delete from Proton Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "The local copy is unaffected." msgid "The local copy is unaffected."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
msgid "Stopped syncing folder" msgid "Stopped syncing folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
msgid "Couldn't stop syncing the folder" msgid "Couldn't stop syncing the folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
msgid "Couldn't rename the computer" msgid "Couldn't rename the computer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
msgid "A name is required." msgid "A name is required."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, rust-format #, rust-format
msgid "Type “{name}” to confirm" msgid "Type “{name}” to confirm"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2330,25 +2324,25 @@ msgid ""
"here." "here."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
msgid "Couldn't remove the computer" msgid "Couldn't remove the computer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
msgid "Continue This Backup Here?" msgid "Continue This Backup Here?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2360,44 +2354,20 @@ msgid ""
"syncing." "syncing."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3084,131 +3054,142 @@ msgstr ""
msgid "Signing in…" msgid "Signing in…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
msgstr "" msgstr ""
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
msgid "Verify in Your Browser"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:543
msgid "Open Verification Page"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:550
msgid "Continue"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "" msgstr ""
+137 -154
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Komputery" msgstr "Komputery"
@@ -267,18 +267,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -318,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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
@@ -360,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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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ę"
@@ -701,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
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"
@@ -1293,11 +1293,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1329,7 +1328,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1343,7 +1342,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Zmień nazwę…" msgstr "Zmień nazwę…"
@@ -1617,7 +1616,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1780,7 +1779,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1926,7 +1925,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "Nowa nazwa" msgstr "Nowa nazwa"
@@ -1957,7 +1956,6 @@ 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"
@@ -2192,35 +2190,31 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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"
@@ -2228,7 +2222,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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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"
@@ -2236,61 +2230,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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "synchronizowanie…" msgstr "synchronizowanie…"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "błąd synchronizacji" msgstr "błąd synchronizacji"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "wymaga uwagi" msgstr "wymaga uwagi"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "aktualne" msgstr "aktualne"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "sprawdzanie zmian…" msgstr "sprawdzanie zmian…"
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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."
@@ -2298,19 +2292,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Przywróć katalogi" msgstr "Przywróć katalogi"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Przywróć" msgstr "Przywróć"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Przywracanie katalogów…" msgstr "Przywracanie katalogów…"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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 "
@@ -2319,37 +2313,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2366,7 +2360,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2379,68 +2373,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
msgid "Stop Syncing Folder?" msgid "Stop Syncing Folder?"
msgstr "Zatrzymać synchronizację katalogu?" msgstr "Zatrzymać synchronizację katalogu?"
#: crates/pdfs-gui/src/app/pages/devices.rs:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Zatrzymaj synchronizację" msgstr "Zatrzymaj synchronizację"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
msgid "Stopped syncing folder" msgid "Stopped syncing folder"
msgstr "Zatrzymano synchronizację katalogu" msgstr "Zatrzymano synchronizację katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, 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:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "Usunąć komputer?" msgstr "Usunąć komputer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2455,25 +2449,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Usunięto komputer" msgstr "Usunięto komputer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2492,51 +2486,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3281,36 +3244,26 @@ msgstr "Proszę podać adres e-mail i hasło."
msgid "Signing in…" msgid "Signing in…"
msgstr "Logowanie…" msgstr "Logowanie…"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Proszę ukończyć weryfikację, aby kontynuować…" msgstr "Proszę ukończyć weryfikację, aby kontynuować…"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "anulowano logowanie" msgstr "anulowano logowanie"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"Nie można otworzyć strony weryfikacji, więc logowanie zostało anulowane. "
"System może blokować uruchomienie piaskownicy widoku internetowego; poradnik "
"rozwiązywania problemów wyjaśnia, co zrobić."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Za dużo prób logowania. Proszę odczekać kilka minut i spróbować ponownie." "Za dużo prób logowania. Proszę odczekać kilka minut i spróbować ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Nie można połączyć się z Proton. Proszę sprawdzić połączenie z Internetem i " "Nie można połączyć się z Proton. Proszę sprawdzić połączenie z Internetem i "
"spróbować ponownie." "spróbować ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3319,19 +3272,19 @@ msgstr ""
"upewnić, że baza kluczy (GNOME Keyring lub KWallet) jest uruchomiona i " "upewnić, że baza kluczy (GNOME Keyring lub KWallet) jest uruchomiona i "
"odblokowana." "odblokowana."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Anulowano logowanie: nie wpisano kodu uwierzytelniania dwuetapowego." msgstr "Anulowano logowanie: nie wpisano kodu uwierzytelniania dwuetapowego."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Anulowano logowanie: nie wpisano hasła skrzynki pocztowej." msgstr "Anulowano logowanie: nie wpisano hasła skrzynki pocztowej."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "To hasło skrzynki pocztowej nie odblokowało Twojego konta." msgstr "To hasło skrzynki pocztowej nie odblokowało Twojego konta."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3340,36 +3293,36 @@ msgstr ""
"ponownie, aby otrzymać nową." "ponownie, aby otrzymać nową."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Logowanie się nie powiodło: {error}" msgstr "Logowanie się nie powiodło: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "" msgstr ""
"To hasło skrzynki pocztowej nie odblokowało Twojego konta. Spróbuj ponownie." "To hasło skrzynki pocztowej nie odblokowało Twojego konta. Spróbuj ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"To konto ma osobne hasło skrzynki pocztowej. Wpisz je, aby odblokować swoje " "To konto ma osobne hasło skrzynki pocztowej. Wpisz je, aby odblokować swoje "
"pliki." "pliki."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Hasło skrzynki pocztowej" msgstr "Hasło skrzynki pocztowej"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Hasło skrzynki pocztowej" msgstr "Hasło skrzynki pocztowej"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Pozostaw odblokowane na tym komputerze" msgstr "Pozostaw odblokowane na tym komputerze"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3378,49 +3331,70 @@ msgstr ""
"się bez pytania po każdym logowaniu. W przeciwnym razie wpisujesz hasło raz " "się bez pytania po każdym logowaniu. W przeciwnym razie wpisujesz hasło raz "
"na sesję." "na sesję."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Odblokuj" msgstr "Odblokuj"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
"Proton Drive jest zablokowany. Wpisz hasło skrzynki pocztowej, aby go " "Proton Drive jest zablokowany. Wpisz hasło skrzynki pocztowej, aby go "
"odblokować." "odblokować."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Odblokowano." msgstr "Odblokowano."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "Nie udało się odblokować" msgstr "Nie udało się odblokować"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Uwierzytelnianie dwuskładnikowe" msgstr "Uwierzytelnianie dwuskładnikowe"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Proszę wpisać kod z aplikacji uwierzytelniającej lub jeden z kodów " "Proszę wpisać kod z aplikacji uwierzytelniającej lub jeden z kodów "
"odzyskiwania." "odzyskiwania."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Kod uwierzytelniania" msgstr "Kod uwierzytelniania"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Potwierdź" msgstr "Potwierdź"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Weryfikacja w przeglądarce"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "Na tym systemie strony weryfikacji nie można wyświetlić w aplikacji. Proszę otworzyć ją w przeglądarce, ukończyć tam weryfikację, a następnie wrócić i wybrać „Kontynuuj”."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Otwórz stronę weryfikacji"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Kontynuuj"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Wylogować się?" msgstr "Wylogować się?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3428,7 +3402,7 @@ msgstr ""
"Proton Drive rozłączy się i przestanie synchronizować do czasu ponownego " "Proton Drive rozłączy się i przestanie synchronizować do czasu ponownego "
"zalogowania. Pliki znajdujące się już na tym komputerze pozostaną na miejscu." "zalogowania. Pliki znajdujące się już na tym komputerze pozostaną na miejscu."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Wyloguj się" msgstr "Wyloguj się"
@@ -6238,6 +6212,15 @@ msgstr "{count} r."
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "nie można połączyć się z usługą Proton Drive: {error}" msgstr "nie można połączyć się z usługą Proton Drive: {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "Nie można otworzyć strony weryfikacji, więc logowanie zostało anulowane. "
#~ "System może blokować uruchomienie piaskownicy widoku internetowego; "
#~ "poradnik rozwiązywania problemów wyjaśnia, co zrobić."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Przejdź do miesiąca" #~ msgstr "Przejdź do miesiąca"
+137 -153
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 13:23+0200\n" "POT-Creation-Date: 2026-10-08 18:47+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:485 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computadores" msgstr "Computadores"
@@ -262,18 +262,18 @@ 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:792 #: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:945 #: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:983 #: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1035 #: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1079 #: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: 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
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:393 #: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:507 #: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -313,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:558 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: 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 +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:984 #: crates/pdfs-gui/src/app/pages/devices.rs:980
#: 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"
@@ -683,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:827 #: crates/pdfs-gui/src/app/pages/devices.rs:823
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"
@@ -1263,11 +1263,10 @@ 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:698 #: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:738 #: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:888 #: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1156 #: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: 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
@@ -1299,7 +1298,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:534 #: crates/pdfs-gui/src/app/pages/devices.rs:530
#: 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
@@ -1313,7 +1312,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:448 #: crates/pdfs-gui/src/app/pages/devices.rs:444
msgid "Rename…" msgid "Rename…"
msgstr "Renomear…" msgstr "Renomear…"
@@ -1581,7 +1580,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:543 #: crates/pdfs-gui/src/app/pages/devices.rs:539
#: 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
@@ -1735,7 +1734,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:554 #: crates/pdfs-gui/src/app/pages/devices.rs:550
#: 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
@@ -1880,7 +1879,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:977 #: crates/pdfs-gui/src/app/pages/devices.rs:973
msgid "New name" msgid "New name"
msgstr "Novo nome" msgstr "Novo nome"
@@ -1910,7 +1909,6 @@ 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á"
@@ -2139,103 +2137,99 @@ 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:443 #: crates/pdfs-gui/src/app/pages/devices.rs:451
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:460 #: crates/pdfs-gui/src/app/pages/devices.rs:456
#: 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:571 #: crates/pdfs-gui/src/app/pages/devices.rs:567
#, 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:575 #: crates/pdfs-gui/src/app/pages/devices.rs:571
#, 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:591 #: crates/pdfs-gui/src/app/pages/devices.rs:587
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:594 #: crates/pdfs-gui/src/app/pages/devices.rs:590
#, 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:607 #: crates/pdfs-gui/src/app/pages/devices.rs:603
#, 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:618 #: crates/pdfs-gui/src/app/pages/devices.rs:614
msgid "syncing…" msgid "syncing…"
msgstr "sincronizando…" msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:619 #: crates/pdfs-gui/src/app/pages/devices.rs:615
msgid "sync error" msgid "sync error"
msgstr "erro de sincronização" msgstr "erro de sincronização"
#: crates/pdfs-gui/src/app/pages/devices.rs:620 #: crates/pdfs-gui/src/app/pages/devices.rs:616
msgid "needs attention" msgid "needs attention"
msgstr "requer atenção" msgstr "requer atenção"
#: crates/pdfs-gui/src/app/pages/devices.rs:621 #: crates/pdfs-gui/src/app/pages/devices.rs:617
msgid "up to date" msgid "up to date"
msgstr "atualizado" msgstr "atualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:633 #: crates/pdfs-gui/src/app/pages/devices.rs:629
msgid "checking for changes…" msgid "checking for changes…"
msgstr "verificando alterações…" msgstr "verificando alterações…"
#: crates/pdfs-gui/src/app/pages/devices.rs:636 #: crates/pdfs-gui/src/app/pages/devices.rs:632
#, 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:648 #: crates/pdfs-gui/src/app/pages/devices.rs:644
#, 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:654 #: crates/pdfs-gui/src/app/pages/devices.rs:650
#, 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:666 #: crates/pdfs-gui/src/app/pages/devices.rs:662
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:690 #: crates/pdfs-gui/src/app/pages/devices.rs:686
#: 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:731 #: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:737 #: crates/pdfs-gui/src/app/pages/devices.rs:733
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:763 #: crates/pdfs-gui/src/app/pages/devices.rs:759
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 +2237,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:786 #: crates/pdfs-gui/src/app/pages/devices.rs:782
msgid "Restore Folders" msgid "Restore Folders"
msgstr "Restaurar pastas" msgstr "Restaurar pastas"
#: crates/pdfs-gui/src/app/pages/devices.rs:793 #: crates/pdfs-gui/src/app/pages/devices.rs:789
msgid "Restore" msgid "Restore"
msgstr "Restaurar" msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:826 #: crates/pdfs-gui/src/app/pages/devices.rs:822
msgid "Restoring folders…" msgid "Restoring folders…"
msgstr "Restaurando pastas…" msgstr "Restaurando pastas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:838 #: crates/pdfs-gui/src/app/pages/devices.rs:834
#, 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,36 +2258,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:841 #: crates/pdfs-gui/src/app/pages/devices.rs:837
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:850 #: crates/pdfs-gui/src/app/pages/devices.rs:846
#, 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:853 #: crates/pdfs-gui/src/app/pages/devices.rs:849
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:877 #: crates/pdfs-gui/src/app/pages/devices.rs:873
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:879 #: crates/pdfs-gui/src/app/pages/devices.rs:875
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:919 #: crates/pdfs-gui/src/app/pages/devices.rs:915
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2310,7 +2304,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:925 #: crates/pdfs-gui/src/app/pages/devices.rs:921
#, rust-format #, rust-format
msgid "" msgid ""
"Stop syncing “{path}”?\n" "Stop syncing “{path}”?\n"
@@ -2323,68 +2317,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:930 #: crates/pdfs-gui/src/app/pages/devices.rs:926
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:935 #: crates/pdfs-gui/src/app/pages/devices.rs:931
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:937 #: crates/pdfs-gui/src/app/pages/devices.rs:933
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:939 #: crates/pdfs-gui/src/app/pages/devices.rs:935
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:946 #: crates/pdfs-gui/src/app/pages/devices.rs:942
msgid "Stop Syncing" msgid "Stop Syncing"
msgstr "Parar de sincronizar" msgstr "Parar de sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:959 #: crates/pdfs-gui/src/app/pages/devices.rs:955
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:960 #: crates/pdfs-gui/src/app/pages/devices.rs:956
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:971 #: crates/pdfs-gui/src/app/pages/devices.rs:967
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:973 #: crates/pdfs-gui/src/app/pages/devices.rs:969
#, rust-format #, rust-format
msgid "Rename “{name}”." msgid "Rename “{name}”."
msgstr "Renomear “{name}”." msgstr "Renomear “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:998 #: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1010 #: crates/pdfs-gui/src/app/pages/devices.rs:1006
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:999 #: crates/pdfs-gui/src/app/pages/devices.rs:995
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:1009 #: crates/pdfs-gui/src/app/pages/devices.rs:1005
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:1022 #: crates/pdfs-gui/src/app/pages/devices.rs:1018
#, 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:1027 #: crates/pdfs-gui/src/app/pages/devices.rs:1023
msgid "Remove Computer?" msgid "Remove Computer?"
msgstr "Remover computador?" msgstr "Remover computador?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1030 #: crates/pdfs-gui/src/app/pages/devices.rs:1026
#, rust-format #, rust-format
msgid "" msgid ""
"Remove “{name}” from this account?\n" "Remove “{name}” from this account?\n"
@@ -2399,25 +2393,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:1036 #: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: 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:1053 #: crates/pdfs-gui/src/app/pages/devices.rs:1049
msgid "Computer removed" msgid "Computer removed"
msgstr "Computador removido" msgstr "Computador removido"
#: crates/pdfs-gui/src/app/pages/devices.rs:1054 #: crates/pdfs-gui/src/app/pages/devices.rs:1050
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:1072 #: crates/pdfs-gui/src/app/pages/devices.rs:1068
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:1075 #: crates/pdfs-gui/src/app/pages/devices.rs:1071
#, 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 "
@@ -2436,50 +2430,20 @@ 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:1080 #: crates/pdfs-gui/src/app/pages/devices.rs:1076
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:1087 #: crates/pdfs-gui/src/app/pages/devices.rs:1083
#, 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:1096 #: crates/pdfs-gui/src/app/pages/devices.rs:1092
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"
@@ -3215,35 +3179,25 @@ msgstr "Digite seu e-mail e senha."
msgid "Signing in…" msgid "Signing in…"
msgstr "Entrando…" msgstr "Entrando…"
#: crates/pdfs-gui/src/app/pages/login.rs:164 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Conclua a verificação para continuar…" msgstr "Conclua a verificação para continuar…"
#: crates/pdfs-gui/src/app/pages/login.rs:197 #: crates/pdfs-gui/src/app/pages/login.rs:195
msgid "login cancelled" msgid "login cancelled"
msgstr "login cancelado" msgstr "login cancelado"
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:228
msgid ""
"The verification page couldn't be opened, so the sign-in was cancelled. Your "
"system may keep the web view's sandbox from starting; the troubleshooting "
"guide explains what to do."
msgstr ""
"Não foi possível abrir a página de verificação, então a entrada foi "
"cancelada. Seu sistema pode estar impedindo que a sandbox da visualização "
"web inicie; o guia de solução de problemas explica o que fazer."
#: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Muitas tentativas de entrar. Aguarde alguns minutos e tente novamente." msgstr "Muitas tentativas de entrar. Aguarde alguns minutos e tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:239 #: crates/pdfs-gui/src/app/pages/login.rs:234
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Não foi possível acessar o Proton. Verifique sua conexão com a internet e " "Não foi possível acessar o Proton. Verifique sua conexão com a internet e "
"tente novamente." "tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:242 #: crates/pdfs-gui/src/app/pages/login.rs:237
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3252,19 +3206,19 @@ msgstr ""
"Certifique-se de que um chaveiro (GNOME Keyring ou KWallet) esteja em " "Certifique-se de que um chaveiro (GNOME Keyring ou KWallet) esteja em "
"execução e desbloqueado." "execução e desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:245 #: crates/pdfs-gui/src/app/pages/login.rs:240
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Entrada cancelada: nenhum código de dois fatores foi digitado." msgstr "Entrada cancelada: nenhum código de dois fatores foi digitado."
#: crates/pdfs-gui/src/app/pages/login.rs:248 #: crates/pdfs-gui/src/app/pages/login.rs:243
msgid "Sign-in cancelled: no mailbox password was entered." msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Entrada cancelada: nenhuma senha da caixa de correio foi digitada." msgstr "Entrada cancelada: nenhuma senha da caixa de correio foi digitada."
#: crates/pdfs-gui/src/app/pages/login.rs:251 #: crates/pdfs-gui/src/app/pages/login.rs:246
msgid "That mailbox password didn't unlock your account." msgid "That mailbox password didn't unlock your account."
msgstr "Essa senha da caixa de correio não desbloqueou sua conta." msgstr "Essa senha da caixa de correio não desbloqueou sua conta."
#: crates/pdfs-gui/src/app/pages/login.rs:254 #: crates/pdfs-gui/src/app/pages/login.rs:249
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3273,36 +3227,36 @@ msgstr ""
"receber uma nova." "receber uma nova."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:259 #: crates/pdfs-gui/src/app/pages/login.rs:254
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Falha ao entrar: {error}" msgstr "Falha ao entrar: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:369 #: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "That mailbox password didn't unlock your account. Try again." msgid "That mailbox password didn't unlock your account. Try again."
msgstr "" msgstr ""
"Essa senha da caixa de correio não desbloqueou sua conta. Tente novamente." "Essa senha da caixa de correio não desbloqueou sua conta. Tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:371 #: crates/pdfs-gui/src/app/pages/login.rs:367
msgid "" msgid ""
"This account has a separate mailbox password. Enter it to unlock your files." "This account has a separate mailbox password. Enter it to unlock your files."
msgstr "" msgstr ""
"Esta conta tem uma senha da caixa de correio separada. Digite-a para " "Esta conta tem uma senha da caixa de correio separada. Digite-a para "
"desbloquear seus arquivos." "desbloquear seus arquivos."
#: crates/pdfs-gui/src/app/pages/login.rs:374 #: crates/pdfs-gui/src/app/pages/login.rs:370
msgid "Mailbox Password" msgid "Mailbox Password"
msgstr "Senha da caixa de correio" msgstr "Senha da caixa de correio"
#: crates/pdfs-gui/src/app/pages/login.rs:380 #: crates/pdfs-gui/src/app/pages/login.rs:376
msgid "Mailbox password" msgid "Mailbox password"
msgstr "Senha da caixa de correio" msgstr "Senha da caixa de correio"
#: crates/pdfs-gui/src/app/pages/login.rs:384 #: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Keep unlocked on this computer" msgid "Keep unlocked on this computer"
msgstr "Manter desbloqueado neste computador" msgstr "Manter desbloqueado neste computador"
#: crates/pdfs-gui/src/app/pages/login.rs:386 #: crates/pdfs-gui/src/app/pages/login.rs:382
msgid "" msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without " "Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session." "asking after every login. Otherwise you enter the password once per session."
@@ -3311,49 +3265,70 @@ msgstr ""
"sem perguntar após cada login. Caso contrário, você digita a senha uma vez " "sem perguntar após cada login. Caso contrário, você digita a senha uma vez "
"por sessão." "por sessão."
#: crates/pdfs-gui/src/app/pages/login.rs:394 #: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:447 #: crates/pdfs-gui/src/app/pages/login.rs:443
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:446 #: crates/pdfs-gui/src/app/pages/login.rs:442
msgid "Proton Drive is locked. Enter your mailbox password to unlock it." msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr "" msgstr ""
"O Proton Drive está bloqueado. Digite a senha da caixa de correio para " "O Proton Drive está bloqueado. Digite a senha da caixa de correio para "
"desbloqueá-lo." "desbloqueá-lo."
#: crates/pdfs-gui/src/app/pages/login.rs:475 #: crates/pdfs-gui/src/app/pages/login.rs:471
msgid "Unlocked." msgid "Unlocked."
msgstr "Desbloqueado." msgstr "Desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:476
msgid "Couldn't unlock" msgid "Couldn't unlock"
msgstr "Não foi possível desbloquear" msgstr "Não foi possível desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:493 #: crates/pdfs-gui/src/app/pages/login.rs:489
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Autenticação de dois fatores" msgstr "Autenticação de dois fatores"
#: crates/pdfs-gui/src/app/pages/login.rs:495 #: crates/pdfs-gui/src/app/pages/login.rs:491
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Digite o código do seu aplicativo autenticador ou um dos seus códigos de " "Digite o código do seu aplicativo autenticador ou um dos seus códigos de "
"recuperação." "recuperação."
#: crates/pdfs-gui/src/app/pages/login.rs:501 #: crates/pdfs-gui/src/app/pages/login.rs:497
msgid "Authentication code" msgid "Authentication code"
msgstr "Código de autenticação" msgstr "Código de autenticação"
#: crates/pdfs-gui/src/app/pages/login.rs:508 #: crates/pdfs-gui/src/app/pages/login.rs:504
msgid "Confirm" msgid "Confirm"
msgstr "Confirmar" msgstr "Confirmar"
#: crates/pdfs-gui/src/app/pages/login.rs:536 #: crates/pdfs-gui/src/app/pages/login.rs:535
#
msgid "Verify in Your Browser"
msgstr "Verificar no navegador"
#: crates/pdfs-gui/src/app/pages/login.rs:537
msgid ""
"The verification page can't be shown in the app on this system. Open it in "
"your browser, complete it there, then come back and choose Continue."
msgstr "A página de verificação não pode ser exibida no app neste sistema. Abra-a no navegador, conclua-a lá e depois volte e escolha “Continuar”."
#: crates/pdfs-gui/src/app/pages/login.rs:543
#
msgid "Open Verification Page"
msgstr "Abrir página de verificação"
#: crates/pdfs-gui/src/app/pages/login.rs:550
#
msgid "Continue"
msgstr "Continuar"
#: crates/pdfs-gui/src/app/pages/login.rs:589
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Sair?" msgstr "Sair?"
#: crates/pdfs-gui/src/app/pages/login.rs:538 #: crates/pdfs-gui/src/app/pages/login.rs:591
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3361,7 +3336,7 @@ msgstr ""
"O Proton Drive será desconectado e deixará de sincronizar até você entrar " "O Proton Drive será desconectado e deixará de sincronizar até você entrar "
"novamente. Os arquivos que já estão neste computador permanecem onde estão." "novamente. Os arquivos que já estão neste computador permanecem onde estão."
#: crates/pdfs-gui/src/app/pages/login.rs:540 #: crates/pdfs-gui/src/app/pages/login.rs:593
msgid "Sign Out" msgid "Sign Out"
msgstr "Sair" msgstr "Sair"
@@ -6129,6 +6104,15 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {error}" msgid "cannot reach the Proton Drive daemon: {error}"
msgstr "não foi possível acessar o daemon do Proton Drive: {error}" msgstr "não foi possível acessar o daemon do Proton Drive: {error}"
#~ msgid ""
#~ "The verification page couldn't be opened, so the sign-in was cancelled. "
#~ "Your system may keep the web view's sandbox from starting; the "
#~ "troubleshooting guide explains what to do."
#~ msgstr ""
#~ "Não foi possível abrir a página de verificação, então a entrada foi "
#~ "cancelada. Seu sistema pode estar impedindo que a sandbox da visualização "
#~ "web inicie; o guia de solução de problemas explica o que fazer."
#~ msgid "Jump to a month" #~ msgid "Jump to a month"
#~ msgstr "Ir para um mês" #~ msgstr "Ir para um mês"