Compare commits

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

Two related bugs on the way to online-only:

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

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

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

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

No files matched your search

+40 -22
View File
@@ -628,6 +628,15 @@ enum DeviceCmd {
#[arg(long, conflicts_with = "uid")]
clear: bool,
},
/// Move another computer's folders into this computer's backup and sync
/// them here. The other computer stays registered, without those folders.
Migrate {
/// Device uid (from `devices list`).
uid: String,
/// Skip the confirmation and accept every proposed local path.
#[arg(long)]
yes: bool,
},
}
#[derive(Subcommand)]
@@ -967,6 +976,24 @@ fn cmd_devices(action: DeviceCmd) -> Result<()> {
let uid = if clear { None } else { uid };
ok_or_bail(control_request(CtlRequest::AdoptDevice { uid })?)?
}
DeviceCmd::Migrate { uid, yes } => {
if !yes {
println!(
"Every folder that device backs up moves into this computer's backup.\n\
The device stays registered, without those folders. Stop Proton Drive\n\
on that computer first, or it sees its folders disappear."
);
confirm("Move them here?")?;
}
let response = control_request(CtlRequest::MigrateDevice { uid })?;
// A script gets the one reply and runs `sync restore` itself.
if emit_json(&response)? {
return Ok(());
}
ok_or_bail(response)?;
// The folders are this device's now, so the plain restore offers them.
cmd_sync_restore(yes, None)?
}
}
Ok(())
}
@@ -1816,29 +1843,20 @@ fn cmd_login(username: Option<String>, remember: bool) -> Result<()> {
// Only a two-password account is ever asked for this.
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()?;
rt.block_on(auth::login_interactive(
&username,
&password,
get_totp,
get_mailbox,
get_hv,
))
.context("login failed")?;
// Solving a CAPTCHA needs a browser engine, which the CLI has no business
// carrying. Point at the app that does rather than failing with the raw API
// message, which reads as "your login is broken".
rt.block_on(auth::login(&username, &password, get_totp, get_mailbox))
.map_err(|e| match e {
pdfs_core::Error::HumanVerificationRequired(_) => anyhow::anyhow!(
"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\
(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
// between keyring checks; restart it so the mount appears now instead of
-62
View File
@@ -206,44 +206,6 @@ 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.
///
/// A gated login fails with [`Error::HumanVerificationRequired`] carrying the
@@ -712,30 +674,6 @@ 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]
fn passphrases_survive_the_blob_encoding() {
let decoded = decode(&encode(&passphrases())).expect("decodes");
+10
View File
@@ -446,6 +446,13 @@ pub enum Request {
/// of registering a duplicate. `uid: None` clears the pin.
/// Replies with [`Response::Ok`].
AdoptDevice { uid: Option<String> },
/// Move every folder another device backs up into this machine's own
/// device, as server-side moves on the main volume. The other device stays
/// registered, without those folders. Sync folders here that already track
/// one of them follow it to its new share. Nothing is downloaded: the moved
/// folders are then offered by [`Request::ListRestorableFolders`].
/// Replies with [`Response::Ok`].
MigrateDevice { uid: String },
// ---- device folder sync ----------------------------------
/// Add a local folder to this machine's device, uploading its tree and
@@ -3082,6 +3089,9 @@ mod tests {
uid: Some("dev-1".into()),
},
Request::AdoptDevice { uid: None },
Request::MigrateDevice {
uid: "dev-2".into(),
},
Request::ListRestorableFolders,
Request::RestoreSyncFolders {
items: vec![RestoreItem {
+11
View File
@@ -139,6 +139,17 @@ impl Db {
Ok(())
}
/// Re-point a synced folder at the share that now holds its remote folder,
/// after the folder moved to another device without changing its uid.
pub fn sync_folder_set_share(&self, id: i64, share_id: &str) -> Result<()> {
let conn = self.conn.lock();
conn.execute(
"UPDATE sync_folder SET remote_share_id = ?2 WHERE id = ?1",
params![id, share_id],
)?;
Ok(())
}
/// Queue (or, with `None`, withdraw) a mode the folder should move to once it
/// is safe to switch.
pub fn sync_folder_set_pending_mode(&self, id: i64, mode: Option<&str>) -> Result<()> {
+22
View File
@@ -4940,6 +4940,28 @@ fn pending_mode_is_queued_until_the_mode_is_reached() {
assert_eq!(folder.pending_mode, None);
}
#[test]
fn moved_sync_folder_points_at_its_new_share() {
let db = Db::open_in_memory().unwrap();
let id = db
.sync_folder_add("/tmp/pdfs-moved-share", "vol~folder", "windows-share")
.unwrap();
let other = db
.sync_folder_add("/tmp/pdfs-unmoved-share", "vol~other", "windows-share")
.unwrap();
db.sync_folder_set_share(id, "linux-share").unwrap();
let folder = db.sync_folder_get(id).unwrap().unwrap();
assert_eq!(folder.remote_share_id, "linux-share");
// A move keeps the uid, so nothing but the share changes.
assert_eq!(folder.remote_uid, "vol~folder");
assert_eq!(
db.sync_folder_get(other).unwrap().unwrap().remote_share_id,
"windows-share"
);
}
#[test]
fn mode_commit_clears_only_the_intent_it_satisfies() {
let db = Db::open_in_memory().unwrap();
+5 -1
View File
@@ -369,7 +369,7 @@ fn touched_topics(request: &CtlRequest) -> &'static [Topic] {
RefreshScope::Photos { .. } => &[],
},
R::RenameDevice { .. } | R::DeleteDevice { .. } => &[Topic::Devices],
R::AdoptDevice { .. } => &[Topic::Devices, Topic::Locations],
R::AdoptDevice { .. } | R::MigrateDevice { .. } => &[Topic::Devices, Topic::Locations],
R::AddSyncFolder { .. }
| R::RemoveSyncFolder { .. }
| R::SetSyncFolderMode { .. }
@@ -1297,6 +1297,10 @@ fn handle_control_conn(core: &Core, username: &str, mountpoint: &Path, stream: U
Ok(message) => CtlResponse::Ok { message },
Err(e) => CtlResponse::error(e),
},
Ok(CtlRequest::MigrateDevice { uid }) => match core.migrate_device(&uid) {
Ok(message) => CtlResponse::Ok { message },
Err(e) => CtlResponse::error(e),
},
Ok(CtlRequest::AddSyncFolder { local_path }) => {
// Registering the device and uploading a folder tree far outlasts the
// socket read timeout, so ack immediately and work on a background
+176 -9
View File
@@ -19,6 +19,7 @@ use pdfs_core::control::{
};
use pdfs_core::db::{StoredDevice, StoredSyncFolder};
use pdfs_core::mounts::MountMode;
use pdfs_core::profile::PROFILE_DIR_NAME;
use pdfs_core::{CoreError, CoreResult};
use proton_drive_rs::proton_sdk::ids::{DeviceUid, NodeUid};
use proton_drive_rs::{DeviceType, Node};
@@ -114,6 +115,22 @@ pub(crate) fn set_adopted_device_uid(uid: Option<&str>) -> CoreResult<()> {
.map_err(|e| CoreError::internal(format!("write config: {e}")))
}
/// The name a folder moved in from `device` takes when `name` is already
/// taken under this device's root, or `None` when it can keep its own.
fn migrated_name(name: &str, device: &str, taken: &[String]) -> Option<String> {
let free = |candidate: &str| !taken.iter().any(|t| t == candidate);
if free(name) {
return None;
}
let base = format!("{name} ({device})");
if free(&base) {
return Some(base);
}
(2..)
.map(|n| format!("{base} {n}"))
.find(|candidate| free(candidate))
}
impl Core {
// ---- devices ----------------------------------------------------------
@@ -260,6 +277,107 @@ impl Core {
})
}
/// Move every folder another device backs up into this machine's own
/// device, so this machine carries on backing them up as itself. The other
/// device stays registered, without those folders.
///
/// Device roots all live on the main volume, so each folder is one
/// server-side move: nothing is downloaded or uploaded, and no quota is
/// used twice. A folder whose name is taken here keeps its content under
/// "<name> (<device>)". A failed folder does not stop the others, and a
/// second run picks up whatever is still left on the other device.
///
/// Nothing is synced to this disk here. The moved folders are now this
/// device's, so the ordinary restore offers them. Only folders that were
/// already synced here from the other device are touched: their uid
/// survives the move but their share does not.
pub(crate) fn migrate_device(&self, uid: &str) -> CoreResult<String> {
let source = self.restore_source(Some(uid))?;
let target = self.ensure_device()?;
if source.uid == target.uid {
return Err(CoreError::invalid(format!(
"{} is this computer's own device",
source.name
)));
}
let bad_root = |d: &StoredDevice| {
parse_uid(&d.root_uid)
.ok_or_else(|| CoreError::internal(format!("bad device root uid: {}", d.root_uid)))
};
let (source_root, target_root) = (bad_root(&source)?, bad_root(&target)?);
if source_root.volume_id != target_root.volume_id {
return Err(CoreError::invalid(
"the two devices are on different Proton Drive volumes; copy it instead",
));
}
let mut taken: Vec<String> = self
.device_root_nodes(&target_root)?
.into_iter()
.filter(|n| !n.trashed)
.map(|n| n.name)
.collect();
let synced = self
.db
.sync_folder_list()
.map_err(|e| CoreError::internal(format!("db: {e:?}")))?;
let mut moved = 0usize;
let mut renamed: Vec<String> = Vec::new();
let mut left: Vec<String> = Vec::new();
let mut failed: Vec<String> = Vec::new();
for node in self.device_root_nodes(&source_root)? {
if node.trashed || node.name == PROFILE_DIR_NAME {
continue;
}
// A device root only ever holds folders (B68); anything else was
// put there by hand and is left for the user to deal with.
if !node.is_folder() {
left.push(node.name);
continue;
}
let new_name = migrated_name(&node.name, &source.name, &taken);
if let Err(e) = self.move_rename_remote(&node.uid, &target_root, new_name.as_deref()) {
warn!(name = %node.name, error = %e, "migrate: could not move folder");
failed.push(format!("{}: {e}", node.name));
continue;
}
let landed = new_name.clone().unwrap_or_else(|| node.name.clone());
if new_name.is_some() {
renamed.push(format!("{} -> {landed}", node.name));
}
taken.push(landed);
moved += 1;
let uid = node.uid.to_string();
for folder in synced.iter().filter(|f| f.remote_uid == uid) {
if let Err(e) = self.db.sync_folder_set_share(folder.id, &target.share_id) {
warn!(id = folder.id, error = ?e, "migrate: could not re-point sync folder");
}
self.sync_now(Some(folder.id));
}
}
self.invalidate_children_of(&source_root);
self.invalidate_children_of(&target_root);
let mut message = format!("moved {moved} folder(s) from {}", source.name);
if !renamed.is_empty() {
message.push_str(&format!("; renamed: {}", renamed.join(", ")));
}
if !left.is_empty() {
message.push_str(&format!("; left behind: {}", left.join(", ")));
}
if !failed.is_empty() {
message.push_str(&format!("; failed: {}", failed.join(", ")));
}
info!(from = %source.name, to = %target.name, moved, failed = failed.len(),
"device migrated");
if moved == 0 && !failed.is_empty() {
return Err(CoreError::conflict(message));
}
Ok(message)
}
// ---- device folder sync -------------------------
/// Auto-register (or recover) this machine as a Proton Drive Device, caching
@@ -360,21 +478,25 @@ impl Core {
root_uid: &NodeUid,
name: &str,
) -> CoreResult<Option<NodeUid>> {
Ok(self
.device_root_nodes(root_uid)?
.into_iter()
.find(|n| n.is_folder() && !n.trashed && n.name == name)
.map(|n| n.uid))
}
/// Everything directly under a device root, trashed nodes included.
fn device_root_nodes(&self, root_uid: &NodeUid) -> CoreResult<Vec<Node>> {
let uids = self
.rt
.block_on(self.drive.enumerate_folder_children_node_uids(root_uid))
.map_err(|e| CoreError::from_api(&e, "list device root"))?;
if uids.is_empty() {
return Ok(None);
return Ok(Vec::new());
}
let nodes = self
.rt
self.rt
.block_on(self.drive.enumerate_nodes(&uids))
.map_err(|e| CoreError::from_api(&e, "resolve device root children"))?;
Ok(nodes
.into_iter()
.find(|n| n.is_folder() && !n.trashed && n.name == name)
.map(|n| n.uid))
.map_err(|e| CoreError::from_api(&e, "resolve device root children"))
}
/// Add a local folder to this device's sync set: register the device if
@@ -842,6 +964,23 @@ impl Core {
if folder.state != "idle" {
return Err(SwitchBlocked::NotNow);
}
// `idle` only says the last pass applied everything it tried.
// It never tries an ignored path, a symlink or a folder it
// cannot read, it defers a file open for writing, and a file can
// change after it ends. The eviction below deletes all of those
// for good, so it waits until nothing here is missing from Drive
// (B198).
let baseline = self
.db
.sync_entries(id)
.map_err(|e| SwitchBlocked::Failed(format!("db: {e:?}")))?;
if let Some(reason) =
sync::mirror_tree_unsynced(&local, &baseline, &self.ignore_rules(&local))
{
return Err(SwitchBlocked::Failed(format!(
"going online-only would delete what is only on this computer: {reason}"
)));
}
let root_uid = parse_uid(&folder.remote_uid).ok_or_else(|| {
SwitchBlocked::Failed(format!("bad remote uid: {}", folder.remote_uid))
})?;
@@ -1107,10 +1246,38 @@ mod tests {
use pdfs_core::db::StoredSyncFolder;
use super::{
ApplicableMountMode, commit_after_teardown, pending_intent_matches,
ApplicableMountMode, commit_after_teardown, migrated_name, pending_intent_matches,
restore_snapshot_matches, select_mode_transition,
};
#[test]
fn migrated_folder_keeps_its_name_when_it_is_free() {
let taken = vec!["Pictures".to_string()];
assert_eq!(migrated_name("Documents", "DESKTOP-1", &taken), None);
}
#[test]
fn migrated_folder_is_named_after_its_device_on_a_clash() {
let taken = vec!["Documents".to_string()];
assert_eq!(
migrated_name("Documents", "DESKTOP-1", &taken).as_deref(),
Some("Documents (DESKTOP-1)")
);
}
#[test]
fn migrated_folder_is_numbered_when_the_device_name_is_taken_too() {
let taken = vec![
"Documents".to_string(),
"Documents (DESKTOP-1)".to_string(),
"Documents (DESKTOP-1) 2".to_string(),
];
assert_eq!(
migrated_name("Documents", "DESKTOP-1", &taken).as_deref(),
Some("Documents (DESKTOP-1) 3")
);
}
#[test]
fn unknown_mode_cannot_select_a_destructive_transition() {
let mut unmounts = 0;
+3
View File
@@ -744,6 +744,9 @@ struct Core {
/// uploading that same tree — the engine would upload files as they vanish
/// and then walk the FUSE mount as if it were local.
sync_locks: Arc<Mutex<HashMap<i64, Arc<Mutex<()>>>>>,
/// Per-sync-folder paths the last pass could not read, so the activity feed
/// says so when the set changes rather than on every poll (B196).
sync_unscanned: Arc<Mutex<HashMap<i64, Vec<String>>>>,
/// Nodes this daemon changed on the remote itself, and how many echoes of
/// those changes the event feed still owes us.
///
+1
View File
@@ -475,6 +475,7 @@ pub(crate) fn mount_with(
sync_tx,
mounts: Arc::new(Mutex::new(SecondaryMountRegistry::default())),
sync_locks: Arc::new(Mutex::new(HashMap::new())),
sync_unscanned: Arc::new(Mutex::new(HashMap::new())),
states: Arc::new(StateRegistry::default()),
};
// Before anything can queue work against it: the drain thread below reaches
+542 -99
View File
@@ -59,8 +59,9 @@ pub(crate) use planner::base_name;
#[cfg(test)]
use planner::conflict_path;
use planner::{
FilePlan, classification_order, conflict_path_with_suffix, filter_baseline, guard_local_wipe,
join_rel, parent_rel, plan_file, rel_to_path, remote_sig, unchanged_remote_size,
FilePlan, Unscanned, classification_order, conflict_path_with_suffix, filter_baseline,
guard_local_wipe, join_rel, local_deletions, parent_rel, plan_file, rel_to_path, remote_sig,
tracked_baseline, unchanged_remote_size,
};
/// What a [`Pending`] op did, so the reconcile can update shared state on the
/// engine thread (never inside a task).
@@ -187,6 +188,7 @@ impl Core {
"idle"
};
let _ = self.db.sync_folder_set_state(folder.id, state, now_secs());
self.report_unscanned(folder.id, name, &outcome.unscanned);
// Summarise a pass that actually moved something. A poll over an
// unchanged folder does nothing and says nothing — otherwise the
// feed would fill with "synced, 0 changes" every two minutes.
@@ -243,6 +245,37 @@ impl Core {
}
}
/// Tell the activity feed what a pass over this folder had to leave out
/// because it cannot be read, once each time that changes. Every other path
/// in the folder still synced, so this does not make the folder's state an
/// error; but a folder the user has no permission for is never going to
/// reach Drive, and they should hear that once rather than not at all
/// (B196).
fn report_unscanned(&self, folder_id: i64, name: &str, unscanned: &[String]) {
let previous = {
let mut last = self.sync_unscanned.lock();
if unscanned.is_empty() {
last.remove(&folder_id)
} else {
last.insert(folder_id, unscanned.to_vec())
}
};
if unscanned.is_empty() || previous.as_deref() == Some(unscanned) {
return;
}
const SHOWN: usize = 3;
let mut detail = unscanned[..unscanned.len().min(SHOWN)].join(", ");
if unscanned.len() > SHOWN {
detail.push_str(&format!(" and {} more", unscanned.len() - SHOWN));
}
self.log_activity(
ActivityKind::Sync,
format!("{} item(s) in {name} cannot be synced", unscanned.len()),
detail,
false,
);
}
/// Compile the ignore rules for a synced folder: the global patterns from
/// the config, plus any `.pdfsignore` at `local_root`.
///
@@ -250,7 +283,7 @@ impl Core {
/// than to "ignore nothing" — the defaults exclude build and VCS trees, and
/// silently uploading those because a config read failed is the outcome this
/// feature exists to prevent.
fn ignore_rules(&self, local_root: &Path) -> IgnoreRules {
pub(crate) fn ignore_rules(&self, local_root: &Path) -> IgnoreRules {
let globals = match pdfs_core::config::AppDirs::new() {
Ok(dirs) => dirs.load_config().resolved_ignore_patterns(),
Err(e) => {
@@ -313,15 +346,23 @@ impl Core {
self.progress_scan_total(folder_id, baseline.len());
let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut unscanned = Unscanned::default();
let writing = open_for_write_set(local_root);
self.walk_local(
folder_id, local_root, local_root, rules, &writing, &mut local,
folder_id,
local_root,
rules,
&writing,
&mut local,
&mut unscanned,
)?;
// The guard compares against the paths this pass could still see: an
// ignored path is absent from `local` by rule, not by loss, and counting
// those as missing would trip the guard on every pass — wedging the
// folder's sync permanently — the moment a rule covers the whole tree.
guard_local_wipe(&filter_baseline(&baseline, rules), &local)?;
// ignored or unreadable path is absent from `local` by rule or by
// failure, not by loss, and counting those as missing would trip the
// guard on every pass — wedging the folder's sync permanently — the
// moment a rule covers the whole tree.
let tracked = tracked_baseline(&baseline, rules, &unscanned);
guard_local_wipe(&tracked, &local)?;
// The remote folder uids come from the baseline instead of a walk: every
// directory this device has synced recorded its uid there when it was
@@ -391,6 +432,7 @@ impl Core {
let mut outcome = Outcome {
deferred: local.values().filter(|item| item.open_for_write).count(),
unscanned: unscanned.report(),
..Default::default()
};
let mut order: Vec<&String> = local.keys().collect();
@@ -515,13 +557,8 @@ impl Core {
// showing the folder's remote contents — otherwise everything they deleted
// comes back the moment the switch lands. Shallowest first, skipping anything
// under a folder already trashed (its children went with it).
let mut missing: Vec<&String> = baseline
.keys()
.filter(|rel| !local.contains_key(*rel))
.collect();
missing.sort_by_key(|p| p.matches('/').count());
let mut trashed: Vec<String> = Vec::new();
for rel in missing {
for rel in &local_deletions(&tracked, &local) {
if trashed
.iter()
.any(|dir| rel.starts_with(&format!("{dir}/")))
@@ -586,12 +623,18 @@ impl Core {
self.progress_scan_total(folder_id, baseline.len() * 2);
let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut unscanned = Unscanned::default();
let writing = open_for_write_set(local_root);
self.walk_local(
folder_id, local_root, local_root, rules, &writing, &mut local,
folder_id,
local_root,
rules,
&writing,
&mut local,
&mut unscanned,
)?;
// See `push_pass`: the guard must not count rule-excluded paths as lost.
guard_local_wipe(&filter_baseline(&baseline, rules), &local)?;
// See `push_pass`: the guard must not count excluded paths as lost.
guard_local_wipe(&tracked_baseline(&baseline, rules, &unscanned), &local)?;
let mut remote: HashMap<String, RemoteItem> = HashMap::new();
let mut remote_dirs: HashMap<String, NodeUid> = HashMap::new();
@@ -605,9 +648,15 @@ impl Core {
&baseline,
)?;
let order = classification_order(&local, &remote, &baseline, rules);
let mut order = classification_order(&local, &remote, &baseline, rules);
// A path the scan could not read is no more a local deletion than an
// ignored one, and a remote path under it has nowhere to be written.
order.retain(|rel| !unscanned.covers(rel));
let mut outcome = Outcome::default();
let mut outcome = Outcome {
unscanned: unscanned.report(),
..Default::default()
};
// Folders to delete, collected here and removed deepest-first at the end
// so a parent is never removed before its children.
let mut delete_local_dirs: Vec<String> = Vec::new();
@@ -873,19 +922,19 @@ impl Core {
Ok(outcome)
}
/// Recursively walk a local directory into `out`, keyed by `/`-joined relative
/// path. Symlinks and other special files are skipped. Reports each entry to the
/// pass's scan progress.
/// Recursively walk a local tree into `out`, keyed by `/`-joined relative
/// path. Symlinks and other special files are skipped, and paths that cannot
/// be read go to `unscanned`. Reports each entry to the pass's scan progress.
fn walk_local(
&self,
folder_id: i64,
root: &Path,
dir: &Path,
rules: &IgnoreRules,
writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
) -> Result<(), String> {
walk_local_tree(root, dir, rules, writing, out, &mut |rel| {
walk_local_tree(root, rules, writing, out, unscanned, &mut |rel| {
self.progress_scanned(folder_id, base_name(rel))
})
}
@@ -1582,51 +1631,120 @@ fn removed_locally(result: std::io::Result<()>) -> std::io::Result<()> {
}
/// The body of [`Core::walk_local`], without a `Core`: recursively collect the
/// local tree under `dir` into `out`, reporting each entry to `scanned`.
/// local tree under `root` into `out`, reporting each entry to `scanned`.
///
/// **Every failure here is fatal to the pass, deliberately.** A `read_dir` that
/// fails, an entry that cannot be stat-ed, a name that is not UTF-8 — each of
/// them would, if skipped, leave `out` describing a *smaller* tree than the one
/// on disk. Reconciliation reads a path present in the baseline and absent from
/// the scan as "the user deleted this", and propagates that to Drive. So an
/// unreadable subdirectory would trash its remote counterpart, and the deeper
/// the failure, the more it takes with it (`docs/BUGS.md` B55). Refusing the
/// whole pass keeps the previous baseline and leaves the remote alone; the next
/// pass retries once the transient condition clears.
/// **A path the scan cannot read is left out and recorded in `unscanned`, never
/// silently dropped.** Every pass drops what `unscanned` covers from
/// classification, so a baseline row under it is neither a local deletion nor a
/// download target (`docs/BUGS.md` B55). That covers a subfolder the pass has no
/// permission for, an entry that vanished between the listing and its `stat`,
/// and a name that is not UTF-8. Failing the whole pass on any of them, as this
/// did before, left one root-owned folder stopping everything else in the tree
/// from syncing, on every pass, for good (B196).
///
/// The root is the exception, and so is any other I/O error: an absent or
/// unreadable root fails the pass, since leaving the root out would leave
/// nothing in, and an error this cannot name a cause for is not one to guess
/// about.
///
/// Split out from the method so exactly that can be tested against a real tree
/// with a real unreadable directory in it, which needs no `Core` at all.
fn walk_local_tree(
root: &Path,
rules: &IgnoreRules,
writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
scanned: &mut dyn FnMut(&str),
) -> Result<(), String> {
walk_local_dir(root, root, rules, writing, out, unscanned, scanned).map_err(|e| e.to_string())
}
/// Why [`walk_local_dir`] could not finish a folder.
enum ScanError {
/// An I/O error on `what`, which the caller may leave out of the pass.
Io { what: String, error: std::io::Error },
/// Anything else, which fails the pass.
Failed(String),
}
impl std::fmt::Display for ScanError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ScanError::Io { what, error } => write!(f, "{what}: {error}"),
ScanError::Failed(message) => f.write_str(message),
}
}
}
/// Leave `rel` out of the pass for `failure`, or hand it back when it is one
/// that fails the pass. Permission denied is reported to the user; an entry
/// that vanished mid-scan is not, since the next pass sees it settled.
fn leave_out(rel: &str, failure: ScanError, unscanned: &mut Unscanned) -> Result<(), ScanError> {
let ScanError::Io { what, error } = &failure else {
return Err(failure);
};
match error.kind() {
std::io::ErrorKind::PermissionDenied => {
warn!(%what, %error, "sync: cannot read; leaving it out of the pass");
unscanned.unreadable(rel.to_string(), &error.to_string());
Ok(())
}
std::io::ErrorKind::NotFound => {
debug!(%what, "sync: gone mid-scan; leaving it out of the pass");
unscanned.vanished(rel.to_string());
Ok(())
}
_ => Err(failure),
}
}
fn walk_local_dir(
root: &Path,
dir: &Path,
rules: &IgnoreRules,
writing: &HashSet<PathBuf>,
out: &mut HashMap<String, LocalItem>,
unscanned: &mut Unscanned,
scanned: &mut dyn FnMut(&str),
) -> Result<(), String> {
let entries = std::fs::read_dir(dir).map_err(|e| format!("read {}: {e}", dir.display()))?;
) -> Result<(), ScanError> {
let io = |what: String| move |error| ScanError::Io { what, error };
let entries = std::fs::read_dir(dir).map_err(io(format!("read {}", dir.display())))?;
for entry in entries {
let entry = entry.map_err(|e| format!("read entry in {}: {e}", dir.display()))?;
let entry = entry.map_err(io(format!("read entry in {}", dir.display())))?;
let path = entry.path();
let meta = std::fs::symlink_metadata(&path)
.map_err(|e| format!("stat {}: {e}", path.display()))?;
let stripped = path.strip_prefix(root).map_err(|e| {
format!(
ScanError::Failed(format!(
"local path {} escaped sync root {}: {e}",
path.display(),
root.display()
)
})?;
let rel = stripped.to_str().ok_or_else(|| {
format!(
"local path {} is not valid UTF-8; refusing a destructive sync pass",
path.display()
)
))
})?;
let Some(rel) = stripped.to_str() else {
// Nothing can be keyed by this name: not the baseline, which only
// ever held paths this scan produced, and not Drive, whose names are
// UTF-8. Leaving it out cannot read as a deletion of anything.
warn!(path = %path.display(), "sync: name is not valid UTF-8; leaving it out of the pass");
unscanned.unreadable(
stripped.to_string_lossy().into_owned(),
"name is not valid UTF-8",
);
continue;
};
// Ignore our own in-flight download temp files.
if rel.contains(".pdfs-tmp-") {
continue;
}
let meta = match std::fs::symlink_metadata(&path) {
Ok(meta) => meta,
// Gone since the listing, or in a folder that lists but does not
// allow `stat`. Either way this pass cannot say what it is.
Err(error) => {
let what = format!("stat {}", path.display());
leave_out(rel, ScanError::Io { what, error }, unscanned)?;
continue;
}
};
// Ignored paths are dropped here as well as from the classification
// union — not for correctness (the union filter is what makes this
// safe) but so an ignored `node_modules/` is never descended into or
@@ -1646,7 +1764,15 @@ fn walk_local_tree(
},
);
scanned(rel);
walk_local_tree(root, &path, rules, writing, out, scanned)?;
if let Err(failure) =
walk_local_dir(root, &path, rules, writing, out, unscanned, scanned)
{
leave_out(rel, failure, unscanned)?;
// What the folder did list before failing goes with it: a
// half-read folder is as unknown as an unread one.
let prefix = format!("{rel}/");
out.retain(|k, _| k != rel && !k.starts_with(&prefix));
}
} else if meta.is_file() {
// Check whether any process holds this file open for writing.
// The canonical path is used because /proc/*/fd links resolve
@@ -1684,7 +1810,7 @@ pub(crate) fn mirror_subtree_unsynced(
baseline: &HashMap<String, StoredSyncEntry>,
) -> Option<String> {
let mut seen = HashSet::new();
if let Some(reason) = unsynced_local(root, rel, baseline, &mut seen) {
if let Some(reason) = unsynced_local(root, rel, baseline, None, &mut seen) {
return Some(reason);
}
let prefix = format!("{rel}/");
@@ -1695,45 +1821,93 @@ pub(crate) fn mirror_subtree_unsynced(
.map(|r| format!("{r} was deleted here but not on Proton Drive yet"))
}
/// [`mirror_subtree_unsynced`] for a whole mirror folder: why its local copy
/// holds something Proton Drive does not, or `None` when evicting it loses
/// nothing. The switch to on-demand asks this before it empties the folder.
///
/// A push pass that ends `idle` is not enough on its own. It never uploads an
/// ignored path, a symlink or a folder it cannot read, it defers a file open
/// for writing, and a file can change after it finishes; the eviction deleted
/// all of those for good (B198).
///
/// A tracked path deleted here but still in the baseline counts, since the
/// mount would show it again. An ignored one does not: ignoring never carries
/// a deletion to Drive, so its row stays in the baseline for good, and holding
/// the switch on it would hold it forever.
pub(crate) fn mirror_tree_unsynced(
root: &Path,
baseline: &HashMap<String, StoredSyncEntry>,
rules: &IgnoreRules,
) -> Option<String> {
let mut seen = HashSet::new();
if let Some(reason) = unsynced_local(root, "", baseline, Some(rules), &mut seen) {
return Some(reason);
}
let mut missing: Vec<String> = filter_baseline(baseline, rules)
.into_keys()
.filter(|r| !seen.contains(r.as_str()))
.collect();
missing.sort_unstable();
missing
.first()
.map(|r| format!("{r} was deleted here but not on Proton Drive yet"))
}
/// The walk behind both checks. `rules`, when given, only names an ignored
/// path as such in the reason; it is still something only this disk has.
fn unsynced_local(
root: &Path,
rel: &str,
baseline: &HashMap<String, StoredSyncEntry>,
rules: Option<&IgnoreRules>,
seen: &mut HashSet<String>,
) -> Option<String> {
let path = root.join(rel_to_path(rel));
let meta = match std::fs::symlink_metadata(&path) {
Ok(meta) => meta,
Err(e) => return Some(format!("cannot read {rel}: {e}")),
let path = if rel.is_empty() {
root.to_path_buf()
} else {
root.join(rel_to_path(rel))
};
let Some(base) = baseline.get(rel) else {
return Some(format!("{rel} is not on Proton Drive yet"));
};
seen.insert(rel.to_string());
if meta.is_file() {
return (!LocalSig::from(&meta).same_content(&LocalSig::from(base)))
.then(|| format!("{rel} has changes that are not on Proton Drive yet"));
}
if !meta.is_dir() {
return Some(format!("{rel} is not a regular file or folder"));
// The folder itself has no baseline row; only what is in it does.
if !rel.is_empty() {
let meta = match std::fs::symlink_metadata(&path) {
Ok(meta) => meta,
Err(e) => return Some(format!("cannot read {rel}: {e}")),
};
let Some(base) = baseline.get(rel) else {
if rules.is_some_and(|rules| rules.is_ignored(rel, meta.is_dir())) {
return Some(format!(
"{rel} is excluded from sync, so it is only on this computer"
));
}
return Some(format!("{rel} is not on Proton Drive yet"));
};
seen.insert(rel.to_string());
if meta.is_file() {
return (!LocalSig::from(&meta).same_content(&LocalSig::from(base)))
.then(|| format!("{rel} has changes that are not on Proton Drive yet"));
}
if !meta.is_dir() {
return Some(format!("{rel} is not a regular file or folder"));
}
}
let shown = if rel.is_empty() { "the folder" } else { rel };
let entries = match std::fs::read_dir(&path) {
Ok(entries) => entries,
Err(e) => return Some(format!("cannot read {rel}: {e}")),
Err(e) => return Some(format!("cannot read {shown}: {e}")),
};
for entry in entries {
let name = match entry {
Ok(entry) => entry.file_name(),
Err(e) => return Some(format!("cannot read {rel}: {e}")),
Err(e) => return Some(format!("cannot read {shown}: {e}")),
};
let Some(name) = name.to_str() else {
return Some(format!("{rel} holds a name that is not valid UTF-8"));
return Some(format!("{shown} holds a name that is not valid UTF-8"));
};
// A download the engine left half done; it is the engine's to clean up.
if name.contains(".pdfs-tmp-") {
continue;
}
if let Some(reason) = unsynced_local(root, &format!("{rel}/{name}"), baseline, seen) {
if let Some(reason) = unsynced_local(root, &join_rel(rel, name), baseline, rules, seen) {
return Some(reason);
}
}
@@ -2154,7 +2328,15 @@ mod tests {
let writing = HashSet::new();
let mut local: HashMap<String, LocalItem> = HashMap::new();
let mut progress = no_progress();
walk_local_tree(&root, &root, &rules, &writing, &mut local, &mut progress).unwrap();
walk_local_tree(
&root,
&rules,
&writing,
&mut local,
&mut Unscanned::default(),
&mut progress,
)
.unwrap();
assert!(local.is_empty(), "the replacement root is genuinely empty");
for size in 1..=3 {
@@ -2170,7 +2352,15 @@ mod tests {
// remounted folder resumes rather than staying wedged.
std::fs::write(root.join("file0.txt"), b"back").unwrap();
let mut local: HashMap<String, LocalItem> = HashMap::new();
walk_local_tree(&root, &root, &rules, &writing, &mut local, &mut progress).unwrap();
walk_local_tree(
&root,
&rules,
&writing,
&mut local,
&mut Unscanned::default(),
&mut progress,
)
.unwrap();
let baseline: HashMap<String, ()> = [("file0.txt".to_string(), ())].into_iter().collect();
assert!(guard_local_wipe(&filter_baseline(&baseline, &rules), &local).is_ok());
@@ -2475,33 +2665,176 @@ mod tests {
|_: &str| {}
}
/// A directory the pass cannot read must fail the pass. Omitting it would
/// hand reconciliation a baseline-minus-subtree, which it reads as the user
/// having deleted that subtree and propagates to Drive (B55).
/// Scan `root` with no rules, returning what it found and left out.
fn scan(root: &Path) -> Result<(HashMap<String, LocalItem>, Unscanned), String> {
let mut out = HashMap::new();
let mut unscanned = Unscanned::default();
let mut progress = no_progress();
walk_local_tree(
root,
&rules_for(&[]),
&HashSet::new(),
&mut out,
&mut unscanned,
&mut progress,
)?;
Ok((out, unscanned))
}
fn sorted_keys<V>(map: &HashMap<String, V>) -> Vec<&str> {
let mut keys: Vec<&str> = map.keys().map(String::as_str).collect();
keys.sort_unstable();
keys
}
/// B196, the report in #33: a folder the user may not read, such as a
/// container's root-owned cache, is left out of the pass and named, and
/// everything around it still scans. It used to fail the whole pass, so
/// nothing else in the tree ever synced again.
#[test]
fn an_unreadable_subdirectory_fails_the_scan_instead_of_shrinking_it() {
fn an_unreadable_subdirectory_is_left_out_and_the_rest_scans() {
use std::os::unix::fs::PermissionsExt as _;
let root = sync_test_dir("scan-eacces");
std::fs::write(root.join("keep.txt"), b"a").unwrap();
let locked = root.join("locked");
std::fs::create_dir_all(root.join("docker/cache")).unwrap();
std::fs::write(root.join("docker/compose.yml"), b"c").unwrap();
let locked = root.join("docker/cache/locked");
std::fs::create_dir(&locked).unwrap();
std::fs::write(locked.join("inner.txt"), b"b").unwrap();
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o000)).unwrap();
let rules = rules_for(&[]);
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
let result = scan(&root);
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
let error = result.expect_err("an unreadable directory must abort the pass");
assert!(
error.contains("locked"),
"the error should name the subtree it could not read: {error}"
let (out, unscanned) = result.expect("one unreadable folder must not fail the pass");
assert_eq!(
sorted_keys(&out),
vec!["docker", "docker/cache", "docker/compose.yml", "keep.txt"]
);
assert!(unscanned.covers("docker/cache/locked"));
assert!(unscanned.covers("docker/cache/locked/inner.txt"));
assert!(!unscanned.covers("docker/cache"));
let report = unscanned.report();
assert_eq!(report.len(), 1);
assert!(report[0].starts_with("docker/cache/locked ("), "{report:?}");
}
/// A folder with read but no search permission lists its names but cannot
/// `stat` them. Whatever it did list must go with it: a half-read folder
/// is as unknown as an unread one.
#[test]
fn a_listable_but_unsearchable_folder_is_left_out_whole() {
use std::os::unix::fs::PermissionsExt as _;
let root = sync_test_dir("scan-no-search");
std::fs::write(root.join("keep.txt"), b"a").unwrap();
let half = root.join("half");
std::fs::create_dir(&half).unwrap();
std::fs::write(half.join("one.txt"), b"1").unwrap();
std::fs::write(half.join("two.txt"), b"2").unwrap();
std::fs::set_permissions(&half, std::fs::Permissions::from_mode(0o400)).unwrap();
let result = scan(&root);
std::fs::set_permissions(&half, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
let (out, unscanned) = result.unwrap();
// Each entry fails its own `stat` and is left out by name.
assert_eq!(sorted_keys(&out), vec!["half", "keep.txt"]);
assert!(unscanned.covers("half/one.txt"));
assert!(unscanned.covers("half/two.txt"));
}
/// The other half of B196: what was left out is not a deletion, and not a
/// download target either. Its baseline rows leave the wipe guard's set
/// and a push pass's deletions, and its paths leave classification.
#[test]
fn a_path_the_scan_left_out_is_never_a_local_deletion() {
let mut baseline = baseline_with("keep.txt", 1, 1);
baseline.extend(baseline_with("locked", 0, 0));
baseline.extend(baseline_with("locked/inner.txt", 1, 1));
baseline.extend(baseline_with("gone.txt", 1, 1));
let local: HashMap<String, LocalItem> = [("keep.txt".to_string(), local_item(false))]
.into_iter()
.collect();
let mut unscanned = Unscanned::default();
unscanned.unreadable("locked".to_string(), "Permission denied");
let rules = rules_for(&[]);
let tracked = tracked_baseline(&baseline, &rules, &unscanned);
assert_eq!(sorted_keys(&tracked), vec!["gone.txt", "keep.txt"]);
assert_eq!(local_deletions(&tracked, &local), vec!["gone.txt"]);
// Every tracked path but one is gone, and the guard still lets the
// pass run: one survivor proves the tree is there.
assert!(guard_local_wipe(&tracked, &local).is_ok());
// With everything readable left out, nothing is tracked, so nothing
// can be lost and the guard has nothing to object to.
let mut all = Unscanned::default();
all.unreadable("keep.txt".to_string(), "Permission denied");
all.unreadable("locked".to_string(), "Permission denied");
all.vanished("gone.txt".to_string());
assert!(tracked_baseline(&baseline, &rules, &all).is_empty());
let remote: HashMap<String, RemoteItem> = HashMap::new();
let mut order = classification_order(&local, &remote, &baseline, &rules);
order.retain(|rel| !unscanned.covers(rel));
order.sort_unstable();
assert_eq!(order, vec!["gone.txt", "keep.txt"]);
}
#[test]
fn unscanned_covers_a_path_and_what_is_under_it_but_not_its_siblings() {
let mut unscanned = Unscanned::default();
unscanned.unreadable("a/locked".to_string(), "Permission denied");
unscanned.vanished("b.txt".to_string());
assert!(unscanned.covers("a/locked"));
assert!(unscanned.covers("a/locked/x/y.txt"));
assert!(unscanned.covers("b.txt"));
assert!(!unscanned.covers("a"));
assert!(!unscanned.covers("a/locked2"));
assert!(!unscanned.covers("b.txt.bak"));
// A file that only vanished mid-scan is not worth telling anyone about.
assert_eq!(unscanned.report(), vec!["a/locked (Permission denied)"]);
}
/// B197: a push pass read its deletions from the raw baseline, so a path
/// synced before it became ignored, which the walk skips, was trashed on
/// Drive, and the switch the push pass ran for then evicted the local copy.
#[test]
fn a_push_pass_never_reads_an_ignored_path_as_deleted() {
let mut baseline = baseline_with("notes.md", 1, 1);
baseline.extend(baseline_with("node_modules", 0, 0));
baseline.extend(baseline_with("node_modules/x/index.js", 1, 1));
baseline.extend(baseline_with("old.md", 1, 1));
let local: HashMap<String, LocalItem> = [("notes.md".to_string(), local_item(false))]
.into_iter()
.collect();
let rules = rules_for(&["node_modules/"]);
let tracked = tracked_baseline(&baseline, &rules, &Unscanned::default());
assert_eq!(local_deletions(&tracked, &local), vec!["old.md"]);
}
/// Deletions come out shallowest first, so a trashed folder can take its
/// children with it.
#[test]
fn local_deletions_come_out_shallowest_first() {
let mut baseline = baseline_with("d/e/f.txt", 1, 1);
baseline.extend(baseline_with("d", 0, 0));
baseline.extend(baseline_with("d/e", 0, 0));
let local: HashMap<String, LocalItem> = HashMap::new();
let tracked = tracked_baseline(&baseline, &rules_for(&[]), &Unscanned::default());
assert_eq!(
local_deletions(&tracked, &local),
vec!["d", "d/e", "d/e/f.txt"]
);
}
@@ -2593,6 +2926,94 @@ mod tests {
assert_eq!(reason, None);
}
// ---- B198: going online-only never evicts what Drive does not have -----
#[test]
fn a_fully_synced_mirror_folder_may_go_online_only() {
let (root, baseline) = synced_subtree("evict-synced");
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert_eq!(reason, None);
}
/// The case that lost data: `.git/` is ignored by default, so no pass ever
/// uploads it, and the eviction deleted it with the rest.
#[test]
fn an_ignored_folder_only_this_disk_has_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-ignored");
std::fs::create_dir(root.join(".git")).unwrap();
std::fs::write(root.join(".git/HEAD"), b"ref").unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[".git/"]));
std::fs::remove_dir_all(&root).unwrap();
let reason = reason.expect("an ignored folder is only on this disk");
assert!(
reason.contains(".git") && reason.contains("excluded"),
"{reason}"
);
}
/// An ignored row stays in the baseline for good once its file is gone, so
/// counting it as a deletion not carried up would hold the switch forever.
#[test]
fn a_deleted_ignored_path_does_not_hold_the_switch_back() {
let (root, mut baseline) = synced_subtree("evict-ignored-gone");
baseline.insert(
"build/out.o".to_string(),
StoredSyncEntry {
rel_path: "build/out.o".to_string(),
..baseline["dir/a.txt"].clone()
},
);
let rules = rules_for(&["build/"]);
let ignored = mirror_tree_unsynced(&root, &baseline, &rules);
let tracked = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert_eq!(ignored, None);
assert!(tracked.unwrap().contains("build/out.o"));
}
#[test]
fn an_edit_after_the_last_pass_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-edit");
std::fs::write(root.join("dir/sub/b.txt"), b"edited since").unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("dir/sub/b.txt"));
}
#[test]
fn a_new_file_at_the_root_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-new");
std::fs::write(root.join("new.txt"), b"n").unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("new.txt"));
}
/// The folder B196 now leaves out of the pass instead of failing it is,
/// by the same token, something the eviction must not delete.
#[test]
fn an_unreadable_folder_holds_the_switch_back() {
use std::os::unix::fs::PermissionsExt as _;
let (root, baseline) = synced_subtree("evict-eacces");
let locked = root.join("dir/sub");
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o000)).unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::set_permissions(&locked, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("dir/sub"));
}
#[test]
fn a_symlink_holds_the_switch_back() {
let (root, baseline) = synced_subtree("evict-symlink");
std::os::unix::fs::symlink("dir/a.txt", root.join("link")).unwrap();
let reason = mirror_tree_unsynced(&root, &baseline, &rules_for(&[]));
std::fs::remove_dir_all(&root).unwrap();
assert!(reason.unwrap().contains("link"));
}
/// The same rule one level up: if the sync root itself cannot be read, the
/// pass sees nothing, and "nothing" must never mean "delete everything".
#[test]
@@ -2607,7 +3028,14 @@ mod tests {
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
let result = walk_local_tree(
&root,
&rules,
&writing,
&mut out,
&mut Unscanned::default(),
&mut progress,
);
std::fs::set_permissions(&root, std::fs::Permissions::from_mode(0o700)).unwrap();
std::fs::remove_dir_all(&root).unwrap();
@@ -2628,30 +3056,40 @@ mod tests {
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
assert!(walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress).is_err());
assert!(
walk_local_tree(
&root,
&rules,
&writing,
&mut out,
&mut Unscanned::default(),
&mut progress
)
.is_err()
);
assert!(out.is_empty());
}
/// A name that is not valid UTF-8 cannot be keyed into the scan, so it
/// cannot be compared against the baseline either. Refusing the pass is the
/// only safe reading: skipping it would classify the file as deleted.
/// A name that is not valid UTF-8 cannot be keyed into the scan, but it
/// cannot be in the baseline or on Drive either, so leaving it out reads as
/// the deletion of nothing. It used to fail the pass (B196).
#[test]
fn a_non_utf8_name_fails_the_scan() {
fn a_non_utf8_name_is_left_out_and_reported() {
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt as _;
let root = sync_test_dir("scan-non-utf8");
std::fs::write(root.join(OsStr::from_bytes(b"bad\xffname")), b"x").unwrap();
std::fs::write(root.join("good.txt"), b"y").unwrap();
let rules = rules_for(&[]);
let writing = HashSet::new();
let mut out = HashMap::new();
let mut progress = no_progress();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut progress);
let result = scan(&root);
std::fs::remove_dir_all(&root).unwrap();
let error = result.expect_err("a name the scan cannot key must abort the pass");
assert!(error.contains("UTF-8"), "{error}");
let (out, unscanned) = result.unwrap();
assert_eq!(sorted_keys(&out), vec!["good.txt"]);
let report = unscanned.report();
assert_eq!(report.len(), 1);
assert!(report[0].contains("UTF-8"), "{report:?}");
}
/// The complement: a scan that *can* read everything reports everything, so
@@ -2670,9 +3108,14 @@ mod tests {
let writing = HashSet::new();
let mut out = HashMap::new();
let mut seen: Vec<String> = Vec::new();
let result = walk_local_tree(&root, &root, &rules, &writing, &mut out, &mut |rel| {
seen.push(rel.to_string())
});
let result = walk_local_tree(
&root,
&rules,
&writing,
&mut out,
&mut Unscanned::default(),
&mut |rel| seen.push(rel.to_string()),
);
std::fs::remove_dir_all(&root).unwrap();
result.unwrap();
+5
View File
@@ -98,6 +98,11 @@ pub(super) struct Outcome {
pub(super) errors: usize,
/// Files skipped because another process held them open for writing.
pub(super) deferred: usize,
/// Paths the local scan could not read, left out of the pass. Not part of
/// [`is_empty`](Self::is_empty) or the summary: an unreadable folder stays
/// unreadable from one poll to the next, so the pass reports it once, when
/// the set changes, rather than on every poll.
pub(super) unscanned: Vec<String>,
}
impl Outcome {
+90
View File
@@ -90,6 +90,96 @@ pub(super) fn filter_baseline<'a, B>(
.collect()
}
/// The paths a local scan left out because it could not read them: a folder
/// it has no permission for, an entry that vanished between the listing and
/// its `stat`, a name that is not UTF-8.
///
/// A left-out path is not a deleted one. A pass drops everything an entry
/// covers from classification, exactly as it drops ignored paths, so a
/// baseline row under an unreadable folder is neither read as a local deletion
/// nor answered with a download into a folder the pass cannot write. Failing
/// the whole pass instead is what B55 did, and it left one root-owned folder
/// stopping every other file in the tree from syncing (B196).
#[derive(Default)]
pub(super) struct Unscanned {
covered: HashSet<String>,
/// The subset worth telling the user about, with why: an entry that only
/// vanished mid-scan is not, since the next pass sees it settled.
unreadable: Vec<String>,
}
impl Unscanned {
/// Leave out `rel`, which vanished while the scan looked at it.
pub(super) fn vanished(&mut self, rel: String) {
self.covered.insert(rel);
}
/// Leave out `rel`, which cannot be read for `reason`.
pub(super) fn unreadable(&mut self, rel: String, reason: &str) {
self.unreadable.push(format!("{rel} ({reason})"));
self.covered.insert(rel);
}
/// Whether `rel` is a left-out path or lies under one.
pub(super) fn covers(&self, rel: &str) -> bool {
if self.covered.is_empty() {
return false;
}
let mut at = rel;
loop {
if self.covered.contains(at) {
return true;
}
match at.rfind('/') {
Some(i) => at = &at[..i],
None => return false,
}
}
}
/// The unreadable paths with their reasons, sorted, for the activity feed.
pub(super) fn report(&self) -> Vec<String> {
let mut lines = self.unreadable.clone();
lines.sort_unstable();
lines
}
}
/// The baseline paths a pass can see: [`filter_baseline`], minus everything
/// under a path the scan could not read. This is the set [`guard_local_wipe`]
/// checks and the set a push pass reads deletions from, since a path outside
/// it is absent from the local walk by rule or by failure, never by loss.
pub(super) fn tracked_baseline<'a, B>(
baseline: &'a HashMap<String, B>,
rules: &IgnoreRules,
unscanned: &Unscanned,
) -> HashMap<String, &'a B> {
let mut tracked = filter_baseline(baseline, rules);
tracked.retain(|rel, _| !unscanned.covers(rel));
tracked
}
/// The baseline paths a push pass has to trash on Drive: tracked, and gone
/// from the local walk. Shallowest first, so a trashed folder takes its
/// children with it.
///
/// Built from [`tracked_baseline`] rather than from the raw baseline. Reading
/// it raw trashed every synced path that later became ignored, because the walk
/// skips those, and the switch to on-demand that the push pass runs for then
/// deleted the local copy too (B197).
pub(super) fn local_deletions<B, L>(
tracked: &HashMap<String, &B>,
local: &HashMap<String, L>,
) -> Vec<String> {
let mut missing: Vec<String> = tracked
.keys()
.filter(|rel| !local.contains_key(*rel))
.cloned()
.collect();
missing.sort_by_key(|p| p.matches('/').count());
missing
}
/// Refuse to run a pass whose local side has vanished in its entirety.
///
/// When every baseline path is absent locally, the likely cause is an unavailable
+65
View File
@@ -439,6 +439,10 @@ fn other_computer_row(ui: &Rc<Ui>, dev: &DeviceInfo) -> adw::ActionRow {
menu.item(&gettext("Restore to This Computer…"), move || {
prompt_restore_folders(&ui_c, Some((uid_c.clone(), name_c.clone())))
});
let (ui_c, uid_c, name_c) = (ui.clone(), uid.clone(), name.clone());
menu.item(&gettext("Move to This Computer…"), move || {
prompt_migrate_device(&ui_c, &uid_c, &name_c)
});
menu.section();
let (ui_c, uid_c, name_c) = (ui.clone(), uid.clone(), name.clone());
menu.item(&gettext("Rename…"), move || {
@@ -1096,6 +1100,67 @@ pub(crate) fn prompt_adopt_device(ui: &Rc<Ui>, uid: &str, name: &str) {
dialog.present(win.as_ref());
}
/// Ask before moving another computer's folders into this computer's backup,
/// then offer them for syncing here.
///
/// Destructive-looking on purpose: the other computer keeps its device but
/// loses its folders, and a copy of Proton Drive still running there would
/// watch them vanish.
pub(crate) fn prompt_migrate_device(ui: &Rc<Ui>, uid: &str, name: &str) {
let win = ui_window(ui);
let dialog = adw::AlertDialog::builder()
.heading(gettext("Move Backup to This Computer?"))
// Translators: {name} is the name of the other computer whose folders move to this one.
.body(gettext_f(
"The folders backed up by “{name}” move into this computer's backup in Proton Drive, and you choose where they go on this computer. “{name}” stays in your account, without those folders.\n\nStop Proton Drive on “{name}” first. Otherwise it sees its folders disappear.",
&[("name", name)],
))
.build();
dialog.add_response("cancel", &gettext("Cancel"));
dialog.add_response("move", &gettext("Move Here"));
dialog.set_response_appearance("move", adw::ResponseAppearance::Destructive);
dialog.set_default_response(Some("cancel"));
dialog.set_close_response("cancel");
let ui = ui.clone();
let uid = uid.to_string();
// Translators: {name} is the name of the computer whose folders moved to this one.
let done = gettext_f("Moved the backup of “{name}”", &[("name", name)]);
dialog.connect_response(None, move |_, resp| {
if resp != "move" {
return;
}
ui.busy_begin();
let rx = spawn_request(
ui.dirs.control_socket(),
Request::MigrateDevice { uid: uid.clone() },
);
let (ui, done) = (ui.clone(), done.clone());
glib::spawn_future_local(async move {
let result = rx.recv().await;
ui.busy_end();
let failed = gettext("Couldn't move that backup");
match result {
Ok(Ok(Response::Ok { .. })) => {
reload_sync_pages(&ui);
toast(&ui, &done);
// The folders are this computer's now, so its own restore
// picker is where the user chooses their local paths.
prompt_restore_folders(&ui, None);
}
Ok(Ok(Response::Error { message, kind })) => {
toast_failure(&ui, &failed, &message, kind)
}
_ => toast_error(
&ui,
&failed,
&gettext("The Proton Drive service didn't respond."),
),
}
});
});
dialog.present(win.as_ref());
}
/// Run a mutation raised from Computers or Locations and reload the page on success.
pub(crate) fn run_devices_mutation(ui: &Rc<Ui>, req: Request, done: &str, failed: &str) {
ui.busy_begin();
+29 -82
View File
@@ -1,5 +1,5 @@
use crate::*;
use pdfs_core::proton_sdk::api::{HumanVerification, HumanVerificationCredential};
use pdfs_core::proton_sdk::api::HumanVerificationCredential;
pub(crate) struct LoginState {
// Login page.
@@ -150,24 +150,26 @@ pub(crate) fn wire_login(ui: &Rc<Ui>) {
});
// Same shape for human verification: only fires when the API gates the
// sign-in, and the worker is blocked on the credential until it does.
// sign-in, and the worker is blocked on the token until it does. A
// 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 verification_failed = Rc::new(Cell::new(false));
let hv_failed = verification_failed.clone();
glib::spawn_future_local(async move {
if let Ok((hv, credential_tx)) = hv_req_rx.recv().await {
if let Ok((url, token_tx)) = hv_req_rx.recv().await {
ui_hv
.login
.login_status
.set_text(&gettext("Complete the verification to continue…"));
// Anything but a credential drops the sender, which the worker
// reads as a cancelled sign-in.
match verify_human(hv.verification_url()).await {
// Anything but a token drops the sender, which the worker reads
// as a cancelled sign-in.
match verify_human(url).await {
Verification::Solved(token) => {
let _ = credential_tx.send(HumanVerificationCredential::captcha(token));
let _ = token_tx.send(token);
}
Verification::Cancelled => {}
// 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),
Verification::Failed => hv_failed.set(true),
}
}
});
@@ -204,6 +206,9 @@ pub(crate) fn wire_login(ui: &Rc<Ui>) {
let _ = gio::spawn_blocking(service::enable_start).await;
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),
}
});
@@ -262,12 +267,9 @@ pub(crate) struct LoginChannels {
pub(crate) result: async_channel::Receiver<Result<(), String>>,
/// 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>>,
/// Fires only if the sign-in is gated: the challenge, and the sender for the
/// credential the user earns by solving it.
pub(crate) hv: async_channel::Receiver<(
HumanVerification,
std::sync::mpsc::Sender<HumanVerificationCredential>,
)>,
/// Fires only if the sign-in is gated: the page to show, and the sender for
/// the token the user earns on it.
pub(crate) hv: async_channel::Receiver<(String, std::sync::mpsc::Sender<String>)>,
/// Fires only for a two-password account: how many answers were already
/// wrong, and the sender for the password and the "remember" choice.
pub(crate) mailbox: async_channel::Receiver<(u32, std::sync::mpsc::Sender<(String, bool)>)>,
@@ -325,16 +327,18 @@ pub(crate) fn spawn_login(username: String, password: String) -> LoginChannels {
})
},
|hv| {
// Gated: hand the UI the challenge, block on the credential
// the user earns by solving it.
let (credential_tx, credential_rx) =
std::sync::mpsc::channel::<HumanVerificationCredential>();
hv_req_tx.send_blocking((hv, credential_tx)).map_err(|_| {
pdfs_core::Error::Other("verification prompt closed".into())
})?;
credential_rx
// Gated: hand the UI the page to show, block on the token the
// user earns by solving it.
let (token_tx, token_rx) = std::sync::mpsc::channel::<String>();
hv_req_tx
.send_blocking((hv.verification_url(), token_tx))
.map_err(|_| {
pdfs_core::Error::Other("verification prompt closed".into())
})?;
let token = token_rx
.recv()
.map_err(|_| pdfs_core::Error::Other("verification cancelled".into()))
.map_err(|_| pdfs_core::Error::Other("verification cancelled".into()))?;
Ok(HumanVerificationCredential::captcha(token))
},
)
.await
@@ -521,63 +525,6 @@ pub(crate) fn prompt_2fa(ui: &Rc<Ui>, code_tx: std::sync::mpsc::Sender<String>)
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
/// daemon isn't left running without credentials), forget the stored session,
/// and drop back to the login page.
+13 -9
View File
@@ -310,8 +310,10 @@ its changes go through the queue like My files.
A filesystem watcher (`notify`) and a remote poll every 120 s feed a debounced pass (2 s, at most
30 s). Passes are serialized per daemon. A pass:
1. **Walks the local tree.** Any `readdir`, metadata or permission failure marks the scan
incomplete, and an incomplete scan cannot delete anything.
1. **Walks the local tree.** A path the user may not read, an entry that vanishes mid-scan and a
name that is not UTF-8 are left out, and the pass drops everything under them, as it drops
ignored paths, so a left-out path is never read as deleted. An unreadable root and any other
I/O error fail the pass.
2. **Walks the remote tree.**
3. **Loads the baseline**, the `sync_entry` rows: both sides as of the last successful pass.
4. **Classifies each path** by comparing local, remote and baseline, with `(mtime, size)` as the
@@ -377,6 +379,12 @@ Restore lists the device's folders, proposes a local path from the profile, and
adds a synced folder bound to the remote uid. The download is an ordinary pass against an empty
baseline. The user side is in [RECOVERY.md](RECOVERY.md).
`Core::migrate_device` moves another device's top-level folders under this machine's device root.
Device roots are separate shares on the main volume, so each folder is one server-side move that
keeps its uid. A name already taken here gets the other device's name as a suffix. A synced folder
that already tracked one of them keeps its `remote_uid` and only has its `remote_share_id`
re-pointed. The moved folders are then offered by the ordinary restore.
---
## 8. Control protocol
@@ -563,13 +571,9 @@ sequenceDiagram
- 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
sandbox cannot start, as on hardened systems such as secureblue (B195). In the child, that ends
the web view, not the app.
- When the child fails, the app offers the page in the user's own browser instead, as Proton Mail
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.
the verification, and the app says why, instead of closing the app.
- The CLI has no web view. It fails with a message to sign in once with `pdfs-app`; the stored
session then works for the CLI and the service.
---
+102 -15
View File
@@ -100,6 +100,9 @@ a live account since.
| Entry | Title |
|---|---|
| [B198](#b198--switching-to-online-only-deletes-local-files-that-never-reached-drive) | Switching to online-only deletes local files that never reached Drive |
| [B197](#b197--switching-to-online-only-trashes-synced-files-that-became-ignored) | Switching to online-only trashes synced files that became ignored |
| [B196](#b196--one-unreadable-folder-stops-the-whole-synced-folder-from-syncing) | One unreadable folder stops the whole synced folder from syncing |
| [B195](#b195--the-app-crashes-when-proton-asks-for-a-captcha-on-secureblue) | The app crashes when Proton asks for a CAPTCHA on secureblue |
| [B193](#b193--deleting-a-file-whose-create-failed-can-trash-a-file-of-the-users-on-drive) | Deleting a file whose create failed can trash a file of the user's on Drive |
| [B191](#b191--a-file-deleted-after-its-create-failed-and-was-written-again-can-stay-on-drive) | A file deleted after its create failed and was written again can stay on Drive |
@@ -298,40 +301,120 @@ a live account since.
Newest first.
### B198 — Switching to online-only deletes local files that never reached Drive
**Status:** Fixed (unverified).
**Found:** 2026-10-08, reading the switch while fixing B196.
**Where:** `crates/pdfs-fuse/src/devices.rs`, `Core::apply_sync_folder_mode`;
`crates/pdfs-fuse/src/sync.rs`, `mirror_tree_unsynced`
**Repro:** Mirror a project folder with a `.git/` in it, then switch it to **Online only**.
`.git/` is gone from the disk and was never on Drive.
**Cause.** The switch evicts the whole local tree once the folder is `idle`. `idle` only says the
last pass applied everything it tried, and a pass never tries an ignored path (`.git/` is ignored
by default), a symlink, or a folder it cannot read (B196). It also defers a file that is open for
writing without leaving `idle`, and a file can change after the pass ends. The eviction deleted
all of those.
**Fix.** Before the mode is written and anything is evicted, the switch walks the folder against
the baseline, as a move out of a mirror folder already does, and refuses when something is only on
this disk. The message names the path; an ignored one is called excluded from sync. A tracked file
deleted here but not yet on Drive also refuses. An ignored one does not, since its baseline row
stays for good and would hold the switch forever.
**Test:** unit tests `a_fully_synced_mirror_folder_may_go_online_only`,
`an_ignored_folder_only_this_disk_has_holds_the_switch_back`,
`a_deleted_ignored_path_does_not_hold_the_switch_back`,
`an_edit_after_the_last_pass_holds_the_switch_back`, `a_new_file_at_the_root_holds_the_switch_back`,
`an_unreadable_folder_holds_the_switch_back` and `a_symlink_holds_the_switch_back`. The switch
itself has not been driven against a live account.
---
### B197 — Switching to online-only trashes synced files that became ignored
**Status:** Fixed (unverified).
**Found:** 2026-10-08, reading the push pass while fixing B196.
**Where:** `crates/pdfs-fuse/src/sync.rs`, `Core::push_pass`; `crates/pdfs-fuse/src/sync/planner.rs`,
`local_deletions`
**Repro:** Mirror a folder until `build/` is on Drive, add `build/` to `.pdfsignore`, then switch
the folder to **Online only**. `build/` goes to the Drive trash, and the switch then deletes the
local copy.
**Cause.** The push pass that runs before the switch read its deletions as "in the baseline, not in
the local walk". The walk skips ignored paths, so every synced path that later became ignored read
as deleted. A full pass does not do this: it drops ignored paths from classification, which is
what the user guide promises ("Ignoring never deletes anything").
**Fix.** The push pass reads its deletions from the same filtered baseline the wipe guard checks:
without ignored paths, and without paths the scan could not read (B196).
**Test:** unit tests `a_push_pass_never_reads_an_ignored_path_as_deleted` and
`local_deletions_come_out_shallowest_first`.
---
### B196 — One unreadable folder stops the whole synced folder from syncing
**Status:** Fixed (unverified). The reporter has not run the fix yet.
**Found:** 2026-10-08, [#33](https://github.com/narrrl/proton-drive-linux/issues/33). A synced
`~/Documents` held a restic cache a Docker container had created, which the user may not read.
Every pass failed with `Couldn't sync Documents: read …/restic/cache/…/snapshots: Permission
denied`, and nothing else in `Documents` synced.
**Where:** `crates/pdfs-fuse/src/sync.rs`, `walk_local_tree`; `crates/pdfs-fuse/src/sync/planner.rs`,
`Unscanned`
**Repro:** In a mirror folder, `sudo mkdir locked && sudo chmod 700 locked`, then sync.
**Cause.** B55 made every scan failure fatal to the pass, because a path left out of the scan read
as a local deletion and was trashed on Drive. That was safe, but a folder the user may not read is
not transient: the pass failed on every poll, for good. The same held for a file deleted between
the listing and its `stat`, which a busy folder hits now and then, and for a name that is not UTF-8.
**Fix.** The scan leaves such a path out and records it, and the pass drops everything under it
from classification, the wipe guard and the push pass's deletions, as it already did for ignored
paths. A left-out path is then neither deleted on Drive nor downloaded into. A folder that lists
but does not allow `stat` is left out whole. An unreadable or absent root, and every other I/O
error, still fails the pass. The activity feed names the unreadable paths once each time the set
changes, and the folder stays `idle`. Adding the folder to `.pdfsignore` was already a workaround
and still silences the report.
**Test:** unit tests `an_unreadable_subdirectory_is_left_out_and_the_rest_scans`,
`a_listable_but_unsearchable_folder_is_left_out_whole`,
`a_path_the_scan_left_out_is_never_a_local_deletion`,
`unscanned_covers_a_path_and_what_is_under_it_but_not_its_siblings` and
`a_non_utf8_name_is_left_out_and_reported`. `an_unreadable_root_fails_the_scan` and
`an_absent_root_fails_the_scan` still hold.
---
### B195 — The app crashes when Proton asks for a CAPTCHA on secureblue
**Status:** Fixed (unverified). 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.
**Status:** Fixed (unverified). Nobody has run the fix on secureblue yet.
**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
`bwrap: Can't get type of source /run/systemd/journal/socket: Permission denied` and
`Failed to fully launch dbus-proxy`.
**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`
**Where:** `crates/pdfs-gui/src/app/pages/verify.rs`, `crates/pdfs-gui/src/app/pages/login.rs`
**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
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`.
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
catch that.
**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
status no longer ends the sign-in: the app offers the page in the user's own browser, as Proton
Mail Bridge does. The tab cannot post the token back, so the user says when they are done, and the
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.
status ends the sign-in with a message that says the page could not be opened. TROUBLESHOOTING.md
gives the cause and a one-time workaround. The sandbox is not switched off by the app: users choose
a hardened system for that isolation.
**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`, `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.
`a_token_counts_even_if_the_window_died_after_it` and `the_token_is_found_among_other_output`.
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.
@@ -4831,6 +4914,10 @@ subdirectory holding a file, asserting the error names the subtree),
strictness must not cost a working pass, so a healthy tree still reports every entry and still
skips symlinks by design.
B196 later relaxed this: a path the user may not read, an entry that vanishes mid-scan and a name
that is not UTF-8 are left out of the pass instead of failing it, and the pass drops everything
under them from classification, so the B55 guarantee holds without the wedge.
Not covered: transient I/O errors, and an entry that disappears between `read_dir` and `stat`.
Both are races that would need a filesystem shim to force; the code path they take is the same
`symlink_metadata` failure the permission test drives.
+19 -4
View File
@@ -12,10 +12,25 @@ scratch (user data in `staging/` and `recovery/` is never touched by this).
## [Unreleased]
### Fixed
- **A CAPTCHA could not be solved on hardened systems.** When the verification page cannot open in
the app, as on secureblue, the app now offers it in your browser and continues the sign-in
once you are done. `pdfs login` now handles a CAPTCHA the same way instead of failing.
([#29](https://github.com/narrrl/proton-drive-linux/issues/29))
- **One unreadable folder stopped a synced folder from syncing at all.** A folder you may not
read, such as a cache a container created, failed every pass, so nothing else in the synced
folder reached Drive. Such a folder is now left out and named once in the activity feed, and
everything around it syncs. A file deleted during a scan, and a name that is not UTF-8, no
longer fail the pass either.
([#33](https://github.com/narrrl/proton-drive-linux/issues/33))
- **Switching a folder to online-only could delete files that were never on Drive.** Ignored
folders such as `.git/`, symlinks, unreadable folders and files changed after the last sync were
deleted with the local copy. The switch now refuses and names what is only on this computer.
- **Switching to online-only trashed synced files that had become ignored.** Adding a synced path
to `.pdfsignore` and then switching moved it to the Drive trash. Ignoring never deletes now, as
the user guide says.
### Added
- **Move another computer's backup to this one.** **Move to This Computer…** on the Computers page,
or `pdfs devices migrate UID`, moves every folder another computer backs up, for example an old
Windows PC, into this computer's backup on Proton Drive. Then it offers them for syncing here. The
folders move on Proton Drive itself, so nothing is uploaded again. The other computer stays in the
account, without those folders.
## [3.1.2] — 2026-10-08
+1
View File
@@ -103,6 +103,7 @@ commands are for scripts and for cases where the mount is not available.
| `pdfs devices rename UID NAME` | Rename a computer. |
| `pdfs devices rm UID` | Remove a computer and its backup from the account. |
| `pdfs devices adopt UID` | Make this machine continue another computer's backup, for example after a reinstall. `--clear` returns to matching by hostname. |
| `pdfs devices migrate UID [--yes]` | Move another computer's folders into this computer's backup, then restore them here like `pdfs sync restore`. The other computer stays registered, without those folders. `--yes` skips the confirmation and accepts every proposed path. See [RECOVERY.md](RECOVERY.md). |
## Trash
+23
View File
@@ -133,6 +133,29 @@ pdfs sync restore --device UID
The folders stay part of the other computer's backup and sync in both directions. This machine
does not take over that computer's backup.
### Moving another computer's backup here
To switch computers for good, for example from a Windows PC to this Linux machine, move the old
computer's folders into this computer's backup instead. Use **Move to This Computer…** on that
computer's row, or:
```bash
pdfs devices list # find the old computer's UID
pdfs devices migrate UID
```
Each folder moves on Proton Drive itself, so nothing is uploaded again and no storage is used
twice. A folder whose name this computer already uses gets the old computer's name added, for
example `Documents (DESKTOP-1)`. The restore picker then opens, as in
[Step 3](#step-3-restore-the-folders), so you choose where each folder goes here.
The old computer stays in your account, without those folders. Unlike
[adoption](#step-2-continue-the-old-computers-backup), this machine keeps its own name and backup.
> [!WARNING]
> Stop Proton Drive on the old computer first. A client still running there sees its folders
> disappear, and may upload them again as new.
## 3. How the restore works
This section is for the curious and for anyone debugging a restore.
+7 -9
View File
@@ -69,16 +69,14 @@ pdfs status
## Signing in
**"Proton is asking for a CAPTCHA"** — Proton wants human verification, usually on a VPN or an
unfamiliar network. `pdfs login` prints the verification page's address: open it in your browser,
complete it, then press Enter. The app shows the page in its own window.
unfamiliar network. The CLI cannot show it. Sign in with `pdfs-app`, which displays the challenge;
the stored session then works for the CLI too.
**"Verify in Your Browser"** — WebKit, which shows the CAPTCHA page in the app, could not start
its sandbox. Hardened systems such as secureblue keep its bubblewrap from the journal socket, and
the log then shows `bwrap: Can't get type of source /run/systemd/journal/socket: Permission
denied` and `Failed to fully launch dbus-proxy`. Choose **Open Verification Page**, complete the
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:
**"The verification page couldn't be opened"** — WebKit, which shows the CAPTCHA page, could not
start its sandbox. Hardened systems such as secureblue keep its bubblewrap from the journal socket,
and 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
installed. If they are, sign in once with the sandbox switched off for this one run:
```bash
WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1 pdfs-app
+9 -1
View File
@@ -96,7 +96,9 @@ app and in the web app.
Each synced folder can also be switched to **Online only**. The local copy is replaced by a mount
of the folder, so the files stay visible but take no disk space until opened. Switch with the
**Synced / Online only** switch on the folder's card, or `pdfs sync mode <id> ondemand` and back
with `pdfs sync mode <id> mirror`. `pdfs locations` lists every local place the service occupies.
with `pdfs sync mode <id> mirror`. The switch waits until everything in the folder is on Proton
Drive, and refuses while the folder holds something that never goes there: an ignored path such
as `.git/`, a symlink, or a folder you may not read. The message names it. `pdfs locations` lists every local place the service occupies.
### Moving between synced folders and My files
@@ -146,6 +148,9 @@ places, and both apply:
Rules are re-read on every pass. Ignoring never deletes anything: a file that becomes ignored is
simply no longer tracked, and its copy on Proton Drive stays.
A folder you may not read, such as a cache a container created as root, is skipped the same way,
and the activity feed names it once. Add it to `.pdfsignore` to stop that message.
## Changes waiting for Proton Drive
A change you made in the Proton Drive folder exists only on this computer until it reaches
@@ -278,6 +283,9 @@ Proton Drive keeps earlier versions of every file. **Details → Versions…** i
**Restore to This Computer…** downloads its folders here.
- **Continue This Backup Here…** makes this computer take over another computer's backup, for
example after reinstalling or replacing a machine. See [RECOVERY.md](RECOVERY.md).
- **Move to This Computer…** moves another computer's folders into this computer's backup, for
example when you switch from Windows to Linux, and then offers them for syncing here. The other
computer stays in the list, without those folders.
## Search launcher
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux-bin
pkgdesc = Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (binaries)
pkgver = 3.1.1
pkgver = 3.1.2
pkgrel = 1
url = https://proton-drive.narl.io
arch = x86_64
@@ -21,21 +21,21 @@ pkgbase = proton-drive-for-linux-bin
optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding
provides = proton-drive-for-linux=3.1.1
provides = proton-drive-linux=3.1.1
provides = proton-drive-for-linux=3.1.2
provides = proton-drive-linux=3.1.2
provides = pdfs
conflicts = proton-drive-linux
conflicts = proton-drive-for-linux
conflicts = proton-drive-for-linux-git
options = !strip
options = !debug
source = proton-drive-linux-3.1.1-x86_64.tar.gz::https://github.com/narrrl/proton-drive-linux/releases/download/v3.1.1/proton-drive-linux-3.1.1-x86_64.tar.gz
source = io.narl.proton-drive-linux-3.1.1.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux.desktop
source = io.narl.proton-drive-linux-tray-3.1.1.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux-tray.desktop
source = io.narl.proton-drive-linux-3.1.1.svg::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/io.narl.proton-drive-linux.svg
source = proton-drive-3.1.1.service::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/packaging/proton-drive.service
source = LICENSE-3.1.1::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.1/LICENSE
sha256sums = e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6
source = proton-drive-linux-3.1.2-x86_64.tar.gz::https://github.com/narrrl/proton-drive-linux/releases/download/v3.1.2/proton-drive-linux-3.1.2-x86_64.tar.gz
source = io.narl.proton-drive-linux-3.1.2.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/io.narl.proton-drive-linux.desktop
source = io.narl.proton-drive-linux-tray-3.1.2.desktop::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/io.narl.proton-drive-linux-tray.desktop
source = io.narl.proton-drive-linux-3.1.2.svg::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/io.narl.proton-drive-linux.svg
source = proton-drive-3.1.2.service::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/packaging/proton-drive.service
source = LICENSE-3.1.2::https://raw.githubusercontent.com/narrrl/proton-drive-linux/v3.1.2/LICENSE
sha256sums = 71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7
sha256sums = d190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123
sha256sums = 1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0
sha256sums = e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux-bin
pkgver=3.1.1
pkgver=3.1.2
pkgrel=1
pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (binaries)"
arch=('x86_64')
@@ -34,7 +34,7 @@ source=("proton-drive-linux-$pkgver-x86_64.tar.gz::$_repo/releases/download/$_ta
"io.narl.proton-drive-linux-$pkgver.svg::$_raw/packaging/io.narl.proton-drive-linux.svg"
"proton-drive-$pkgver.service::$_raw/packaging/proton-drive.service"
"LICENSE-$pkgver::$_raw/LICENSE")
sha256sums=('e8a2ca20dc5a4b050a85056196eb7f3f4a428db2a8d41aa09b813e007609c0b6'
sha256sums=('71fc50775cbd795717ed17c4a3994d8fdfb5ab30a223dcbc7f0e313f9ab615f7'
'd190d6771fff0b975271fb62fd3fb0fa8bbf17d7278c10853c18557855b0c123'
'1d95e250370220e3bb6aead6ce34d1d6cc759f42c4803b75f1667e78ff47c6c0'
'e598a93c2715c3a9fdc7fb937902083d4a1135e8fbdfe6fe7e37f0383ebbd828'
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux-git
pkgdesc = Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (git)
pkgver = 3.1.1.r0.gedd62c5
pkgver = 3.1.2.r0.g07c9b67
pkgrel = 1
url = https://proton-drive.narl.io
arch = x86_64
@@ -24,8 +24,8 @@ pkgbase = proton-drive-for-linux-git
optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding
provides = proton-drive-for-linux=3.1.1.r0.gedd62c5
provides = proton-drive-linux=3.1.1.r0.gedd62c5
provides = proton-drive-for-linux=3.1.2.r0.g07c9b67
provides = proton-drive-linux=3.1.2.r0.g07c9b67
provides = pdfs
conflicts = proton-drive-linux
conflicts = proton-drive-for-linux
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux-git
pkgver=3.1.1.r0.gedd62c5
pkgver=3.1.2.r0.g07c9b67
pkgrel=1
pkgdesc="Unofficial Proton Drive client: FUSE files-on-demand mount, CLI, GTK4 app, tray (git)"
arch=('x86_64')
@@ -1,6 +1,6 @@
pkgbase = proton-drive-for-linux
pkgdesc = Unofficial Proton Drive client: files-on-demand FUSE mount, CLI, GTK4 app and tray
pkgver = 3.1.1
pkgver = 3.1.2
pkgrel = 1
url = https://proton-drive.narl.io
arch = x86_64
@@ -23,13 +23,13 @@ pkgbase = proton-drive-for-linux
optdepends = xdg-utils: "Open folder" action in the tray menu
optdepends = fzf: search-as-you-type launcher (pdfs-prompt --fzf)
optdepends = foot: terminal that hosts pdfs-prompt --fzf when started from a keybinding
provides = proton-drive-linux=3.1.1
provides = proton-drive-linux=3.1.2
provides = pdfs
conflicts = proton-drive-linux
conflicts = proton-drive-for-linux-bin
conflicts = proton-drive-for-linux-git
options = !lto
source = proton-drive-for-linux-3.1.1.tar.gz::https://github.com/narrrl/proton-drive-linux/archive/refs/tags/v3.1.1.tar.gz
sha256sums = c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256
source = proton-drive-for-linux-3.1.2.tar.gz::https://github.com/narrrl/proton-drive-linux/archive/refs/tags/v3.1.2.tar.gz
sha256sums = 260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1
pkgname = proton-drive-for-linux
@@ -1,7 +1,7 @@
# Maintainer: Nils Pukropp <contact@narl.io>
pkgname=proton-drive-for-linux
pkgver=3.1.1
pkgver=3.1.2
pkgrel=1
pkgdesc="Unofficial Proton Drive client: files-on-demand FUSE mount, CLI, GTK4 app and tray"
arch=('x86_64')
@@ -24,7 +24,7 @@ conflicts=('proton-drive-linux' 'proton-drive-for-linux-bin' 'proton-drive-for-l
# LTO has broken GTK/Rust links for this workspace; the release profile keeps it off.
options=('!lto')
source=("$pkgname-$pkgver.tar.gz::$_repo/archive/refs/tags/v$pkgver.tar.gz")
sha256sums=('c16019c75959d5056c8ae486e0a4dc1f6346828ea93f346dfeae7da717629256')
sha256sums=('260ed05c8b041cf38c5904f7543780de0d0cb06d9695a427a98250d2a9ec0eb1')
_srcname="proton-drive-linux-$pkgver"
+154 -138
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: German\n"
@@ -90,7 +90,7 @@ msgstr "Von mir geteilt"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computer"
@@ -266,18 +266,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -317,7 +317,7 @@ msgstr "Drive durchsuchen"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -359,7 +359,7 @@ msgstr "Raster / Liste"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Umbenennen"
@@ -687,7 +687,7 @@ msgid "Couldn't add a sync folder"
msgstr "Synchronisierungsordner konnte nicht hinzugefügt werden"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Ordner konnten nicht wiederhergestellt werden"
@@ -1267,10 +1267,11 @@ msgstr "Alben konnten nicht geladen werden"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1302,7 +1303,7 @@ msgstr "Der Proton-Drive-Dienst hat nicht geantwortet."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1316,7 +1317,7 @@ msgstr "Öffnen"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Umbenennen …"
@@ -1584,7 +1585,7 @@ msgstr "Symbolgröße"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1742,7 +1743,7 @@ msgid "New Folder…"
msgstr "Neuer Ordner …"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1887,7 +1888,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Neuer Name"
@@ -1917,6 +1918,7 @@ msgid "Choose the folder to move into."
msgstr "Den Zielordner auswählen."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Hierher verschieben"
@@ -2148,99 +2150,103 @@ msgstr "Dateien durchsuchen"
msgid "Restore to This Computer…"
msgstr "Auf diesem Computer wiederherstellen …"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Auf diesen Computer verschieben …"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Diese Sicherung hier fortsetzen …"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Entfernen …"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · letzte Sicherung {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · noch keine Sicherungen"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Noch keine Ordner gesichert"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} Ordner gesichert"
msgstr[1] "{n} Ordner gesichert"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} erfordert Aufmerksamkeit"
msgstr[1] "{folders} · {n} erfordern Aufmerksamkeit"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "wird synchronisiert …"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "Synchronisierungsfehler"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "erfordert Aufmerksamkeit"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "aktuell"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "wird auf Änderungen geprüft …"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "wird auf Änderungen geprüft – {done} von {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "{done} von {total} wird synchronisiert"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "{file} wird synchronisiert – {done} von {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Ordner zur Synchronisierung hinzufügen"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Ordner wird synchronisiert …"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Ordner konnte nicht hinzugefügt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Wiederherstellbare Ordner konnten nicht aufgelistet werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2248,19 +2254,19 @@ msgstr ""
"Die Ordner ankreuzen, die mit diesem Rechner synchronisiert werden sollen, "
"und für jeden den Speicherort anpassen."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Ordner wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Wiederherstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Ordner werden wiederhergestellt …"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2269,37 +2275,37 @@ msgstr ""
"Diese Ordner werden von „{name}“ gesichert. Wiederhergestellte Ordner werden "
"weiterhin mit der Kopie dieses Computers synchronisiert."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Diese Ordner werden in Proton Drive unter diesem Computer gesichert."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nichts wiederherzustellen – alle Ordner von „{name}“ werden bereits hier "
"synchronisiert."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nichts wiederherzustellen – alle Ordner dieses Computers werden bereits hier "
"synchronisiert."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Ordner wird auf „Nur online“ umgestellt"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Ordner wird heruntergeladen und bleibt synchronisiert"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Modus konnte nicht geändert werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2317,7 +2323,7 @@ msgstr ""
"Ordner auf „Synchronisiert“ umstellen und vor dem Entfernen warten, bis der "
"Download abgeschlossen ist."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2331,68 +2337,68 @@ msgstr ""
"mehr synchronisiert. Es kann zusätzlich ausgewählt werden, die Kopie in "
"Proton Drive zu löschen."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Synchronisierung des Ordners beenden?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Auch aus Proton Drive löschen"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Löscht die einzige Kopie dieser Dateien."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "Die lokale Kopie bleibt unverändert."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Synchronisierung beenden"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Synchronisierung des Ordners beendet"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Synchronisierung des Ordners konnte nicht beendet werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Computer umbenennen"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "„{name}“ umbenennen."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Der Computer konnte nicht umbenannt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Ein Name ist erforderlich."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer umbenannt"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Zur Bestätigung „{name}“ eingeben"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Computer entfernen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2407,25 +2413,25 @@ msgstr ""
"gelöscht. Die Dateien auf dem Computer selbst bleiben unberührt – dies kann "
"jedoch von hier aus nicht rückgängig gemacht werden."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Entfernen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer entfernt"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Der Computer konnte nicht entfernt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Diese Sicherung hier fortsetzen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2444,20 +2450,50 @@ msgstr ""
"werden nicht verschoben. Mit „Auf diesem Computer wiederherstellen“ lässt "
"sich danach zurückholen, was „{name}“ synchronisiert hat."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Hier fortsetzen"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Sicherung jetzt als „{name}“"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Diese Sicherung konnte hier nicht fortgesetzt werden"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Sicherung auf diesen Computer verschieben?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Die von „{name}“ gesicherten Ordner werden in Proton Drive in die Sicherung "
"dieses Computers verschoben, und Sie wählen, wo sie auf diesem Computer "
"liegen. „{name}“ bleibt in Ihrem Konto, ohne diese Ordner.\n"
"\n"
"Beenden Sie Proton Drive zuerst auf „{name}“. Sonst sieht es seine Ordner "
"verschwinden."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Sicherung von „{name}“ verschoben"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Diese Sicherung konnte nicht verschoben werden"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3202,25 +3238,36 @@ msgstr "E-Mail-Adresse und Passwort eingeben."
msgid "Signing in…"
msgstr "Anmeldung läuft …"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Zum Fortfahren die Überprüfung abschließen …"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "Anmeldung abgebrochen"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr "Zu viele Anmeldeversuche. Einige Minuten warten und erneut versuchen."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"Proton ist nicht erreichbar. Bitte die Internetverbindung prüfen und erneut "
"versuchen."
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3229,19 +3276,19 @@ msgstr ""
"gespeichert werden. Bitte sicherstellen, dass ein Schlüsselbund (GNOME "
"Keyring oder KWallet) läuft und entsperrt ist."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Anmeldung abgebrochen: Es wurde kein Zwei-Faktor-Code eingegeben."
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Anmeldung abgebrochen: Es wurde kein Postfach-Passwort eingegeben."
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr "Das Postfach-Passwort hat Ihr Konto nicht entsperrt."
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3250,36 +3297,36 @@ msgstr ""
"neue Überprüfung erneut anmelden."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Anmeldung fehlgeschlagen: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
"Das Postfach-Passwort hat Ihr Konto nicht entsperrt. Versuchen Sie es erneut."
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"Dieses Konto hat ein separates Postfach-Passwort. Geben Sie es ein, um Ihre "
"Dateien zu entsperren."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Postfach-Passwort"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr "Postfach-Passwort"
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr "Auf diesem Computer entsperrt lassen"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3288,70 +3335,49 @@ msgstr ""
"nach jeder Anmeldung ohne Nachfrage öffnet. Andernfalls geben Sie das "
"Passwort einmal pro Sitzung ein."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Entsperren"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
"Proton Drive ist gesperrt. Geben Sie Ihr Postfach-Passwort ein, um es zu "
"entsperren."
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Entsperrt."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "Entsperren fehlgeschlagen"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Zwei-Faktor-Authentifizierung"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Den Code aus der Authentifizierungs-App oder einen der "
"Wiederherstellungscodes eingeben."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Authentifizierungscode"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Bestätigen"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "Abmelden?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3360,7 +3386,7 @@ msgstr ""
"nächsten Anmeldung. Dateien, die sich bereits auf diesem Computer befinden, "
"bleiben, wo sie sind."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Abmelden"
@@ -6147,16 +6173,6 @@ msgstr "{count} J."
msgid "cannot reach the Proton Drive daemon: {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"
#~ msgstr "Zu einem Monat springen"
+152 -137
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: English (United Kingdom)\n"
@@ -90,7 +90,7 @@ msgstr "Shared by me"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computers"
@@ -262,18 +262,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -313,7 +313,7 @@ msgstr "Search Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -355,7 +355,7 @@ msgstr "Grid / list"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Rename"
@@ -679,7 +679,7 @@ msgid "Couldn't add a sync folder"
msgstr "Couldn't add a sync folder"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Couldn't restore folders"
@@ -1255,10 +1255,11 @@ msgstr "Couldn't load albums"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1290,7 +1291,7 @@ msgstr "The Proton Drive service didn't respond."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1304,7 +1305,7 @@ msgstr "Open"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Rename…"
@@ -1572,7 +1573,7 @@ msgstr "Icon size"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1726,7 +1727,7 @@ msgid "New Folder…"
msgstr "New Folder…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1868,7 +1869,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "New name"
@@ -1898,6 +1899,7 @@ msgid "Choose the folder to move into."
msgstr "Choose the folder to move into."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Move Here"
@@ -2125,99 +2127,103 @@ msgstr "Browse Files"
msgid "Restore to This Computer…"
msgstr "Restore to This Computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Move to This Computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continue This Backup Here…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Remove…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · last backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · no backups yet"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "No folders backed up yet"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} folder backed up"
msgstr[1] "{n} folders backed up"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} needs attention"
msgstr[1] "{folders} · {n} need attention"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "syncing…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "sync error"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "needs attention"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "up to date"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "checking for changes…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "checking for changes — {done} of {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "syncing {done} of {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "syncing {file} — {done} of {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Add Folder to Sync"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Syncing folder…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Couldn't add folder"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Couldn't list folders to restore"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2225,19 +2231,19 @@ msgstr ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restore Folders"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restore"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restoring folders…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2246,33 +2252,33 @@ msgstr ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
"with that computer's copy."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "These folders are backed up under this computer in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr "Nothing to restore — “{name}”'s folders are all synced here."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr "Nothing to restore — this computer's folders are all synced here."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Folder will switch to online only"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Folder will download and stay synced"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Couldn't change mode"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2289,7 +2295,7 @@ msgstr ""
"copy, cancel, switch the folder to Synced, and wait for the download to "
"finish before removing it."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2302,68 +2308,68 @@ msgstr ""
"The local files stay on this disk and simply stop being synced. Choose "
"whether to also delete the copy in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Stop Syncing Folder?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Also delete from Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Deletes the only copy of these files."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "The local copy is unaffected."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Stop Syncing"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Stopped syncing folder"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Couldn't stop syncing the folder"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Rename Computer"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Rename “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Couldn't rename the computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "A name is required."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer renamed"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Type “{name}” to confirm"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Remove Computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2378,25 +2384,25 @@ msgstr ""
"on that computer itself are not touched — but this cannot be undone from "
"here."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Remove"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer removed"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Couldn't remove the computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continue This Backup Here?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2415,20 +2421,49 @@ msgstr ""
"“Restore to This Computer” afterwards to bring back what “{name}” was "
"syncing."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continue Here"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Now backing up as “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Couldn't continue that backup here"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Move Backup to This Computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Moved the backup of “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Couldn't move that backup"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3151,23 +3186,33 @@ msgstr "Enter your email and password."
msgid "Signing in…"
msgstr "Signing in…"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Complete the verification to continue…"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "login cancelled"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr "Too many sign-in attempts. Wait a few minutes and try again."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "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:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3175,19 +3220,19 @@ msgstr ""
"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."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "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:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "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:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "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:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3196,34 +3241,34 @@ msgstr ""
"new one."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Sign-in failed: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "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:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"This account has a separate mailbox password. Enter it to unlock your files."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Mailbox Password"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr "Mailbox password"
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr "Keep unlocked on this computer"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3231,67 +3276,46 @@ msgstr ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Unlock"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "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:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Unlocked."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "Couldn't unlock"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Two-Factor Authentication"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Enter the code from your authenticator app, or one of your recovery codes."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Authentication code"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Confirm"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "Sign Out?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3299,7 +3323,7 @@ msgstr ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Sign Out"
@@ -6032,15 +6056,6 @@ msgstr "{count}y"
msgid "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"
#~ msgstr "Jump to a month"
+153 -138
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Spanish\n"
@@ -90,7 +90,7 @@ msgstr "Compartido por mí"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Equipos"
@@ -264,18 +264,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -315,7 +315,7 @@ msgstr "Buscar en Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -357,7 +357,7 @@ msgstr "Cuadrícula / lista"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Renombrar"
@@ -684,7 +684,7 @@ msgid "Couldn't add a sync folder"
msgstr "No se pudo añadir una carpeta sincronizada"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "No se pudieron restaurar las carpetas"
@@ -1261,10 +1261,11 @@ msgstr "No se pudieron cargar los álbumes"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1296,7 +1297,7 @@ msgstr "El servicio de Proton Drive no respondió."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1310,7 +1311,7 @@ msgstr "Abrir"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Renombrar…"
@@ -1578,7 +1579,7 @@ msgstr "Tamaño de los iconos"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1733,7 +1734,7 @@ msgid "New Folder…"
msgstr "Carpeta nueva…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1879,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nombre nuevo"
@@ -1909,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Elija la carpeta de destino."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Mover aquí"
@@ -2137,99 +2139,103 @@ msgstr "Examinar archivos"
msgid "Restore to This Computer…"
msgstr "Restaurar en este equipo…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Mover a este equipo…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continuar esta copia de seguridad aquí…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Quitar…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · última copia de seguridad {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · aún no hay copias de seguridad"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Aún no hay carpetas con copia de seguridad"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} carpeta con copia de seguridad"
msgstr[1] "{n} carpetas con copia de seguridad"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requiere atención"
msgstr[1] "{folders} · {n} requieren atención"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "error de sincronización"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "requiere atención"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "actualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "buscando cambios…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "buscando cambios: {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "sincronizando {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "sincronizando {file}: {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Añadir carpeta para sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Sincronizando la carpeta…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "No se pudo añadir la carpeta"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "No se pudieron listar las carpetas para restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2237,19 +2243,19 @@ msgstr ""
"Marque las carpetas que sincronizar con esta máquina y ajuste dónde debe "
"estar cada una."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restaurar carpetas"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restaurando carpetas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2258,36 +2264,36 @@ msgstr ""
"Estas carpetas tienen copia de seguridad desde “{name}”. Las carpetas "
"restauradas siguen sincronizándose con la copia de ese equipo."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
"Estas carpetas tienen copia de seguridad bajo este equipo en Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nada que restaurar: todas las carpetas de “{name}” ya se sincronizan aquí."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nada que restaurar: todas las carpetas de este equipo ya se sincronizan aquí."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "La carpeta pasará a solo en línea"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "La carpeta se descargará y permanecerá sincronizada"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "No se pudo cambiar el modo"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2304,7 +2310,7 @@ msgstr ""
"Para conservar una copia local, cancele, cambie la carpeta a Sincronizada y "
"espere a que termine la descarga antes de quitarla."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2317,68 +2323,68 @@ msgstr ""
"Los archivos locales permanecen en este disco y simplemente dejan de "
"sincronizarse. Elija si quiere eliminar también la copia en Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "¿Dejar de sincronizar la carpeta?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Eliminar también de Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Elimina la única copia de estos archivos."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "La copia local no se ve afectada."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Dejar de sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Se dejó de sincronizar la carpeta"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "No se pudo dejar de sincronizar la carpeta"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Renombrar equipo"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Renombrar “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "No se pudo renombrar el equipo"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Se necesita un nombre."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Equipo renombrado"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Escriba “{name}” para confirmar"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "¿Quitar el equipo?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2392,25 +2398,25 @@ msgstr ""
"Todo lo que respaldó en Proton Drive se eliminará con él. Los archivos de "
"ese equipo no se tocan, pero esto no se puede deshacer desde aquí."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Quitar"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Equipo quitado"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "No se pudo quitar el equipo"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "¿Continuar esta copia de seguridad aquí?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2429,20 +2435,50 @@ msgstr ""
"no se mueven. Después, use “Restaurar en este equipo” para recuperar lo que "
"“{name}” sincronizaba."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continuar aquí"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Ahora se hace copia de seguridad como “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "No se pudo continuar esa copia de seguridad aquí"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "¿Mover la copia de seguridad a este equipo?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Las carpetas de las que “{name}” hace copia de seguridad pasan a la copia de "
"seguridad de este equipo en Proton Drive, y tú eliges dónde van en este "
"equipo. “{name}” sigue en tu cuenta, sin esas carpetas.\n"
"\n"
"Cierra primero Proton Drive en “{name}”. Si no, verá desaparecer sus "
"carpetas."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Se movió la copia de seguridad de “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "No se pudo mover esa copia de seguridad"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3176,27 +3212,37 @@ msgstr "Introduzca su correo electrónico y su contraseña."
msgid "Signing in…"
msgstr "Iniciando sesión…"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Complete la verificación para continuar…"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "inicio de sesión cancelado"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr ""
"Demasiados intentos de inicio de sesión. Espere unos minutos e inténtelo de "
"nuevo."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"No se pudo contactar con Proton. Compruebe su conexión a Internet e "
"inténtelo de nuevo."
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3205,20 +3251,20 @@ msgstr ""
"sistema. Asegúrese de que un depósito de claves (GNOME Keyring o KWallet) "
"esté en ejecución y desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr ""
"Inicio de sesión cancelado: no se introdujo ningún código de dos factores."
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Inicio de sesión cancelado: no se introdujo la contraseña del buzón."
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr "Esa contraseña del buzón no desbloqueó tu cuenta."
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3227,35 +3273,35 @@ msgstr ""
"sesión para obtener una nueva."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Falló el inicio de sesión: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
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."
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"Esta cuenta tiene una contraseña del buzón independiente. Introdúcela para "
"desbloquear tus archivos."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Contraseña del buzón"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr "Contraseña del buzón"
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr "Mantener desbloqueado en este equipo"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3264,70 +3310,49 @@ msgstr ""
"abra sin preguntar después de cada inicio de sesión. De lo contrario, "
"introduces la contraseña una vez por sesión."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
"Proton Drive está bloqueado. Introduce la contraseña del buzón para "
"desbloquearlo."
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "No se pudo desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Autenticación en dos pasos"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Introduzca el código de su aplicación de autenticación o uno de sus códigos "
"de recuperación."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Código de autenticación"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Confirmar"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "¿Cerrar la sesión?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3336,7 +3361,7 @@ msgstr ""
"iniciar sesión. Los archivos que ya están en este equipo se quedan donde "
"están."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Cerrar la sesión"
@@ -6106,16 +6131,6 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {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"
#~ msgstr "Saltar a un mes"
+153 -137
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: French\n"
@@ -90,7 +90,7 @@ msgstr "Partagés par moi"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Ordinateurs"
@@ -266,18 +266,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -317,7 +317,7 @@ msgstr "Rechercher dans Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -359,7 +359,7 @@ msgstr "Grille / liste"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Renommer"
@@ -687,7 +687,7 @@ msgid "Couldn't add a sync folder"
msgstr "Impossible d’ajouter un dossier synchronisé"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Impossible de restaurer les dossiers"
@@ -1272,10 +1272,11 @@ msgstr "Impossible de charger les albums"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1307,7 +1308,7 @@ msgstr "Le service Proton Drive n’a pas répondu."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1321,7 +1322,7 @@ msgstr "Ouvrir"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Renommer…"
@@ -1589,7 +1590,7 @@ msgstr "Taille des icônes"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1745,7 +1746,7 @@ msgid "New Folder…"
msgstr "Nouveau dossier…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1891,7 +1892,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nouveau nom"
@@ -1921,6 +1922,7 @@ msgid "Choose the folder to move into."
msgstr "Choisissez le dossier de destination."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Déplacer ici"
@@ -2150,99 +2152,103 @@ msgstr "Parcourir les fichiers"
msgid "Restore to This Computer…"
msgstr "Restaurer sur cet ordinateur…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Déplacer vers cet ordinateur…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continuer cette sauvegarde ici…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Retirer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · dernière sauvegarde {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · aucune sauvegarde pour l’instant"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Aucun dossier sauvegardé pour l’instant"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} dossier sauvegardé"
msgstr[1] "{n} dossiers sauvegardés"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requiert votre attention"
msgstr[1] "{folders} · {n} requièrent votre attention"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "synchronisation…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "erreur de synchronisation"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "attention requise"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "à jour"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "recherche de modifications…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "recherche de modifications — {done} sur {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "synchronisation de {done} sur {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "synchronisation de {file} — {done} sur {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Ajouter un dossier à synchroniser"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Synchronisation du dossier…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Impossible d’ajouter le dossier"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Impossible de lister les dossiers à restaurer"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2250,19 +2256,19 @@ msgstr ""
"Cochez les dossiers à synchroniser sur cette machine et ajustez "
"l’emplacement de chacun."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restaurer les dossiers"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restaurer"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restauration des dossiers…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2271,35 +2277,35 @@ msgstr ""
"Ces dossiers sont sauvegardés depuis « {name} ». Les dossiers restaurés "
"restent synchronisés avec la copie de cet ordinateur."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Ces dossiers sont sauvegardés sous cet ordinateur dans Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Rien à restaurer — les dossiers de « {name} » sont tous synchronisés ici."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Rien à restaurer — les dossiers de cet ordinateur sont tous synchronisés ici."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Le dossier passera en ligne uniquement"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Le dossier va être téléchargé et rester synchronisé"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Impossible de changer de mode"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2316,7 +2322,7 @@ msgstr ""
"arrêtée. Pour conserver une copie locale, annulez, passez le dossier en "
"« Synchronisé » et attendez la fin du téléchargement avant de le retirer."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2330,68 +2336,68 @@ msgstr ""
"synchronisés. Choisissez s’il faut aussi supprimer la copie dans Proton "
"Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Arrêter la synchronisation du dossier ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Supprimer aussi de Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Supprime l’unique copie de ces fichiers."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "La copie locale n’est pas affectée."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Arrêter la synchronisation"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Synchronisation du dossier arrêtée"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Impossible d’arrêter la synchronisation du dossier"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Renommer l’ordinateur"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Renommer « {name} »."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Impossible de renommer l’ordinateur"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Un nom est requis."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Ordinateur renommé"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Saisissez « {name} » pour confirmer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Retirer l’ordinateur ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2406,25 +2412,25 @@ msgstr ""
"fichiers présents sur cet ordinateur ne sont pas touchés — mais cette action "
"ne peut pas être annulée d’ici."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Retirer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Ordinateur retiré"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Impossible de retirer l’ordinateur"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continuer cette sauvegarde ici ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2443,20 +2449,50 @@ msgstr ""
"ne sont pas déplacés. Utilisez ensuite « Restaurer sur cet ordinateur » pour "
"récupérer ce que « {name} » synchronisait."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continuer ici"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Sauvegarde désormais en tant que « {name} »"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Impossible de continuer cette sauvegarde ici"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Déplacer la sauvegarde vers cet ordinateur ?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Les dossiers sauvegardés par « {name} » passent dans la sauvegarde de cet "
"ordinateur dans Proton Drive, et vous choisissez où les placer sur cet "
"ordinateur. « {name} » reste dans votre compte, sans ces dossiers.\n"
"\n"
"Arrêtez d'abord Proton Drive sur « {name} ». Sinon, il verra ses dossiers "
"disparaître."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Sauvegarde de « {name} » déplacée"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Impossible de déplacer cette sauvegarde"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3202,25 +3238,35 @@ msgstr "Saisissez votre adresse électronique et votre mot de passe."
msgid "Signing in…"
msgstr "Connexion…"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Terminez la vérification pour continuer…"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "connexion annulée"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr ""
"Trop de tentatives de connexion. Patientez quelques minutes et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"Impossible de joindre Proton. Vérifiez votre connexion Internet et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3229,21 +3275,21 @@ msgstr ""
"système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en "
"cours d’exécution et déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi."
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr ""
"Connexion annulée : aucun mot de passe de boîte aux lettres n’a été saisi."
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr ""
"Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte."
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3252,37 +3298,37 @@ msgstr ""
"pour en obtenir une nouvelle."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Échec de la connexion : {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
"Ce mot de passe de boîte aux lettres n’a pas déverrouillé votre compte. "
"Réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"Ce compte a un mot de passe de boîte aux lettres distinct. Saisissez-le pour "
"déverrouiller vos fichiers."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Mot de passe de la boîte aux lettres"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
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:384
msgid "Keep unlocked on this computer"
msgstr "Garder déverrouillé sur cet ordinateur"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3291,70 +3337,49 @@ msgstr ""
"Proton Drive s’ouvre sans demande après chaque connexion. Sinon, vous "
"saisissez le mot de passe une fois par session."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
"Proton Drive est verrouillé. Saisissez votre mot de passe de boîte aux "
"lettres pour le déverrouiller."
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "Impossible de déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Authentification à deux facteurs"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Saisissez le code de votre application d’authentification ou l’un de vos "
"codes de récupération."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Code d’authentification"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Confirmer"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "Se déconnecter ?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3363,7 +3388,7 @@ msgstr ""
"vous vous reconnectiez. Les fichiers déjà présents sur cet ordinateur "
"restent en place."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Se déconnecter"
@@ -6151,15 +6176,6 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {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"
#~ msgstr "Aller à un mois"
+153 -137
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Italian\n"
@@ -90,7 +90,7 @@ msgstr "Condivisi da me"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computer"
@@ -262,18 +262,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -313,7 +313,7 @@ msgstr "Cerca in Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -355,7 +355,7 @@ msgstr "Griglia / elenco"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Rinomina"
@@ -683,7 +683,7 @@ msgid "Couldn't add a sync folder"
msgstr "Impossibile aggiungere una cartella sincronizzata"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Impossibile ripristinare le cartelle"
@@ -1266,10 +1266,11 @@ msgstr "Impossibile caricare gli album"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1301,7 +1302,7 @@ msgstr "Il servizio di Proton Drive non ha risposto."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1315,7 +1316,7 @@ msgstr "Apri"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Rinomina…"
@@ -1583,7 +1584,7 @@ msgstr "Dimensione icone"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1739,7 +1740,7 @@ msgid "New Folder…"
msgstr "Nuova cartella…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1885,7 +1886,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nuovo nome"
@@ -1915,6 +1916,7 @@ msgid "Choose the folder to move into."
msgstr "Scegli la cartella di destinazione."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Sposta qui"
@@ -2144,99 +2146,103 @@ msgstr "Sfoglia file"
msgid "Restore to This Computer…"
msgstr "Ripristina su questo computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Sposta su questo computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continua questo backup qui…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Rimuovi…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · ultimo backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · ancora nessun backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Ancora nessuna cartella sottoposta a backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} cartella sottoposta a backup"
msgstr[1] "{n} cartelle sottoposte a backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} richiede attenzione"
msgstr[1] "{folders} · {n} richiedono attenzione"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "sincronizzazione…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "errore di sincronizzazione"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "richiede attenzione"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "aggiornato"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "controllo delle modifiche…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "controllo delle modifiche: {done} di {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "sincronizzazione {done} di {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "sincronizzazione di {file}: {done} di {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Aggiungi cartella da sincronizzare"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Sincronizzazione della cartella…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Impossibile aggiungere la cartella"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Impossibile elencare le cartelle da ripristinare"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2244,19 +2250,19 @@ msgstr ""
"Seleziona le cartelle da sincronizzare su questa macchina e regola dove deve "
"trovarsi ciascuna."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Ripristina cartelle"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Ripristina"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Ripristino delle cartelle…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2265,39 +2271,39 @@ msgstr ""
"Queste cartelle sono sottoposte a backup da “{name}”. Le cartelle "
"ripristinate continuano a sincronizzarsi con la copia di quel computer."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
"Queste cartelle sono sottoposte a backup sotto questo computer in Proton "
"Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Niente da ripristinare: le cartelle di “{name}” sono già tutte sincronizzate "
"qui."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Niente da ripristinare: le cartelle di questo computer sono già tutte "
"sincronizzate qui."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "La cartella passerà a solo online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "La cartella verrà scaricata e resterà sincronizzata"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Impossibile cambiare modalità"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2315,7 +2321,7 @@ msgstr ""
"cartella a Sincronizzata e attendi il completamento del download prima di "
"rimuoverla."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2328,68 +2334,68 @@ msgstr ""
"I file locali restano su questo disco e semplicemente smettono di essere "
"sincronizzati. Scegli se eliminare anche la copia in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Interrompere la sincronizzazione della cartella?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Elimina anche da Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Elimina l'unica copia di questi file."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "La copia locale non viene modificata."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Interrompi sincronizzazione"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Sincronizzazione della cartella interrotta"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Impossibile interrompere la sincronizzazione della cartella"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Rinomina computer"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Rinomina “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Impossibile rinominare il computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "È richiesto un nome."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer rinominato"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Digita “{name}” per confermare"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Rimuovere il computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2404,25 +2410,25 @@ msgstr ""
"insieme a esso. I file su quel computer non vengono toccati, ma questa "
"operazione non può essere annullata da qui."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Rimuovi"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer rimosso"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Impossibile rimuovere il computer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continuare questo backup qui?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2441,20 +2447,50 @@ msgstr ""
"qui non vengono spostate. Usa poi “Ripristina su questo computer” per "
"recuperare ciò che “{name}” sincronizzava."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continua qui"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Ora il backup avviene come “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Impossibile continuare quel backup qui"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Spostare il backup su questo computer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Le cartelle di cui “{name}” esegue il backup passano nel backup di questo "
"computer su Proton Drive, e scegli tu dove metterle su questo computer. "
"“{name}” resta nel tuo account, senza quelle cartelle.\n"
"\n"
"Chiudi prima Proton Drive su “{name}”. Altrimenti vedrà sparire le sue "
"cartelle."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Backup di “{name}” spostato"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Impossibile spostare quel backup"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3194,25 +3230,35 @@ msgstr "Inserisci la tua email e la password."
msgid "Signing in…"
msgstr "Accesso in corso…"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Completa la verifica per continuare…"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "accesso annullato"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr "Troppi tentativi di accesso. Attendi qualche minuto e riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"Impossibile raggiungere Proton. Controlla la connessione a Internet e "
"riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3221,24 +3267,24 @@ msgstr ""
"portachiavi di sistema. Assicurati che un portachiavi (GNOME Keyring o "
"KWallet) sia in esecuzione e sbloccato."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr ""
"Accesso annullato: non è stato inserito alcun codice di autenticazione a due "
"fattori."
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr ""
"Accesso annullato: non è stata inserita alcuna password della casella di "
"posta."
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr ""
"Quella password della casella di posta non ha sbloccato il tuo account."
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3247,37 +3293,37 @@ msgstr ""
"riceverne una nuova."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Accesso non riuscito: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
"Quella password della casella di posta non ha sbloccato il tuo account. "
"Riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"Questo account ha una password della casella di posta separata. Inseriscila "
"per sbloccare i tuoi file."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Password della casella di posta"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr "Password della casella di posta"
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr "Mantieni sbloccato su questo computer"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3286,70 +3332,49 @@ msgstr ""
"chiedere dopo ogni accesso. Altrimenti inserisci la password una volta per "
"sessione."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Sblocca"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
"Proton Drive è bloccato. Inserisci la password della casella di posta per "
"sbloccarlo."
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Sbloccato."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "Impossibile sbloccare"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Autenticazione a due fattori"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Inserisci il codice dell'app di autenticazione o uno dei tuoi codici di "
"recupero."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Codice di autenticazione"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Conferma"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "Disconnettersi?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3357,7 +3382,7 @@ msgstr ""
"Proton Drive si disconnetterà e interromperà la sincronizzazione finché non "
"accedi di nuovo. I file già presenti su questo computer restano dove sono."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Disconnetti"
@@ -6129,15 +6154,6 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {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"
#~ msgstr "Vai a un mese"
+153 -138
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Dutch\n"
@@ -90,7 +90,7 @@ msgstr "Gedeeld door mij"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computers"
@@ -263,18 +263,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -314,7 +314,7 @@ msgstr "Drive doorzoeken"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -356,7 +356,7 @@ msgstr "Raster / lijst"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Hernoemen"
@@ -684,7 +684,7 @@ msgid "Couldn't add a sync folder"
msgstr "Kon geen synchronisatiemap toevoegen"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Kon mappen niet terugzetten"
@@ -1262,10 +1262,11 @@ msgstr "Kon albums niet laden"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1297,7 +1298,7 @@ msgstr "De Proton Drive-service reageerde niet."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1311,7 +1312,7 @@ msgstr "Openen"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Hernoemen…"
@@ -1579,7 +1580,7 @@ msgstr "Pictogramgrootte"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1735,7 +1736,7 @@ msgid "New Folder…"
msgstr "Nieuwe map…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1879,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nieuwe naam"
@@ -1909,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Kies de map waarnaar je wilt verplaatsen."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Hierheen verplaatsen"
@@ -2138,99 +2140,103 @@ msgstr "Bestanden bekijken"
msgid "Restore to This Computer…"
msgstr "Terugzetten op deze computer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Naar deze computer verplaatsen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Deze back-up hier voortzetten…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Verwijderen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · laatste back-up {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · nog geen back-ups"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Nog geen mappen geback-upt"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} map in back-up"
msgstr[1] "{n} mappen in back-up"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} vereist aandacht"
msgstr[1] "{folders} · {n} vereisen aandacht"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "synchroniseren…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "synchronisatiefout"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "vereist aandacht"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "bijgewerkt"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "controleren op wijzigingen…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "controleren op wijzigingen — {done} van {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "synchroniseren: {done} van {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "{file} synchroniseren — {done} van {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Map toevoegen aan synchronisatie"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Map synchroniseren…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Kon map niet toevoegen"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Kon mappen om terug te zetten niet weergeven"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2238,19 +2244,19 @@ msgstr ""
"Vink de mappen aan die je met dit apparaat wilt synchroniseren en pas aan "
"waar elke map moet komen."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Mappen herstellen"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Terugzetten"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Mappen terugzetten…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2259,38 +2265,38 @@ msgstr ""
"Van deze mappen is een back-up gemaakt vanaf “{name}”. Teruggezette mappen "
"blijven synchroniseren met de kopie van die computer."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
"Van deze mappen is een back-up gemaakt onder deze computer in Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Niets om terug te zetten — de mappen van “{name}” worden hier al allemaal "
"gesynchroniseerd."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Niets om terug te zetten — de mappen van deze computer worden hier al "
"allemaal gesynchroniseerd."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Map wordt alleen online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Map wordt gedownload en blijft gesynchroniseerd"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Kon modus niet wijzigen"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2307,7 +2313,7 @@ msgstr ""
"kopie houden, annuleer dan, zet de map op Gesynchroniseerd en wacht tot de "
"download klaar is voordat je hem verwijdert."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2320,68 +2326,68 @@ msgstr ""
"De lokale bestanden blijven op deze schijf en worden gewoon niet meer "
"gesynchroniseerd. Kies of je ook de kopie in Proton Drive wilt verwijderen."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Synchroniseren van map stoppen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Ook uit Proton Drive verwijderen"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Verwijdert de enige kopie van deze bestanden."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "De lokale kopie blijft ongewijzigd."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Synchroniseren stoppen"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Synchroniseren van map gestopt"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Kon het synchroniseren van de map niet stoppen"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Computer hernoemen"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "“{name}” hernoemen."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Kon de computer niet hernoemen"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Een naam is vereist."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computer hernoemd"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Typ “{name}” om te bevestigen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Computer verwijderen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2396,25 +2402,25 @@ msgstr ""
"mee verwijderd. De bestanden op die computer zelf blijven onaangeroerd — "
"maar dit kan hier niet ongedaan worden gemaakt."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Verwijderen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computer verwijderd"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Kon de computer niet verwijderen"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Deze back-up hier voortzetten?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2433,20 +2439,49 @@ msgstr ""
"gesynchroniseerd, worden niet verplaatst. Gebruik daarna “Terugzetten op "
"deze computer” om terug te halen wat “{name}” synchroniseerde."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Hier voortzetten"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Back-up nu als “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Kon die back-up hier niet voortzetten"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Back-up naar deze computer verplaatsen?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"De mappen waarvan “{name}” een back-up maakt, gaan naar de back-up van deze "
"computer in Proton Drive, en je kiest zelf waar ze op deze computer komen. "
"“{name}” blijft in je account, zonder die mappen.\n"
"\n"
"Stop Proton Drive eerst op “{name}”. Anders ziet het zijn mappen verdwijnen."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Back-up van “{name}” verplaatst"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Kon die back-up niet verplaatsen"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3187,26 +3222,37 @@ msgstr "Voer je e-mailadres en wachtwoord in."
msgid "Signing in…"
msgstr "Aanmelden…"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Voltooi de verificatie om verder te gaan…"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "aanmelden geannuleerd"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr ""
"Te veel aanmeldpogingen. Wacht een paar minuten en probeer het opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"Kon Proton niet bereiken. Controleer je internetverbinding en probeer het "
"opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3215,19 +3261,19 @@ msgstr ""
"opgeslagen. Zorg dat een sleutelbos (GNOME Keyring of KWallet) actief en "
"ontgrendeld is."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Aanmelden geannuleerd: er is geen tweestapscode ingevoerd."
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Aanmelden geannuleerd: er is geen mailboxwachtwoord ingevoerd."
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr "Dat mailboxwachtwoord heeft je account niet ontgrendeld."
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3236,36 +3282,36 @@ msgstr ""
"om een nieuwe te krijgen."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Aanmelden mislukt: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
"Dat mailboxwachtwoord heeft je account niet ontgrendeld. Probeer het opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"Dit account heeft een apart mailboxwachtwoord. Voer het in om je bestanden "
"te ontgrendelen."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Mailboxwachtwoord"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr "Mailboxwachtwoord"
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr "Ontgrendeld houden op deze computer"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3274,68 +3320,47 @@ msgstr ""
"Drive na elke aanmelding opent zonder te vragen. Anders voer je het "
"wachtwoord één keer per sessie in."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Ontgrendelen"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
"Proton Drive is vergrendeld. Voer je mailboxwachtwoord in om het te "
"ontgrendelen."
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Ontgrendeld."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "Ontgrendelen mislukt"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Tweestapsverificatie"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"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."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Verificatiecode"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Bevestigen"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "Afmelden?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3344,7 +3369,7 @@ msgstr ""
"je opnieuw aanmeldt. Bestanden die al op deze computer staan, blijven waar "
"ze zijn."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Afmelden"
@@ -6117,16 +6142,6 @@ msgstr "{count}j"
msgid "cannot reach the Proton Drive daemon: {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"
#~ msgstr "Naar een maand springen"
+144 -125
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 3.1.2\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -93,7 +93,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr ""
@@ -239,18 +239,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -290,7 +290,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -332,7 +332,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr ""
@@ -654,7 +654,7 @@ msgid "Couldn't add a sync folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr ""
@@ -1220,10 +1220,11 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1255,7 +1256,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1269,7 +1270,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr ""
@@ -1537,7 +1538,7 @@ msgstr ""
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1691,7 +1692,7 @@ msgid "New Folder…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1833,7 +1834,7 @@ msgid "{status}. {message}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr ""
@@ -1863,6 +1864,7 @@ msgid "Choose the folder to move into."
msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr ""
@@ -2090,150 +2092,154 @@ msgstr ""
msgid "Restore to This Computer…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr ""
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] ""
msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] ""
msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
"with that computer's copy."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2244,7 +2250,7 @@ msgid ""
"finish before removing it."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2253,68 +2259,68 @@ msgid ""
"whether to also delete the copy in Proton Drive."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr ""
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr ""
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2324,25 +2330,25 @@ msgid ""
"here."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2354,20 +2360,44 @@ msgid ""
"syncing."
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr ""
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr ""
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr ""
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3054,142 +3084,131 @@ msgstr ""
msgid "Signing in…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
msgstr ""
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr ""
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr ""
+154 -137
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Polish\n"
@@ -92,7 +92,7 @@ msgstr "Udostępnione przeze mnie"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Komputery"
@@ -267,18 +267,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -318,7 +318,7 @@ msgstr "Przeszukaj Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -360,7 +360,7 @@ msgstr "Siatka/lista"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Zmień nazwę"
@@ -701,7 +701,7 @@ msgid "Couldn't add a sync folder"
msgstr "Nie można dodać katalogu synchronizacji"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Nie można przywrócić katalogów"
@@ -1293,10 +1293,11 @@ msgstr "Nie można wczytać albumów"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1328,7 +1329,7 @@ msgstr "Usługa Proton Drive nie odpowiedziała."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1342,7 +1343,7 @@ msgstr "Otwórz"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Zmień nazwę…"
@@ -1616,7 +1617,7 @@ msgstr "Rozmiar ikon"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1779,7 +1780,7 @@ msgid "New Folder…"
msgstr "Nowy katalog…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1925,7 +1926,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Nowa nazwa"
@@ -1956,6 +1957,7 @@ msgid "Choose the folder to move into."
msgstr "Proszę wybrać katalog docelowy."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Przenieś tutaj"
@@ -2190,31 +2192,35 @@ msgstr "Przeglądaj pliki"
msgid "Restore to This Computer…"
msgstr "Przywróć na tym komputerze…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Przenieś na ten komputer…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Kontynuuj tę kopię zapasową tutaj…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Usuń…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · ostatnia kopia zapasowa: {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · brak kopii zapasowych"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Brak zarchiwizowanych katalogów"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
@@ -2222,7 +2228,7 @@ msgstr[0] "{n} katalog z kopią zapasową"
msgstr[1] "{n} katalogi z kopią zapasową"
msgstr[2] "{n} katalogów z kopią zapasową"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
@@ -2230,61 +2236,61 @@ msgstr[0] "{folders} · {n} wymaga uwagi"
msgstr[1] "{folders} · {n} wymagają uwagi"
msgstr[2] "{folders} · {n} wymaga uwagi"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "synchronizowanie…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "błąd synchronizacji"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "wymaga uwagi"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "aktualne"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "sprawdzanie zmian…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "sprawdzanie zmian — {done} z {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "synchronizowanie {done} z {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "synchronizowanie {file} — {done} z {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Dodaj katalog do synchronizacji"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Synchronizowanie katalogu…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Nie można dodać katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Nie można wyświetlić listy katalogów do przywrócenia"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2292,19 +2298,19 @@ msgstr ""
"Należy zaznaczyć katalogi do synchronizacji z tym komputerem i dostosować "
"położenie każdego z nich."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Przywróć katalogi"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Przywróć"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Przywracanie katalogów…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2313,37 +2319,37 @@ msgstr ""
"Te katalogi mają kopię zapasową z komputera „{name}”. Przywrócone katalogi "
"nadal będą synchronizowane z kopią tego komputera."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Te katalogi mają kopię zapasową w Proton Drive pod tym komputerem."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nie ma nic do przywrócenia — wszystkie katalogi komputera „{name}” są tutaj "
"synchronizowane."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nie ma nic do przywrócenia — wszystkie katalogi tego komputera są tutaj "
"synchronizowane."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "Katalog przejdzie w tryb tylko online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "Katalog zostanie pobrany i będzie synchronizowany"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Nie można zmienić trybu"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2360,7 +2366,7 @@ msgstr ""
"pusty. Aby zachować lokalną kopię, należy anulować, przełączyć katalog na "
"tryb Synchronizowany i poczekać na ukończenie pobierania przed usunięciem."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2373,68 +2379,68 @@ msgstr ""
"Lokalne pliki pozostaną na tym dysku i po prostu przestaną być "
"synchronizowane. Można też usunąć kopię w Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Zatrzymać synchronizację katalogu?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Usuń także z Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Usuwa jedyną kopię tych plików."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "Lokalna kopia pozostanie bez zmian."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Zatrzymaj synchronizację"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "Zatrzymano synchronizację katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Nie można zatrzymać synchronizacji katalogu"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Zmiana nazwy komputera"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Proszę podać nową nazwę komputera „{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Nie można zmienić nazwy komputera"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Nazwa jest wymagana."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Zmieniono nazwę komputera"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Proszę wpisać „{name}”, aby potwierdzić"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Usunąć komputer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2449,25 +2455,25 @@ msgstr ""
"z nim. Pliki na samym komputerze pozostaną nietknięte — ale tej operacji nie "
"można tutaj cofnąć."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Usuń"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Usunięto komputer"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Nie można usunąć komputera"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Kontynuować tę kopię zapasową tutaj?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2486,20 +2492,51 @@ msgstr ""
"przeniesione. Aby odzyskać to, co synchronizował „{name}”, proszę potem użyć "
"opcji „Przywróć na tym komputerze”."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Kontynuuj tutaj"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Kopia zapasowa jest teraz tworzona jako „{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Nie można kontynuować tej kopii zapasowej tutaj"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Przenieść kopię zapasową na ten komputer?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"Foldery, których kopię zapasową tworzy „{name}”, zostaną przeniesione do "
"kopii zapasowej tego komputera w Proton Drive, a Ty wybierzesz, gdzie mają "
"się znaleźć na tym komputerze. „{name}” pozostanie na Twoim koncie, bez tych "
"folderów.\n"
"\n"
"Najpierw zamknij Proton Drive na „{name}”. W przeciwnym razie zobaczy, jak "
"jego foldery znikają."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Przeniesiono kopię zapasową „{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Nie można przenieść tej kopii zapasowej"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3244,26 +3281,36 @@ msgstr "Proszę podać adres e-mail i hasło."
msgid "Signing in…"
msgstr "Logowanie…"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Proszę ukończyć weryfikację, aby kontynuować…"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "anulowano logowanie"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr ""
"Za dużo prób logowania. Proszę odczekać kilka minut i spróbować ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"Nie można połączyć się z Proton. Proszę sprawdzić połączenie z Internetem i "
"spróbować ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3272,19 +3319,19 @@ msgstr ""
"upewnić, że baza kluczy (GNOME Keyring lub KWallet) jest uruchomiona i "
"odblokowana."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Anulowano logowanie: nie wpisano kodu uwierzytelniania dwuetapowego."
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Anulowano logowanie: nie wpisano hasła skrzynki pocztowej."
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr "To hasło skrzynki pocztowej nie odblokowało Twojego konta."
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3293,36 +3340,36 @@ msgstr ""
"ponownie, aby otrzymać nową."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Logowanie się nie powiodło: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
"To hasło skrzynki pocztowej nie odblokowało Twojego konta. Spróbuj ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"To konto ma osobne hasło skrzynki pocztowej. Wpisz je, aby odblokować swoje "
"pliki."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Hasło skrzynki pocztowej"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr "Hasło skrzynki pocztowej"
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr "Pozostaw odblokowane na tym komputerze"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3331,70 +3378,49 @@ msgstr ""
"się bez pytania po każdym logowaniu. W przeciwnym razie wpisujesz hasło raz "
"na sesję."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Odblokuj"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
"Proton Drive jest zablokowany. Wpisz hasło skrzynki pocztowej, aby go "
"odblokować."
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Odblokowano."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "Nie udało się odblokować"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Uwierzytelnianie dwuskładnikowe"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Proszę wpisać kod z aplikacji uwierzytelniającej lub jeden z kodów "
"odzyskiwania."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Kod uwierzytelniania"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Potwierdź"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "Wylogować się?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3402,7 +3428,7 @@ msgstr ""
"Proton Drive rozłączy się i przestanie synchronizować do czasu ponownego "
"zalogowania. Pliki znajdujące się już na tym komputerze pozostaną na miejscu."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Wyloguj się"
@@ -6212,15 +6238,6 @@ msgstr "{count} r."
msgid "cannot reach the Proton Drive daemon: {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"
#~ msgstr "Przejdź do miesiąca"
+153 -137
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-08 18:47+0200\n"
"POT-Creation-Date: 2026-10-08 13:23+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Portuguese (Brazil)\n"
@@ -90,7 +90,7 @@ msgstr "Compartilhados por mim"
#: crates/pdfs-gui/src/app/main.rs:776
#: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481
#: crates/pdfs-gui/src/app/pages/devices.rs:485
msgid "Computers"
msgstr "Computadores"
@@ -262,18 +262,18 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1892
#: crates/pdfs-gui/src/app/pages/browser.rs:1968
#: crates/pdfs-gui/src/app/pages/browser.rs:2381
#: crates/pdfs-gui/src/app/pages/devices.rs:788
#: crates/pdfs-gui/src/app/pages/devices.rs:941
#: crates/pdfs-gui/src/app/pages/devices.rs:979
#: crates/pdfs-gui/src/app/pages/devices.rs:1031
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#: crates/pdfs-gui/src/app/pages/devices.rs:792
#: crates/pdfs-gui/src/app/pages/devices.rs:945
#: crates/pdfs-gui/src/app/pages/devices.rs:983
#: crates/pdfs-gui/src/app/pages/devices.rs:1035
#: crates/pdfs-gui/src/app/pages/devices.rs:1079
#: crates/pdfs-gui/src/app/pages/devices.rs:1119
#: crates/pdfs-gui/src/app/pages/locations.rs:809
#: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:389
#: crates/pdfs-gui/src/app/pages/login.rs:503
#: crates/pdfs-gui/src/app/pages/login.rs:549
#: crates/pdfs-gui/src/app/pages/login.rs:393
#: crates/pdfs-gui/src/app/pages/login.rs:507
#: 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:1027
@@ -313,7 +313,7 @@ msgstr "Pesquisar no Drive"
#: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/devices.rs:558
#: crates/pdfs-gui/src/app/pages/shared.rs:586
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:526
#: crates/pdfs-gui/src/app/pages/trash.rs:246
@@ -355,7 +355,7 @@ msgstr "Grade / lista"
#: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
#: crates/pdfs-gui/src/app/pages/devices.rs:980
#: crates/pdfs-gui/src/app/pages/devices.rs:984
#: crates/pdfs-gui/src/app/widgets/details.rs:159
msgid "Rename"
msgstr "Renomear"
@@ -683,7 +683,7 @@ msgid "Couldn't add a sync folder"
msgstr "Não foi possível adicionar uma pasta sincronizada"
#: crates/pdfs-gui/src/app/pages/activity_text.rs:58
#: crates/pdfs-gui/src/app/pages/devices.rs:823
#: crates/pdfs-gui/src/app/pages/devices.rs:827
msgid "Couldn't restore folders"
msgstr "Não foi possível restaurar as pastas"
@@ -1263,10 +1263,11 @@ msgstr "Não foi possível carregar os álbuns"
#: crates/pdfs-gui/src/app/pages/browser.rs:1848
#: crates/pdfs-gui/src/app/pages/browser.rs:2315
#: crates/pdfs-gui/src/app/pages/browser.rs:2491
#: crates/pdfs-gui/src/app/pages/devices.rs:694
#: crates/pdfs-gui/src/app/pages/devices.rs:734
#: crates/pdfs-gui/src/app/pages/devices.rs:884
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
#: crates/pdfs-gui/src/app/pages/devices.rs:698
#: crates/pdfs-gui/src/app/pages/devices.rs:738
#: crates/pdfs-gui/src/app/pages/devices.rs:888
#: crates/pdfs-gui/src/app/pages/devices.rs:1156
#: crates/pdfs-gui/src/app/pages/devices.rs:1185
#: crates/pdfs-gui/src/app/pages/duplicates.rs:220
#: crates/pdfs-gui/src/app/pages/locations.rs:536
#: crates/pdfs-gui/src/app/pages/locations.rs:783
@@ -1298,7 +1299,7 @@ msgstr "O serviço do Proton Drive não respondeu."
#: crates/pdfs-gui/src/app/pages/albums.rs:206
#: crates/pdfs-gui/src/app/pages/browser.rs:840
#: crates/pdfs-gui/src/app/pages/devices.rs:530
#: crates/pdfs-gui/src/app/pages/devices.rs:534
#: crates/pdfs-gui/src/app/pages/photos.rs:3190
#: crates/pdfs-gui/src/app/pages/shared.rs:541
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:474
@@ -1312,7 +1313,7 @@ msgstr "Abrir"
#: crates/pdfs-gui/src/app/pages/albums.rs:212
#: crates/pdfs-gui/src/app/pages/browser.rs:882
#: crates/pdfs-gui/src/app/pages/devices.rs:406
#: crates/pdfs-gui/src/app/pages/devices.rs:444
#: crates/pdfs-gui/src/app/pages/devices.rs:448
msgid "Rename…"
msgstr "Renomear…"
@@ -1580,7 +1581,7 @@ msgstr "Tamanho dos ícones"
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:538
#: crates/pdfs-gui/src/app/pages/browser.rs:925
#: crates/pdfs-gui/src/app/pages/devices.rs:539
#: crates/pdfs-gui/src/app/pages/devices.rs:543
#: crates/pdfs-gui/src/app/pages/photos.rs:1988
#: crates/pdfs-gui/src/app/pages/shared.rs:565
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:507
@@ -1734,7 +1735,7 @@ msgid "New Folder…"
msgstr "Nova pasta…"
#: crates/pdfs-gui/src/app/pages/browser.rs:953
#: crates/pdfs-gui/src/app/pages/devices.rs:550
#: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:582
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:522
#: crates/pdfs-gui/src/app/pages/trash.rs:242
@@ -1879,7 +1880,7 @@ msgid "{status}. {message}"
msgstr "{status}. {message}"
#: crates/pdfs-gui/src/app/pages/browser.rs:1875
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#: crates/pdfs-gui/src/app/pages/devices.rs:977
msgid "New name"
msgstr "Novo nome"
@@ -1909,6 +1910,7 @@ msgid "Choose the folder to move into."
msgstr "Escolha a pasta de destino."
#: crates/pdfs-gui/src/app/pages/browser.rs:1969
#: crates/pdfs-gui/src/app/pages/devices.rs:1120
msgid "Move Here"
msgstr "Mover para cá"
@@ -2137,99 +2139,103 @@ msgstr "Navegar pelos arquivos"
msgid "Restore to This Computer…"
msgstr "Restaurar neste computador…"
#: crates/pdfs-gui/src/app/pages/devices.rs:451
#: crates/pdfs-gui/src/app/pages/devices.rs:443
msgid "Move to This Computer…"
msgstr "Mover para este computador…"
#: crates/pdfs-gui/src/app/pages/devices.rs:455
msgid "Continue This Backup Here…"
msgstr "Continuar este backup aqui…"
#: crates/pdfs-gui/src/app/pages/devices.rs:456
#: crates/pdfs-gui/src/app/pages/devices.rs:460
#: crates/pdfs-gui/src/app/pages/shared.rs:895
msgid "Remove…"
msgstr "Remover…"
#: crates/pdfs-gui/src/app/pages/devices.rs:567
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#, rust-format
msgid "{platform} · last backup {time}"
msgstr "{platform} · último backup {time}"
#. Translators: {platform} is the device's platform, such as "Linux".
#: crates/pdfs-gui/src/app/pages/devices.rs:571
#: crates/pdfs-gui/src/app/pages/devices.rs:575
#, rust-format
msgid "{platform} · no backups yet"
msgstr "{platform} · nenhum backup ainda"
#: crates/pdfs-gui/src/app/pages/devices.rs:587
#: crates/pdfs-gui/src/app/pages/devices.rs:591
msgid "No folders backed up yet"
msgstr "Nenhuma pasta com backup ainda"
#: crates/pdfs-gui/src/app/pages/devices.rs:590
#: crates/pdfs-gui/src/app/pages/devices.rs:594
#, rust-format
msgid "{n} folder backed up"
msgid_plural "{n} folders backed up"
msgstr[0] "{n} pasta com backup"
msgstr[1] "{n} pastas com backup"
#: crates/pdfs-gui/src/app/pages/devices.rs:603
#: crates/pdfs-gui/src/app/pages/devices.rs:607
#, rust-format
msgid "{folders} · {n} needs attention"
msgid_plural "{folders} · {n} need attention"
msgstr[0] "{folders} · {n} requer atenção"
msgstr[1] "{folders} · {n} requerem atenção"
#: crates/pdfs-gui/src/app/pages/devices.rs:614
#: crates/pdfs-gui/src/app/pages/devices.rs:618
msgid "syncing…"
msgstr "sincronizando…"
#: crates/pdfs-gui/src/app/pages/devices.rs:615
#: crates/pdfs-gui/src/app/pages/devices.rs:619
msgid "sync error"
msgstr "erro de sincronização"
#: crates/pdfs-gui/src/app/pages/devices.rs:616
#: crates/pdfs-gui/src/app/pages/devices.rs:620
msgid "needs attention"
msgstr "requer atenção"
#: crates/pdfs-gui/src/app/pages/devices.rs:617
#: crates/pdfs-gui/src/app/pages/devices.rs:621
msgid "up to date"
msgstr "atualizado"
#: crates/pdfs-gui/src/app/pages/devices.rs:629
#: crates/pdfs-gui/src/app/pages/devices.rs:633
msgid "checking for changes…"
msgstr "verificando alterações…"
#: crates/pdfs-gui/src/app/pages/devices.rs:632
#: crates/pdfs-gui/src/app/pages/devices.rs:636
#, rust-format
msgid "checking for changes — {done} of {total}"
msgstr "verificando alterações — {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:644
#: crates/pdfs-gui/src/app/pages/devices.rs:648
#, rust-format
msgid "syncing {done} of {total}"
msgstr "sincronizando {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:650
#: crates/pdfs-gui/src/app/pages/devices.rs:654
#, rust-format
msgid "syncing {file} — {done} of {total}"
msgstr "sincronizando {file} — {done} de {total}"
#: crates/pdfs-gui/src/app/pages/devices.rs:662
#: crates/pdfs-gui/src/app/pages/devices.rs:666
msgid "Add Folder to Sync"
msgstr "Adicionar pasta à sincronização"
#: crates/pdfs-gui/src/app/pages/devices.rs:686
#: crates/pdfs-gui/src/app/pages/devices.rs:690
#: crates/pdfs-gui/src/app/pages/locations.rs:1593
msgid "Syncing folder…"
msgstr "Sincronizando pasta…"
#: crates/pdfs-gui/src/app/pages/devices.rs:689
#: crates/pdfs-gui/src/app/pages/devices.rs:693
#: crates/pdfs-gui/src/app/pages/devices.rs:697
msgid "Couldn't add folder"
msgstr "Não foi possível adicionar a pasta"
#: crates/pdfs-gui/src/app/pages/devices.rs:727
#: crates/pdfs-gui/src/app/pages/devices.rs:733
#: crates/pdfs-gui/src/app/pages/devices.rs:731
#: crates/pdfs-gui/src/app/pages/devices.rs:737
msgid "Couldn't list folders to restore"
msgstr "Não foi possível listar as pastas para restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:759
#: crates/pdfs-gui/src/app/pages/devices.rs:763
msgid ""
"Tick the folders to sync to this machine, and adjust where each one should "
"live."
@@ -2237,19 +2243,19 @@ msgstr ""
"Marque as pastas a sincronizar com esta máquina e ajuste onde cada uma deve "
"ficar."
#: crates/pdfs-gui/src/app/pages/devices.rs:782
#: crates/pdfs-gui/src/app/pages/devices.rs:786
msgid "Restore Folders"
msgstr "Restaurar pastas"
#: crates/pdfs-gui/src/app/pages/devices.rs:789
#: crates/pdfs-gui/src/app/pages/devices.rs:793
msgid "Restore"
msgstr "Restaurar"
#: crates/pdfs-gui/src/app/pages/devices.rs:822
#: crates/pdfs-gui/src/app/pages/devices.rs:826
msgid "Restoring folders…"
msgstr "Restaurando pastas…"
#: crates/pdfs-gui/src/app/pages/devices.rs:834
#: crates/pdfs-gui/src/app/pages/devices.rs:838
#, rust-format
msgid ""
"These folders are backed up from “{name}”. Restored folders keep syncing "
@@ -2258,36 +2264,36 @@ msgstr ""
"Estas pastas têm backup a partir de “{name}”. As pastas restauradas "
"continuam sincronizando com a cópia daquele computador."
#: crates/pdfs-gui/src/app/pages/devices.rs:837
#: crates/pdfs-gui/src/app/pages/devices.rs:841
msgid "These folders are backed up under this computer in Proton Drive."
msgstr "Estas pastas têm backup sob este computador no Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:846
#: crates/pdfs-gui/src/app/pages/devices.rs:850
#, rust-format
msgid "Nothing to restore — “{name}”'s folders are all synced here."
msgstr ""
"Nada a restaurar — as pastas de “{name}” já estão todas sincronizadas aqui."
#: crates/pdfs-gui/src/app/pages/devices.rs:849
#: crates/pdfs-gui/src/app/pages/devices.rs:853
msgid "Nothing to restore — this computer's folders are all synced here."
msgstr ""
"Nada a restaurar — as pastas deste computador já estão todas sincronizadas "
"aqui."
#: crates/pdfs-gui/src/app/pages/devices.rs:873
#: crates/pdfs-gui/src/app/pages/devices.rs:877
msgid "Folder will switch to online only"
msgstr "A pasta passará a ser somente online"
#: crates/pdfs-gui/src/app/pages/devices.rs:875
#: crates/pdfs-gui/src/app/pages/devices.rs:879
msgid "Folder will download and stay synced"
msgstr "A pasta será baixada e permanecerá sincronizada"
#: crates/pdfs-gui/src/app/pages/devices.rs:879
#: crates/pdfs-gui/src/app/pages/devices.rs:883
#: crates/pdfs-gui/src/app/pages/devices.rs:887
msgid "Couldn't change mode"
msgstr "Não foi possível alterar o modo"
#: crates/pdfs-gui/src/app/pages/devices.rs:915
#: crates/pdfs-gui/src/app/pages/devices.rs:919
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2304,7 +2310,7 @@ msgstr ""
"uma cópia local, cancele, mude a pasta para Sincronizada e aguarde o "
"download terminar antes de removê-la."
#: crates/pdfs-gui/src/app/pages/devices.rs:921
#: crates/pdfs-gui/src/app/pages/devices.rs:925
#, rust-format
msgid ""
"Stop syncing “{path}”?\n"
@@ -2317,68 +2323,68 @@ msgstr ""
"Os arquivos locais permanecem neste disco e simplesmente deixam de ser "
"sincronizados. Escolha se também deseja excluir a cópia no Proton Drive."
#: crates/pdfs-gui/src/app/pages/devices.rs:926
#: crates/pdfs-gui/src/app/pages/devices.rs:930
msgid "Stop Syncing Folder?"
msgstr "Parar de sincronizar a pasta?"
#: crates/pdfs-gui/src/app/pages/devices.rs:931
#: crates/pdfs-gui/src/app/pages/devices.rs:935
msgid "Also delete from Proton Drive"
msgstr "Também excluir do Proton Drive"
#: crates/pdfs-gui/src/app/pages/devices.rs:933
#: crates/pdfs-gui/src/app/pages/devices.rs:937
msgid "Deletes the only copy of these files."
msgstr "Exclui a única cópia destes arquivos."
#: crates/pdfs-gui/src/app/pages/devices.rs:935
#: crates/pdfs-gui/src/app/pages/devices.rs:939
msgid "The local copy is unaffected."
msgstr "A cópia local não é afetada."
#: crates/pdfs-gui/src/app/pages/devices.rs:942
#: crates/pdfs-gui/src/app/pages/devices.rs:946
msgid "Stop Syncing"
msgstr "Parar de sincronizar"
#: crates/pdfs-gui/src/app/pages/devices.rs:955
#: crates/pdfs-gui/src/app/pages/devices.rs:959
msgid "Stopped syncing folder"
msgstr "A pasta deixou de ser sincronizada"
#: crates/pdfs-gui/src/app/pages/devices.rs:956
#: crates/pdfs-gui/src/app/pages/devices.rs:960
msgid "Couldn't stop syncing the folder"
msgstr "Não foi possível parar de sincronizar a pasta"
#: crates/pdfs-gui/src/app/pages/devices.rs:967
#: crates/pdfs-gui/src/app/pages/devices.rs:971
msgid "Rename Computer"
msgstr "Renomear computador"
#. Translators: {name} is the computer's current name.
#: crates/pdfs-gui/src/app/pages/devices.rs:969
#: crates/pdfs-gui/src/app/pages/devices.rs:973
#, rust-format
msgid "Rename “{name}”."
msgstr "Renomear “{name}”."
#: crates/pdfs-gui/src/app/pages/devices.rs:994
#: crates/pdfs-gui/src/app/pages/devices.rs:1006
#: crates/pdfs-gui/src/app/pages/devices.rs:998
#: crates/pdfs-gui/src/app/pages/devices.rs:1010
msgid "Couldn't rename the computer"
msgstr "Não foi possível renomear o computador"
#: crates/pdfs-gui/src/app/pages/devices.rs:995
#: crates/pdfs-gui/src/app/pages/devices.rs:999
msgid "A name is required."
msgstr "Um nome é obrigatório."
#: crates/pdfs-gui/src/app/pages/devices.rs:1005
#: crates/pdfs-gui/src/app/pages/devices.rs:1009
msgid "Computer renamed"
msgstr "Computador renomeado"
#. Translators: {name} is the computer's name, which the user must type.
#: crates/pdfs-gui/src/app/pages/devices.rs:1018
#: crates/pdfs-gui/src/app/pages/devices.rs:1022
#, rust-format
msgid "Type “{name}” to confirm"
msgstr "Digite “{name}” para confirmar"
#: crates/pdfs-gui/src/app/pages/devices.rs:1023
#: crates/pdfs-gui/src/app/pages/devices.rs:1027
msgid "Remove Computer?"
msgstr "Remover computador?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1026
#: crates/pdfs-gui/src/app/pages/devices.rs:1030
#, rust-format
msgid ""
"Remove “{name}” from this account?\n"
@@ -2393,25 +2399,25 @@ msgstr ""
"naquele próprio computador não são tocados — mas isso não pode ser desfeito "
"daqui."
#: crates/pdfs-gui/src/app/pages/devices.rs:1032
#: crates/pdfs-gui/src/app/pages/devices.rs:1036
#: crates/pdfs-gui/src/app/pages/shared.rs:1028
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:529
msgid "Remove"
msgstr "Remover"
#: crates/pdfs-gui/src/app/pages/devices.rs:1049
#: crates/pdfs-gui/src/app/pages/devices.rs:1053
msgid "Computer removed"
msgstr "Computador removido"
#: crates/pdfs-gui/src/app/pages/devices.rs:1050
#: crates/pdfs-gui/src/app/pages/devices.rs:1054
msgid "Couldn't remove the computer"
msgstr "Não foi possível remover o computador"
#: crates/pdfs-gui/src/app/pages/devices.rs:1068
#: crates/pdfs-gui/src/app/pages/devices.rs:1072
msgid "Continue This Backup Here?"
msgstr "Continuar este backup aqui?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1071
#: crates/pdfs-gui/src/app/pages/devices.rs:1075
#, rust-format
msgid ""
"This computer takes over the backup of “{name}”, for example after a "
@@ -2430,20 +2436,50 @@ msgstr ""
"movidas. Depois, use “Restaurar neste computador” para recuperar o que "
"“{name}” sincronizava."
#: crates/pdfs-gui/src/app/pages/devices.rs:1076
#: crates/pdfs-gui/src/app/pages/devices.rs:1080
msgid "Continue Here"
msgstr "Continuar aqui"
#. Translators: {name} is the name of the computer whose backup this one took over.
#: crates/pdfs-gui/src/app/pages/devices.rs:1083
#: crates/pdfs-gui/src/app/pages/devices.rs:1087
#, rust-format
msgid "Now backing up as “{name}”"
msgstr "Agora fazendo backup como “{name}”"
#: crates/pdfs-gui/src/app/pages/devices.rs:1092
#: crates/pdfs-gui/src/app/pages/devices.rs:1096
msgid "Couldn't continue that backup here"
msgstr "Não foi possível continuar esse backup aqui"
#: crates/pdfs-gui/src/app/pages/devices.rs:1112
msgid "Move Backup to This Computer?"
msgstr "Mover o backup para este computador?"
#: crates/pdfs-gui/src/app/pages/devices.rs:1115
#, rust-format
msgid ""
"The folders backed up by “{name}” move into this computer's backup in Proton "
"Drive, and you choose where they go on this computer. “{name}” stays in your "
"account, without those folders.\n"
"\n"
"Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear."
msgstr ""
"As pastas cujo backup é feito por “{name}” passam para o backup deste "
"computador no Proton Drive, e você escolhe onde ficam neste computador. "
"“{name}” continua na sua conta, sem essas pastas.\n"
"\n"
"Feche primeiro o Proton Drive em “{name}”. Caso contrário, ele verá as "
"pastas sumirem."
#. Translators: {name} is the name of the computer whose folders moved to this one.
#: crates/pdfs-gui/src/app/pages/devices.rs:1127
#, rust-format
msgid "Moved the backup of “{name}”"
msgstr "Backup de “{name}” movido"
#: crates/pdfs-gui/src/app/pages/devices.rs:1141
msgid "Couldn't move that backup"
msgstr "Não foi possível mover esse backup"
#: crates/pdfs-gui/src/app/pages/duplicates.rs:81
msgctxt "duplicates"
msgid "Exact"
@@ -3179,25 +3215,35 @@ msgstr "Digite seu e-mail e senha."
msgid "Signing in…"
msgstr "Entrando…"
#: crates/pdfs-gui/src/app/pages/login.rs:160
#: crates/pdfs-gui/src/app/pages/login.rs:164
msgid "Complete the verification to continue…"
msgstr "Conclua a verificação para continuar…"
#: crates/pdfs-gui/src/app/pages/login.rs:195
#: crates/pdfs-gui/src/app/pages/login.rs:197
msgid "login cancelled"
msgstr "login cancelado"
#: crates/pdfs-gui/src/app/pages/login.rs:228
#: crates/pdfs-gui/src/app/pages/login.rs:210
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."
msgstr "Muitas tentativas de entrar. Aguarde alguns minutos e tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:234
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr ""
"Não foi possível acessar o Proton. Verifique sua conexão com a internet e "
"tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:237
#: crates/pdfs-gui/src/app/pages/login.rs:242
msgid ""
"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."
@@ -3206,19 +3252,19 @@ msgstr ""
"Certifique-se de que um chaveiro (GNOME Keyring ou KWallet) esteja em "
"execução e desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:240
#: crates/pdfs-gui/src/app/pages/login.rs:245
msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Entrada cancelada: nenhum código de dois fatores foi digitado."
#: crates/pdfs-gui/src/app/pages/login.rs:243
#: crates/pdfs-gui/src/app/pages/login.rs:248
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr "Entrada cancelada: nenhuma senha da caixa de correio foi digitada."
#: crates/pdfs-gui/src/app/pages/login.rs:246
#: crates/pdfs-gui/src/app/pages/login.rs:251
msgid "That mailbox password didn't unlock your account."
msgstr "Essa senha da caixa de correio não desbloqueou sua conta."
#: crates/pdfs-gui/src/app/pages/login.rs:249
#: crates/pdfs-gui/src/app/pages/login.rs:254
msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one."
@@ -3227,36 +3273,36 @@ msgstr ""
"receber uma nova."
#. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:254
#: crates/pdfs-gui/src/app/pages/login.rs:259
#, rust-format
msgid "Sign-in failed: {error}"
msgstr "Falha ao entrar: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:365
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
"Essa senha da caixa de correio não desbloqueou sua conta. Tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:367
#: crates/pdfs-gui/src/app/pages/login.rs:371
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
"Esta conta tem uma senha da caixa de correio separada. Digite-a para "
"desbloquear seus arquivos."
#: crates/pdfs-gui/src/app/pages/login.rs:370
#: crates/pdfs-gui/src/app/pages/login.rs:374
msgid "Mailbox Password"
msgstr "Senha da caixa de correio"
#: crates/pdfs-gui/src/app/pages/login.rs:376
#: crates/pdfs-gui/src/app/pages/login.rs:380
msgid "Mailbox password"
msgstr "Senha da caixa de correio"
#: crates/pdfs-gui/src/app/pages/login.rs:380
#: crates/pdfs-gui/src/app/pages/login.rs:384
msgid "Keep unlocked on this computer"
msgstr "Manter desbloqueado neste computador"
#: crates/pdfs-gui/src/app/pages/login.rs:382
#: crates/pdfs-gui/src/app/pages/login.rs:386
msgid ""
"Stores the unlock in the system keyring, so Proton Drive opens without "
"asking after every login. Otherwise you enter the password once per session."
@@ -3265,70 +3311,49 @@ msgstr ""
"sem perguntar após cada login. Caso contrário, você digita a senha uma vez "
"por sessão."
#: crates/pdfs-gui/src/app/pages/login.rs:390
#: crates/pdfs-gui/src/app/pages/login.rs:443
#: crates/pdfs-gui/src/app/pages/login.rs:394
#: crates/pdfs-gui/src/app/pages/login.rs:447
msgid "Unlock"
msgstr "Desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:442
#: crates/pdfs-gui/src/app/pages/login.rs:446
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
"O Proton Drive está bloqueado. Digite a senha da caixa de correio para "
"desbloqueá-lo."
#: crates/pdfs-gui/src/app/pages/login.rs:471
#: crates/pdfs-gui/src/app/pages/login.rs:475
msgid "Unlocked."
msgstr "Desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:476
#: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "Couldn't unlock"
msgstr "Não foi possível desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:489
#: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Two-Factor Authentication"
msgstr "Autenticação de dois fatores"
#: crates/pdfs-gui/src/app/pages/login.rs:491
#: crates/pdfs-gui/src/app/pages/login.rs:495
msgid ""
"Enter the code from your authenticator app, or one of your recovery codes."
msgstr ""
"Digite o código do seu aplicativo autenticador ou um dos seus códigos de "
"recuperação."
#: crates/pdfs-gui/src/app/pages/login.rs:497
#: crates/pdfs-gui/src/app/pages/login.rs:501
msgid "Authentication code"
msgstr "Código de autenticação"
#: crates/pdfs-gui/src/app/pages/login.rs:504
#: crates/pdfs-gui/src/app/pages/login.rs:508
msgid "Confirm"
msgstr "Confirmar"
#: 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
#: crates/pdfs-gui/src/app/pages/login.rs:536
msgid "Sign Out?"
msgstr "Sair?"
#: crates/pdfs-gui/src/app/pages/login.rs:591
#: crates/pdfs-gui/src/app/pages/login.rs:538
msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are."
@@ -3336,7 +3361,7 @@ msgstr ""
"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."
#: crates/pdfs-gui/src/app/pages/login.rs:593
#: crates/pdfs-gui/src/app/pages/login.rs:540
msgid "Sign Out"
msgstr "Sair"
@@ -6104,15 +6129,6 @@ msgstr "{count} a"
msgid "cannot reach the Proton Drive daemon: {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"
#~ msgstr "Ir para um mês"