feat(core,cli,gui): support two-password accounts without storing the mailbox password

A two-password account signed in with its login password as the mailbox
password, so the key chain never unlocked and the daemon retried forever.

Login now asks for the mailbox password and checks it against the account
(proton-sdk 0.8 `unlock`), so a typo is a retry. The password is never
stored: the keyring blob keeps the per-key passphrases instead, and for a
two-password account only when the user opts in (`--remember`, or the
"Keep unlocked on this computer" switch). By default they live in the
kernel keyring for the login session and the account is locked after a
reboot until `pdfs unlock` or the app supplies them again.

- core: kernelkey module, Error::Locked / WrongMailboxPassword, unlock,
  lock, key_state, ready; blobs written by 3.0.x are migrated on first
  start; token refresh updates only the tokens in the stored blob
- cli: `pdfs unlock [--remember]`, `pdfs lock [--forget]`; status and
  diagnose report the key state; the daemon waits while locked and is
  marked non-dumpable
- gui: mailbox password dialog at sign-in and on open, locked tray state
- po: all catalogs translated
- bump to 3.1.0, depend on proton-sdk and proton-drive-rs 0.8.0

Refs #26.
This commit is contained in:
nvrl committed 2026-10-07 08:17:50 +02:00
1 parent f105159186
commit 9fa88ff397
24 files changed
+2871 -1417

No files matched your search

Generated
+14 -10
View File
@@ -3474,7 +3474,7 @@ checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4"
[[package]] [[package]]
name = "pdfs-cli" name = "pdfs-cli"
version = "3.0.0" version = "3.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
@@ -3485,13 +3485,15 @@ dependencies = [
"tokio", "tokio",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
"zeroize",
] ]
[[package]] [[package]]
name = "pdfs-core" name = "pdfs-core"
version = "3.0.0" version = "3.1.0"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64 0.23.1",
"dbus-secret-service-keyring-store", "dbus-secret-service-keyring-store",
"directories", "directories",
"ignore", "ignore",
@@ -3508,12 +3510,13 @@ dependencies = [
"thiserror 2.0.20", "thiserror 2.0.20",
"tokio", "tokio",
"tracing", "tracing",
"zeroize",
"zip", "zip",
] ]
[[package]] [[package]]
name = "pdfs-fuse" name = "pdfs-fuse"
version = "3.0.0" version = "3.1.0"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64 0.23.1", "base64 0.23.1",
@@ -3535,7 +3538,7 @@ dependencies = [
[[package]] [[package]]
name = "pdfs-gui" name = "pdfs-gui"
version = "3.0.0" version = "3.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-channel", "async-channel",
@@ -3572,9 +3575,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]] [[package]]
name = "pgp" name = "pgp"
version = "0.20.0" version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cfa4743b28656065ff4c0ba09e46b357a65e8c00fc2341e89084b82f87cbdf1" checksum = "ae70f4d9325a391db30d115d6191a7bb67cec856aa0bba131290f0c4e09a532a"
dependencies = [ dependencies = [
"aead 0.5.2", "aead 0.5.2",
"aes 0.8.4", "aes 0.8.4",
@@ -3775,9 +3778,9 @@ dependencies = [
[[package]] [[package]]
name = "proton-drive-rs" name = "proton-drive-rs"
version = "0.7.2" version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6ce113d234474821d34787436ee80e1458e3d8a8f97212219615ed315eb70be" checksum = "5bde475139afb5fc2649621e1d283e243f9df2bb412f08802cdf3f4ffaf97c44"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64 0.23.1", "base64 0.23.1",
@@ -3802,9 +3805,9 @@ dependencies = [
[[package]] [[package]]
name = "proton-sdk" name = "proton-sdk"
version = "0.7.2" version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a33c67df9694f90ce60e5b34984275956244138511b4640ca0d100e1dac8b3d" checksum = "faf32d0a03f7d13bd9bdcc8c9503e35e9df9318ca9f2a100dcf06cf50cb7ac8c"
dependencies = [ dependencies = [
"aes-gcm 0.11.1", "aes-gcm 0.11.1",
"async-trait", "async-trait",
@@ -3831,6 +3834,7 @@ dependencies = [
"thiserror 2.0.20", "thiserror 2.0.20",
"tokio", "tokio",
"tracing", "tracing",
"zeroize",
] ]
[[package]] [[package]]
+4 -3
View File
@@ -3,7 +3,7 @@ resolver = "2"
members = ["crates/pdfs-core", "crates/pdfs-fuse", "crates/pdfs-cli", "crates/pdfs-gui"] members = ["crates/pdfs-core", "crates/pdfs-fuse", "crates/pdfs-cli", "crates/pdfs-gui"]
[workspace.package] [workspace.package]
version = "3.0.0" version = "3.1.0"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
authors = ["Nils Pukropp <contact@narl.io>"] authors = ["Nils Pukropp <contact@narl.io>"]
@@ -15,8 +15,8 @@ keywords = ["proton", "drive", "fuse", "sync", "linux"]
categories = ["filesystem", "command-line-utilities"] categories = ["filesystem", "command-line-utilities"]
[workspace.dependencies] [workspace.dependencies]
proton-sdk = { version = "0.7.2" } proton-sdk = { version = "0.8.0" }
proton-drive-rs = { version = "0.7.2" } proton-drive-rs = { version = "0.8.0" }
# Internal crates. # Internal crates.
pdfs-core = { path = "crates/pdfs-core" } pdfs-core = { path = "crates/pdfs-core" }
@@ -26,6 +26,7 @@ tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "fs",
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
base64 = "0.23" base64 = "0.23"
zeroize = "1"
thiserror = "2" thiserror = "2"
anyhow = "1" anyhow = "1"
# Non-poisoning mutexes. A handler that panics while holding a lock must not # Non-poisoning mutexes. A handler that panics while holding a lock must not
+1
View File
@@ -23,3 +23,4 @@ tracing-subscriber.workspace = true
clap.workspace = true clap.workspace = true
rpassword.workspace = true rpassword.workspace = true
serde_json.workspace = true serde_json.workspace = true
zeroize.workspace = true
+154 -5
View File
@@ -135,6 +135,24 @@ enum Command {
/// Account email; prompted if omitted. /// Account email; prompted if omitted.
#[arg(short, long)] #[arg(short, long)]
username: Option<String>, username: Option<String>,
/// For a two-password account, keep the mailbox password's unlock in the
/// system keyring so the daemon starts without asking after every login.
/// Without it the unlock lives in kernel memory for this session only.
#[arg(long)]
remember: bool,
},
/// Enter the mailbox password of a two-password account so the daemon can
/// unlock your files. Needed once per login session.
Unlock {
/// Keep the unlock in the system keyring instead of kernel memory only.
#[arg(long)]
remember: bool,
},
/// Forget the unlock held in kernel memory; the account is locked again.
Lock {
/// Also remove an unlock kept in the keyring with `--remember`.
#[arg(long)]
forget: bool,
}, },
/// Forget the stored session. /// Forget the stored session.
Logout, Logout,
@@ -803,7 +821,9 @@ fn main() -> Result<()> {
let cli = Cli::parse(); let cli = Cli::parse();
JSON_OUTPUT.store(cli.json, std::sync::atomic::Ordering::Relaxed); JSON_OUTPUT.store(cli.json, std::sync::atomic::Ordering::Relaxed);
match cli.command { match cli.command {
Command::Login { username } => cmd_login(username), Command::Login { username, remember } => cmd_login(username, remember),
Command::Unlock { remember } => cmd_unlock(remember),
Command::Lock { forget } => cmd_lock(forget),
Command::Logout => cmd_logout(), Command::Logout => cmd_logout(),
Command::Status => cmd_status(), Command::Status => cmd_status(),
Command::Locations => cmd_locations(), Command::Locations => cmd_locations(),
@@ -1781,7 +1801,7 @@ fn prompt_line(label: &str) -> Result<String> {
Ok(line.trim().to_owned()) Ok(line.trim().to_owned())
} }
fn cmd_login(username: Option<String>) -> Result<()> { fn cmd_login(username: Option<String>, remember: bool) -> Result<()> {
let username = match username { let username = match username {
Some(u) => u, Some(u) => u,
None => prompt_line("Proton email")?, None => prompt_line("Proton email")?,
@@ -1793,11 +1813,14 @@ fn cmd_login(username: Option<String>) -> Result<()> {
prompt_line("2FA code").map_err(|e| pdfs_core::Error::Other(format!("read 2FA code: {e}"))) prompt_line("2FA code").map_err(|e| pdfs_core::Error::Other(format!("read 2FA code: {e}")))
}; };
// Only a two-password account is ever asked for this.
let get_mailbox = |attempt: u32| prompt_mailbox(attempt, remember);
let rt = tokio::runtime::Runtime::new()?; let rt = tokio::runtime::Runtime::new()?;
// Solving a CAPTCHA needs a browser engine, which the CLI has no business // 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 // carrying. Point at the app that does rather than failing with the raw API
// message, which reads as "your login is broken". // message, which reads as "your login is broken".
rt.block_on(auth::login(&username, &password, get_totp)) rt.block_on(auth::login(&username, &password, get_totp, get_mailbox))
.map_err(|e| match e { .map_err(|e| match e {
pdfs_core::Error::HumanVerificationRequired(_) => anyhow::anyhow!( pdfs_core::Error::HumanVerificationRequired(_) => anyhow::anyhow!(
"Proton is asking for a CAPTCHA before it will accept this sign-in.\n\ "Proton is asking for a CAPTCHA before it will accept this sign-in.\n\
@@ -1818,9 +1841,88 @@ fn cmd_login(username: Option<String>) -> Result<()> {
} }
println!("Logged in as {username}. Session stored in the system keyring."); println!("Logged in as {username}. Session stored in the system keyring.");
report_key_state();
Ok(()) Ok(())
} }
/// Ask for the mailbox password of a two-password account, without echo.
fn prompt_mailbox(attempt: u32, remember: bool) -> pdfs_core::Result<auth::Mailbox> {
if attempt == 0 {
eprintln!("This account has a separate mailbox password.");
} else {
eprintln!("That mailbox password did not unlock the account. Try again.");
}
let password = rpassword::prompt_password("Mailbox password: ")
.map_err(|e| pdfs_core::Error::Other(format!("read mailbox password: {e}")))?;
Ok(auth::Mailbox {
password: zeroize::Zeroizing::new(password),
remember,
})
}
/// Say where the account's keys are held, and what that means for the next login.
fn report_key_state() {
match auth::key_state() {
Ok(auth::KeyState::Session) => println!(
"Unlocked for this login session only. After you log out or reboot, run `pdfs unlock`."
),
Ok(auth::KeyState::Locked) => println!("The account is locked. Run `pdfs unlock`."),
_ => {}
}
}
fn cmd_unlock(remember: bool) -> Result<()> {
auth::load().context("not logged in (run `pdfs login` first)")?;
let rt = tokio::runtime::Runtime::new()?;
// Bounded like the login prompt: three wrong answers end the command.
let mut attempt = 0;
loop {
let mailbox = prompt_mailbox(attempt, remember)?;
match rt.block_on(auth::unlock(&mailbox.password, remember)) {
Ok(()) => break,
Err(pdfs_core::Error::WrongMailboxPassword) if attempt < 2 => attempt += 1,
Err(e) => return Err(anyhow::Error::new(e).context("unlock failed")),
}
}
// A daemon parked on the locked account would otherwise notice on its next
// poll; restarting it makes the mount appear now, as after `pdfs login`.
if service::is_active() {
service::restart();
}
println!("Unlocked.");
report_key_state();
Ok(())
}
fn cmd_lock(forget: bool) -> Result<()> {
auth::lock(forget)?;
println!(
"Locked. {}",
if forget {
"Unlock removed from memory and keyring."
} else {
"Run `pdfs unlock` to unlock again."
}
);
// The running daemon keeps its keys until it restarts; say so, since
// "locked" would otherwise suggest the mount stopped.
if service::is_active() {
println!(
"The running daemon keeps its keys until it restarts: `systemctl --user restart proton-drive`."
);
}
Ok(())
}
/// `stored`, `session` or `locked`: where the account's keys are held.
fn key_state_name() -> &'static str {
match auth::key_state() {
Ok(auth::KeyState::Stored) => "stored",
Ok(auth::KeyState::Session) => "session",
_ => "locked",
}
}
fn cmd_logout() -> Result<()> { fn cmd_logout() -> Result<()> {
auth::logout()?; auth::logout()?;
println!("Stored session cleared."); println!("Stored session cleared.");
@@ -1848,6 +1950,7 @@ fn cmd_status() -> Result<()> {
"username": session.as_ref().map(|s| s.username.clone()), "username": session.as_ref().map(|s| s.username.clone()),
"user_id": session.as_ref().map(|s| s.user_id.clone()), "user_id": session.as_ref().map(|s| s.user_id.clone()),
"scopes": session.as_ref().map(|s| s.scopes.clone()), "scopes": session.as_ref().map(|s| s.scopes.clone()),
"keys": session.as_ref().map(|_| key_state_name()),
"mount": mount, "mount": mount,
}); });
println!("{}", serde_json::to_string_pretty(&out)?); println!("{}", serde_json::to_string_pretty(&out)?);
@@ -1858,6 +1961,11 @@ fn cmd_status() -> Result<()> {
Ok(s) => { Ok(s) => {
println!("Logged in as {} (user {})", s.username, s.user_id); println!("Logged in as {} (user {})", s.username, s.user_id);
println!("Scopes: {}", s.scopes.join(", ")); println!("Scopes: {}", s.scopes.join(", "));
match key_state_name() {
"locked" => println!("Keys: locked — run `pdfs unlock`"),
"session" => println!("Keys: unlocked for this login session"),
_ => {}
}
} }
Err(pdfs_core::Error::NotLoggedIn) => { Err(pdfs_core::Error::NotLoggedIn) => {
println!("Not logged in. Run `pdfs login`."); println!("Not logged in. Run `pdfs login`.");
@@ -1989,7 +2097,7 @@ fn login_poll_delay(attempts: u32) -> std::time::Duration {
std::time::Duration::from_secs(BASE_SECS.saturating_mul(factor).min(MAX_SECS)) std::time::Duration::from_secs(BASE_SECS.saturating_mul(factor).min(MAX_SECS))
} }
/// Block until a session is stored, backing off between checks. /// Block until a session is stored and unlocked, backing off between checks.
/// ///
/// `load` and `sleep` are parameters rather than direct calls so the backoff /// `load` and `sleep` are parameters rather than direct calls so the backoff
/// schedule can be tested without a keyring and without real time passing. /// schedule can be tested without a keyring and without real time passing.
@@ -2014,6 +2122,16 @@ where
sleep(delay); sleep(delay);
attempts = attempts.saturating_add(1); attempts = attempts.saturating_add(1);
} }
Err(pdfs_core::Error::Locked) => {
let delay = login_poll_delay(attempts);
if attempts == 0 {
tracing::info!("account is locked; waiting for `pdfs unlock`…");
} else {
tracing::debug!(delay_secs = delay.as_secs(), "account still locked");
}
sleep(delay);
attempts = attempts.saturating_add(1);
}
Err(e) => return Err(e.into()), Err(e) => return Err(e.into()),
} }
} }
@@ -2024,10 +2142,13 @@ where
/// an external unmount triggers a remount; errors back off and retry. This is /// an external unmount triggers a remount; errors back off and retry. This is
/// the entry point for the systemd user service. /// the entry point for the systemd user service.
fn cmd_daemon(mountpoint: Option<PathBuf>) -> Result<()> { fn cmd_daemon(mountpoint: Option<PathBuf>) -> Result<()> {
// The daemon holds the account's key passphrases in memory; keep them out
// of core dumps and away from same-user ptrace.
pdfs_core::kernelkey::forbid_dumps();
loop { loop {
// Wait until a session is stored. The GUI enables this service on login, // Wait until a session is stored. The GUI enables this service on login,
// but the service may also start at boot before the user has logged in. // but the service may also start at boot before the user has logged in.
wait_for_session(|| auth::load().map(|_| ()), pdfs_fuse::idle_sleep)?; wait_for_session(auth::ready, pdfs_fuse::idle_sleep)?;
match mount_once(mountpoint.clone()) { match mount_once(mountpoint.clone()) {
Ok(pdfs_fuse::MountOutcome::Shutdown) => { Ok(pdfs_fuse::MountOutcome::Shutdown) => {
@@ -3224,6 +3345,19 @@ fn cmd_diagnose() -> Result<()> {
match pdfs_core::auth::load() { match pdfs_core::auth::load() {
Ok(session) => { Ok(session) => {
report.finding(DiagnoseLevel::Ok, " keyring session", session.username); report.finding(DiagnoseLevel::Ok, " keyring session", session.username);
match key_state_name() {
"locked" => report.finding(
DiagnoseLevel::Fail,
" account keys",
"locked — run `pdfs unlock` (the daemon waits for it)",
),
"session" => report.finding(
DiagnoseLevel::Ok,
" account keys",
"unlocked for this login session",
),
_ => report.finding(DiagnoseLevel::Ok, " account keys", "stored in the keyring"),
}
} }
Err(e) => { Err(e) => {
// A locked keyring and an absent login look the same from here, so // A locked keyring and an absent login look the same from here, so
@@ -3522,6 +3656,21 @@ mod login_wait_tests {
); );
} }
#[test]
fn a_locked_account_is_waited_on_until_it_is_unlocked() {
let mut checks = vec![
Ok(()),
Err(pdfs_core::Error::Locked),
Err(pdfs_core::Error::NotLoggedIn),
Err(pdfs_core::Error::Locked),
];
let mut slept = 0;
wait_for_session(|| checks.pop().unwrap(), |_| slept += 1).unwrap();
assert_eq!(slept, 3, "locked and signed-out are both waited out");
}
#[test] #[test]
fn a_stored_session_is_not_waited_for_at_all() { fn a_stored_session_is_not_waited_for_at_all() {
let mut slept = 0; let mut slept = 0;
+2
View File
@@ -28,3 +28,5 @@ dbus-secret-service-keyring-store.workspace = true
parking_lot.workspace = true parking_lot.workspace = true
async-trait.workspace = true async-trait.workspace = true
libc.workspace = true libc.workspace = true
zeroize.workspace = true
base64.workspace = true
+467 -118
View File
@@ -1,22 +1,50 @@
//! Login, session persistence, and Drive-client construction. //! Login, session persistence, and Drive-client construction.
//! //!
//! A successful login is persisted to the OS keyring as a single JSON blob //! A successful login is persisted to the OS keyring as a single JSON blob
//! holding the resumable session tokens plus the mailbox password (needed to //! holding the resumable session tokens, the account's key salts and — unless
//! rebuild the key chain on resume). The daemon resumes from this blob with no //! the user chose otherwise — the per-key *passphrases* derived from the
//! interactive step; the refresh token auto-renews via the HTTP client's 401 //! mailbox password. The password itself is never stored: the passphrases are
//! path, so no fresh 2FA is required until the refresh token itself expires. //! what it exists to produce, and they are enough to rebuild the key chain on
//! resume. The daemon resumes from this blob with no interactive step; the
//! refresh token auto-renews via the HTTP client's 401 path, so no fresh 2FA is
//! required until the refresh token itself expires.
//!
//! # Two-password accounts
//!
//! An account with a separate mailbox password exists precisely so that no one
//! login holds the means to read the data. Storing that password in the keyring
//! would defeat it, so such an account is **locked by default**: its
//! passphrases are kept only in the kernel keyring ([`crate::kernelkey`]), for
//! the length of the user's session, and `pdfs unlock` (or the app) supplies
//! them again after each login. Storing them in the Secret Service as well is
//! an explicit opt-in ([`Mailbox::remember`]). Single-password accounts have no
//! such separation to protect and are stored, as they always were.
use std::collections::BTreeMap;
use base64::Engine as _;
use base64::engine::general_purpose::STANDARD as BASE64;
use keyring_core::Entry; use keyring_core::Entry;
use proton_drive_rs::{KeySalt, ProtonDriveClient}; use proton_drive_rs::{KeySalt, ProtonDriveClient};
use proton_sdk::account::KeyPassphrases;
use proton_sdk::api::{HumanVerification, HumanVerificationCredential}; use proton_sdk::api::{HumanVerification, HumanVerificationCredential};
use proton_sdk::cache::EncryptedCacheRepository; use proton_sdk::cache::EncryptedCacheRepository;
use proton_sdk::config::ProtonClientConfiguration; use proton_sdk::config::ProtonClientConfiguration;
use proton_sdk::error::ProtonError;
use proton_sdk::session::{PasswordMode, ProtonApiSession, ResumeParameters}; use proton_sdk::session::{PasswordMode, ProtonApiSession, ResumeParameters};
use proton_sdk::telemetry::TracingTelemetry; use proton_sdk::telemetry::TracingTelemetry;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use zeroize::Zeroizing;
use crate::config::{APP_VERSION, AppDirs, KEYRING_SERVICE, USER_AGENT}; use crate::config::{APP_VERSION, AppDirs, KEYRING_SERVICE, USER_AGENT};
use crate::error::{Error, Result}; use crate::error::{Error, Result};
use crate::kernelkey;
/// How often a wrong mailbox password is asked for again before the login gives up.
const MAILBOX_ATTEMPTS: u32 = 3;
/// Domain-separation label for the key that encrypts the persistent entity cache.
const ENTITY_CACHE_PURPOSE: &[u8] = b"pdfs entity cache v1";
/// Fixed keyring account name for the single stored session blob. /// Fixed keyring account name for the single stored session blob.
const KEYRING_USER: &str = "session"; const KEYRING_USER: &str = "session";
@@ -32,8 +60,11 @@ pub struct StoredSession {
pub scopes: Vec<String>, pub scopes: Vec<String>,
/// `1` = single password, `2` = dual (Proton wire value). /// `1` = single password, `2` = dual (Proton wire value).
pub password_mode: u8, pub password_mode: u8,
/// Mailbox (data) password — required by `ProtonDriveClient::new` to derive /// The mailbox password of a blob written by 3.0.x and earlier.
/// the key chain. Lives only in the OS keyring, never on disk in cleartext. ///
/// Read only, to migrate: [`resume_client`] derives the passphrases from it
/// once and writes the blob back without it. Never serialized again.
#[serde(default, skip_serializing)]
pub mailbox_password: String, pub mailbox_password: String,
/// The account's key salts, captured at login. /// The account's key salts, captured at login.
/// ///
@@ -49,6 +80,11 @@ pub struct StoredSession {
/// backfilling) them. /// backfilling) them.
#[serde(default)] #[serde(default)]
pub key_salts: Vec<KeySalt>, pub key_salts: Vec<KeySalt>,
/// Per-key passphrases (key id → base64), when the user keeps them in the
/// keyring: always for a single-password account, by opt-in for a
/// two-password one. `None` means they are not stored here.
#[serde(default, skip_serializing_if = "Option::is_none")]
pub key_passphrases: Option<BTreeMap<String, String>>,
} }
impl StoredSession { impl StoredSession {
@@ -89,6 +125,26 @@ fn keyring_entry() -> Result<Entry> {
Ok(Entry::new(KEYRING_SERVICE, KEYRING_USER)?) Ok(Entry::new(KEYRING_SERVICE, KEYRING_USER)?)
} }
/// What the user answered when asked for the mailbox password.
pub struct Mailbox {
pub password: Zeroizing<String>,
/// Keep the derived passphrases in the keyring, so the daemon unlocks by
/// itself after every login. Off by default: it trades the protection a
/// separate mailbox password gives for convenience.
pub remember: bool,
}
/// Where the passphrases that unlock this account's keys currently live.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum KeyState {
/// In the keyring, available after every login.
Stored,
/// In kernel memory for this login session only.
Session,
/// Nowhere: the mailbox password has to be entered (`pdfs unlock`).
Locked,
}
/// Run an interactive SRP + (optional) 2FA login and persist the session. /// Run an interactive SRP + (optional) 2FA login and persist the session.
/// ///
/// `get_totp` is only invoked when the account requires a second factor, so /// `get_totp` is only invoked when the account requires a second factor, so
@@ -96,14 +152,19 @@ fn keyring_entry() -> Result<Entry> {
/// more than once — [`login_interactive`] re-runs the whole login after human /// more than once — [`login_interactive`] re-runs the whole login after human
/// verification, and a 2FA account needs a fresh code on that second attempt. /// verification, and a 2FA account needs a fresh code on that second attempt.
/// ///
/// `get_mailbox` is only invoked for a two-password account. It receives the
/// number of earlier wrong answers (so a prompt can say "try again") and is
/// asked at most [`MAILBOX_ATTEMPTS`] times; an `Err` from it aborts the login.
///
/// A gated login fails with [`Error::HumanVerificationRequired`]; a front-end /// A gated login fails with [`Error::HumanVerificationRequired`]; a front-end
/// that can present the challenge should use [`login_interactive`] instead. /// that can present the challenge should use [`login_interactive`] instead.
pub async fn login( pub async fn login(
username: &str, username: &str,
password: &str, password: &str,
get_totp: impl Fn() -> Result<String>, get_totp: impl Fn() -> Result<String>,
get_mailbox: impl Fn(u32) -> Result<Mailbox>,
) -> Result<()> { ) -> Result<()> {
login_verified(username, password, None, get_totp).await login_verified(username, password, None, get_totp, get_mailbox).await
} }
/// [`login`], able to answer a human-verification gate rather than fail on it. /// [`login`], able to answer a human-verification gate rather than fail on it.
@@ -123,12 +184,20 @@ pub async fn login_interactive(
username: &str, username: &str,
password: &str, password: &str,
get_totp: impl Fn() -> Result<String>, get_totp: impl Fn() -> Result<String>,
get_mailbox: impl Fn(u32) -> Result<Mailbox>,
get_hv: impl FnOnce(HumanVerification) -> Result<HumanVerificationCredential>, get_hv: impl FnOnce(HumanVerification) -> Result<HumanVerificationCredential>,
) -> Result<()> { ) -> Result<()> {
match login_verified(username, password, None, &get_totp).await { match login_verified(username, password, None, &get_totp, &get_mailbox).await {
Err(Error::HumanVerificationRequired(hv)) => { Err(Error::HumanVerificationRequired(hv)) => {
let credential = get_hv(*hv)?; let credential = get_hv(*hv)?;
login_verified(username, password, Some(&credential), &get_totp).await login_verified(
username,
password,
Some(&credential),
&get_totp,
&get_mailbox,
)
.await
} }
other => other, other => other,
} }
@@ -145,15 +214,18 @@ pub async fn login_verified(
password: &str, password: &str,
verification: Option<&HumanVerificationCredential>, verification: Option<&HumanVerificationCredential>,
get_totp: impl Fn() -> Result<String>, get_totp: impl Fn() -> Result<String>,
get_mailbox: impl Fn(u32) -> Result<Mailbox>,
) -> Result<()> { ) -> Result<()> {
let mut session = ProtonApiSession::begin_verified( let password = Zeroizing::new(password.to_owned());
let session = ProtonApiSession::begin_verified(
client_config(), client_config(),
username, username,
password.as_bytes(), password.as_bytes(),
verification, verification,
) )
.await .await
.map_err(classify_verification_gate)?; .map_err(classify_verification_gate);
let mut session = session?;
if session.is_waiting_for_second_factor() { if session.is_waiting_for_second_factor() {
let code = get_totp()?; let code = get_totp()?;
@@ -163,38 +235,38 @@ pub async fn login_verified(
// Grab the key salts while this access token still has the `locked` scope: // Grab the key salts while this access token still has the `locked` scope:
// after its first refresh it never will again, and without them no later // after its first refresh it never will again, and without them no later
// resume can unlock the key chain. See `StoredSession::key_salts`. // resume can unlock the key chain. See `StoredSession::key_salts`.
let client = ProtonDriveClient::new(&session, password.as_bytes().to_vec()); let key_salts = ProtonDriveClient::new(&session, Vec::new())
let key_salts = client.account().key_salts().await?; .account()
.key_salts()
.await?;
register_refresh_handler(&session, password.to_owned(), key_salts.clone()); // A single-password account's mailbox password is the login password. A
// two-password one has a second secret the user must type, and it is checked
save(&session, password, key_salts).await?; // against the account now — a typo found at login is a retry, found later it
Ok(()) // is a daemon that never mounts.
} let (passphrases, remember) = match session.password_mode() {
PasswordMode::Single => (
/// Lift a human-verification gate out of the generic API error into the typed derive_verified(&session, password.as_bytes(), key_salts.clone()).await?,
/// variant a front-end can act on. true,
/// ),
/// Only a gate that names a solvable method is converted. A `9001` with no PasswordMode::Dual => {
/// `Details`, or one offering only `email`/`sms`, stays a plain API error: let mut attempt = 0;
/// promoting it would send the UI to open a verification page it cannot loop {
/// complete, which reads to the user as a hang rather than a refusal. let mailbox = get_mailbox(attempt)?;
fn classify_verification_gate(e: proton_sdk::error::ProtonError) -> Error { match derive_verified(&session, mailbox.password.as_bytes(), key_salts.clone())
let proton_sdk::error::ProtonError::Api(api) = &e else { .await
return e.into(); {
Ok(passphrases) => break (passphrases, mailbox.remember),
Err(Error::WrongMailboxPassword) if attempt + 1 < MAILBOX_ATTEMPTS => {
attempt += 1;
}
Err(e) => return Err(e),
}
}
}
}; };
match api.human_verification() {
Some(hv) if hv.supports_captcha() => Error::HumanVerificationRequired(Box::new(hv)),
_ => e.into(),
}
}
/// Persist the session's current tokens, mailbox password and key salts. register_refresh_handler(&session);
pub async fn save(
session: &ProtonApiSession,
mailbox_password: &str,
key_salts: Vec<KeySalt>,
) -> Result<()> {
let tokens = session.current_tokens().await; let tokens = session.current_tokens().await;
let stored = StoredSession { let stored = StoredSession {
session_id: session.session_id().as_str().to_owned(), session_id: session.session_id().as_str().to_owned(),
@@ -207,10 +279,103 @@ pub async fn save(
PasswordMode::Single => 1, PasswordMode::Single => 1,
PasswordMode::Dual => 2, PasswordMode::Dual => 2,
}, },
mailbox_password: mailbox_password.to_owned(), mailbox_password: String::new(),
key_salts, key_salts,
key_passphrases: None,
}; };
let json = serde_json::to_string(&stored)?; keep_passphrases(stored, &passphrases, remember)
}
/// Derive the key passphrases from `mailbox` and prove they unlock the account.
///
/// [`Error::WrongMailboxPassword`] means the account answered and the password
/// is wrong; any other error says nothing about the password (no network, an
/// API fault) and must not be reported as a typo.
async fn derive_verified(
session: &ProtonApiSession,
mailbox: &[u8],
key_salts: Vec<KeySalt>,
) -> Result<KeyPassphrases> {
let client = ProtonDriveClient::with_key_salts(session, mailbox.to_vec(), key_salts);
client.account().unlock().await.map_err(|e| match e {
ProtonError::KeysLocked => Error::WrongMailboxPassword,
other => other.into(),
})?;
Ok(client.account().key_passphrases().await?)
}
/// Write `stored` with the passphrases in the place the user chose: the
/// keyring (`remember`) or kernel memory only. Whichever is not chosen is
/// cleared, so a revoked choice never leaves a copy behind.
///
/// The kernel entry is written first. If it cannot be (no keyring support), the
/// secret is *not* quietly stored somewhere weaker: the blob is written locked
/// and the error says so.
fn keep_passphrases(
mut stored: StoredSession,
passphrases: &KeyPassphrases,
remember: bool,
) -> Result<()> {
let outcome = if remember {
stored.key_passphrases = Some(encode(passphrases));
// Best-effort: a system without a kernel keyring has nothing to clear.
let _ = kernelkey::clear();
Ok(())
} else {
stored.key_passphrases = None;
kernelkey::store(&encode_secret(passphrases)).map_err(|e| {
Error::Other(format!(
"the kernel keyring is unavailable, so the unlock cannot be kept for this session: {e}"
))
})
};
write_stored(&stored)?;
outcome
}
fn encode(passphrases: &KeyPassphrases) -> BTreeMap<String, String> {
passphrases
.iter()
.map(|(id, secret)| (id.to_owned(), BASE64.encode(secret)))
.collect()
}
fn decode(encoded: &BTreeMap<String, String>) -> Option<KeyPassphrases> {
let mut passphrases = KeyPassphrases::new();
for (id, secret) in encoded {
passphrases.insert(id.clone(), BASE64.decode(secret).ok()?);
}
(!passphrases.is_empty()).then_some(passphrases)
}
/// The kernel-keyring payload: the same map as the blob's, as JSON.
fn encode_secret(passphrases: &KeyPassphrases) -> Zeroizing<Vec<u8>> {
Zeroizing::new(serde_json::to_vec(&encode(passphrases)).unwrap_or_default())
}
fn decode_secret(secret: &[u8]) -> Option<KeyPassphrases> {
decode(&serde_json::from_slice(secret).ok()?)
}
/// Lift a human-verification gate out of the generic API error into the typed
/// variant a front-end can act on.
///
/// Only a gate that names a solvable method is converted. A `9001` with no
/// `Details`, or one offering only `email`/`sms`, stays a plain API error:
/// promoting it would send the UI to open a verification page it cannot
/// complete, which reads to the user as a hang rather than a refusal.
fn classify_verification_gate(e: ProtonError) -> Error {
let ProtonError::Api(api) = &e else {
return e.into();
};
match api.human_verification() {
Some(hv) if hv.supports_captcha() => Error::HumanVerificationRequired(Box::new(hv)),
_ => e.into(),
}
}
fn write_stored(stored: &StoredSession) -> Result<()> {
let json = Zeroizing::new(serde_json::to_string(stored)?);
keyring_entry()?.set_password(&json)?; keyring_entry()?.set_password(&json)?;
Ok(()) Ok(())
} }
@@ -225,12 +390,93 @@ pub fn load() -> Result<StoredSession> {
} }
} }
/// Where the passphrases for the stored session live right now.
///
/// Reads the kernel keyring and the stored blob only; never the network.
pub fn key_state() -> Result<KeyState> {
Ok(key_state_of(&load()?))
}
fn key_state_of(stored: &StoredSession) -> KeyState {
match find_passphrases(stored) {
Ok(Some((_, origin))) => origin,
// A 3.0.x blob still holds its password; `resume_client` migrates it.
_ if !stored.mailbox_password.is_empty() => KeyState::Stored,
_ => KeyState::Locked,
}
}
/// Whether the stored session can be resumed without asking the user:
/// `Ok` when it can, [`Error::NotLoggedIn`] or [`Error::Locked`] when not.
/// What the daemon waits on before it mounts.
pub fn ready() -> Result<()> {
match key_state_of(&load()?) {
KeyState::Locked => Err(Error::Locked),
_ => Ok(()),
}
}
/// The passphrases the stored session can use without being asked, and which
/// of the two places they came from. Prefers the keyring blob: it is what the
/// user opted into. A corrupt entry is treated as absent, so it reads as
/// locked instead of wedging the daemon.
fn find_passphrases(stored: &StoredSession) -> Result<Option<(KeyPassphrases, KeyState)>> {
if let Some(found) = stored.key_passphrases.as_ref().and_then(decode) {
return Ok(Some((found, KeyState::Stored)));
}
match kernelkey::load() {
Ok(Some(secret)) => Ok(decode_secret(&secret).map(|p| (p, KeyState::Session))),
Ok(None) => Ok(None),
// No keyring on this system: nothing was ever kept there.
Err(e) => {
tracing::debug!(error = %e, "kernel keyring not readable; treating the account as locked");
Ok(None)
}
}
}
/// Supply the mailbox password of a locked account.
///
/// Verifies it against the account, then keeps the derived passphrases in
/// kernel memory for this login session — or, with `remember`, in the keyring.
/// A daemon waiting on [`Error::Locked`] picks them up on its next attempt.
///
/// Fails with [`Error::WrongMailboxPassword`] for a wrong password, which
/// changes nothing, and [`Error::ReloginRequired`] for a session that predates
/// stored key salts.
pub async fn unlock(mailbox: &str, remember: bool) -> Result<()> {
let stored = load()?;
if stored.key_salts.is_empty() {
return Err(Error::ReloginRequired);
}
let mailbox = Zeroizing::new(mailbox.to_owned());
let session = ProtonApiSession::resume(client_config(), stored.to_params())?;
register_refresh_handler(&session);
let passphrases =
derive_verified(&session, mailbox.as_bytes(), stored.key_salts.clone()).await?;
keep_passphrases(stored, &passphrases, remember)
}
/// Drop the passphrases held in kernel memory, so the account is locked again
/// until [`unlock`]. With `forget`, also those in the keyring blob.
pub fn lock(forget: bool) -> Result<()> {
kernelkey::clear()?;
if forget {
let mut stored = load()?;
if stored.key_passphrases.take().is_some() {
write_stored(&stored)?;
}
}
Ok(())
}
/// Forget the persisted session (best-effort; absent entry is not an error). /// Forget the persisted session (best-effort; absent entry is not an error).
pub fn logout() -> Result<()> { pub fn logout() -> Result<()> {
// The persisted entity cache describes the account being logged out of. It // The persisted entity cache describes the account being logged out of. It
// is encrypted under that account's mailbox password, but leaving it behind // is encrypted under a key derived from that account's passphrases, but
// would also mean the next account inherits a store it can only ever read as // leaving it behind would also mean the next account inherits a store it can
// misses. Best-effort: failing to remove a cache must not block the logout. // only ever read as misses. Best-effort: failing to remove a cache must not
// block the logout.
if let Ok(dirs) = AppDirs::new() { if let Ok(dirs) = AppDirs::new() {
let path = dirs.state_dir().join("sdk_cache.db"); let path = dirs.state_dir().join("sdk_cache.db");
if let Some(cache) = crate::sdkcache::SdkCache::opened() if let Some(cache) = crate::sdkcache::SdkCache::opened()
@@ -242,6 +488,9 @@ pub fn logout() -> Result<()> {
let _ = std::fs::remove_file(format!("{}{suffix}", path.display())); let _ = std::fs::remove_file(format!("{}{suffix}", path.display()));
} }
} }
if let Err(e) = kernelkey::clear() {
tracing::warn!(error = %e, "clearing the kernel-keyring unlock on logout failed");
}
match keyring_entry()?.delete_credential() { match keyring_entry()?.delete_credential() {
Ok(()) | Err(keyring_core::Error::NoEntry) => Ok(()), Ok(()) | Err(keyring_core::Error::NoEntry) => Ok(()),
Err(e) => Err(e.into()), Err(e) => Err(e.into()),
@@ -250,44 +499,87 @@ pub fn logout() -> Result<()> {
/// Resume a persisted session and build an authenticated Drive client. /// Resume a persisted session and build an authenticated Drive client.
/// ///
/// Returns `Error::NotLoggedIn` when no session has been saved. The caller is /// Returns `Error::NotLoggedIn` when no session has been saved and
/// responsible for persisting rotated tokens over the session's lifetime via /// [`Error::Locked`] when the account is waiting for its mailbox password. Tokens
/// [`persist`] — Proton refresh tokens are single-use, so a refresh that is not /// the session rotates are written back to the keyring as they happen (see
/// written back leaves the keyring holding a stale (now-invalid) refresh token, /// [`register_refresh_handler`]); Proton refresh tokens are single-use, so a
/// and the next resume fails with `InvalidRefreshToken`. /// refresh that is not written back would leave the keyring holding a stale
/// refresh token, and the next resume would fail with `InvalidRefreshToken`.
///
/// Makes no network call for an account whose passphrases are already known, so
/// a daemon starting offline can still mount from its cache.
pub async fn resume_client() -> Result<(ProtonDriveClient, ProtonApiSession)> { pub async fn resume_client() -> Result<(ProtonDriveClient, ProtonApiSession)> {
let stored = load()?; let stored = load()?;
let session = ProtonApiSession::resume(client_config(), stored.to_params())?; let session = ProtonApiSession::resume(client_config(), stored.to_params())?;
let password = stored.mailbox_password.clone(); register_refresh_handler(&session);
// Blobs written before key salts were persisted have none: fetch them once let passphrases = match find_passphrases(&stored)? {
// more and write them back, which only works while the stored access token Some((passphrases, _)) => passphrases,
// still carries the `locked` scope. If it doesn't, the account must be None if !stored.mailbox_password.is_empty() => migrate_legacy(&session, &stored).await?,
// logged into again — no refresh can restore that scope. None => return Err(Error::Locked),
let key_salts = if stored.key_salts.is_empty() {
register_refresh_handler(&session, password.clone(), Vec::new());
let probe = ProtonDriveClient::new(&session, password.clone().into_bytes());
let salts = probe.account().key_salts().await.map_err(|e| match &e {
proton_sdk::error::ProtonError::Api(api) if api.is_insufficient_scope() => {
Error::ReloginRequired
}
_ => e.into(),
})?;
save(&session, &password, salts.clone()).await?;
salts
} else {
stored.key_salts
}; };
register_refresh_handler(&session, password.clone(), key_salts.clone());
let client = tune( let client = tune(
ProtonDriveClient::with_key_salts(&session, password.clone().into_bytes(), key_salts), ProtonDriveClient::with_key_passphrases(&session, passphrases.clone()),
password.as_bytes(), &passphrases,
); );
Ok((client, session)) Ok((client, session))
} }
/// Turn a blob written by 3.0.x — which holds the mailbox password — into one
/// that holds passphrases, so the password stops being stored.
///
/// The old login saved whatever was typed as the mailbox password, which for a
/// two-password account is the *login* password and unlocks nothing. That is
/// checked here: a password the account rejects leaves the account locked (and
/// the stored copy gone) rather than failing every start forever.
async fn migrate_legacy(
session: &ProtonApiSession,
stored: &StoredSession,
) -> Result<KeyPassphrases> {
let legacy = Zeroizing::new(stored.mailbox_password.clone());
// Blobs from before key salts were persisted have none: fetch them once
// more, which only works while the stored access token still carries the
// `locked` scope. If it doesn't, the account must be logged into again — no
// refresh can restore that scope.
let key_salts = if stored.key_salts.is_empty() {
ProtonDriveClient::new(session, Vec::new())
.account()
.key_salts()
.await
.map_err(|e| match &e {
ProtonError::Api(api) if api.is_insufficient_scope() => Error::ReloginRequired,
_ => e.into(),
})?
} else {
stored.key_salts.clone()
};
let mut migrated = stored.clone();
migrated.mailbox_password = String::new();
migrated.key_salts = key_salts.clone();
match derive_verified(session, legacy.as_bytes(), key_salts).await {
Ok(passphrases) => {
migrated.key_passphrases = Some(encode(&passphrases));
write_stored(&migrated)?;
tracing::info!(
"migrated the stored session from a mailbox password to key passphrases"
);
Ok(passphrases)
}
Err(Error::WrongMailboxPassword) => {
write_stored(&migrated)?;
tracing::warn!(
"the stored password does not unlock the account's keys; unlock required"
);
Err(Error::Locked)
}
Err(e) => Err(e),
}
}
/// The client settings every front-end wants, applied wherever a /// The client settings every front-end wants, applied wherever a
/// [`ProtonDriveClient`] is built for real work. /// [`ProtonDriveClient`] is built for real work.
/// ///
@@ -301,23 +593,24 @@ pub async fn resume_client() -> Result<(ProtonDriveClient, ProtonApiSession)> {
/// failure point per write instead of three. /// failure point per write instead of three.
/// - **A persistent entity cache** ([`crate::sdkcache`]), so a restart does not /// - **A persistent entity cache** ([`crate::sdkcache`]), so a restart does not
/// re-fetch and re-decrypt the tree the previous run already walked. It is /// re-fetch and re-decrypt the tree the previous run already walked. It is
/// wrapped in the SDK's [`EncryptedCacheRepository`] keyed by the mailbox /// wrapped in the SDK's [`EncryptedCacheRepository`] keyed by a secret derived
/// password, so the decrypted node names it holds are not readable from the /// from the key passphrases, so the decrypted node names it holds are not
/// file alone — and a password change simply reads as a cold cache, since the /// readable from the file alone — and a password change simply reads as a cold
/// SDK treats an undecryptable entry as a miss and clears the store. /// cache, since the SDK treats an undecryptable entry as a miss and clears the
/// store.
/// ///
/// Opening it is best-effort: a store this process cannot open costs cache /// Opening it is best-effort: a store this process cannot open costs cache
/// hits, not the session, so the client falls back to the SDK's in-memory /// hits, not the session, so the client falls back to the SDK's in-memory
/// default. /// default.
fn tune(client: ProtonDriveClient, mailbox_password: &[u8]) -> ProtonDriveClient { fn tune(client: ProtonDriveClient, passphrases: &KeyPassphrases) -> ProtonDriveClient {
let client = client let client = client
.with_telemetry(TracingTelemetry::shared()) .with_telemetry(TracingTelemetry::shared())
.with_small_file_upload(true); .with_small_file_upload(true);
match AppDirs::new().and_then(|dirs| crate::sdkcache::SdkCache::shared(&dirs)) { match AppDirs::new().and_then(|dirs| crate::sdkcache::SdkCache::shared(&dirs)) {
Ok(cache) => client.with_entity_repository(EncryptedCacheRepository::shared( Ok(cache) => {
cache, let key = passphrases.derive_secret(ENTITY_CACHE_PURPOSE);
mailbox_password.to_vec(), client.with_entity_repository(EncryptedCacheRepository::shared(cache, key.to_vec()))
)), }
Err(e) => { Err(e) => {
tracing::warn!(error = %e, "persistent SDK entity cache unavailable; using memory"); tracing::warn!(error = %e, "persistent SDK entity cache unavailable; using memory");
client client
@@ -327,49 +620,105 @@ fn tune(client: ProtonDriveClient, mailbox_password: &[u8]) -> ProtonDriveClient
/// Write the session's current tokens back to the keyring. /// Write the session's current tokens back to the keyring.
/// ///
/// The session does not carry the mailbox password (it is only needed to rebuild /// Everything else in the stored blob — salts, passphrases — is preserved, so
/// the key chain on resume), so it is re-read from the existing stored blob and /// this never undoes an [`unlock`] or [`lock`] made since the session started.
/// preserved. Call whenever the session may have rotated its tokens through the /// Call whenever the session may have rotated its tokens so a later
/// 401-refresh path so a later [`resume_client`] presents a live refresh token. /// [`resume_client`] presents a live refresh token.
pub async fn persist(session: &ProtonApiSession) -> Result<()> { pub async fn persist(session: &ProtonApiSession) -> Result<()> {
let stored = load()?; let tokens = session.current_tokens().await;
save(session, &stored.mailbox_password, stored.key_salts).await store_tokens(tokens.access_token, tokens.refresh_token)
} }
fn register_refresh_handler( fn store_tokens(access_token: String, refresh_token: String) -> Result<()> {
session: &ProtonApiSession, let mut stored = load()?;
mailbox_password: String, stored.access_token = access_token;
key_salts: Vec<KeySalt>, stored.refresh_token = refresh_token;
) { write_stored(&stored)
let session_id = session.session_id().as_str().to_owned(); }
let username = session.username().to_owned();
let user_id = session.user_id().as_str().to_owned();
let scopes = session.scopes().to_vec();
let password_mode = match session.password_mode() {
PasswordMode::Single => 1,
PasswordMode::Dual => 2,
};
/// Persist rotated tokens the moment the session obtains them.
///
/// The handler re-reads the stored blob instead of capturing one, so it cannot
/// write back a stale copy over a later unlock or lock — and cannot resurrect a
/// session that was logged out while the daemon still ran.
fn register_refresh_handler(session: &ProtonApiSession) {
session.http().set_on_tokens_refreshed(move |tokens| { session.http().set_on_tokens_refreshed(move |tokens| {
let stored = StoredSession { match store_tokens(tokens.access_token, tokens.refresh_token) {
session_id: session_id.clone(), Ok(()) => tracing::info!("successfully auto-persisted refreshed tokens in keyring"),
username: username.clone(), Err(Error::NotLoggedIn) => {}
user_id: user_id.clone(), Err(e) => {
access_token: tokens.access_token, tracing::warn!(error = %e, "failed to auto-persist refreshed tokens in keyring")
refresh_token: tokens.refresh_token,
scopes: scopes.clone(),
password_mode,
mailbox_password: mailbox_password.clone(),
key_salts: key_salts.clone(),
};
if let Ok(json) = serde_json::to_string(&stored)
&& let Ok(entry) = keyring_entry()
{
if let Err(e) = entry.set_password(&json) {
tracing::warn!(error = %e, "failed to auto-persist refreshed tokens in keyring");
} else {
tracing::info!("successfully auto-persisted refreshed tokens in keyring");
} }
} }
}); });
} }
#[cfg(test)]
mod tests {
use super::*;
fn passphrases() -> KeyPassphrases {
let mut p = KeyPassphrases::new();
p.insert("key-a", b"alpha".to_vec());
p.insert("key-b", vec![0, 255, 7]);
p
}
fn blob(extra: &str) -> String {
format!(
r#"{{"session_id":"s","username":"u","user_id":"i","access_token":"a",
"refresh_token":"r","scopes":[],"password_mode":2{extra}}}"#
)
}
#[test]
fn passphrases_survive_the_blob_encoding() {
let decoded = decode(&encode(&passphrases())).expect("decodes");
assert_eq!(decoded, passphrases());
}
#[test]
fn passphrases_survive_the_kernel_payload_encoding() {
let decoded = decode_secret(&encode_secret(&passphrases())).expect("decodes");
assert_eq!(decoded, passphrases());
}
#[test]
fn corrupt_or_empty_secrets_read_as_absent() {
assert!(decode_secret(b"not json").is_none());
assert!(decode(&BTreeMap::new()).is_none());
assert!(decode(&BTreeMap::from([("k".into(), "!!!".into())])).is_none());
}
#[test]
fn legacy_blob_is_read_but_its_password_is_never_written_back() {
let stored: StoredSession =
serde_json::from_str(&blob(r#","mailbox_password":"hunter2""#)).unwrap();
assert_eq!(stored.mailbox_password, "hunter2");
assert!(stored.key_passphrases.is_none());
let written = serde_json::to_string(&stored).unwrap();
assert!(!written.contains("hunter2"));
assert!(!written.contains("mailbox_password"));
}
#[test]
fn locked_blob_has_no_passphrases_field() {
let stored: StoredSession = serde_json::from_str(&blob("")).unwrap();
assert!(
serde_json::to_string(&stored)
.unwrap()
.find("key_passphrases")
.is_none()
);
}
#[test]
fn stored_passphrases_win_over_the_kernel_keyring() {
let mut stored: StoredSession = serde_json::from_str(&blob("")).unwrap();
stored.key_passphrases = Some(encode(&passphrases()));
let (found, origin) = find_passphrases(&stored).unwrap().unwrap();
assert_eq!(origin, KeyState::Stored);
assert_eq!(found, passphrases());
}
}
+15 -3
View File
@@ -32,6 +32,16 @@ pub enum Error {
#[error("saved session can no longer unlock your keys — run `pdfs login` again")] #[error("saved session can no longer unlock your keys — run `pdfs login` again")]
ReloginRequired, ReloginRequired,
/// The account has a separate mailbox password that has not been entered
/// since login, so its keys cannot be unlocked. The fix is
/// [`auth::unlock`](crate::auth::unlock), not a new login.
#[error("account is locked — enter the mailbox password with `pdfs unlock`")]
Locked,
/// The mailbox password was checked against the account and is wrong.
#[error("that mailbox password does not unlock your account")]
WrongMailboxPassword,
/// The login was gated behind human verification. Not a failure the user can /// The login was gated behind human verification. Not a failure the user can
/// fix by retrying: the challenge has to be solved and the login restarted /// fix by retrying: the challenge has to be solved and the login restarted
/// with the resulting token (see [`auth::login_verified`](crate::auth::login_verified)). /// with the resulting token (see [`auth::login_verified`](crate::auth::login_verified)).
@@ -199,9 +209,11 @@ impl From<serde_json::Error> for CoreError {
impl From<Error> for CoreError { impl From<Error> for CoreError {
fn from(e: Error) -> Self { fn from(e: Error) -> Self {
let kind = match &e { let kind = match &e {
Error::NotLoggedIn | Error::ReloginRequired | Error::HumanVerificationRequired(_) => { Error::NotLoggedIn
ErrorKind::Denied | Error::ReloginRequired
} | Error::Locked
| Error::WrongMailboxPassword
| Error::HumanVerificationRequired(_) => ErrorKind::Denied,
Error::Proton(proton_sdk::ProtonError::Api(api)) => api_kind(api.code), Error::Proton(proton_sdk::ProtonError::Api(api)) => api_kind(api.code),
// A `ProtonError` that never reached the API is a transport failure. // A `ProtonError` that never reached the API is a transport failure.
Error::Proton(_) => ErrorKind::Offline, Error::Proton(_) => ErrorKind::Offline,
+177
View File
@@ -0,0 +1,177 @@
//! A secret held in the Linux kernel keyring, for as long as the user is logged in.
//!
//! This is where the key passphrases of a two-password account live by default:
//! the mailbox password is never stored, and the secrets derived from it are
//! kept in kernel memory — not on disk, not in the Secret Service — and vanish
//! when the user's last session ends or the machine reboots. Both the daemon and
//! `pdfs unlock` reach the same entry because it hangs off the *user* keyring.
//!
//! Kernel keys are not paged to swap, are invisible to other users, and are
//! wiped by [`clear`] (`KEYCTL_REVOKE`), which makes them a better home than a
//! process's heap. Processes of the same user can still read them, exactly as
//! they could ptrace the daemon: this protects against disk, backup and other
//! users, not against code already running as you.
//!
//! The keyring may be unavailable (a container, a kernel built without
//! `CONFIG_KEYS`); every operation then reports it as an error and the caller
//! falls back to asking again, never to storing the secret somewhere weaker.
use std::io;
use zeroize::Zeroizing;
/// Key description. Namespaced so it cannot collide with another program's key.
#[cfg(not(test))]
const DESCRIPTION: &[u8] = b"pdfs:key-passphrases\0";
/// Tests must never touch a real unlock.
#[cfg(test)]
const DESCRIPTION: &[u8] = b"pdfs:key-passphrases:test\0";
const KEY_TYPE: &[u8] = b"user\0";
const KEY_SPEC_USER_KEYRING: i32 = -4;
const KEYCTL_REVOKE: libc::c_long = 3;
const KEYCTL_SEARCH: libc::c_long = 10;
const KEYCTL_READ: libc::c_long = 11;
fn last_error<T>() -> io::Result<T> {
Err(io::Error::last_os_error())
}
fn find() -> io::Result<Option<libc::c_long>> {
// SAFETY: both strings are NUL-terminated and outlive the call.
let id = unsafe {
libc::syscall(
libc::SYS_keyctl,
KEYCTL_SEARCH,
KEY_SPEC_USER_KEYRING,
KEY_TYPE.as_ptr(),
DESCRIPTION.as_ptr(),
0,
)
};
if id >= 0 {
return Ok(Some(id));
}
let err = io::Error::last_os_error();
match err.raw_os_error() {
// ENOKEY: not stored. EKEYREVOKED/EKEYEXPIRED: stored once, now gone.
Some(libc::ENOKEY | libc::EKEYREVOKED | libc::EKEYEXPIRED) => Ok(None),
_ => Err(err),
}
}
/// Stop this process from being core-dumped or ptraced by an unprivileged
/// process of the same user, so the secrets in its memory stay out of crash
/// reports. Call once at start of a long-lived process that holds them.
pub fn forbid_dumps() {
// SAFETY: `PR_SET_DUMPABLE` takes plain integers and only affects this process.
let rc = unsafe { libc::prctl(libc::PR_SET_DUMPABLE, 0, 0, 0, 0) };
if rc != 0 {
tracing::warn!(error = %io::Error::last_os_error(), "could not mark the process non-dumpable");
}
}
/// Store `secret`, replacing any earlier one.
pub fn store(secret: &[u8]) -> io::Result<()> {
// SAFETY: strings are NUL-terminated; the payload pointer/length pair
// describes `secret`, which outlives the call.
let id = unsafe {
libc::syscall(
libc::SYS_add_key,
KEY_TYPE.as_ptr(),
DESCRIPTION.as_ptr(),
secret.as_ptr(),
secret.len(),
KEY_SPEC_USER_KEYRING,
)
};
if id < 0 {
return last_error();
}
Ok(())
}
/// Read the stored secret, or `None` when there is none.
pub fn load() -> io::Result<Option<Zeroizing<Vec<u8>>>> {
let Some(id) = find()? else {
return Ok(None);
};
// Size first, then read; retry if the key was replaced in between.
for _ in 0..3 {
// SAFETY: a null buffer asks the kernel only for the payload length.
let len = unsafe {
libc::syscall(
libc::SYS_keyctl,
KEYCTL_READ,
id,
std::ptr::null_mut::<u8>(),
0usize,
)
};
if len < 0 {
return match io::Error::last_os_error().raw_os_error() {
Some(libc::ENOKEY | libc::EKEYREVOKED | libc::EKEYEXPIRED) => Ok(None),
_ => last_error(),
};
}
let mut buf = Zeroizing::new(vec![0u8; len as usize]);
// SAFETY: `buf` is `len` writable bytes.
let read = unsafe {
libc::syscall(
libc::SYS_keyctl,
KEYCTL_READ,
id,
buf.as_mut_ptr(),
buf.len(),
)
};
if read < 0 {
return last_error();
}
if read as usize <= buf.len() {
buf.truncate(read as usize);
return Ok(Some(buf));
}
}
Err(io::Error::other("the key changed while it was being read"))
}
/// Remove the stored secret. Succeeds when there is none.
pub fn clear() -> io::Result<()> {
let Some(id) = find()? else {
return Ok(());
};
// SAFETY: plain integer arguments.
let rc = unsafe { libc::syscall(libc::SYS_keyctl, KEYCTL_REVOKE, id) };
if rc < 0 {
return match io::Error::last_os_error().raw_os_error() {
Some(libc::ENOKEY | libc::EKEYREVOKED) => Ok(()),
_ => last_error(),
};
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
// The kernel keyring is process-wide state and a sandbox may not offer it,
// so one test covers the whole round trip and skips when it is unavailable.
#[test]
fn stored_secret_round_trips_and_clears() {
if store(b"probe").is_err() {
eprintln!("kernel keyring unavailable; skipping");
return;
}
let saved = load().unwrap().expect("stored secret is readable");
assert_eq!(saved.as_slice(), b"probe");
store(b"replaced").unwrap();
assert_eq!(load().unwrap().unwrap().as_slice(), b"replaced");
clear().unwrap();
assert!(load().unwrap().is_none());
clear().unwrap();
}
}
+1
View File
@@ -10,6 +10,7 @@ pub mod config;
pub mod control; pub mod control;
pub mod db; pub mod db;
pub mod error; pub mod error;
pub mod kernelkey;
pub mod localindex; pub mod localindex;
pub mod menu; pub mod menu;
pub mod mounts; pub mod mounts;
+4
View File
@@ -119,6 +119,9 @@ struct Ui {
/// keyring (a DBus round-trip). Populated at startup and updated only on /// keyring (a DBus round-trip). Populated at startup and updated only on
/// login / logout. `None` = signed out. /// login / logout. `None` = signed out.
session: RefCell<Option<auth::StoredSession>>, session: RefCell<Option<auth::StoredSession>>,
/// Whether this run already asked for the mailbox password of a locked
/// account, so a refresh never re-opens a dialog the user cancelled.
unlock_offered: Cell<bool>,
/// Whether the last refresh saw a live mount daemon. Gates the unpin buttons /// Whether the last refresh saw a live mount daemon. Gates the unpin buttons
/// (which need the daemon to evict + re-hydrate) and every mutating action. /// (which need the daemon to evict + re-hydrate) and every mutating action.
mounted: RefCell<bool>, mounted: RefCell<bool>,
@@ -362,6 +365,7 @@ fn build_window(app: &adw::Application) {
busy: Cell::new(0), busy: Cell::new(0),
opening: RefCell::new(HashSet::new()), opening: RefCell::new(HashSet::new()),
session: RefCell::new(auth::load().ok()), session: RefCell::new(auth::load().ok()),
unlock_offered: Cell::new(false),
mounted: RefCell::new(false), mounted: RefCell::new(false),
sidebar: sidebar_list.clone(), sidebar: sidebar_list.clone(),
nav: split.clone(), nav: split.clone(),
+202 -16
View File
@@ -128,7 +128,12 @@ pub(crate) fn wire_login(ui: &Rc<Ui>) {
set_signing_in(&ui, true); set_signing_in(&ui, true);
ui.login.login_status.set_text(&gettext("Signing in…")); ui.login.login_status.set_text(&gettext("Signing in…"));
let (rx, totp_req_rx, hv_req_rx) = spawn_login(username, password); let LoginChannels {
result: rx,
totp: totp_req_rx,
hv: hv_req_rx,
mailbox: mailbox_req_rx,
} = spawn_login(username, password);
// Surface the 2FA dialog only if the SDK actually asks for a code (i.e. // Surface the 2FA dialog only if the SDK actually asks for a code (i.e.
// the account has 2FA enabled). The worker blocks until the dialog feeds // the account has 2FA enabled). The worker blocks until the dialog feeds
@@ -157,6 +162,21 @@ pub(crate) fn wire_login(ui: &Rc<Ui>) {
} }
}); });
// And for the mailbox password, which only a two-password account has.
// The worker asks again after a wrong answer, so this loops too.
let ui_mailbox = ui.clone();
glib::spawn_future_local(async move {
while let Ok((attempt, answer_tx)) = mailbox_req_rx.recv().await {
ask_mailbox(&ui_mailbox, attempt > 0, move |answer| {
// A cancelled dialog drops the sender, which the worker
// reads as a cancelled login.
if let Some(answer) = answer {
let _ = answer_tx.send(answer);
}
});
}
});
let ui = ui.clone(); let ui = ui.clone();
glib::spawn_future_local(async move { glib::spawn_future_local(async move {
let result = rx let result = rx
@@ -209,6 +229,12 @@ pub(crate) fn login_error_message(error: &pdfs_core::Error) -> String {
pdfs_core::Error::Other(message) if message.contains("two-factor") => { pdfs_core::Error::Other(message) if message.contains("two-factor") => {
gettext("Sign-in cancelled: no two-factor code was entered.") gettext("Sign-in cancelled: no two-factor code was entered.")
} }
pdfs_core::Error::Other(message) if message.contains("mailbox") => {
gettext("Sign-in cancelled: no mailbox password was entered.")
}
pdfs_core::Error::WrongMailboxPassword => {
gettext("That mailbox password didn't unlock your account.")
}
pdfs_core::Error::Other(message) if message.contains("verification") => gettext( pdfs_core::Error::Other(message) if message.contains("verification") => gettext(
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a new one.", "Sign-in cancelled: the verification wasn't completed. Sign in again to get a new one.",
), ),
@@ -220,26 +246,31 @@ pub(crate) fn login_error_message(error: &pdfs_core::Error) -> String {
} }
} }
/// What the login worker asks the UI for, and how it reports back.
pub(crate) struct LoginChannels {
/// The final outcome, once.
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 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)>)>,
}
/// Run the async SRP + optional 2FA login on a dedicated current-thread Tokio /// Run the async SRP + optional 2FA login on a dedicated current-thread Tokio
/// runtime. Returns two channels: the first yields the final login result once; /// runtime. The returned [`LoginChannels`] carry the final result and the lazy
/// the second fires *only if* the account needs a 2FA code, carrying a /// prompts. Each login closure blocks the worker on a sender the UI answers, so
/// [`std::sync::mpsc::Sender`] the UI uses to feed the code back. The login /// a code is requested lazily and can't expire before the password proof.
/// closure blocks the worker on that sender until the dialog answers, so the pub(crate) fn spawn_login(username: String, password: String) -> LoginChannels {
/// code is requested lazily and can't expire before the password proof.
#[allow(clippy::type_complexity)]
pub(crate) fn spawn_login(
username: String,
password: String,
) -> (
async_channel::Receiver<Result<(), String>>,
async_channel::Receiver<std::sync::mpsc::Sender<String>>,
async_channel::Receiver<(String, std::sync::mpsc::Sender<String>)>,
) {
let (tx, rx) = async_channel::bounded(1); let (tx, rx) = async_channel::bounded(1);
// Two, not one: a CAPTCHA-gated login restarts, so a 2FA account is asked // Two, not one: a CAPTCHA-gated login restarts, so a 2FA account is asked
// for a code on each attempt and a single slot would deadlock the worker. // for a code on each attempt and a single slot would deadlock the worker.
let (totp_req_tx, totp_req_rx) = async_channel::bounded(2); let (totp_req_tx, totp_req_rx) = async_channel::bounded(2);
let (hv_req_tx, hv_req_rx) = async_channel::bounded(1); let (hv_req_tx, hv_req_rx) = async_channel::bounded(1);
let (mailbox_req_tx, mailbox_req_rx) = async_channel::bounded(1);
std::thread::spawn(move || { std::thread::spawn(move || {
let rt = match tokio::runtime::Builder::new_current_thread() let rt = match tokio::runtime::Builder::new_current_thread()
.enable_all() .enable_all()
@@ -267,6 +298,19 @@ pub(crate) fn spawn_login(
.recv() .recv()
.map_err(|_| pdfs_core::Error::Other("two-factor entry cancelled".into())) .map_err(|_| pdfs_core::Error::Other("two-factor entry cancelled".into()))
}, },
|attempt| {
let (answer_tx, answer_rx) = std::sync::mpsc::channel::<(String, bool)>();
mailbox_req_tx
.send_blocking((attempt, answer_tx))
.map_err(|_| pdfs_core::Error::Other("mailbox prompt closed".into()))?;
let (password, remember) = answer_rx
.recv()
.map_err(|_| pdfs_core::Error::Other("mailbox entry cancelled".into()))?;
Ok(auth::Mailbox {
password: password.into(),
remember,
})
},
|hv| { |hv| {
// Gated: hand the UI the page to show, block on the token the // Gated: hand the UI the page to show, block on the token the
// user earns by solving it. // user earns by solving it.
@@ -287,7 +331,143 @@ pub(crate) fn spawn_login(
}); });
let _ = tx.send_blocking(result); let _ = tx.send_blocking(result);
}); });
(rx, totp_req_rx, hv_req_rx) LoginChannels {
result: rx,
totp: totp_req_rx,
hv: hv_req_rx,
mailbox: mailbox_req_rx,
}
}
/// Ask for the mailbox password of a two-password account.
///
/// `done` gets the password and the "keep unlocked" choice, or `None` when the
/// dialog was cancelled. `retry` says the last answer was wrong. The choice
/// defaults to off: storing the mailbox unlock in the keyring trades away what
/// a separate mailbox password is for, so it is something to opt into.
pub(crate) fn ask_mailbox(
ui: &Rc<Ui>,
retry: bool,
done: impl FnOnce(Option<(String, bool)>) + 'static,
) {
let body = if retry {
gettext("That mailbox password didn't unlock your account. Try again.")
} else {
gettext("This account has a separate mailbox password. Enter it to unlock your files.")
};
let dialog = adw::AlertDialog::builder()
.heading(gettext("Mailbox Password"))
.body(body)
.build();
let group = adw::PreferencesGroup::new();
let entry = adw::PasswordEntryRow::builder()
.title(gettext("Mailbox password"))
.activates_default(true)
.build();
let remember = adw::SwitchRow::builder()
.title(gettext("Keep unlocked on this computer"))
.subtitle(gettext(
"Stores the unlock in the system keyring, so Proton Drive opens without asking after every login. Otherwise you enter the password once per session.",
))
.build();
group.add(&entry);
group.add(&remember);
dialog.set_extra_child(Some(&group));
dialog.add_response("cancel", &gettext("Cancel"));
dialog.add_response("unlock", &gettext("Unlock"));
dialog.set_response_appearance("unlock", adw::ResponseAppearance::Suggested);
dialog.set_default_response(Some("unlock"));
dialog.set_close_response("cancel");
let done = RefCell::new(Some(done));
dialog.connect_response(None, move |_, resp| {
let Some(done) = done.borrow_mut().take() else {
return;
};
let password = entry.text().to_string();
if resp == "unlock" && !password.is_empty() {
done(Some((password, remember.is_active())));
} else {
done(None);
}
});
let parent = ui_window(ui).map(|w| w.upcast::<gtk4::Window>());
dialog.present(parent.as_ref());
}
/// If the signed-in account is locked, ask for its mailbox password — once per
/// run; after a cancel, a toast keeps an Unlock button within reach.
///
/// The key state is a keyring and kernel-keyring read, so it runs on a worker.
pub(crate) fn offer_unlock(ui: &Rc<Ui>) {
if ui.unlock_offered.get() {
return;
}
let ui = ui.clone();
glib::spawn_future_local(async move {
let state = gio::spawn_blocking(|| auth::key_state().ok()).await;
if matches!(state, Ok(Some(auth::KeyState::Locked))) && !ui.unlock_offered.replace(true) {
prompt_unlock(&ui, false);
}
});
}
enum UnlockOutcome {
Unlocked,
Wrong,
Failed(String),
}
/// Ask for the mailbox password and unlock the account with it.
fn prompt_unlock(ui: &Rc<Ui>, retry: bool) {
let ui_done = ui.clone();
ask_mailbox(ui, retry, move |answer| {
let Some((password, remember)) = answer else {
toast_action(
&ui_done,
&gettext("Proton Drive is locked. Enter your mailbox password to unlock it."),
&gettext("Unlock"),
|ui| prompt_unlock(ui, false),
);
return;
};
glib::spawn_future_local(async move {
// Verifying talks to Proton and the restart talks to systemd, so
// both run on a worker, never on the main loop.
let outcome = gio::spawn_blocking(move || {
let rt = match tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
{
Ok(rt) => rt,
Err(e) => return UnlockOutcome::Failed(e.to_string()),
};
match rt.block_on(auth::unlock(&password, remember)) {
Ok(()) => {
service::restart();
UnlockOutcome::Unlocked
}
Err(pdfs_core::Error::WrongMailboxPassword) => UnlockOutcome::Wrong,
Err(e) => UnlockOutcome::Failed(login_error_message(&e)),
}
})
.await;
match outcome {
Ok(UnlockOutcome::Unlocked) => {
toast(&ui_done, &gettext("Unlocked."));
refresh(&ui_done);
}
Ok(UnlockOutcome::Wrong) => prompt_unlock(&ui_done, true),
Ok(UnlockOutcome::Failed(message)) => {
toast_error(&ui_done, &gettext("Couldn't unlock"), &message)
}
Err(_) => {}
}
});
});
} }
/// Show the lazy two-factor dialog and feed the entered code back to the waiting /// Show the lazy two-factor dialog and feed the entered code back to the waiting
@@ -374,6 +554,12 @@ mod tests {
assert!(login_error_message(&hv).contains("verification wasn't completed")); assert!(login_error_message(&hv).contains("verification wasn't completed"));
} }
#[test]
fn a_cancelled_mailbox_prompt_is_reported_as_such() {
let error = pdfs_core::Error::Other("mailbox entry cancelled".into());
assert!(login_error_message(&error).contains("no mailbox password"));
}
#[test] #[test]
fn an_unmapped_error_keeps_its_text() { fn an_unmapped_error_keeps_its_text() {
let error = pdfs_core::Error::Other("something odd".into()); let error = pdfs_core::Error::Other("something odd".into());
+1
View File
@@ -860,6 +860,7 @@ pub(crate) fn refresh(ui: &Rc<Ui>) {
} }
} }
offer_unlock(ui);
refresh_status(ui); refresh_status(ui);
refresh_transfers(ui); refresh_transfers(ui);
} }
+9
View File
@@ -166,6 +166,15 @@ fn poll_state(socket: &Path, default_mountpoint: &Path) -> DriveState {
// No daemon: describe login state instead so the menu is still useful. // No daemon: describe login state instead so the menu is still useful.
Err(_) => { Err(_) => {
let (line, phase) = match auth::load() { let (line, phase) = match auth::load() {
Ok(s) if matches!(auth::key_state(), Ok(auth::KeyState::Locked)) => (
// Translators: {username} is the Proton account name. The
// account has a mailbox password that has to be entered.
gettext_f(
"Signed in as {username} — locked",
&[("username", &s.username)],
),
Phase::Attention,
),
Ok(s) => ( Ok(s) => (
// Translators: {username} is the Proton account name. // Translators: {username} is the Proton account name.
gettext_f( gettext_f(
+36
View File
@@ -11,6 +11,42 @@ scratch (user data in `staging/` and `recovery/` is never touched by this).
## [Unreleased] ## [Unreleased]
## [3.1.0] — 2026-10-07
Schema: **42**, unchanged.
### Added
- **Two-password accounts.** An account with a separate mailbox password now signs in: the app
and `pdfs login` ask for it after the login password and check it against the account, so a
typo is a retry and not a daemon that never mounts. The mailbox password is never stored.
What it unlocks is kept in kernel memory for the login session, so it is asked for once per
session and is gone after a reboot or when you log out of the machine.
- **`pdfs unlock` and `pdfs lock`.** `pdfs unlock` enters the mailbox password of a locked
account and starts the daemon's mount; `pdfs lock` forgets it again. `--remember` on `login`
and `unlock` (and the "Keep unlocked on this computer" switch in the app) keeps the unlock in
the system keyring instead, so the daemon starts without asking; `pdfs lock --forget` removes
it. Off by default: it gives up the separation a second password is for.
- **Locked state.** `pdfs status`, `pdfs diagnose` and the tray say when the account is waiting
for its mailbox password, and the app asks for it when it opens.
### Changed
- **The keyring no longer holds a password.** The session blob keeps the keys' passphrases
instead of the mailbox password, and a blob written by 3.0.x is converted on the first start.
A stored password the account rejects (a two-password account that was signed in with only
its login password) leaves the account locked instead of failing every start.
- **The daemon is not dumpable.** It holds the unlock in memory, so core dumps and same-user
`ptrace` are off for it.
- **The offline cache is re-keyed** from the new secret, so the first start after the update
reads it as cold and fetches the tree again once.
### Fixed
- **systemd killed a daemon that was only retrying.** `WatchdogSec` was answered only once a
mount existed, so a daemon waiting for a login or retrying a failed mount was aborted after
two minutes and restarted in a loop, hiding the error it logged. It now answers the watchdog
while it waits. ([#26](https://github.com/narrrl/proton-drive-linux/issues/26))
- **A refreshed token could overwrite a newer unlock or revive a signed-out session.** Token
rotation now updates only the tokens in the stored blob.
## [3.0.0] — 2026-10-05 ## [3.0.0] — 2026-10-05
Schema: **42**. The queue table is rebuilt so an id is never given out twice; queued changes Schema: **42**. The queue table is rebuilt so an id is never given out twice; queued changes
+1 -1
View File
@@ -9,7 +9,7 @@
# Build + install: cd packaging && makepkg -fi # Build + install: cd packaging && makepkg -fi
pkgname=proton-drive-linux pkgname=proton-drive-linux
pkgver=3.0.0 pkgver=3.1.0
pkgrel=1 pkgrel=1
pkgdesc="Unofficial Proton Drive client for Linux: files-on-demand FUSE mount, CLI, GTK4 app + tray" pkgdesc="Unofficial Proton Drive client for Linux: files-on-demand FUSE mount, CLI, GTK4 app + tray"
arch=('x86_64') arch=('x86_64')
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: German\n" "Language-Team: German\n"
@@ -57,7 +57,7 @@ msgstr "%-d. %b %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A, %-d. %B %Y, %H:%M" msgstr "%A, %-d. %B %Y, %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A, %-d. %B %Y, %H:%M"
msgid "My files" msgid "My files"
msgstr "Meine Dateien" msgstr "Meine Dateien"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Fotos" msgstr "Fotos"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Mit mir geteilt" msgstr "Mit mir geteilt"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Von mir geteilt" msgstr "Von mir geteilt"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computer" msgstr "Computer"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Papierkorb" msgstr "Papierkorb"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Synchronisierung" msgstr "Synchronisierung"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what}: {detail}" msgstr "{what}: {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "Keine Internetverbindung" msgstr "Keine Internetverbindung"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "Das ist nicht mehr vorhanden" msgstr "Das ist nicht mehr vorhanden"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "Kein Zugriff darauf" msgstr "Kein Zugriff darauf"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "Etwas anderes hat dies zuerst geändert" msgstr "Etwas anderes hat dies zuerst geändert"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Das Proton Drive ist voll" msgstr "Das Proton Drive ist voll"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Einstellungen" msgstr "Einstellungen"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Tastenkürzel" msgstr "Tastenkürzel"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "Info zu Proton Drive for Linux" msgstr "Info zu Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Hauptmenü" msgstr "Hauptmenü"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -166,23 +166,23 @@ msgstr ""
"Inoffizieller Client – nicht mit Proton AG verbunden, von Proton AG " "Inoffizieller Client – nicht mit Proton AG verbunden, von Proton AG "
"unterstützt oder befürwortet." "unterstützt oder befürwortet."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Quellcode" msgstr "Quellcode"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Nutzungsbedingungen von Proton" msgstr "Nutzungsbedingungen von Proton"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Datenschutzerklärung von Proton" msgstr "Datenschutzerklärung von Proton"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Haftungsausschluss" msgstr "Haftungsausschluss"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -207,7 +207,7 @@ msgstr ""
"bereitgestellt. Daten, deren Verlust nicht hinnehmbar ist, sollten " "bereitgestellt. Daten, deren Verlust nicht hinnehmbar ist, sollten "
"zusätzlich gesichert werden." "zusätzlich gesichert werden."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -217,7 +217,7 @@ msgstr ""
"\">GeoNames</a>, lizenziert unter <a href=\"https://creativecommons.org/" "\">GeoNames</a>, lizenziert unter <a href=\"https://creativecommons.org/"
"licenses/by/4.0/\">CC BY 4.0</a>." "licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -227,7 +227,7 @@ msgstr ""
"href=\"https://www.naturalearthdata.com/\">Natural Earth</a> gezeichnet, die " "href=\"https://www.naturalearthdata.com/\">Natural Earth</a> gezeichnet, die "
"gemeinfrei sind." "gemeinfrei sind."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -243,15 +243,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Mitwirkende an Proton Drive for Linux" msgstr "Mitwirkende an Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "Proton Drive beenden?" msgstr "Proton Drive beenden?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -260,7 +260,7 @@ msgstr ""
"eine Verbindung hergestellt wird. Proton Drive startet bei der nächsten " "eine Verbindung hergestellt wird. Proton Drive startet bei der nächsten "
"Anmeldung erneut." "Anmeldung erneut."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -275,7 +275,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -290,30 +291,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Beenden" msgstr "Beenden"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "Proton Drive konnte nicht beendet werden" msgstr "Proton Drive konnte nicht beendet werden"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "Der Proton-Drive-Dienst wurde nicht beendet." msgstr "Der Proton-Drive-Dienst wurde nicht beendet."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "Allgemein" msgstr "Allgemein"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Drive durchsuchen" msgstr "Drive durchsuchen"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -322,38 +323,38 @@ msgstr "Drive durchsuchen"
msgid "Refresh" msgid "Refresh"
msgstr "Aktualisieren" msgstr "Aktualisieren"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Tastenkürzel" msgstr "Tastenkürzel"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "Dateien" msgstr "Dateien"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "Neuer Ordner" msgstr "Neuer Ordner"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Dateien hochladen" msgstr "Dateien hochladen"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Zurück / Vor" msgstr "Zurück / Vor"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Übergeordneter Ordner" msgstr "Übergeordneter Ordner"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Raster / Liste" msgstr "Raster / Liste"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -362,7 +363,7 @@ msgstr "Raster / Liste"
msgid "Rename" msgid "Rename"
msgstr "Umbenennen" msgstr "Umbenennen"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -372,73 +373,73 @@ msgstr "Umbenennen"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "In den Papierkorb verschieben" msgstr "In den Papierkorb verschieben"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Auswahl aufheben" msgstr "Auswahl aufheben"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Größere Vorschaubilder" msgstr "Größere Vorschaubilder"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Kleinere Vorschaubilder" msgstr "Kleinere Vorschaubilder"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Vorschaubildgröße zurücksetzen" msgstr "Vorschaubildgröße zurücksetzen"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Alles auswählen" msgstr "Alles auswählen"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Fotobetrachter" msgstr "Fotobetrachter"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Vorheriges / nächstes Foto" msgstr "Vorheriges / nächstes Foto"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "Erstes / letztes Foto" msgstr "Erstes / letztes Foto"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Details anzeigen" msgstr "Details anzeigen"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Vollbild" msgstr "Vollbild"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Schließen" msgstr "Schließen"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Zum Umbenennen genau ein Element auswählen" msgstr "Zum Umbenennen genau ein Element auswählen"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Nicht verbunden" msgstr "Nicht verbunden"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Der Proton-Drive-Dienst läuft nicht." msgstr "Der Proton-Drive-Dienst läuft nicht."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Verbindung wird hergestellt …" msgstr "Verbindung wird hergestellt …"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "Warten auf den Start des Proton-Drive-Dienstes." msgstr "Warten auf den Start des Proton-Drive-Dienstes."
@@ -1287,7 +1288,7 @@ msgstr "Alben konnten nicht geladen werden"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1555,7 +1556,7 @@ msgid "Make available offline"
msgstr "Offline verfügbar machen" msgstr "Offline verfügbar machen"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Nur online verfügbar machen" msgstr "Nur online verfügbar machen"
@@ -2724,7 +2725,7 @@ msgid "Sync paused until you resume"
msgstr "Synchronisierung bis zur Fortsetzung pausiert" msgstr "Synchronisierung bis zur Fortsetzung pausiert"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Synchronisierung pausiert" msgstr "Synchronisierung pausiert"
@@ -3200,25 +3201,25 @@ msgstr "E-Mail-Adresse und Passwort eingeben."
msgid "Signing in…" msgid "Signing in…"
msgstr "Anmeldung läuft …" msgstr "Anmeldung läuft …"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Zum Fortfahren die Überprüfung abschließen …" msgstr "Zum Fortfahren die Überprüfung abschließen …"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "Anmeldung abgebrochen" msgstr "Anmeldung abgebrochen"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Zu viele Anmeldeversuche. Einige Minuten warten und erneut versuchen." msgstr "Zu viele Anmeldeversuche. Einige Minuten warten und erneut versuchen."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Proton ist nicht erreichbar. Bitte die Internetverbindung prüfen und erneut " "Proton ist nicht erreichbar. Bitte die Internetverbindung prüfen und erneut "
"versuchen." "versuchen."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3227,11 +3228,19 @@ msgstr ""
"gespeichert werden. Bitte sicherstellen, dass ein Schlüsselbund (GNOME " "gespeichert werden. Bitte sicherstellen, dass ein Schlüsselbund (GNOME "
"Keyring oder KWallet) läuft und entsperrt ist." "Keyring oder KWallet) läuft und entsperrt ist."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Anmeldung abgebrochen: Es wurde kein Zwei-Faktor-Code eingegeben." msgstr "Anmeldung abgebrochen: Es wurde kein Zwei-Faktor-Code eingegeben."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3240,35 +3249,79 @@ msgstr ""
"neue Überprüfung erneut anmelden." "neue Überprüfung erneut anmelden."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Anmeldung fehlgeschlagen: {error}" msgstr "Anmeldung fehlgeschlagen: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Postfach-Passwort"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Postfach-Passwort"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Auf diesem Computer entsperrt lassen"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "Speichert die Entsperrung im System-Schlüsselbund, sodass sich Proton Drive nach jeder Anmeldung ohne Nachfrage öffnet. Andernfalls geben Sie das Passwort einmal pro Sitzung ein."
#: crates/pdfs-gui/src/app/pages/login.rs:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Entsperren"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Entsperrt."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Entsperren fehlgeschlagen"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Zwei-Faktor-Authentifizierung" msgstr "Zwei-Faktor-Authentifizierung"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Den Code aus der Authentifizierungs-App oder einen der " "Den Code aus der Authentifizierungs-App oder einen der "
"Wiederherstellungscodes eingeben." "Wiederherstellungscodes eingeben."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Authentifizierungscode" msgstr "Authentifizierungscode"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Bestätigen" msgstr "Bestätigen"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Abmelden?" msgstr "Abmelden?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3277,7 +3330,7 @@ msgstr ""
"nächsten Anmeldung. Dateien, die sich bereits auf diesem Computer befinden, " "nächsten Anmeldung. Dateien, die sich bereits auf diesem Computer befinden, "
"bleiben, wo sie sind." "bleiben, wo sie sind."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Abmelden" msgstr "Abmelden"
@@ -4645,40 +4698,40 @@ msgid "Restart Now"
msgstr "Jetzt neu starten" msgstr "Jetzt neu starten"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "{size} belegt" msgstr "{size} belegt"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "{used} von {total} belegt ({percent} %)" msgstr "{used} von {total} belegt ({percent} %)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Proton Drive verbunden" msgstr "Proton Drive verbunden"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "Deine Dateien sind verfügbar." msgstr "Deine Dateien sind verfügbar."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Proton Drive getrennt" msgstr "Proton Drive getrennt"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"Der Proton-Drive-Dienst wurde beendet. Dateien sind erst nach seinem " "Der Proton-Drive-Dienst wurde beendet. Dateien sind erst nach seinem "
"Neustart wieder verfügbar." "Neustart wieder verfügbar."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Synchronisierung abgeschlossen" msgstr "Synchronisierung abgeschlossen"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4687,27 +4740,27 @@ msgstr[1] "Übertragung von {n} Dateien abgeschlossen."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title} – {done} von {total}" msgstr "{title} – {done} von {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title} – {detail} ({done} von {total})" msgstr "{title} – {detail} ({done} von {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title} …" msgstr "{title} …"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title} – {detail} …" msgstr "{title} – {detail} …"
@@ -4715,7 +4768,7 @@ msgstr "{title} – {detail} …"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name} – {done} ({speed}/s)" msgstr "{arrow} {name} – {done} ({speed}/s)"
@@ -4723,118 +4776,118 @@ msgstr "{arrow} {name} – {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name} – {done} von {total} ({speed}/s)" msgstr "{arrow} {name} – {done} von {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} zwischengespeichert – keine Grenze festgelegt" msgstr "{used} zwischengespeichert – keine Grenze festgelegt"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "{used} von {limit} belegt" msgstr "{used} von {limit} belegt"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · wird {time} fortgesetzt" msgstr "{queued} · wird {time} fortgesetzt"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Wird {time} fortgesetzt" msgstr "Wird {time} fortgesetzt"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Bis zur manuellen Fortsetzung" msgstr "Bis zur manuellen Fortsetzung"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "{n} Änderung erfordert Aufmerksamkeit" msgstr[0] "{n} Änderung erfordert Aufmerksamkeit"
msgstr[1] "{n} Änderungen erfordern Aufmerksamkeit" msgstr[1] "{n} Änderungen erfordern Aufmerksamkeit"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Offline" msgstr "Offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Nur zwischengespeicherte Dateien" msgstr "Nur zwischengespeicherte Dateien"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Wird synchronisiert" msgstr "Wird synchronisiert"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "Auf dem neuesten Stand" msgstr "Auf dem neuesten Stand"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "Proton Drive läuft nicht" msgstr "Proton Drive läuft nicht"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "Reagiert nicht" msgstr "Reagiert nicht"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive braucht zu lange für eine Antwort" msgstr "Proton Drive braucht zu lange für eine Antwort"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "später" msgstr "später"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "um %H:%M" msgstr "um %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "am %a um %H:%M" msgstr "am %a um %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "am %-d. %b" msgstr "am %-d. %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "Keine offline verfügbaren Dateien" msgstr "Keine offline verfügbaren Dateien"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "" msgstr ""
"Mit einem Rechtsklick auf eine Datei „Offline verfügbar machen“ auswählen." "Mit einem Rechtsklick auf eine Datei „Offline verfügbar machen“ auswählen."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "Konnte nicht auf „nur online“ umgestellt werden" msgstr "Konnte nicht auf „nur online“ umgestellt werden"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Weniger anzeigen" msgstr "Weniger anzeigen"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5898,40 +5951,45 @@ msgstr[1] "↑ {n} werden hochgeladen"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "Proton Drive reagiert nicht" msgstr "Proton Drive reagiert nicht"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Angemeldet als {username} – gesperrt"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Angemeldet als {username} – nicht verbunden" msgstr "Angemeldet als {username} – nicht verbunden"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Nicht angemeldet" msgstr "Nicht angemeldet"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Fehler: {error}" msgstr "Fehler: {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive hat unerwartet geantwortet" msgstr "Proton Drive hat unerwartet geantwortet"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Aktuell in {mountpoint} ({n} angeheftet)" msgstr[0] "Aktuell in {mountpoint} ({n} angeheftet)"
msgstr[1] "Aktuell in {mountpoint} ({n} angeheftet)" msgstr[1] "Aktuell in {mountpoint} ({n} angeheftet)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Wird synchronisiert – {queued} ({n} angeheftet)" msgstr[0] "Wird synchronisiert – {queued} ({n} angeheftet)"
msgstr[1] "Wird synchronisiert – {queued} ({n} angeheftet)" msgstr[1] "Wird synchronisiert – {queued} ({n} angeheftet)"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5939,52 +5997,52 @@ msgstr[0] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)"
msgstr[1] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)" msgstr[1] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline – {queued}" msgstr "Offline – {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} Problem – Anzeigen" msgstr[0] "{n} Problem – Anzeigen"
msgstr[1] "{n} Probleme – Anzeigen" msgstr[1] "{n} Probleme – Anzeigen"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Anmelden …" msgstr "Anmelden …"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Proton Drive öffnen" msgstr "Proton Drive öffnen"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Ordner öffnen" msgstr "Ordner öffnen"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Synchronisierung fortsetzen" msgstr "Synchronisierung fortsetzen"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Synchronisierung pausieren" msgstr "Synchronisierung pausieren"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Verbinden" msgstr "Verbinden"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Symbol im Benachrichtigungsfeld ausblenden" msgstr "Symbol im Benachrichtigungsfeld ausblenden"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Proton Drive beenden …" msgstr "Proton Drive beenden …"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Beenden" msgstr "Beenden"
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: English (United Kingdom)\n" "Language-Team: English (United Kingdom)\n"
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A %-d %B %Y, %H:%M" msgstr "%A %-d %B %Y, %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y, %H:%M"
msgid "My files" msgid "My files"
msgstr "My files" msgstr "My files"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Photos" msgstr "Photos"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Shared with me" msgstr "Shared with me"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Shared by me" msgstr "Shared by me"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computers" msgstr "Computers"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Trash" msgstr "Trash"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Sync" msgstr "Sync"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what}: {detail}" msgstr "{what}: {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "You're offline" msgstr "You're offline"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "That's not there any more" msgstr "That's not there any more"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "You don't have access to that" msgstr "You don't have access to that"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "Something changed this first" msgstr "Something changed this first"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Your Proton Drive is full" msgstr "Your Proton Drive is full"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Preferences" msgstr "Preferences"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Keyboard Shortcuts" msgstr "Keyboard Shortcuts"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "About Proton Drive for Linux" msgstr "About Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Main menu" msgstr "Main menu"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -166,23 +166,23 @@ msgstr ""
"Unofficial client — not affiliated with, endorsed by, or supported by Proton " "Unofficial client — not affiliated with, endorsed by, or supported by Proton "
"AG." "AG."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Source Code" msgstr "Source Code"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Proton Terms of Service" msgstr "Proton Terms of Service"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Proton Privacy Policy" msgstr "Proton Privacy Policy"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Disclaimer" msgstr "Disclaimer"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -204,7 +204,7 @@ msgstr ""
"This software is provided “as is”, without warranty of any kind. Keep a copy " "This software is provided “as is”, without warranty of any kind. Keep a copy "
"of any data you cannot afford to lose." "of any data you cannot afford to lose."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -214,7 +214,7 @@ msgstr ""
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
"licenses/by/4.0/\">CC BY 4.0</a>." "licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -224,7 +224,7 @@ msgstr ""
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
"public domain." "public domain."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -240,15 +240,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Proton Drive for Linux contributors" msgstr "Proton Drive for Linux contributors"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "Stop Proton Drive?" msgstr "Stop Proton Drive?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -256,7 +256,7 @@ msgstr ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -271,7 +271,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -286,30 +287,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Cancel" msgstr "Cancel"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Stop" msgstr "Stop"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "Couldn't stop Proton Drive" msgstr "Couldn't stop Proton Drive"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "The Proton Drive service did not stop." msgstr "The Proton Drive service did not stop."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "General" msgstr "General"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Search Drive" msgstr "Search Drive"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -318,38 +319,38 @@ msgstr "Search Drive"
msgid "Refresh" msgid "Refresh"
msgstr "Refresh" msgstr "Refresh"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Keyboard shortcuts" msgstr "Keyboard shortcuts"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "Files" msgstr "Files"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "New folder" msgstr "New folder"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Upload files" msgstr "Upload files"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Back / forward" msgstr "Back / forward"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Parent folder" msgstr "Parent folder"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Grid / list" msgstr "Grid / list"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -358,7 +359,7 @@ msgstr "Grid / list"
msgid "Rename" msgid "Rename"
msgstr "Rename" msgstr "Rename"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -368,73 +369,73 @@ msgstr "Rename"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "Move to Trash" msgstr "Move to Trash"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Clear the selection" msgstr "Clear the selection"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Larger thumbnails" msgstr "Larger thumbnails"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Smaller thumbnails" msgstr "Smaller thumbnails"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Reset thumbnail size" msgstr "Reset thumbnail size"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Select all" msgstr "Select all"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Photo Viewer" msgstr "Photo Viewer"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Previous / next photo" msgstr "Previous / next photo"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "First / last photo" msgstr "First / last photo"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Show details" msgstr "Show details"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Fullscreen" msgstr "Fullscreen"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Close" msgstr "Close"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Select a single item to rename it" msgstr "Select a single item to rename it"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Not connected" msgstr "Not connected"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "The Proton Drive service isn't running." msgstr "The Proton Drive service isn't running."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Connecting…" msgstr "Connecting…"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "Waiting for the Proton Drive service to start." msgstr "Waiting for the Proton Drive service to start."
@@ -1275,7 +1276,7 @@ msgstr "Couldn't load albums"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1543,7 +1544,7 @@ msgid "Make available offline"
msgstr "Make available offline" msgstr "Make available offline"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Make online only" msgstr "Make online only"
@@ -2686,7 +2687,7 @@ msgid "Sync paused until you resume"
msgstr "Sync paused until you resume" msgstr "Sync paused until you resume"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Sync paused" msgstr "Sync paused"
@@ -3149,23 +3150,23 @@ msgstr "Enter your email and password."
msgid "Signing in…" msgid "Signing in…"
msgstr "Signing in…" msgstr "Signing in…"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Complete the verification to continue…" msgstr "Complete the verification to continue…"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "login cancelled" msgstr "login cancelled"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Too many sign-in attempts. Wait a few minutes and try again." msgstr "Too many sign-in attempts. Wait a few minutes and try again."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "Couldn't reach Proton. Check your internet connection and try again." msgstr "Couldn't reach Proton. Check your internet connection and try again."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3173,11 +3174,19 @@ msgstr ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Sign-in cancelled: no two-factor code was entered." msgstr "Sign-in cancelled: no two-factor code was entered."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3186,34 +3195,78 @@ msgstr ""
"new one." "new one."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Sign-in failed: {error}" msgstr "Sign-in failed: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Mailbox Password"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Mailbox password"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Keep unlocked on this computer"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "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:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Unlock"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Unlocked."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Couldn't unlock"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Two-Factor Authentication" msgstr "Two-Factor Authentication"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Authentication code" msgstr "Authentication code"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Confirm" msgstr "Confirm"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Sign Out?" msgstr "Sign Out?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3221,7 +3274,7 @@ msgstr ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Sign Out" msgstr "Sign Out"
@@ -4556,39 +4609,39 @@ msgid "Restart Now"
msgstr "Restart Now" msgstr "Restart Now"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "{size} used" msgstr "{size} used"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "{used} of {total} used ({percent}%)" msgstr "{used} of {total} used ({percent}%)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Proton Drive connected" msgstr "Proton Drive connected"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "Your files are available." msgstr "Your files are available."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Proton Drive disconnected" msgstr "Proton Drive disconnected"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Sync complete" msgstr "Sync complete"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4597,27 +4650,27 @@ msgstr[1] "{n} files finished transferring."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title} — {done} of {total}" msgstr "{title} — {done} of {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title} — {detail} ({done} of {total})" msgstr "{title} — {detail} ({done} of {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title}…" msgstr "{title}…"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title} — {detail}…" msgstr "{title} — {detail}…"
@@ -4625,7 +4678,7 @@ msgstr "{title} — {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name} — {done} ({speed}/s)" msgstr "{arrow} {name} — {done} ({speed}/s)"
@@ -4633,117 +4686,117 @@ msgstr "{arrow} {name} — {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name} — {done} of {total} ({speed}/s)" msgstr "{arrow} {name} — {done} of {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} cached — no limit set" msgstr "{used} cached — no limit set"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "{used} of {limit} used" msgstr "{used} of {limit} used"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · resumes {time}" msgstr "{queued} · resumes {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Resumes {time}" msgstr "Resumes {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Until you resume" msgstr "Until you resume"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "{n} change needs attention" msgstr[0] "{n} change needs attention"
msgstr[1] "{n} changes need attention" msgstr[1] "{n} changes need attention"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Offline" msgstr "Offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Cached files only" msgstr "Cached files only"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Syncing" msgstr "Syncing"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "Up to date" msgstr "Up to date"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "Proton Drive isn't running" msgstr "Proton Drive isn't running"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "Not responding" msgstr "Not responding"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive is taking too long to answer" msgstr "Proton Drive is taking too long to answer"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "later" msgstr "later"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "at %H:%M" msgstr "at %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "%a %H:%M" msgstr "%a %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "%e %b" msgstr "%e %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "No files kept offline" msgstr "No files kept offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "Right-click a file and choose “Make available offline”." msgstr "Right-click a file and choose “Make available offline”."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "Couldn't make it online only" msgstr "Couldn't make it online only"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Show fewer" msgstr "Show fewer"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5788,40 +5841,45 @@ msgstr[1] "↑ {n} uploading"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "Proton Drive isn't responding" msgstr "Proton Drive isn't responding"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Signed in as {username} — locked"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Signed in as {username} — not connected" msgstr "Signed in as {username} — not connected"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Not signed in" msgstr "Not signed in"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Error: {error}" msgstr "Error: {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive sent an unexpected reply" msgstr "Proton Drive sent an unexpected reply"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Up to date in {mountpoint} ({n} pinned)" msgstr[0] "Up to date in {mountpoint} ({n} pinned)"
msgstr[1] "Up to date in {mountpoint} ({n} pinned)" msgstr[1] "Up to date in {mountpoint} ({n} pinned)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Syncing — {queued} ({n} pinned)" msgstr[0] "Syncing — {queued} ({n} pinned)"
msgstr[1] "Syncing — {queued} ({n} pinned)" msgstr[1] "Syncing — {queued} ({n} pinned)"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5829,52 +5887,52 @@ msgstr[0] "Offline — cached files only ({n} pinned)"
msgstr[1] "Offline — cached files only ({n} pinned)" msgstr[1] "Offline — cached files only ({n} pinned)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} issue — View" msgstr[0] "{n} issue — View"
msgstr[1] "{n} issues — View" msgstr[1] "{n} issues — View"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Sign In…" msgstr "Sign In…"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Open Proton Drive" msgstr "Open Proton Drive"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Open Folder" msgstr "Open Folder"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Resume Sync" msgstr "Resume Sync"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Pause Sync" msgstr "Pause Sync"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Connect" msgstr "Connect"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Hide Tray Icon" msgstr "Hide Tray Icon"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Stop Proton Drive…" msgstr "Stop Proton Drive…"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Quit" msgstr "Quit"
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A, %-d de %B de %Y, %H:%M" msgstr "%A, %-d de %B de %Y, %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A, %-d de %B de %Y, %H:%M"
msgid "My files" msgid "My files"
msgstr "Mis archivos" msgstr "Mis archivos"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Fotos" msgstr "Fotos"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Compartido conmigo" msgstr "Compartido conmigo"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Compartido por mí" msgstr "Compartido por mí"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Equipos" msgstr "Equipos"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Papelera" msgstr "Papelera"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Sincronización" msgstr "Sincronización"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what}: {detail}" msgstr "{what}: {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "Está sin conexión" msgstr "Está sin conexión"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "Eso ya no existe" msgstr "Eso ya no existe"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "No tiene acceso a eso" msgstr "No tiene acceso a eso"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "Algo lo cambió antes" msgstr "Algo lo cambió antes"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Su Proton Drive está lleno" msgstr "Su Proton Drive está lleno"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Preferencias" msgstr "Preferencias"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Atajos del teclado" msgstr "Atajos del teclado"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "Acerca de Proton Drive for Linux" msgstr "Acerca de Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Menú principal" msgstr "Menú principal"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -166,23 +166,23 @@ msgstr ""
"Cliente no oficial: no está afiliado a Proton AG, ni respaldado ni mantenido " "Cliente no oficial: no está afiliado a Proton AG, ni respaldado ni mantenido "
"por esta." "por esta."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Código fuente" msgstr "Código fuente"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Condiciones del servicio de Proton" msgstr "Condiciones del servicio de Proton"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Política de privacidad de Proton" msgstr "Política de privacidad de Proton"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Aviso legal" msgstr "Aviso legal"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -205,7 +205,7 @@ msgstr ""
"Este software se proporciona “tal cual”, sin garantía de ningún tipo. Guarde " "Este software se proporciona “tal cual”, sin garantía de ningún tipo. Guarde "
"una copia de los datos que no pueda permitirse perder." "una copia de los datos que no pueda permitirse perder."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -215,7 +215,7 @@ msgstr ""
"www.geonames.org/\">GeoNames</a>, con licencia <a href=\"https://" "www.geonames.org/\">GeoNames</a>, con licencia <a href=\"https://"
"creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>." "creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -225,7 +225,7 @@ msgstr ""
"fronteras de países de <a href=\"https://www.naturalearthdata.com/\">Natural " "fronteras de países de <a href=\"https://www.naturalearthdata.com/\">Natural "
"Earth</a>, que son de dominio público." "Earth</a>, que son de dominio público."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -241,15 +241,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Colaboradores de Proton Drive for Linux" msgstr "Colaboradores de Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "¿Detener Proton Drive?" msgstr "¿Detener Proton Drive?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -258,7 +258,7 @@ msgstr ""
"a conectarse. Proton Drive se iniciará de nuevo en su próximo inicio de " "a conectarse. Proton Drive se iniciará de nuevo en su próximo inicio de "
"sesión." "sesión."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -273,7 +273,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -288,30 +289,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Detener" msgstr "Detener"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "No se pudo detener Proton Drive" msgstr "No se pudo detener Proton Drive"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "El servicio de Proton Drive no se detuvo." msgstr "El servicio de Proton Drive no se detuvo."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "General" msgstr "General"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Buscar en Drive" msgstr "Buscar en Drive"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -320,38 +321,38 @@ msgstr "Buscar en Drive"
msgid "Refresh" msgid "Refresh"
msgstr "Actualizar" msgstr "Actualizar"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Atajos del teclado" msgstr "Atajos del teclado"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "Archivos" msgstr "Archivos"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "Carpeta nueva" msgstr "Carpeta nueva"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Subir archivos" msgstr "Subir archivos"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Atrás / adelante" msgstr "Atrás / adelante"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Carpeta superior" msgstr "Carpeta superior"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Cuadrícula / lista" msgstr "Cuadrícula / lista"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -360,7 +361,7 @@ msgstr "Cuadrícula / lista"
msgid "Rename" msgid "Rename"
msgstr "Renombrar" msgstr "Renombrar"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -370,73 +371,73 @@ msgstr "Renombrar"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "Mover a la papelera" msgstr "Mover a la papelera"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Anular la selección" msgstr "Anular la selección"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Miniaturas más grandes" msgstr "Miniaturas más grandes"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Miniaturas más pequeñas" msgstr "Miniaturas más pequeñas"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Restablecer el tamaño de las miniaturas" msgstr "Restablecer el tamaño de las miniaturas"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Seleccionar todo" msgstr "Seleccionar todo"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Visor de fotos" msgstr "Visor de fotos"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Foto anterior / siguiente" msgstr "Foto anterior / siguiente"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "Primera / última foto" msgstr "Primera / última foto"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Mostrar detalles" msgstr "Mostrar detalles"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Pantalla completa" msgstr "Pantalla completa"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Cerrar" msgstr "Cerrar"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Seleccione un único elemento para renombrarlo" msgstr "Seleccione un único elemento para renombrarlo"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Sin conexión" msgstr "Sin conexión"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "El servicio de Proton Drive no está en ejecución." msgstr "El servicio de Proton Drive no está en ejecución."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Conectando…" msgstr "Conectando…"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "Esperando a que se inicie el servicio de Proton Drive." msgstr "Esperando a que se inicie el servicio de Proton Drive."
@@ -1281,7 +1282,7 @@ msgstr "No se pudieron cargar los álbumes"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1549,7 +1550,7 @@ msgid "Make available offline"
msgstr "Hacer disponible sin conexión" msgstr "Hacer disponible sin conexión"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Hacer solo en línea" msgstr "Hacer solo en línea"
@@ -2707,7 +2708,7 @@ msgid "Sync paused until you resume"
msgstr "Sincronización en pausa hasta que la reanude" msgstr "Sincronización en pausa hasta que la reanude"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Sincronización en pausa" msgstr "Sincronización en pausa"
@@ -3174,27 +3175,27 @@ msgstr "Introduzca su correo electrónico y su contraseña."
msgid "Signing in…" msgid "Signing in…"
msgstr "Iniciando sesión…" msgstr "Iniciando sesión…"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Complete la verificación para continuar…" msgstr "Complete la verificación para continuar…"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "inicio de sesión cancelado" msgstr "inicio de sesión cancelado"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Demasiados intentos de inicio de sesión. Espere unos minutos e inténtelo de " "Demasiados intentos de inicio de sesión. Espere unos minutos e inténtelo de "
"nuevo." "nuevo."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"No se pudo contactar con Proton. Compruebe su conexión a Internet e " "No se pudo contactar con Proton. Compruebe su conexión a Internet e "
"inténtelo de nuevo." "inténtelo de nuevo."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3203,12 +3204,20 @@ msgstr ""
"sistema. Asegúrese de que un depósito de claves (GNOME Keyring o KWallet) " "sistema. Asegúrese de que un depósito de claves (GNOME Keyring o KWallet) "
"esté en ejecución y desbloqueado." "esté en ejecución y desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "" msgstr ""
"Inicio de sesión cancelado: no se introdujo ningún código de dos factores." "Inicio de sesión cancelado: no se introdujo ningún código de dos factores."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3217,35 +3226,79 @@ msgstr ""
"sesión para obtener una nueva." "sesión para obtener una nueva."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Falló el inicio de sesión: {error}" msgstr "Falló el inicio de sesión: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Contraseña del buzón"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Contraseña del buzón"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Mantener desbloqueado en este equipo"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "Guarda el desbloqueo en el llavero del sistema, para que Proton Drive se 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:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "No se pudo desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Autenticación en dos pasos" msgstr "Autenticación en dos pasos"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Introduzca el código de su aplicación de autenticación o uno de sus códigos " "Introduzca el código de su aplicación de autenticación o uno de sus códigos "
"de recuperación." "de recuperación."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Código de autenticación" msgstr "Código de autenticación"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Confirmar" msgstr "Confirmar"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "¿Cerrar la sesión?" msgstr "¿Cerrar la sesión?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3254,7 +3307,7 @@ msgstr ""
"iniciar sesión. Los archivos que ya están en este equipo se quedan donde " "iniciar sesión. Los archivos que ya están en este equipo se quedan donde "
"están." "están."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Cerrar la sesión" msgstr "Cerrar la sesión"
@@ -4606,40 +4659,40 @@ msgid "Restart Now"
msgstr "Reiniciar ahora" msgstr "Reiniciar ahora"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "{size} usados" msgstr "{size} usados"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "{used} de {total} usados ({percent}%)" msgstr "{used} de {total} usados ({percent}%)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Proton Drive conectado" msgstr "Proton Drive conectado"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "Sus archivos están disponibles." msgstr "Sus archivos están disponibles."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Proton Drive desconectado" msgstr "Proton Drive desconectado"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"El servicio de Proton Drive se detuvo. Los archivos no estarán disponibles " "El servicio de Proton Drive se detuvo. Los archivos no estarán disponibles "
"hasta que se reinicie." "hasta que se reinicie."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Sincronización completada" msgstr "Sincronización completada"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4648,27 +4701,27 @@ msgstr[1] "{n} archivos terminaron de transferirse."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title}: {done} de {total}" msgstr "{title}: {done} de {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title}: {detail} ({done} de {total})" msgstr "{title}: {detail} ({done} de {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title}…" msgstr "{title}…"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title}: {detail}…" msgstr "{title}: {detail}…"
@@ -4676,7 +4729,7 @@ msgstr "{title}: {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name}: {done} ({speed}/s)" msgstr "{arrow} {name}: {done} ({speed}/s)"
@@ -4684,119 +4737,119 @@ msgstr "{arrow} {name}: {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name}: {done} de {total} ({speed}/s)" msgstr "{arrow} {name}: {done} de {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} en caché — sin límite" msgstr "{used} en caché — sin límite"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "{used} de {limit} usados" msgstr "{used} de {limit} usados"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · se reanuda {time}" msgstr "{queued} · se reanuda {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Se reanuda {time}" msgstr "Se reanuda {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Hasta que la reanude" msgstr "Hasta que la reanude"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "{n} cambio requiere atención" msgstr[0] "{n} cambio requiere atención"
msgstr[1] "{n} cambios requieren atención" msgstr[1] "{n} cambios requieren atención"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Sin conexión" msgstr "Sin conexión"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Solo archivos en caché" msgstr "Solo archivos en caché"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Sincronizando" msgstr "Sincronizando"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "Actualizado" msgstr "Actualizado"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "Proton Drive no está en ejecución" msgstr "Proton Drive no está en ejecución"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "No responde" msgstr "No responde"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive está tardando demasiado en responder" msgstr "Proton Drive está tardando demasiado en responder"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "más tarde" msgstr "más tarde"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "a las %H:%M" msgstr "a las %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "%a %H:%M" msgstr "%a %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "%-d %b" msgstr "%-d %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "No hay archivos disponibles sin conexión" msgstr "No hay archivos disponibles sin conexión"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "" msgstr ""
"Pulse con el botón derecho en un archivo y elija “Hacer disponible sin " "Pulse con el botón derecho en un archivo y elija “Hacer disponible sin "
"conexión”." "conexión”."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "No se pudo hacer solo en línea" msgstr "No se pudo hacer solo en línea"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Mostrar menos" msgstr "Mostrar menos"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5858,40 +5911,45 @@ msgstr[1] "↑ {n} subiendo"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "Proton Drive no responde" msgstr "Proton Drive no responde"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Sesión iniciada como {username} — bloqueado"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Sesión iniciada como {username} — sin conexión" msgstr "Sesión iniciada como {username} — sin conexión"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Sesión no iniciada" msgstr "Sesión no iniciada"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Error: {error}" msgstr "Error: {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive envió una respuesta inesperada" msgstr "Proton Drive envió una respuesta inesperada"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Actualizado en {mountpoint} ({n} fijado)" msgstr[0] "Actualizado en {mountpoint} ({n} fijado)"
msgstr[1] "Actualizado en {mountpoint} ({n} fijados)" msgstr[1] "Actualizado en {mountpoint} ({n} fijados)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Sincronizando: {queued} ({n} anclado)" msgstr[0] "Sincronizando: {queued} ({n} anclado)"
msgstr[1] "Sincronizando: {queued} ({n} anclados)" msgstr[1] "Sincronizando: {queued} ({n} anclados)"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5899,52 +5957,52 @@ msgstr[0] "Sin conexión: solo archivos en caché ({n} anclado)"
msgstr[1] "Sin conexión: solo archivos en caché ({n} anclados)" msgstr[1] "Sin conexión: solo archivos en caché ({n} anclados)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Sin conexión: {queued}" msgstr "Sin conexión: {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problema: ver" msgstr[0] "{n} problema: ver"
msgstr[1] "{n} problemas: ver" msgstr[1] "{n} problemas: ver"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Iniciar sesión…" msgstr "Iniciar sesión…"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Abrir Proton Drive" msgstr "Abrir Proton Drive"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Abrir carpeta" msgstr "Abrir carpeta"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Reanudar la sincronización" msgstr "Reanudar la sincronización"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Pausar la sincronización" msgstr "Pausar la sincronización"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Ocultar el icono de la bandeja" msgstr "Ocultar el icono de la bandeja"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Detener Proton Drive…" msgstr "Detener Proton Drive…"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Salir" msgstr "Salir"
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: French\n" "Language-Team: French\n"
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A %-d %B %Y à %H:%M" msgstr "%A %-d %B %Y à %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y à %H:%M"
msgid "My files" msgid "My files"
msgstr "Mes fichiers" msgstr "Mes fichiers"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Photos" msgstr "Photos"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Partagés avec moi" msgstr "Partagés avec moi"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Partagés par moi" msgstr "Partagés par moi"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Ordinateurs" msgstr "Ordinateurs"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Corbeille" msgstr "Corbeille"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Synchronisation" msgstr "Synchronisation"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what} : {detail}" msgstr "{what} : {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "Vous êtes hors ligne" msgstr "Vous êtes hors ligne"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "Cet élément n’existe plus" msgstr "Cet élément n’existe plus"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "Vous n’avez pas accès à cet élément" msgstr "Vous n’avez pas accès à cet élément"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "Quelque chose l’a modifié entre-temps" msgstr "Quelque chose l’a modifié entre-temps"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Votre Proton Drive est plein" msgstr "Votre Proton Drive est plein"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Préférences" msgstr "Préférences"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Raccourcis clavier" msgstr "Raccourcis clavier"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "À propos de Proton Drive for Linux" msgstr "À propos de Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Menu principal" msgstr "Menu principal"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -166,23 +166,23 @@ msgstr ""
"Client non officiel — non affilié à Proton AG, ni approuvé ni pris en charge " "Client non officiel — non affilié à Proton AG, ni approuvé ni pris en charge "
"par Proton AG." "par Proton AG."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Code source" msgstr "Code source"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Conditions d’utilisation de Proton" msgstr "Conditions d’utilisation de Proton"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Politique de confidentialité de Proton" msgstr "Politique de confidentialité de Proton"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Avertissement" msgstr "Avertissement"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -206,7 +206,7 @@ msgstr ""
"une copie de toutes les données que vous ne pouvez pas vous permettre de " "une copie de toutes les données que vous ne pouvez pas vous permettre de "
"perdre." "perdre."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -216,7 +216,7 @@ msgstr ""
"www.geonames.org/\">GeoNames</a>, sous licence <a href=\"https://" "www.geonames.org/\">GeoNames</a>, sous licence <a href=\"https://"
"creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>." "creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -226,7 +226,7 @@ msgstr ""
"frontières des pays de <a href=\"https://www.naturalearthdata.com/\">Natural " "frontières des pays de <a href=\"https://www.naturalearthdata.com/\">Natural "
"Earth</a>, qui sont dans le domaine public." "Earth</a>, qui sont dans le domaine public."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -243,15 +243,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Les contributeurs de Proton Drive for Linux" msgstr "Les contributeurs de Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "Arrêter Proton Drive ?" msgstr "Arrêter Proton Drive ?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -260,7 +260,7 @@ msgstr ""
"vous reconnectez pas. Proton Drive redémarrera à votre prochaine ouverture " "vous reconnectez pas. Proton Drive redémarrera à votre prochaine ouverture "
"de session." "de session."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -275,7 +275,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -290,30 +291,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Annuler" msgstr "Annuler"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Arrêter" msgstr "Arrêter"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "Impossible d’arrêter Proton Drive" msgstr "Impossible d’arrêter Proton Drive"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "Le service Proton Drive ne s’est pas arrêté." msgstr "Le service Proton Drive ne s’est pas arrêté."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "Général" msgstr "Général"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Rechercher dans Drive" msgstr "Rechercher dans Drive"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -322,38 +323,38 @@ msgstr "Rechercher dans Drive"
msgid "Refresh" msgid "Refresh"
msgstr "Actualiser" msgstr "Actualiser"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Raccourcis clavier" msgstr "Raccourcis clavier"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "Fichiers" msgstr "Fichiers"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "Nouveau dossier" msgstr "Nouveau dossier"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Téléverser des fichiers" msgstr "Téléverser des fichiers"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Précédent / suivant" msgstr "Précédent / suivant"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Dossier parent" msgstr "Dossier parent"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Grille / liste" msgstr "Grille / liste"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -362,7 +363,7 @@ msgstr "Grille / liste"
msgid "Rename" msgid "Rename"
msgstr "Renommer" msgstr "Renommer"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -372,73 +373,73 @@ msgstr "Renommer"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "Mettre à la corbeille" msgstr "Mettre à la corbeille"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Effacer la sélection" msgstr "Effacer la sélection"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Miniatures plus grandes" msgstr "Miniatures plus grandes"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Miniatures plus petites" msgstr "Miniatures plus petites"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Réinitialiser la taille des miniatures" msgstr "Réinitialiser la taille des miniatures"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Tout sélectionner" msgstr "Tout sélectionner"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Visionneuse de photos" msgstr "Visionneuse de photos"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Photo précédente / suivante" msgstr "Photo précédente / suivante"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "Première / dernière photo" msgstr "Première / dernière photo"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Afficher les détails" msgstr "Afficher les détails"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Plein écran" msgstr "Plein écran"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Fermer" msgstr "Fermer"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Sélectionnez un seul élément pour le renommer" msgstr "Sélectionnez un seul élément pour le renommer"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Non connecté" msgstr "Non connecté"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Le service Proton Drive n’est pas en cours d’exécution." msgstr "Le service Proton Drive n’est pas en cours d’exécution."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Connexion…" msgstr "Connexion…"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "En attente du démarrage du service Proton Drive." msgstr "En attente du démarrage du service Proton Drive."
@@ -1292,7 +1293,7 @@ msgstr "Impossible de charger les albums"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1560,7 +1561,7 @@ msgid "Make available offline"
msgstr "Rendre disponible hors ligne" msgstr "Rendre disponible hors ligne"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Garder en ligne uniquement" msgstr "Garder en ligne uniquement"
@@ -2724,7 +2725,7 @@ msgid "Sync paused until you resume"
msgstr "Synchronisation en pause jusqu’à la reprise" msgstr "Synchronisation en pause jusqu’à la reprise"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Synchronisation en pause" msgstr "Synchronisation en pause"
@@ -3200,25 +3201,25 @@ msgstr "Saisissez votre adresse électronique et votre mot de passe."
msgid "Signing in…" msgid "Signing in…"
msgstr "Connexion…" msgstr "Connexion…"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Terminez la vérification pour continuer…" msgstr "Terminez la vérification pour continuer…"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "connexion annulée" msgstr "connexion annulée"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Trop de tentatives de connexion. Patientez quelques minutes et réessayez." "Trop de tentatives de connexion. Patientez quelques minutes et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Impossible de joindre Proton. Vérifiez votre connexion Internet et réessayez." "Impossible de joindre Proton. Vérifiez votre connexion Internet et réessayez."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3227,11 +3228,19 @@ msgstr ""
"système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en " "système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en "
"cours d’exécution et déverrouillé." "cours d’exécution et déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi." msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3240,35 +3249,79 @@ msgstr ""
"pour en obtenir une nouvelle." "pour en obtenir une nouvelle."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Échec de la connexion : {error}" msgstr "Échec de la connexion : {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Mot de passe de la boîte aux lettres"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Mot de passe de la boîte aux lettres"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Garder déverrouillé sur cet ordinateur"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "Enregistre le déverrouillage dans le trousseau de clés du système, afin que 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:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Déverrouillé."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Impossible de déverrouiller"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Authentification à deux facteurs" msgstr "Authentification à deux facteurs"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Saisissez le code de votre application d’authentification ou l’un de vos " "Saisissez le code de votre application d’authentification ou l’un de vos "
"codes de récupération." "codes de récupération."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Code d’authentification" msgstr "Code d’authentification"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Confirmer" msgstr "Confirmer"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Se déconnecter ?" msgstr "Se déconnecter ?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3277,7 +3330,7 @@ msgstr ""
"vous vous reconnectiez. Les fichiers déjà présents sur cet ordinateur " "vous vous reconnectiez. Les fichiers déjà présents sur cet ordinateur "
"restent en place." "restent en place."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Se déconnecter" msgstr "Se déconnecter"
@@ -4643,40 +4696,40 @@ msgid "Restart Now"
msgstr "Redémarrer maintenant" msgstr "Redémarrer maintenant"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "{size} utilisés" msgstr "{size} utilisés"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "{used} utilisés sur {total} ({percent} %)" msgstr "{used} utilisés sur {total} ({percent} %)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Proton Drive connecté" msgstr "Proton Drive connecté"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "Vos fichiers sont disponibles." msgstr "Vos fichiers sont disponibles."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Proton Drive déconnecté" msgstr "Proton Drive déconnecté"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"Le service Proton Drive s’est arrêté. Les fichiers ne sont pas disponibles " "Le service Proton Drive s’est arrêté. Les fichiers ne sont pas disponibles "
"tant qu’il n’a pas redémarré." "tant qu’il n’a pas redémarré."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Synchronisation terminée" msgstr "Synchronisation terminée"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4685,27 +4738,27 @@ msgstr[1] "Le transfert de {n} fichiers est terminé."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title} — {done} sur {total}" msgstr "{title} — {done} sur {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title} — {detail} ({done} sur {total})" msgstr "{title} — {detail} ({done} sur {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title}…" msgstr "{title}…"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title} — {detail}…" msgstr "{title} — {detail}…"
@@ -4713,7 +4766,7 @@ msgstr "{title} — {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name} — {done} ({speed}/s)" msgstr "{arrow} {name} — {done} ({speed}/s)"
@@ -4721,119 +4774,119 @@ msgstr "{arrow} {name} — {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name} — {done} sur {total} ({speed}/s)" msgstr "{arrow} {name} — {done} sur {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} en cache — aucune limite définie" msgstr "{used} en cache — aucune limite définie"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "{used} utilisés sur {limit}" msgstr "{used} utilisés sur {limit}"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · reprise {time}" msgstr "{queued} · reprise {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Reprise {time}" msgstr "Reprise {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Jusqu’à la reprise" msgstr "Jusqu’à la reprise"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "{n} modification requiert votre attention" msgstr[0] "{n} modification requiert votre attention"
msgstr[1] "{n} modifications requièrent votre attention" msgstr[1] "{n} modifications requièrent votre attention"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Hors ligne" msgstr "Hors ligne"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Fichiers en cache uniquement" msgstr "Fichiers en cache uniquement"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Synchronisation" msgstr "Synchronisation"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "À jour" msgstr "À jour"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "Proton Drive n’est pas en cours d’exécution" msgstr "Proton Drive n’est pas en cours d’exécution"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "Ne répond pas" msgstr "Ne répond pas"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive met trop de temps à répondre" msgstr "Proton Drive met trop de temps à répondre"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "plus tard" msgstr "plus tard"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "à %H:%M" msgstr "à %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "%a %H:%M" msgstr "%a %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "%e %b" msgstr "%e %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "Aucun fichier disponible hors ligne" msgstr "Aucun fichier disponible hors ligne"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "" msgstr ""
"Faites un clic droit sur un fichier et choisissez « Rendre disponible hors " "Faites un clic droit sur un fichier et choisissez « Rendre disponible hors "
"ligne »." "ligne »."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "Impossible de le garder en ligne uniquement" msgstr "Impossible de le garder en ligne uniquement"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Afficher moins" msgstr "Afficher moins"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5899,40 +5952,45 @@ msgstr[1] "↑ {n} en téléversement"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "Proton Drive ne répond pas" msgstr "Proton Drive ne répond pas"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Connecté en tant que {username} — verrouillé"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Connecté en tant que {username} — non connecté" msgstr "Connecté en tant que {username} — non connecté"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Non connecté" msgstr "Non connecté"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Erreur : {error}" msgstr "Erreur : {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive a envoyé une réponse inattendue" msgstr "Proton Drive a envoyé une réponse inattendue"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "À jour dans {mountpoint} ({n} épinglé)" msgstr[0] "À jour dans {mountpoint} ({n} épinglé)"
msgstr[1] "À jour dans {mountpoint} ({n} épinglés)" msgstr[1] "À jour dans {mountpoint} ({n} épinglés)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Synchronisation — {queued} ({n} épinglé)" msgstr[0] "Synchronisation — {queued} ({n} épinglé)"
msgstr[1] "Synchronisation — {queued} ({n} épinglés)" msgstr[1] "Synchronisation — {queued} ({n} épinglés)"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5940,52 +5998,52 @@ msgstr[0] "Hors ligne — fichiers en cache uniquement ({n} épinglé)"
msgstr[1] "Hors ligne — fichiers en cache uniquement ({n} épinglés)" msgstr[1] "Hors ligne — fichiers en cache uniquement ({n} épinglés)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Hors ligne — {queued}" msgstr "Hors ligne — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problème — Afficher" msgstr[0] "{n} problème — Afficher"
msgstr[1] "{n} problèmes — Afficher" msgstr[1] "{n} problèmes — Afficher"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Se connecter…" msgstr "Se connecter…"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Ouvrir Proton Drive" msgstr "Ouvrir Proton Drive"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Ouvrir le dossier" msgstr "Ouvrir le dossier"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Reprendre la synchronisation" msgstr "Reprendre la synchronisation"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Mettre en pause la synchronisation" msgstr "Mettre en pause la synchronisation"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Connecter" msgstr "Connecter"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Masquer l’icône de la zone de notification" msgstr "Masquer l’icône de la zone de notification"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Arrêter Proton Drive…" msgstr "Arrêter Proton Drive…"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Quitter" msgstr "Quitter"
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A %-d %B %Y, %H:%M" msgstr "%A %-d %B %Y, %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y, %H:%M"
msgid "My files" msgid "My files"
msgstr "I miei file" msgstr "I miei file"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Foto" msgstr "Foto"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Condivisi con me" msgstr "Condivisi con me"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Condivisi da me" msgstr "Condivisi da me"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computer" msgstr "Computer"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Cestino" msgstr "Cestino"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Sincronizzazione" msgstr "Sincronizzazione"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what}: {detail}" msgstr "{what}: {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "Sei offline" msgstr "Sei offline"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "Non esiste più" msgstr "Non esiste più"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "Non hai accesso a questo elemento" msgstr "Non hai accesso a questo elemento"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "È stato modificato prima da qualcos'altro" msgstr "È stato modificato prima da qualcos'altro"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Il tuo Proton Drive è pieno" msgstr "Il tuo Proton Drive è pieno"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Preferenze" msgstr "Preferenze"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Scorciatoie da tastiera" msgstr "Scorciatoie da tastiera"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "Informazioni su Proton Drive for Linux" msgstr "Informazioni su Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Menu principale" msgstr "Menu principale"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -165,23 +165,23 @@ msgstr ""
"\n" "\n"
"Client non ufficiale: non affiliato, approvato né supportato da Proton AG." "Client non ufficiale: non affiliato, approvato né supportato da Proton AG."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Codice sorgente" msgstr "Codice sorgente"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Termini di servizio di Proton" msgstr "Termini di servizio di Proton"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Informativa sulla privacy di Proton" msgstr "Informativa sulla privacy di Proton"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Esclusione di responsabilità" msgstr "Esclusione di responsabilità"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -204,7 +204,7 @@ msgstr ""
"Questo software è fornito “così com’è”, senza alcuna garanzia. Conserva una " "Questo software è fornito “così com’è”, senza alcuna garanzia. Conserva una "
"copia dei dati che non puoi permetterti di perdere." "copia dei dati che non puoi permetterti di perdere."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -214,7 +214,7 @@ msgstr ""
"\">GeoNames</a>, con licenza <a href=\"https://creativecommons.org/licenses/" "\">GeoNames</a>, con licenza <a href=\"https://creativecommons.org/licenses/"
"by/4.0/\">CC BY 4.0</a>." "by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -224,7 +224,7 @@ msgstr ""
"confini nazionali di <a href=\"https://www.naturalearthdata.com/\">Natural " "confini nazionali di <a href=\"https://www.naturalearthdata.com/\">Natural "
"Earth</a>, che sono di pubblico dominio." "Earth</a>, che sono di pubblico dominio."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -240,15 +240,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Collaboratori di Proton Drive for Linux" msgstr "Collaboratori di Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "Arrestare Proton Drive?" msgstr "Arrestare Proton Drive?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -256,7 +256,7 @@ msgstr ""
"I miei file andranno offline e nulla verrà sincronizzato finché non ti " "I miei file andranno offline e nulla verrà sincronizzato finché non ti "
"riconnetti. Proton Drive si riavvierà al prossimo accesso." "riconnetti. Proton Drive si riavvierà al prossimo accesso."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -271,7 +271,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -286,30 +287,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Annulla" msgstr "Annulla"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Arresta" msgstr "Arresta"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "Impossibile arrestare Proton Drive" msgstr "Impossibile arrestare Proton Drive"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "Il servizio di Proton Drive non si è arrestato." msgstr "Il servizio di Proton Drive non si è arrestato."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "Generale" msgstr "Generale"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Cerca in Drive" msgstr "Cerca in Drive"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -318,38 +319,38 @@ msgstr "Cerca in Drive"
msgid "Refresh" msgid "Refresh"
msgstr "Aggiorna" msgstr "Aggiorna"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Scorciatoie da tastiera" msgstr "Scorciatoie da tastiera"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "File" msgstr "File"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "Nuova cartella" msgstr "Nuova cartella"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Carica file" msgstr "Carica file"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Indietro / avanti" msgstr "Indietro / avanti"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Cartella superiore" msgstr "Cartella superiore"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Griglia / elenco" msgstr "Griglia / elenco"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -358,7 +359,7 @@ msgstr "Griglia / elenco"
msgid "Rename" msgid "Rename"
msgstr "Rinomina" msgstr "Rinomina"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -368,73 +369,73 @@ msgstr "Rinomina"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "Sposta nel cestino" msgstr "Sposta nel cestino"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Annulla la selezione" msgstr "Annulla la selezione"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Miniature più grandi" msgstr "Miniature più grandi"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Miniature più piccole" msgstr "Miniature più piccole"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Ripristina la dimensione delle miniature" msgstr "Ripristina la dimensione delle miniature"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Seleziona tutto" msgstr "Seleziona tutto"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Visualizzatore di foto" msgstr "Visualizzatore di foto"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Foto precedente / successiva" msgstr "Foto precedente / successiva"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "Prima / ultima foto" msgstr "Prima / ultima foto"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Mostra dettagli" msgstr "Mostra dettagli"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Schermo intero" msgstr "Schermo intero"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Chiudi" msgstr "Chiudi"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Seleziona un solo elemento per rinominarlo" msgstr "Seleziona un solo elemento per rinominarlo"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Non connesso" msgstr "Non connesso"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Il servizio di Proton Drive non è in esecuzione." msgstr "Il servizio di Proton Drive non è in esecuzione."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Connessione…" msgstr "Connessione…"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "In attesa dell’avvio del servizio di Proton Drive." msgstr "In attesa dell’avvio del servizio di Proton Drive."
@@ -1286,7 +1287,7 @@ msgstr "Impossibile caricare gli album"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1554,7 +1555,7 @@ msgid "Make available offline"
msgstr "Rendi disponibile offline" msgstr "Rendi disponibile offline"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Rendi solo online" msgstr "Rendi solo online"
@@ -2722,7 +2723,7 @@ msgid "Sync paused until you resume"
msgstr "Sincronizzazione in pausa finché non riprendi" msgstr "Sincronizzazione in pausa finché non riprendi"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Sincronizzazione in pausa" msgstr "Sincronizzazione in pausa"
@@ -3192,25 +3193,25 @@ msgstr "Inserisci la tua email e la password."
msgid "Signing in…" msgid "Signing in…"
msgstr "Accesso in corso…" msgstr "Accesso in corso…"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Completa la verifica per continuare…" msgstr "Completa la verifica per continuare…"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "accesso annullato" msgstr "accesso annullato"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Troppi tentativi di accesso. Attendi qualche minuto e riprova." msgstr "Troppi tentativi di accesso. Attendi qualche minuto e riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Impossibile raggiungere Proton. Controlla la connessione a Internet e " "Impossibile raggiungere Proton. Controlla la connessione a Internet e "
"riprova." "riprova."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3219,13 +3220,21 @@ msgstr ""
"portachiavi di sistema. Assicurati che un portachiavi (GNOME Keyring o " "portachiavi di sistema. Assicurati che un portachiavi (GNOME Keyring o "
"KWallet) sia in esecuzione e sbloccato." "KWallet) sia in esecuzione e sbloccato."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "" msgstr ""
"Accesso annullato: non è stato inserito alcun codice di autenticazione a due " "Accesso annullato: non è stato inserito alcun codice di autenticazione a due "
"fattori." "fattori."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3234,35 +3243,79 @@ msgstr ""
"riceverne una nuova." "riceverne una nuova."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Accesso non riuscito: {error}" msgstr "Accesso non riuscito: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Password della casella di posta"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Password della casella di posta"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Mantieni sbloccato su questo computer"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "Salva lo sblocco nel portachiavi di sistema, così Proton Drive si apre senza chiedere dopo ogni accesso. Altrimenti inserisci la password una volta per sessione."
#: crates/pdfs-gui/src/app/pages/login.rs:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Sblocca"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Sbloccato."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Impossibile sbloccare"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Autenticazione a due fattori" msgstr "Autenticazione a due fattori"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Inserisci il codice dell'app di autenticazione o uno dei tuoi codici di " "Inserisci il codice dell'app di autenticazione o uno dei tuoi codici di "
"recupero." "recupero."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Codice di autenticazione" msgstr "Codice di autenticazione"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Conferma" msgstr "Conferma"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Disconnettersi?" msgstr "Disconnettersi?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3270,7 +3323,7 @@ msgstr ""
"Proton Drive si disconnetterà e interromperà la sincronizzazione finché non " "Proton Drive si disconnetterà e interromperà la sincronizzazione finché non "
"accedi di nuovo. I file già presenti su questo computer restano dove sono." "accedi di nuovo. I file già presenti su questo computer restano dove sono."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Disconnetti" msgstr "Disconnetti"
@@ -4621,40 +4674,40 @@ msgid "Restart Now"
msgstr "Riavvia ora" msgstr "Riavvia ora"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "{size} utilizzati" msgstr "{size} utilizzati"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "{used} di {total} utilizzati ({percent}%)" msgstr "{used} di {total} utilizzati ({percent}%)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Proton Drive connesso" msgstr "Proton Drive connesso"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "I tuoi file sono disponibili." msgstr "I tuoi file sono disponibili."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Proton Drive disconnesso" msgstr "Proton Drive disconnesso"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"Il servizio di Proton Drive si è arrestato. I file non sono disponibili " "Il servizio di Proton Drive si è arrestato. I file non sono disponibili "
"finché non si riavvia." "finché non si riavvia."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Sincronizzazione completata" msgstr "Sincronizzazione completata"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4663,27 +4716,27 @@ msgstr[1] "Trasferimento di {n} file completato."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title}: {done} di {total}" msgstr "{title}: {done} di {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title}: {detail} ({done} di {total})" msgstr "{title}: {detail} ({done} di {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title}…" msgstr "{title}…"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title}: {detail}…" msgstr "{title}: {detail}…"
@@ -4691,7 +4744,7 @@ msgstr "{title}: {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name}: {done} ({speed}/s)" msgstr "{arrow} {name}: {done} ({speed}/s)"
@@ -4699,117 +4752,117 @@ msgstr "{arrow} {name}: {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name}: {done} di {total} ({speed}/s)" msgstr "{arrow} {name}: {done} di {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} in cache — nessun limite impostato" msgstr "{used} in cache — nessun limite impostato"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "{used} di {limit} utilizzati" msgstr "{used} di {limit} utilizzati"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · riprende {time}" msgstr "{queued} · riprende {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Riprende {time}" msgstr "Riprende {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Finché non riprendi" msgstr "Finché non riprendi"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "{n} modifica richiede attenzione" msgstr[0] "{n} modifica richiede attenzione"
msgstr[1] "{n} modifiche richiedono attenzione" msgstr[1] "{n} modifiche richiedono attenzione"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Offline" msgstr "Offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Solo file in cache" msgstr "Solo file in cache"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Sincronizzazione in corso" msgstr "Sincronizzazione in corso"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "Aggiornato" msgstr "Aggiornato"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "Proton Drive non è in esecuzione" msgstr "Proton Drive non è in esecuzione"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "Non risponde" msgstr "Non risponde"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive impiega troppo tempo a rispondere" msgstr "Proton Drive impiega troppo tempo a rispondere"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "più tardi" msgstr "più tardi"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "alle %H:%M" msgstr "alle %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "%a %H:%M" msgstr "%a %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "%e %b" msgstr "%e %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "Nessun file mantenuto offline" msgstr "Nessun file mantenuto offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "Fai clic destro su un file e scegli “Rendi disponibile offline”." msgstr "Fai clic destro su un file e scegli “Rendi disponibile offline”."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "Impossibile renderlo solo online" msgstr "Impossibile renderlo solo online"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Mostra meno" msgstr "Mostra meno"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5876,40 +5929,45 @@ msgstr[1] "↑ {n} in caricamento"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "Proton Drive non risponde" msgstr "Proton Drive non risponde"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Accesso effettuato come {username} — bloccato"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Accesso effettuato come {username} — non connesso" msgstr "Accesso effettuato come {username} — non connesso"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Accesso non eseguito" msgstr "Accesso non eseguito"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Errore: {error}" msgstr "Errore: {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive ha inviato una risposta inattesa" msgstr "Proton Drive ha inviato una risposta inattesa"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Aggiornato in {mountpoint} ({n} fissato)" msgstr[0] "Aggiornato in {mountpoint} ({n} fissato)"
msgstr[1] "Aggiornato in {mountpoint} ({n} fissati)" msgstr[1] "Aggiornato in {mountpoint} ({n} fissati)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Sincronizzazione: {queued} ({n} fissato)" msgstr[0] "Sincronizzazione: {queued} ({n} fissato)"
msgstr[1] "Sincronizzazione: {queued} ({n} fissati)" msgstr[1] "Sincronizzazione: {queued} ({n} fissati)"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5917,52 +5975,52 @@ msgstr[0] "Offline: solo file in cache ({n} fissato)"
msgstr[1] "Offline: solo file in cache ({n} fissati)" msgstr[1] "Offline: solo file in cache ({n} fissati)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline: {queued}" msgstr "Offline: {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problema: visualizza" msgstr[0] "{n} problema: visualizza"
msgstr[1] "{n} problemi: visualizza" msgstr[1] "{n} problemi: visualizza"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Accedi…" msgstr "Accedi…"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Apri Proton Drive" msgstr "Apri Proton Drive"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Apri cartella" msgstr "Apri cartella"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Riprendi sincronizzazione" msgstr "Riprendi sincronizzazione"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Metti in pausa sincronizzazione" msgstr "Metti in pausa sincronizzazione"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Connetti" msgstr "Connetti"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Nascondi icona nell'area di notifica" msgstr "Nascondi icona nell'area di notifica"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Arresta Proton Drive…" msgstr "Arresta Proton Drive…"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Esci" msgstr "Esci"
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A %-d %B %Y, %H:%M" msgstr "%A %-d %B %Y, %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y, %H:%M"
msgid "My files" msgid "My files"
msgstr "Mijn bestanden" msgstr "Mijn bestanden"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Foto's" msgstr "Foto's"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Gedeeld met mij" msgstr "Gedeeld met mij"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Gedeeld door mij" msgstr "Gedeeld door mij"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computers" msgstr "Computers"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Prullenbak" msgstr "Prullenbak"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Synchronisatie" msgstr "Synchronisatie"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what}: {detail}" msgstr "{what}: {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "Je bent offline" msgstr "Je bent offline"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "Dat bestaat niet meer" msgstr "Dat bestaat niet meer"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "Je hebt daar geen toegang toe" msgstr "Je hebt daar geen toegang toe"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "Er is eerst iets anders gewijzigd" msgstr "Er is eerst iets anders gewijzigd"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Je Proton Drive is vol" msgstr "Je Proton Drive is vol"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Voorkeuren" msgstr "Voorkeuren"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Sneltoetsen" msgstr "Sneltoetsen"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "Over Proton Drive for Linux" msgstr "Over Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Hoofdmenu" msgstr "Hoofdmenu"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -166,23 +166,23 @@ msgstr ""
"Onofficiële client — niet gelieerd aan, onderschreven door of ondersteund " "Onofficiële client — niet gelieerd aan, onderschreven door of ondersteund "
"door Proton AG." "door Proton AG."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Broncode" msgstr "Broncode"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Servicevoorwaarden van Proton" msgstr "Servicevoorwaarden van Proton"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Privacybeleid van Proton" msgstr "Privacybeleid van Proton"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Disclaimer" msgstr "Disclaimer"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -205,7 +205,7 @@ msgstr ""
"Deze software wordt geleverd “zoals ze is”, zonder enige garantie. Bewaar " "Deze software wordt geleverd “zoals ze is”, zonder enige garantie. Bewaar "
"een kopie van gegevens die je niet kwijt wilt raken." "een kopie van gegevens die je niet kwijt wilt raken."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -215,7 +215,7 @@ msgstr ""
"\">GeoNames</a>, gelicentieerd onder <a href=\"https://creativecommons.org/" "\">GeoNames</a>, gelicentieerd onder <a href=\"https://creativecommons.org/"
"licenses/by/4.0/\">CC BY 4.0</a>." "licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -225,7 +225,7 @@ msgstr ""
"href=\"https://www.naturalearthdata.com/\">Natural Earth</a>, die in het " "href=\"https://www.naturalearthdata.com/\">Natural Earth</a>, die in het "
"publieke domein vallen." "publieke domein vallen."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -241,15 +241,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Bijdragers aan Proton Drive for Linux" msgstr "Bijdragers aan Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "Proton Drive stoppen?" msgstr "Proton Drive stoppen?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -257,7 +257,7 @@ msgstr ""
"Mijn bestanden gaat offline en er wordt niets gesynchroniseerd tot je weer " "Mijn bestanden gaat offline en er wordt niets gesynchroniseerd tot je weer "
"verbinding maakt. Proton Drive start opnieuw bij je volgende aanmelding." "verbinding maakt. Proton Drive start opnieuw bij je volgende aanmelding."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -272,7 +272,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -287,30 +288,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Annuleren" msgstr "Annuleren"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Stoppen" msgstr "Stoppen"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "Kon Proton Drive niet stoppen" msgstr "Kon Proton Drive niet stoppen"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "De Proton Drive-service is niet gestopt." msgstr "De Proton Drive-service is niet gestopt."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "Algemeen" msgstr "Algemeen"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Drive doorzoeken" msgstr "Drive doorzoeken"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -319,38 +320,38 @@ msgstr "Drive doorzoeken"
msgid "Refresh" msgid "Refresh"
msgstr "Verversen" msgstr "Verversen"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Sneltoetsen" msgstr "Sneltoetsen"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "Bestanden" msgstr "Bestanden"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "Nieuwe map" msgstr "Nieuwe map"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Bestanden uploaden" msgstr "Bestanden uploaden"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Terug / vooruit" msgstr "Terug / vooruit"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Bovenliggende map" msgstr "Bovenliggende map"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Raster / lijst" msgstr "Raster / lijst"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -359,7 +360,7 @@ msgstr "Raster / lijst"
msgid "Rename" msgid "Rename"
msgstr "Hernoemen" msgstr "Hernoemen"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -369,73 +370,73 @@ msgstr "Hernoemen"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "Naar prullenbak verplaatsen" msgstr "Naar prullenbak verplaatsen"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Selectie wissen" msgstr "Selectie wissen"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Grotere miniaturen" msgstr "Grotere miniaturen"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Kleinere miniaturen" msgstr "Kleinere miniaturen"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Miniatuurgrootte herstellen" msgstr "Miniatuurgrootte herstellen"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Alles selecteren" msgstr "Alles selecteren"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Fotoweergave" msgstr "Fotoweergave"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Vorige / volgende foto" msgstr "Vorige / volgende foto"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "Eerste / laatste foto" msgstr "Eerste / laatste foto"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Details tonen" msgstr "Details tonen"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Volledig scherm" msgstr "Volledig scherm"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Sluiten" msgstr "Sluiten"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Selecteer één item om het te hernoemen" msgstr "Selecteer één item om het te hernoemen"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Niet verbonden" msgstr "Niet verbonden"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "De Proton Drive-service draait niet." msgstr "De Proton Drive-service draait niet."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Verbinden…" msgstr "Verbinden…"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "Wachten tot de Proton Drive-service is gestart." msgstr "Wachten tot de Proton Drive-service is gestart."
@@ -1282,7 +1283,7 @@ msgstr "Kon albums niet laden"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1550,7 +1551,7 @@ msgid "Make available offline"
msgstr "Offline beschikbaar maken" msgstr "Offline beschikbaar maken"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Alleen online maken" msgstr "Alleen online maken"
@@ -2713,7 +2714,7 @@ msgid "Sync paused until you resume"
msgstr "Synchronisatie gepauzeerd totdat je hervat" msgstr "Synchronisatie gepauzeerd totdat je hervat"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Synchronisatie gepauzeerd" msgstr "Synchronisatie gepauzeerd"
@@ -3185,26 +3186,26 @@ msgstr "Voer je e-mailadres en wachtwoord in."
msgid "Signing in…" msgid "Signing in…"
msgstr "Aanmelden…" msgstr "Aanmelden…"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Voltooi de verificatie om verder te gaan…" msgstr "Voltooi de verificatie om verder te gaan…"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "aanmelden geannuleerd" msgstr "aanmelden geannuleerd"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Te veel aanmeldpogingen. Wacht een paar minuten en probeer het opnieuw." "Te veel aanmeldpogingen. Wacht een paar minuten en probeer het opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Kon Proton niet bereiken. Controleer je internetverbinding en probeer het " "Kon Proton niet bereiken. Controleer je internetverbinding en probeer het "
"opnieuw." "opnieuw."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3213,11 +3214,19 @@ msgstr ""
"opgeslagen. Zorg dat een sleutelbos (GNOME Keyring of KWallet) actief en " "opgeslagen. Zorg dat een sleutelbos (GNOME Keyring of KWallet) actief en "
"ontgrendeld is." "ontgrendeld is."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Aanmelden geannuleerd: er is geen tweestapscode ingevoerd." msgstr "Aanmelden geannuleerd: er is geen tweestapscode ingevoerd."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3226,33 +3235,77 @@ msgstr ""
"om een nieuwe te krijgen." "om een nieuwe te krijgen."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Aanmelden mislukt: {error}" msgstr "Aanmelden mislukt: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Mailboxwachtwoord"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Mailboxwachtwoord"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Ontgrendeld houden op deze computer"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "Bewaart de ontgrendeling in de sleutelhanger van het systeem, zodat Proton 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:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Ontgrendelen"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Ontgrendeld."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Ontgrendelen mislukt"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Tweestapsverificatie" msgstr "Tweestapsverificatie"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "Voer de code uit je authenticator-app in, of een van je herstelcodes." msgstr "Voer de code uit je authenticator-app in, of een van je herstelcodes."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Verificatiecode" msgstr "Verificatiecode"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Bevestigen" msgstr "Bevestigen"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Afmelden?" msgstr "Afmelden?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3261,7 +3314,7 @@ msgstr ""
"je opnieuw aanmeldt. Bestanden die al op deze computer staan, blijven waar " "je opnieuw aanmeldt. Bestanden die al op deze computer staan, blijven waar "
"ze zijn." "ze zijn."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Afmelden" msgstr "Afmelden"
@@ -4620,40 +4673,40 @@ msgid "Restart Now"
msgstr "Nu opnieuw starten" msgstr "Nu opnieuw starten"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "{size} gebruikt" msgstr "{size} gebruikt"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "{used} van {total} gebruikt ({percent}%)" msgstr "{used} van {total} gebruikt ({percent}%)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Proton Drive verbonden" msgstr "Proton Drive verbonden"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "Je bestanden zijn beschikbaar." msgstr "Je bestanden zijn beschikbaar."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Verbinding met Proton Drive verbroken" msgstr "Verbinding met Proton Drive verbroken"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"De Proton Drive-service is gestopt. Bestanden zijn pas weer beschikbaar als " "De Proton Drive-service is gestopt. Bestanden zijn pas weer beschikbaar als "
"hij opnieuw start." "hij opnieuw start."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Synchronisatie voltooid" msgstr "Synchronisatie voltooid"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4662,27 +4715,27 @@ msgstr[1] "{n} bestanden zijn klaar met overdragen."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title} — {done} van {total}" msgstr "{title} — {done} van {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title} — {detail} ({done} van {total})" msgstr "{title} — {detail} ({done} van {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title}…" msgstr "{title}…"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title} — {detail}…" msgstr "{title} — {detail}…"
@@ -4690,7 +4743,7 @@ msgstr "{title} — {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name} — {done} ({speed}/s)" msgstr "{arrow} {name} — {done} ({speed}/s)"
@@ -4698,117 +4751,117 @@ msgstr "{arrow} {name} — {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name} — {done} van {total} ({speed}/s)" msgstr "{arrow} {name} — {done} van {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} in cache — geen limiet ingesteld" msgstr "{used} in cache — geen limiet ingesteld"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "{used} van {limit} gebruikt" msgstr "{used} van {limit} gebruikt"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · hervat {time}" msgstr "{queued} · hervat {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Hervat {time}" msgstr "Hervat {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Totdat je hervat" msgstr "Totdat je hervat"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "{n} wijziging vereist aandacht" msgstr[0] "{n} wijziging vereist aandacht"
msgstr[1] "{n} wijzigingen vereisen aandacht" msgstr[1] "{n} wijzigingen vereisen aandacht"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Offline" msgstr "Offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Alleen bestanden in cache" msgstr "Alleen bestanden in cache"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Synchroniseren" msgstr "Synchroniseren"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "Bijgewerkt" msgstr "Bijgewerkt"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "Proton Drive draait niet" msgstr "Proton Drive draait niet"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "Reageert niet" msgstr "Reageert niet"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive doet er te lang over om te antwoorden" msgstr "Proton Drive doet er te lang over om te antwoorden"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "later" msgstr "later"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "om %H:%M" msgstr "om %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "%a %H:%M" msgstr "%a %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "%e %b" msgstr "%e %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "Geen offline bewaarde bestanden" msgstr "Geen offline bewaarde bestanden"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "Klik met rechts op een bestand en kies “Offline beschikbaar maken”." msgstr "Klik met rechts op een bestand en kies “Offline beschikbaar maken”."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "Kon het niet alleen online maken" msgstr "Kon het niet alleen online maken"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Minder tonen" msgstr "Minder tonen"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5868,40 +5921,45 @@ msgstr[1] "↑ {n} worden geüpload"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "Proton Drive reageert niet" msgstr "Proton Drive reageert niet"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Aangemeld als {username} — vergrendeld"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Aangemeld als {username} — niet verbonden" msgstr "Aangemeld als {username} — niet verbonden"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Niet aangemeld" msgstr "Niet aangemeld"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Fout: {error}" msgstr "Fout: {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive gaf een onverwacht antwoord" msgstr "Proton Drive gaf een onverwacht antwoord"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Bijgewerkt in {mountpoint} ({n} vastgezet)" msgstr[0] "Bijgewerkt in {mountpoint} ({n} vastgezet)"
msgstr[1] "Bijgewerkt in {mountpoint} ({n} vastgezet)" msgstr[1] "Bijgewerkt in {mountpoint} ({n} vastgezet)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Synchroniseren — {queued} ({n} vastgezet)" msgstr[0] "Synchroniseren — {queued} ({n} vastgezet)"
msgstr[1] "Synchroniseren — {queued} ({n} vastgezet)" msgstr[1] "Synchroniseren — {queued} ({n} vastgezet)"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5909,52 +5967,52 @@ msgstr[0] "Offline — alleen bestanden in cache ({n} vastgezet)"
msgstr[1] "Offline — alleen bestanden in cache ({n} vastgezet)" msgstr[1] "Offline — alleen bestanden in cache ({n} vastgezet)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} probleem — Bekijken" msgstr[0] "{n} probleem — Bekijken"
msgstr[1] "{n} problemen — Bekijken" msgstr[1] "{n} problemen — Bekijken"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Aanmelden…" msgstr "Aanmelden…"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Proton Drive openen" msgstr "Proton Drive openen"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Map openen" msgstr "Map openen"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Synchronisatie hervatten" msgstr "Synchronisatie hervatten"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Synchronisatie pauzeren" msgstr "Synchronisatie pauzeren"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Verbinden" msgstr "Verbinden"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Pictogram in systeemvak verbergen" msgstr "Pictogram in systeemvak verbergen"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Proton Drive stoppen…" msgstr "Proton Drive stoppen…"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Afsluiten" msgstr "Afsluiten"
+199 -141
View File
@@ -6,9 +6,9 @@
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.10.0\n" "Project-Id-Version: proton-drive-linux 3.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -60,7 +60,7 @@ msgstr ""
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -73,91 +73,91 @@ msgstr ""
msgid "My files" msgid "My files"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "" msgstr ""
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "" msgstr ""
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -165,23 +165,23 @@ msgid ""
"AG." "AG."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -194,21 +194,21 @@ msgid ""
"of any data you cannot afford to lose." "of any data you cannot afford to lose."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
"licenses/by/4.0/\">CC BY 4.0</a>." "licenses/by/4.0/\">CC BY 4.0</a>."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
"public domain." "public domain."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -219,21 +219,21 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -248,7 +248,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -263,30 +264,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -295,38 +296,38 @@ msgstr ""
msgid "Refresh" msgid "Refresh"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -335,7 +336,7 @@ msgstr ""
msgid "Rename" msgid "Rename"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -345,73 +346,73 @@ msgstr ""
msgid "Move to Trash" msgid "Move to Trash"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "" msgstr ""
@@ -1240,7 +1241,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1508,7 +1509,7 @@ msgid "Make available offline"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "" msgstr ""
@@ -2616,7 +2617,7 @@ msgid "Sync paused until you resume"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "" msgstr ""
@@ -3052,72 +3053,124 @@ msgstr ""
msgid "Signing in…" msgid "Signing in…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
msgid "Sign-in cancelled: no mailbox password was entered."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:236
msgid "That mailbox password didn't unlock your account."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
msgstr "" msgstr ""
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
msgid "That mailbox password didn't unlock your account. Try again."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:356
msgid ""
"This account has a separate mailbox password. Enter it to unlock your files."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:359
msgid "Mailbox Password"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:371
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:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:431
msgid "Proton Drive is locked. Enter your mailbox password to unlock it."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:460
msgid "Unlocked."
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "" msgstr ""
@@ -4433,38 +4486,38 @@ msgid "Restart Now"
msgstr "" msgstr ""
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4473,27 +4526,27 @@ msgstr[1] ""
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "" msgstr ""
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "" msgstr ""
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "" msgstr ""
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "" msgstr ""
@@ -4501,7 +4554,7 @@ msgstr ""
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "" msgstr ""
@@ -4509,117 +4562,117 @@ msgstr ""
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "" msgstr ""
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "" msgstr ""
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "" msgstr ""
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "" msgstr ""
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "" msgstr ""
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5644,40 +5697,45 @@ msgstr[1] ""
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr ""
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "" msgstr ""
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5685,52 +5743,52 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "" msgstr ""
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "" msgstr ""
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Polish\n" "Language-Team: Polish\n"
@@ -59,7 +59,7 @@ msgstr "%-d %b %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A, %-d %B %Y, %H:%M" msgstr "%A, %-d %B %Y, %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -72,91 +72,91 @@ msgstr "%A, %-d %B %Y, %H:%M"
msgid "My files" msgid "My files"
msgstr "Moje pliki" msgstr "Moje pliki"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Zdjęcia" msgstr "Zdjęcia"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Udostępnione mi" msgstr "Udostępnione mi"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Udostępnione przeze mnie" msgstr "Udostępnione przeze mnie"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Komputery" msgstr "Komputery"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Kosz" msgstr "Kosz"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Synchronizacja" msgstr "Synchronizacja"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what}: {detail}" msgstr "{what}: {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "Brak połączenia z siecią" msgstr "Brak połączenia z siecią"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "Ten element już nie istnieje" msgstr "Ten element już nie istnieje"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "Brak dostępu do tego elementu" msgstr "Brak dostępu do tego elementu"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "Coś zmieniło ten element wcześniej" msgstr "Coś zmieniło ten element wcześniej"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Proton Drive jest pełny" msgstr "Proton Drive jest pełny"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Preferencje" msgstr "Preferencje"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Skróty klawiszowe" msgstr "Skróty klawiszowe"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "O programie Proton Drive for Linux" msgstr "O programie Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Menu główne" msgstr "Menu główne"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -168,23 +168,23 @@ msgstr ""
"Nieoficjalny klient — niepowiązany z Proton AG, niepopierany ani " "Nieoficjalny klient — niepowiązany z Proton AG, niepopierany ani "
"niewspierany przez tę firmę." "niewspierany przez tę firmę."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Kod źródłowy" msgstr "Kod źródłowy"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Warunki korzystania z usług Proton" msgstr "Warunki korzystania z usług Proton"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Polityka prywatności Proton" msgstr "Polityka prywatności Proton"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Zastrzeżenia" msgstr "Zastrzeżenia"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -208,7 +208,7 @@ msgstr ""
"gwarancji. Zachowaj kopię danych, na których utratę nie możesz sobie " "gwarancji. Zachowaj kopię danych, na których utratę nie możesz sobie "
"pozwolić." "pozwolić."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -218,7 +218,7 @@ msgstr ""
"\">GeoNames</a> udostępnionych na licencji <a href=\"https://" "\">GeoNames</a> udostępnionych na licencji <a href=\"https://"
"creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>." "creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -228,7 +228,7 @@ msgstr ""
"www.naturalearthdata.com/\">Natural Earth</a>, które należą do domeny " "www.naturalearthdata.com/\">Natural Earth</a>, które należą do domeny "
"publicznej." "publicznej."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -244,15 +244,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Współtwórcy programu Proton Drive for Linux" msgstr "Współtwórcy programu Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "Zatrzymać Proton Drive?" msgstr "Zatrzymać Proton Drive?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -261,7 +261,7 @@ msgstr ""
"ponownego połączenia. Proton Drive uruchomi się ponownie przy następnym " "ponownego połączenia. Proton Drive uruchomi się ponownie przy następnym "
"logowaniu." "logowaniu."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -276,7 +276,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -291,30 +292,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Anuluj" msgstr "Anuluj"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Zatrzymaj" msgstr "Zatrzymaj"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "Nie można zatrzymać Proton Drive" msgstr "Nie można zatrzymać Proton Drive"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "Usługa Proton Drive nie zatrzymała się." msgstr "Usługa Proton Drive nie zatrzymała się."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "Ogólne" msgstr "Ogólne"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Przeszukaj Drive" msgstr "Przeszukaj Drive"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -323,38 +324,38 @@ msgstr "Przeszukaj Drive"
msgid "Refresh" msgid "Refresh"
msgstr "Odśwież" msgstr "Odśwież"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Skróty klawiszowe" msgstr "Skróty klawiszowe"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "Pliki" msgstr "Pliki"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "Nowy katalog" msgstr "Nowy katalog"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Wyślij pliki" msgstr "Wyślij pliki"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Wstecz/dalej" msgstr "Wstecz/dalej"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Katalog nadrzędny" msgstr "Katalog nadrzędny"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Siatka/lista" msgstr "Siatka/lista"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -363,7 +364,7 @@ msgstr "Siatka/lista"
msgid "Rename" msgid "Rename"
msgstr "Zmień nazwę" msgstr "Zmień nazwę"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -373,73 +374,73 @@ msgstr "Zmień nazwę"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "Przenieś do kosza" msgstr "Przenieś do kosza"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Wyczyść zaznaczenie" msgstr "Wyczyść zaznaczenie"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Większe miniatury" msgstr "Większe miniatury"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Mniejsze miniatury" msgstr "Mniejsze miniatury"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Przywróć rozmiar miniatur" msgstr "Przywróć rozmiar miniatur"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Zaznacz wszystko" msgstr "Zaznacz wszystko"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Przeglądarka zdjęć" msgstr "Przeglądarka zdjęć"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Poprzednie/następne zdjęcie" msgstr "Poprzednie/następne zdjęcie"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "Pierwsze/ostatnie zdjęcie" msgstr "Pierwsze/ostatnie zdjęcie"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Wyświetl szczegóły" msgstr "Wyświetl szczegóły"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Pełny ekran" msgstr "Pełny ekran"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Zamknij" msgstr "Zamknij"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Należy zaznaczyć jeden element, aby zmienić jego nazwę" msgstr "Należy zaznaczyć jeden element, aby zmienić jego nazwę"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Brak połączenia" msgstr "Brak połączenia"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "Usługa Proton Drive nie jest uruchomiona." msgstr "Usługa Proton Drive nie jest uruchomiona."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Łączenie…" msgstr "Łączenie…"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "Oczekiwanie na uruchomienie usługi Proton Drive." msgstr "Oczekiwanie na uruchomienie usługi Proton Drive."
@@ -1313,7 +1314,7 @@ msgstr "Nie można wczytać albumów"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1586,7 +1587,7 @@ msgid "Make available offline"
msgstr "Oznacz jako dostępne offline" msgstr "Oznacz jako dostępne offline"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Oznacz jako tylko online" msgstr "Oznacz jako tylko online"
@@ -2770,7 +2771,7 @@ msgid "Sync paused until you resume"
msgstr "Wstrzymano synchronizację do czasu wznowienia" msgstr "Wstrzymano synchronizację do czasu wznowienia"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Wstrzymano synchronizację" msgstr "Wstrzymano synchronizację"
@@ -3242,26 +3243,26 @@ msgstr "Proszę podać adres e-mail i hasło."
msgid "Signing in…" msgid "Signing in…"
msgstr "Logowanie…" msgstr "Logowanie…"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Proszę ukończyć weryfikację, aby kontynuować…" msgstr "Proszę ukończyć weryfikację, aby kontynuować…"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "anulowano logowanie" msgstr "anulowano logowanie"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "" msgstr ""
"Za dużo prób logowania. Proszę odczekać kilka minut i spróbować ponownie." "Za dużo prób logowania. Proszę odczekać kilka minut i spróbować ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Nie można połączyć się z Proton. Proszę sprawdzić połączenie z Internetem i " "Nie można połączyć się z Proton. Proszę sprawdzić połączenie z Internetem i "
"spróbować ponownie." "spróbować ponownie."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3270,11 +3271,19 @@ msgstr ""
"upewnić, że baza kluczy (GNOME Keyring lub KWallet) jest uruchomiona i " "upewnić, że baza kluczy (GNOME Keyring lub KWallet) jest uruchomiona i "
"odblokowana." "odblokowana."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Anulowano logowanie: nie wpisano kodu uwierzytelniania dwuetapowego." msgstr "Anulowano logowanie: nie wpisano kodu uwierzytelniania dwuetapowego."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3283,35 +3292,79 @@ msgstr ""
"ponownie, aby otrzymać nową." "ponownie, aby otrzymać nową."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Logowanie się nie powiodło: {error}" msgstr "Logowanie się nie powiodło: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Hasło skrzynki pocztowej"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Hasło skrzynki pocztowej"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Pozostaw odblokowane na tym komputerze"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "Zapisuje odblokowanie w systemowym breloku kluczy, aby Proton Drive otwierał się bez pytania po każdym logowaniu. W przeciwnym razie wpisujesz hasło raz na sesję."
#: crates/pdfs-gui/src/app/pages/login.rs:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Odblokuj"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Odblokowano."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Nie udało się odblokować"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Uwierzytelnianie dwuskładnikowe" msgstr "Uwierzytelnianie dwuskładnikowe"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Proszę wpisać kod z aplikacji uwierzytelniającej lub jeden z kodów " "Proszę wpisać kod z aplikacji uwierzytelniającej lub jeden z kodów "
"odzyskiwania." "odzyskiwania."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Kod uwierzytelniania" msgstr "Kod uwierzytelniania"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Potwierdź" msgstr "Potwierdź"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Wylogować się?" msgstr "Wylogować się?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3319,7 +3372,7 @@ msgstr ""
"Proton Drive rozłączy się i przestanie synchronizować do czasu ponownego " "Proton Drive rozłączy się i przestanie synchronizować do czasu ponownego "
"zalogowania. Pliki znajdujące się już na tym komputerze pozostaną na miejscu." "zalogowania. Pliki znajdujące się już na tym komputerze pozostaną na miejscu."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Wyloguj się" msgstr "Wyloguj się"
@@ -4689,40 +4742,40 @@ msgid "Restart Now"
msgstr "Uruchom ponownie teraz" msgstr "Uruchom ponownie teraz"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "Użyto {size}" msgstr "Użyto {size}"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "Użyto {used} z {total} ({percent}%)" msgstr "Użyto {used} z {total} ({percent}%)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Połączono z Proton Drive" msgstr "Połączono z Proton Drive"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "Twoje pliki są dostępne." msgstr "Twoje pliki są dostępne."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Rozłączono z Proton Drive" msgstr "Rozłączono z Proton Drive"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"Usługa Proton Drive zatrzymała się. Pliki będą niedostępne do jej ponownego " "Usługa Proton Drive zatrzymała się. Pliki będą niedostępne do jej ponownego "
"uruchomienia." "uruchomienia."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Ukończono synchronizację" msgstr "Ukończono synchronizację"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4732,27 +4785,27 @@ msgstr[2] "Ukończono przesyłanie {n} plików."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title} — {done} z {total}" msgstr "{title} — {done} z {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title} — {detail} ({done} z {total})" msgstr "{title} — {detail} ({done} z {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title}…" msgstr "{title}…"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title} — {detail}…" msgstr "{title} — {detail}…"
@@ -4760,7 +4813,7 @@ msgstr "{title} — {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name} — {done} ({speed}/s)" msgstr "{arrow} {name} — {done} ({speed}/s)"
@@ -4768,38 +4821,38 @@ msgstr "{arrow} {name} — {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name} — {done} z {total} ({speed}/s)" msgstr "{arrow} {name} — {done} z {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} w pamięci podręcznej — bez limitu" msgstr "{used} w pamięci podręcznej — bez limitu"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "Użyto {used} z {limit}" msgstr "Użyto {used} z {limit}"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · wznowienie {time}" msgstr "{queued} · wznowienie {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Wznowienie {time}" msgstr "Wznowienie {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Do czasu wznowienia" msgstr "Do czasu wznowienia"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
@@ -4807,81 +4860,81 @@ msgstr[0] "{n} zmiana wymaga uwagi"
msgstr[1] "{n} zmiany wymagają uwagi" msgstr[1] "{n} zmiany wymagają uwagi"
msgstr[2] "{n} zmian wymaga uwagi" msgstr[2] "{n} zmian wymaga uwagi"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Offline" msgstr "Offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Tylko pliki w pamięci podręcznej" msgstr "Tylko pliki w pamięci podręcznej"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Synchronizowanie" msgstr "Synchronizowanie"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "Aktualne" msgstr "Aktualne"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "Proton Drive nie jest uruchomiony" msgstr "Proton Drive nie jest uruchomiony"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "Nie odpowiada" msgstr "Nie odpowiada"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "Proton Drive zbyt długo nie odpowiada" msgstr "Proton Drive zbyt długo nie odpowiada"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "później" msgstr "później"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "o %H:%M" msgstr "o %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "%a %H:%M" msgstr "%a %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "%-d %b" msgstr "%-d %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "Brak plików dostępnych offline" msgstr "Brak plików dostępnych offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "" msgstr ""
"Należy kliknąć plik prawym przyciskiem myszy i wybrać „Oznacz jako dostępne " "Należy kliknąć plik prawym przyciskiem myszy i wybrać „Oznacz jako dostępne "
"offline”." "offline”."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "Nie można oznaczyć jako tylko online" msgstr "Nie można oznaczyć jako tylko online"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Wyświetl mniej" msgstr "Wyświetl mniej"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5959,26 +6012,31 @@ msgstr[2] "↑ wysyłanie: {n}"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "Proton Drive nie odpowiada" msgstr "Proton Drive nie odpowiada"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Zalogowano jako {username} — zablokowane"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Zalogowano jako {username} — brak połączenia" msgstr "Zalogowano jako {username} — brak połączenia"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Nie zalogowano" msgstr "Nie zalogowano"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Błąd: {error}" msgstr "Błąd: {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "Proton Drive wysłał nieoczekiwaną odpowiedź" msgstr "Proton Drive wysłał nieoczekiwaną odpowiedź"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
@@ -5986,7 +6044,7 @@ msgstr[0] "Aktualne w {mountpoint} ({n} przypięty)"
msgstr[1] "Aktualne w {mountpoint} ({n} przypięte)" msgstr[1] "Aktualne w {mountpoint} ({n} przypięte)"
msgstr[2] "Aktualne w {mountpoint} ({n} przypiętych)" msgstr[2] "Aktualne w {mountpoint} ({n} przypiętych)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
@@ -5994,7 +6052,7 @@ msgstr[0] "Synchronizowanie — {queued} (przypięte: {n})"
msgstr[1] "Synchronizowanie — {queued} (przypięte: {n})" msgstr[1] "Synchronizowanie — {queued} (przypięte: {n})"
msgstr[2] "Synchronizowanie — {queued} (przypięte: {n})" msgstr[2] "Synchronizowanie — {queued} (przypięte: {n})"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -6003,13 +6061,13 @@ msgstr[1] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})"
msgstr[2] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})" msgstr[2] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
@@ -6017,39 +6075,39 @@ msgstr[0] "{n} problem — wyświetl"
msgstr[1] "{n} problemy — wyświetl" msgstr[1] "{n} problemy — wyświetl"
msgstr[2] "{n} problemów — wyświetl" msgstr[2] "{n} problemów — wyświetl"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Zaloguj się…" msgstr "Zaloguj się…"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Otwórz Proton Drive" msgstr "Otwórz Proton Drive"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Otwórz katalog" msgstr "Otwórz katalog"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Wznów synchronizację" msgstr "Wznów synchronizację"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Wstrzymaj synchronizację" msgstr "Wstrzymaj synchronizację"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Połącz" msgstr "Połącz"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Ukryj ikonę w obszarze powiadamiania" msgstr "Ukryj ikonę w obszarze powiadamiania"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Zatrzymaj Proton Drive…" msgstr "Zatrzymaj Proton Drive…"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Zakończ" msgstr "Zakończ"
+198 -140
View File
@@ -5,7 +5,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.1.0\n" "Project-Id-Version: proton-drive-linux 2.1.0\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-10-05 01:01+0200\n" "POT-Creation-Date: 2026-10-07 02:39+0200\n"
"PO-Revision-Date: 2026-09-23 12:00+0200\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n"
"Last-Translator: Proton Drive for Linux contributors\n" "Last-Translator: Proton Drive for Linux contributors\n"
"Language-Team: Portuguese (Brazil)\n" "Language-Team: Portuguese (Brazil)\n"
@@ -57,7 +57,7 @@ msgstr "%-d de %b de %Y"
msgid "%A, %B %-d, %Y, %H:%M" msgid "%A, %B %-d, %Y, %H:%M"
msgstr "%A, %-d de %B de %Y, %H:%M" msgstr "%A, %-d de %B de %Y, %H:%M"
#: crates/pdfs-gui/src/app/main.rs:743 #: crates/pdfs-gui/src/app/main.rs:747
#: crates/pdfs-gui/src/app/pages/activity_text.rs:539 #: crates/pdfs-gui/src/app/pages/activity_text.rs:539
#: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:454
#: crates/pdfs-gui/src/app/pages/browser.rs:819 #: crates/pdfs-gui/src/app/pages/browser.rs:819
@@ -70,91 +70,91 @@ msgstr "%A, %-d de %B de %Y, %H:%M"
msgid "My files" msgid "My files"
msgstr "Meus arquivos" msgstr "Meus arquivos"
#: crates/pdfs-gui/src/app/main.rs:746 crates/pdfs-gui/src/app/main.rs:1390 #: crates/pdfs-gui/src/app/main.rs:750 crates/pdfs-gui/src/app/main.rs:1394
#: crates/pdfs-gui/src/app/pages/albums.rs:638 #: crates/pdfs-gui/src/app/pages/albums.rs:638
#: crates/pdfs-gui/src/app/pages/photos.rs:842 #: crates/pdfs-gui/src/app/pages/photos.rs:842
#: crates/pdfs-gui/src/app/pages/places.rs:441 #: crates/pdfs-gui/src/app/pages/places.rs:441
msgid "Photos" msgid "Photos"
msgstr "Fotos" msgstr "Fotos"
#: crates/pdfs-gui/src/app/main.rs:751 #: crates/pdfs-gui/src/app/main.rs:755
#: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:168
#: crates/pdfs-gui/src/app/pages/shared.rs:482 #: crates/pdfs-gui/src/app/pages/shared.rs:482
msgid "Shared with me" msgid "Shared with me"
msgstr "Compartilhados comigo" msgstr "Compartilhados comigo"
#: crates/pdfs-gui/src/app/main.rs:756 #: crates/pdfs-gui/src/app/main.rs:760
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120
msgid "Shared by me" msgid "Shared by me"
msgstr "Compartilhados por mim" msgstr "Compartilhados por mim"
#: crates/pdfs-gui/src/app/main.rs:759 #: crates/pdfs-gui/src/app/main.rs:763
#: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:140
#: crates/pdfs-gui/src/app/pages/devices.rs:481 #: crates/pdfs-gui/src/app/pages/devices.rs:481
msgid "Computers" msgid "Computers"
msgstr "Computadores" msgstr "Computadores"
#: crates/pdfs-gui/src/app/main.rs:760 #: crates/pdfs-gui/src/app/main.rs:764
#: crates/pdfs-gui/src/app/pages/trash.rs:101 #: crates/pdfs-gui/src/app/pages/trash.rs:101
msgid "Trash" msgid "Trash"
msgstr "Lixeira" msgstr "Lixeira"
#. Translators: sidebar entry for the page listing this computer's synced folders. #. Translators: sidebar entry for the page listing this computer's synced folders.
#: crates/pdfs-gui/src/app/main.rs:762 #: crates/pdfs-gui/src/app/main.rs:766
msgid "Sync" msgid "Sync"
msgstr "Sincronização" msgstr "Sincronização"
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1079 #: crates/pdfs-gui/src/app/main.rs:1083
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "{what}: {detail}" msgstr "{what}: {detail}"
#: crates/pdfs-gui/src/app/main.rs:1098 #: crates/pdfs-gui/src/app/main.rs:1102
msgid "You're offline" msgid "You're offline"
msgstr "Você está offline" msgstr "Você está offline"
#: crates/pdfs-gui/src/app/main.rs:1099 #: crates/pdfs-gui/src/app/main.rs:1103
msgid "That's not there any more" msgid "That's not there any more"
msgstr "Isso não existe mais" msgstr "Isso não existe mais"
#: crates/pdfs-gui/src/app/main.rs:1100 #: crates/pdfs-gui/src/app/main.rs:1104
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "Você não tem acesso a isso" msgstr "Você não tem acesso a isso"
#: crates/pdfs-gui/src/app/main.rs:1101 #: crates/pdfs-gui/src/app/main.rs:1105
msgid "Something changed this first" msgid "Something changed this first"
msgstr "Algo alterou isso antes" msgstr "Algo alterou isso antes"
#: crates/pdfs-gui/src/app/main.rs:1102 #: crates/pdfs-gui/src/app/main.rs:1106
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "Seu Proton Drive está cheio" msgstr "Seu Proton Drive está cheio"
#: crates/pdfs-gui/src/app/main.rs:1143 crates/pdfs-gui/src/app/main.rs:1372 #: crates/pdfs-gui/src/app/main.rs:1147 crates/pdfs-gui/src/app/main.rs:1376
#: crates/pdfs-gui/src/app/pages/status.rs:385 #: crates/pdfs-gui/src/app/pages/status.rs:385
msgid "Preferences" msgid "Preferences"
msgstr "Preferências" msgstr "Preferências"
#: crates/pdfs-gui/src/app/main.rs:1144 #: crates/pdfs-gui/src/app/main.rs:1148
#: crates/pdfs-gui/src/app/widgets/compat.rs:262 #: crates/pdfs-gui/src/app/widgets/compat.rs:262
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "Atalhos de teclado" msgstr "Atalhos de teclado"
#: crates/pdfs-gui/src/app/main.rs:1146 #: crates/pdfs-gui/src/app/main.rs:1150
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "Sobre o Proton Drive for Linux" msgstr "Sobre o Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1151 #: crates/pdfs-gui/src/app/main.rs:1155
msgid "Main menu" msgid "Main menu"
msgstr "Menu principal" msgstr "Menu principal"
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "Proton Drive for Linux" msgstr "Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1215 #: crates/pdfs-gui/src/app/main.rs:1219
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -165,23 +165,23 @@ msgstr ""
"\n" "\n"
"Cliente não oficial — sem afiliação, endosso ou suporte da Proton AG." "Cliente não oficial — sem afiliação, endosso ou suporte da Proton AG."
#: crates/pdfs-gui/src/app/main.rs:1220 #: crates/pdfs-gui/src/app/main.rs:1224
msgid "Source Code" msgid "Source Code"
msgstr "Código-fonte" msgstr "Código-fonte"
#: crates/pdfs-gui/src/app/main.rs:1224 #: crates/pdfs-gui/src/app/main.rs:1228
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "Termos de Serviço da Proton" msgstr "Termos de Serviço da Proton"
#: crates/pdfs-gui/src/app/main.rs:1228 #: crates/pdfs-gui/src/app/main.rs:1232
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "Política de Privacidade da Proton" msgstr "Política de Privacidade da Proton"
#: crates/pdfs-gui/src/app/main.rs:1233 #: crates/pdfs-gui/src/app/main.rs:1237
msgid "Disclaimer" msgid "Disclaimer"
msgstr "Aviso legal" msgstr "Aviso legal"
#: crates/pdfs-gui/src/app/main.rs:1237 #: crates/pdfs-gui/src/app/main.rs:1241
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -204,7 +204,7 @@ msgstr ""
"Este software é fornecido “no estado em que se encontra”, sem garantia de " "Este software é fornecido “no estado em que se encontra”, sem garantia de "
"qualquer tipo. Mantenha uma cópia de todos os dados que você não pode perder." "qualquer tipo. Mantenha uma cópia de todos os dados que você não pode perder."
#: crates/pdfs-gui/src/app/main.rs:1245 #: crates/pdfs-gui/src/app/main.rs:1249
msgid "" msgid ""
"Places are named with data from <a href=\"https://www.geonames.org/" "Places are named with data from <a href=\"https://www.geonames.org/"
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
@@ -214,7 +214,7 @@ msgstr ""
"\">GeoNames</a>, licenciados sob <a href=\"https://creativecommons.org/" "\">GeoNames</a>, licenciados sob <a href=\"https://creativecommons.org/"
"licenses/by/4.0/\">CC BY 4.0</a>." "licenses/by/4.0/\">CC BY 4.0</a>."
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "" msgid ""
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/" "The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a> land outlines and country borders, which are in the " "\">Natural Earth</a> land outlines and country borders, which are in the "
@@ -224,7 +224,7 @@ msgstr ""
"fronteiras de países do <a href=\"https://www.naturalearthdata.com/" "fronteiras de países do <a href=\"https://www.naturalearthdata.com/"
"\">Natural Earth</a>, que são de domínio público." "\">Natural Earth</a>, que são de domínio público."
#: crates/pdfs-gui/src/app/main.rs:1261 #: crates/pdfs-gui/src/app/main.rs:1265
msgid "" msgid ""
"The street map, when turned on, comes from <a href=\"https://openfreemap.org/" "The street map, when turned on, comes from <a href=\"https://openfreemap.org/"
"\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/" "\">OpenFreeMap</a> in the <a href=\"https://www.openmaptiles.org/"
@@ -240,15 +240,15 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1272 #: crates/pdfs-gui/src/app/main.rs:1276
msgid "translator-credits" msgid "translator-credits"
msgstr "Colaboradores do Proton Drive for Linux" msgstr "Colaboradores do Proton Drive for Linux"
#: crates/pdfs-gui/src/app/main.rs:1310 #: crates/pdfs-gui/src/app/main.rs:1314
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "Parar o Proton Drive?" msgstr "Parar o Proton Drive?"
#: crates/pdfs-gui/src/app/main.rs:1311 #: crates/pdfs-gui/src/app/main.rs:1315
msgid "" msgid ""
"My files goes offline and nothing syncs until you connect again. Proton " "My files goes offline and nothing syncs until you connect again. Proton "
"Drive starts again at your next login." "Drive starts again at your next login."
@@ -256,7 +256,7 @@ msgstr ""
"Meus arquivos fica offline e nada é sincronizado até você se conectar " "Meus arquivos fica offline e nada é sincronizado até você se conectar "
"novamente. O Proton Drive será iniciado de novo no seu próximo login." "novamente. O Proton Drive será iniciado de novo no seu próximo login."
#: crates/pdfs-gui/src/app/main.rs:1313 crates/pdfs-gui/src/app/main.rs:1588 #: crates/pdfs-gui/src/app/main.rs:1317 crates/pdfs-gui/src/app/main.rs:1592
#: crates/pdfs-gui/src/app/pages/albums.rs:243 #: crates/pdfs-gui/src/app/pages/albums.rs:243
#: crates/pdfs-gui/src/app/pages/albums.rs:428 #: crates/pdfs-gui/src/app/pages/albums.rs:428
#: crates/pdfs-gui/src/app/pages/browser.rs:1892 #: crates/pdfs-gui/src/app/pages/browser.rs:1892
@@ -271,7 +271,8 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1013 #: crates/pdfs-gui/src/app/pages/locations.rs:1013
#: crates/pdfs-gui/src/app/pages/locations.rs:1488 #: crates/pdfs-gui/src/app/pages/locations.rs:1488
#: crates/pdfs-gui/src/app/pages/locations.rs:1538 #: crates/pdfs-gui/src/app/pages/locations.rs:1538
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:378
#: crates/pdfs-gui/src/app/pages/login.rs:492
#: crates/pdfs-gui/src/app/pages/photos.rs:2055 #: crates/pdfs-gui/src/app/pages/photos.rs:2055
#: crates/pdfs-gui/src/app/pages/shared.rs:946 #: crates/pdfs-gui/src/app/pages/shared.rs:946
#: crates/pdfs-gui/src/app/pages/shared.rs:1027 #: crates/pdfs-gui/src/app/pages/shared.rs:1027
@@ -286,30 +287,30 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: crates/pdfs-gui/src/app/main.rs:1314 #: crates/pdfs-gui/src/app/main.rs:1318
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "Parar" msgstr "Parar"
#: crates/pdfs-gui/src/app/main.rs:1331 #: crates/pdfs-gui/src/app/main.rs:1335
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "Não foi possível parar o Proton Drive" msgstr "Não foi possível parar o Proton Drive"
#: crates/pdfs-gui/src/app/main.rs:1332 #: crates/pdfs-gui/src/app/main.rs:1336
msgid "The Proton Drive service did not stop." msgid "The Proton Drive service did not stop."
msgstr "O serviço do Proton Drive não parou." msgstr "O serviço do Proton Drive não parou."
#: crates/pdfs-gui/src/app/main.rs:1368 #: crates/pdfs-gui/src/app/main.rs:1372
#: crates/pdfs-gui/src/app/pages/status.rs:254 #: crates/pdfs-gui/src/app/pages/status.rs:254
msgid "General" msgid "General"
msgstr "Geral" msgstr "Geral"
#: crates/pdfs-gui/src/app/main.rs:1370 #: crates/pdfs-gui/src/app/main.rs:1374
#: crates/pdfs-gui/src/app/pages/browser.rs:247 #: crates/pdfs-gui/src/app/pages/browser.rs:247
msgid "Search Drive" msgid "Search Drive"
msgstr "Pesquisar no Drive" msgstr "Pesquisar no Drive"
#: crates/pdfs-gui/src/app/main.rs:1371 #: crates/pdfs-gui/src/app/main.rs:1375
#: crates/pdfs-gui/src/app/pages/browser.rs:957 #: crates/pdfs-gui/src/app/pages/browser.rs:957
#: crates/pdfs-gui/src/app/pages/devices.rs:554 #: crates/pdfs-gui/src/app/pages/devices.rs:554
#: crates/pdfs-gui/src/app/pages/shared.rs:586 #: crates/pdfs-gui/src/app/pages/shared.rs:586
@@ -318,38 +319,38 @@ msgstr "Pesquisar no Drive"
msgid "Refresh" msgid "Refresh"
msgstr "Atualizar" msgstr "Atualizar"
#: crates/pdfs-gui/src/app/main.rs:1373 #: crates/pdfs-gui/src/app/main.rs:1377
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "Atalhos de teclado" msgstr "Atalhos de teclado"
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "Files" msgid "Files"
msgstr "Arquivos" msgstr "Arquivos"
#: crates/pdfs-gui/src/app/main.rs:1379 #: crates/pdfs-gui/src/app/main.rs:1383
#: crates/pdfs-gui/src/app/pages/browser.rs:294 #: crates/pdfs-gui/src/app/pages/browser.rs:294
msgid "New folder" msgid "New folder"
msgstr "Nova pasta" msgstr "Nova pasta"
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
#: crates/pdfs-gui/src/app/pages/browser.rs:290 #: crates/pdfs-gui/src/app/pages/browser.rs:290
msgid "Upload files" msgid "Upload files"
msgstr "Enviar arquivos" msgstr "Enviar arquivos"
#: crates/pdfs-gui/src/app/main.rs:1381 #: crates/pdfs-gui/src/app/main.rs:1385
msgid "Back / forward" msgid "Back / forward"
msgstr "Voltar / avançar" msgstr "Voltar / avançar"
#: crates/pdfs-gui/src/app/main.rs:1382 #: crates/pdfs-gui/src/app/main.rs:1386
#: crates/pdfs-gui/src/app/pages/browser.rs:1943 #: crates/pdfs-gui/src/app/pages/browser.rs:1943
msgid "Parent folder" msgid "Parent folder"
msgstr "Pasta superior" msgstr "Pasta superior"
#: crates/pdfs-gui/src/app/main.rs:1383 #: crates/pdfs-gui/src/app/main.rs:1387
msgid "Grid / list" msgid "Grid / list"
msgstr "Grade / lista" msgstr "Grade / lista"
#: crates/pdfs-gui/src/app/main.rs:1384 #: crates/pdfs-gui/src/app/main.rs:1388
#: crates/pdfs-gui/src/app/pages/albums.rs:298 #: crates/pdfs-gui/src/app/pages/albums.rs:298
#: crates/pdfs-gui/src/app/pages/browser.rs:1871 #: crates/pdfs-gui/src/app/pages/browser.rs:1871
#: crates/pdfs-gui/src/app/pages/browser.rs:1893 #: crates/pdfs-gui/src/app/pages/browser.rs:1893
@@ -358,7 +359,7 @@ msgstr "Grade / lista"
msgid "Rename" msgid "Rename"
msgstr "Renomear" msgstr "Renomear"
#: crates/pdfs-gui/src/app/main.rs:1385 crates/pdfs-gui/src/app/main.rs:1405 #: crates/pdfs-gui/src/app/main.rs:1389 crates/pdfs-gui/src/app/main.rs:1409
#: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:357
#: crates/pdfs-gui/src/app/pages/browser.rs:900 #: crates/pdfs-gui/src/app/pages/browser.rs:900
#: crates/pdfs-gui/src/app/pages/browser.rs:932 #: crates/pdfs-gui/src/app/pages/browser.rs:932
@@ -368,73 +369,73 @@ msgstr "Renomear"
msgid "Move to Trash" msgid "Move to Trash"
msgstr "Mover para a lixeira" msgstr "Mover para a lixeira"
#: crates/pdfs-gui/src/app/main.rs:1386 #: crates/pdfs-gui/src/app/main.rs:1390
msgid "Clear the selection" msgid "Clear the selection"
msgstr "Limpar a seleção" msgstr "Limpar a seleção"
#: crates/pdfs-gui/src/app/main.rs:1392 #: crates/pdfs-gui/src/app/main.rs:1396
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "Miniaturas maiores" msgstr "Miniaturas maiores"
#: crates/pdfs-gui/src/app/main.rs:1393 #: crates/pdfs-gui/src/app/main.rs:1397
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "Miniaturas menores" msgstr "Miniaturas menores"
#: crates/pdfs-gui/src/app/main.rs:1394 #: crates/pdfs-gui/src/app/main.rs:1398
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "Redefinir tamanho das miniaturas" msgstr "Redefinir tamanho das miniaturas"
#: crates/pdfs-gui/src/app/main.rs:1395 #: crates/pdfs-gui/src/app/main.rs:1399
msgid "Select all" msgid "Select all"
msgstr "Selecionar tudo" msgstr "Selecionar tudo"
#: crates/pdfs-gui/src/app/main.rs:1399 #: crates/pdfs-gui/src/app/main.rs:1403
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "Visualizador de fotos" msgstr "Visualizador de fotos"
#: crates/pdfs-gui/src/app/main.rs:1401 #: crates/pdfs-gui/src/app/main.rs:1405
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "Foto anterior / próxima" msgstr "Foto anterior / próxima"
#: crates/pdfs-gui/src/app/main.rs:1402 #: crates/pdfs-gui/src/app/main.rs:1406
msgid "First / last photo" msgid "First / last photo"
msgstr "Primeira / última foto" msgstr "Primeira / última foto"
#: crates/pdfs-gui/src/app/main.rs:1403 #: crates/pdfs-gui/src/app/main.rs:1407
msgid "Show details" msgid "Show details"
msgstr "Mostrar detalhes" msgstr "Mostrar detalhes"
#: crates/pdfs-gui/src/app/main.rs:1404 #: crates/pdfs-gui/src/app/main.rs:1408
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Tela cheia" msgstr "Tela cheia"
#: crates/pdfs-gui/src/app/main.rs:1406 #: crates/pdfs-gui/src/app/main.rs:1410
msgid "Close" msgid "Close"
msgstr "Fechar" msgstr "Fechar"
#: crates/pdfs-gui/src/app/main.rs:1496 #: crates/pdfs-gui/src/app/main.rs:1500
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "Selecione um único item para renomeá-lo" msgstr "Selecione um único item para renomeá-lo"
#: crates/pdfs-gui/src/app/main.rs:1656 #: crates/pdfs-gui/src/app/main.rs:1660
#: crates/pdfs-gui/src/app/pages/albums.rs:85 #: crates/pdfs-gui/src/app/pages/albums.rs:85
#: crates/pdfs-gui/src/app/pages/places.rs:104 #: crates/pdfs-gui/src/app/pages/places.rs:104
#: crates/pdfs-gui/src/app/pages/status.rs:1370 #: crates/pdfs-gui/src/app/pages/status.rs:1371
msgid "Not connected" msgid "Not connected"
msgstr "Não conectado" msgstr "Não conectado"
#: crates/pdfs-gui/src/app/main.rs:1657 #: crates/pdfs-gui/src/app/main.rs:1661
msgid "The Proton Drive service isn't running." msgid "The Proton Drive service isn't running."
msgstr "O serviço do Proton Drive não está em execução." msgstr "O serviço do Proton Drive não está em execução."
#: crates/pdfs-gui/src/app/main.rs:1665 #: crates/pdfs-gui/src/app/main.rs:1669
#: crates/pdfs-gui/src/app/pages/status.rs:336 #: crates/pdfs-gui/src/app/pages/status.rs:336
#: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595 #: crates/pdfs-gui/src/hud/mod.rs:274 crates/pdfs-gui/src/hud/mod.rs:595
#: crates/pdfs-gui/src/main.rs:444 #: crates/pdfs-gui/src/main.rs:453
msgid "Connecting…" msgid "Connecting…"
msgstr "Conectando…" msgstr "Conectando…"
#: crates/pdfs-gui/src/app/main.rs:1666 #: crates/pdfs-gui/src/app/main.rs:1670
msgid "Waiting for the Proton Drive service to start." msgid "Waiting for the Proton Drive service to start."
msgstr "Aguardando o serviço do Proton Drive iniciar." msgstr "Aguardando o serviço do Proton Drive iniciar."
@@ -1283,7 +1284,7 @@ msgstr "Não foi possível carregar os álbuns"
#: crates/pdfs-gui/src/app/pages/shared.rs:1006 #: crates/pdfs-gui/src/app/pages/shared.rs:1006
#: crates/pdfs-gui/src/app/pages/shared.rs:1122 #: crates/pdfs-gui/src/app/pages/shared.rs:1122
#: crates/pdfs-gui/src/app/pages/status.rs:750 #: crates/pdfs-gui/src/app/pages/status.rs:750
#: crates/pdfs-gui/src/app/pages/status.rs:1517 #: crates/pdfs-gui/src/app/pages/status.rs:1518
#: crates/pdfs-gui/src/app/pages/takeout.rs:424 #: crates/pdfs-gui/src/app/pages/takeout.rs:424
#: crates/pdfs-gui/src/app/pages/takeout.rs:617 #: crates/pdfs-gui/src/app/pages/takeout.rs:617
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
@@ -1551,7 +1552,7 @@ msgid "Make available offline"
msgstr "Disponibilizar offline" msgstr "Disponibilizar offline"
#: crates/pdfs-gui/src/app/pages/browser.rs:347 #: crates/pdfs-gui/src/app/pages/browser.rs:347
#: crates/pdfs-gui/src/app/pages/status.rs:1493 #: crates/pdfs-gui/src/app/pages/status.rs:1494
msgid "Make online only" msgid "Make online only"
msgstr "Tornar somente online" msgstr "Tornar somente online"
@@ -2708,7 +2709,7 @@ msgid "Sync paused until you resume"
msgstr "Sincronização pausada até você retomar" msgstr "Sincronização pausada até você retomar"
#: crates/pdfs-gui/src/app/pages/locations.rs:529 #: crates/pdfs-gui/src/app/pages/locations.rs:529
#: crates/pdfs-gui/src/app/pages/status.rs:1323 crates/pdfs-gui/src/main.rs:237 #: crates/pdfs-gui/src/app/pages/status.rs:1324 crates/pdfs-gui/src/main.rs:246
msgid "Sync paused" msgid "Sync paused"
msgstr "Sincronização pausada" msgstr "Sincronização pausada"
@@ -3177,25 +3178,25 @@ msgstr "Digite seu e-mail e senha."
msgid "Signing in…" msgid "Signing in…"
msgstr "Entrando…" msgstr "Entrando…"
#: crates/pdfs-gui/src/app/pages/login.rs:155 #: crates/pdfs-gui/src/app/pages/login.rs:160
msgid "Complete the verification to continue…" msgid "Complete the verification to continue…"
msgstr "Conclua a verificação para continuar…" msgstr "Conclua a verificação para continuar…"
#: crates/pdfs-gui/src/app/pages/login.rs:165 #: crates/pdfs-gui/src/app/pages/login.rs:185
msgid "login cancelled" msgid "login cancelled"
msgstr "login cancelado" msgstr "login cancelado"
#: crates/pdfs-gui/src/app/pages/login.rs:198 #: crates/pdfs-gui/src/app/pages/login.rs:218
msgid "Too many sign-in attempts. Wait a few minutes and try again." msgid "Too many sign-in attempts. Wait a few minutes and try again."
msgstr "Muitas tentativas de entrar. Aguarde alguns minutos e tente novamente." msgstr "Muitas tentativas de entrar. Aguarde alguns minutos e tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:204 #: crates/pdfs-gui/src/app/pages/login.rs:224
msgid "Couldn't reach Proton. Check your internet connection and try again." msgid "Couldn't reach Proton. Check your internet connection and try again."
msgstr "" msgstr ""
"Não foi possível acessar o Proton. Verifique sua conexão com a internet e " "Não foi possível acessar o Proton. Verifique sua conexão com a internet e "
"tente novamente." "tente novamente."
#: crates/pdfs-gui/src/app/pages/login.rs:207 #: crates/pdfs-gui/src/app/pages/login.rs:227
msgid "" msgid ""
"Signed in, but the session couldn't be saved to the system keyring. Make " "Signed in, but the session couldn't be saved to the system keyring. Make "
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." "sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
@@ -3204,11 +3205,19 @@ msgstr ""
"Certifique-se de que um chaveiro (GNOME Keyring ou KWallet) esteja em " "Certifique-se de que um chaveiro (GNOME Keyring ou KWallet) esteja em "
"execução e desbloqueado." "execução e desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:210 #: crates/pdfs-gui/src/app/pages/login.rs:230
msgid "Sign-in cancelled: no two-factor code was entered." msgid "Sign-in cancelled: no two-factor code was entered."
msgstr "Entrada cancelada: nenhum código de dois fatores foi digitado." msgstr "Entrada cancelada: nenhum código de dois fatores foi digitado."
#: crates/pdfs-gui/src/app/pages/login.rs:213 #: crates/pdfs-gui/src/app/pages/login.rs:233
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:236
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:239
msgid "" msgid ""
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " "Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
"new one." "new one."
@@ -3217,35 +3226,79 @@ msgstr ""
"receber uma nova." "receber uma nova."
#. Translators: {error} is an error message, usually in English. #. Translators: {error} is an error message, usually in English.
#: crates/pdfs-gui/src/app/pages/login.rs:218 #: crates/pdfs-gui/src/app/pages/login.rs:244
#, rust-format #, rust-format
msgid "Sign-in failed: {error}" msgid "Sign-in failed: {error}"
msgstr "Falha ao entrar: {error}" msgstr "Falha ao entrar: {error}"
#: crates/pdfs-gui/src/app/pages/login.rs:298 #: crates/pdfs-gui/src/app/pages/login.rs:354
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:356
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:359
msgid "Mailbox Password"
msgstr "Senha da caixa de correio"
#: crates/pdfs-gui/src/app/pages/login.rs:365
msgid "Mailbox password"
msgstr "Senha da caixa de correio"
#: crates/pdfs-gui/src/app/pages/login.rs:369
msgid "Keep unlocked on this computer"
msgstr "Manter desbloqueado neste computador"
#: crates/pdfs-gui/src/app/pages/login.rs:371
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 "Guarda o desbloqueio no chaveiro do sistema, para que o Proton Drive abra 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:379
#: crates/pdfs-gui/src/app/pages/login.rs:432
msgid "Unlock"
msgstr "Desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:431
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:460
msgid "Unlocked."
msgstr "Desbloqueado."
#: crates/pdfs-gui/src/app/pages/login.rs:465
msgid "Couldn't unlock"
msgstr "Não foi possível desbloquear"
#: crates/pdfs-gui/src/app/pages/login.rs:478
msgid "Two-Factor Authentication" msgid "Two-Factor Authentication"
msgstr "Autenticação de dois fatores" msgstr "Autenticação de dois fatores"
#: crates/pdfs-gui/src/app/pages/login.rs:300 #: crates/pdfs-gui/src/app/pages/login.rs:480
msgid "" msgid ""
"Enter the code from your authenticator app, or one of your recovery codes." "Enter the code from your authenticator app, or one of your recovery codes."
msgstr "" msgstr ""
"Digite o código do seu aplicativo autenticador ou um dos seus códigos de " "Digite o código do seu aplicativo autenticador ou um dos seus códigos de "
"recuperação." "recuperação."
#: crates/pdfs-gui/src/app/pages/login.rs:306 #: crates/pdfs-gui/src/app/pages/login.rs:486
msgid "Authentication code" msgid "Authentication code"
msgstr "Código de autenticação" msgstr "Código de autenticação"
#: crates/pdfs-gui/src/app/pages/login.rs:313 #: crates/pdfs-gui/src/app/pages/login.rs:493
msgid "Confirm" msgid "Confirm"
msgstr "Confirmar" msgstr "Confirmar"
#: crates/pdfs-gui/src/app/pages/login.rs:341 #: crates/pdfs-gui/src/app/pages/login.rs:521
msgid "Sign Out?" msgid "Sign Out?"
msgstr "Sair?" msgstr "Sair?"
#: crates/pdfs-gui/src/app/pages/login.rs:343 #: crates/pdfs-gui/src/app/pages/login.rs:523
msgid "" msgid ""
"Proton Drive will disconnect and stop syncing until you sign in again. Files " "Proton Drive will disconnect and stop syncing until you sign in again. Files "
"already on this computer stay where they are." "already on this computer stay where they are."
@@ -3253,7 +3306,7 @@ msgstr ""
"O Proton Drive será desconectado e deixará de sincronizar até você entrar " "O Proton Drive será desconectado e deixará de sincronizar até você entrar "
"novamente. Os arquivos que já estão neste computador permanecem onde estão." "novamente. Os arquivos que já estão neste computador permanecem onde estão."
#: crates/pdfs-gui/src/app/pages/login.rs:345 #: crates/pdfs-gui/src/app/pages/login.rs:525
msgid "Sign Out" msgid "Sign Out"
msgstr "Sair" msgstr "Sair"
@@ -4604,40 +4657,40 @@ msgid "Restart Now"
msgstr "Reiniciar agora" msgstr "Reiniciar agora"
#. Translators: {size} is an amount of storage, such as "1.2 GiB". #. Translators: {size} is an amount of storage, such as "1.2 GiB".
#: crates/pdfs-gui/src/app/pages/status.rs:912 #: crates/pdfs-gui/src/app/pages/status.rs:913
#, rust-format #, rust-format
msgid "{size} used" msgid "{size} used"
msgstr "{size} usados" msgstr "{size} usados"
#: crates/pdfs-gui/src/app/pages/status.rs:923 #: crates/pdfs-gui/src/app/pages/status.rs:924
#, rust-format #, rust-format
msgid "{used} of {total} used ({percent}%)" msgid "{used} of {total} used ({percent}%)"
msgstr "{used} de {total} usados ({percent}%)" msgstr "{used} de {total} usados ({percent}%)"
#: crates/pdfs-gui/src/app/pages/status.rs:961 #: crates/pdfs-gui/src/app/pages/status.rs:962
msgid "Proton Drive connected" msgid "Proton Drive connected"
msgstr "Proton Drive conectado" msgstr "Proton Drive conectado"
#: crates/pdfs-gui/src/app/pages/status.rs:962 #: crates/pdfs-gui/src/app/pages/status.rs:963
msgid "Your files are available." msgid "Your files are available."
msgstr "Seus arquivos estão disponíveis." msgstr "Seus arquivos estão disponíveis."
#: crates/pdfs-gui/src/app/pages/status.rs:967 #: crates/pdfs-gui/src/app/pages/status.rs:968
msgid "Proton Drive disconnected" msgid "Proton Drive disconnected"
msgstr "Proton Drive desconectado" msgstr "Proton Drive desconectado"
#: crates/pdfs-gui/src/app/pages/status.rs:968 #: crates/pdfs-gui/src/app/pages/status.rs:969
msgid "" msgid ""
"The Proton Drive service stopped. Files aren't available until it restarts." "The Proton Drive service stopped. Files aren't available until it restarts."
msgstr "" msgstr ""
"O serviço do Proton Drive parou. Os arquivos ficarão indisponíveis até ele " "O serviço do Proton Drive parou. Os arquivos ficarão indisponíveis até ele "
"reiniciar." "reiniciar."
#: crates/pdfs-gui/src/app/pages/status.rs:1037 #: crates/pdfs-gui/src/app/pages/status.rs:1038
msgid "Sync complete" msgid "Sync complete"
msgstr "Sincronização concluída" msgstr "Sincronização concluída"
#: crates/pdfs-gui/src/app/pages/status.rs:1039 #: crates/pdfs-gui/src/app/pages/status.rs:1040
#, rust-format #, rust-format
msgid "{n} file finished transferring." msgid "{n} file finished transferring."
msgid_plural "{n} files finished transferring." msgid_plural "{n} files finished transferring."
@@ -4646,27 +4699,27 @@ msgstr[1] "{n} arquivos terminaram de ser transferidos."
#. Translators: a background job's progress. {title} is the job, such as #. Translators: a background job's progress. {title} is the job, such as
#. "Scanning Photos"; {done} and {total} are counts. #. "Scanning Photos"; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1117 #: crates/pdfs-gui/src/app/pages/status.rs:1118
#, rust-format #, rust-format
msgid "{title} — {done} of {total}" msgid "{title} — {done} of {total}"
msgstr "{title} — {done} de {total}" msgstr "{title} — {done} de {total}"
#. Translators: a background job's progress. {title} is the job, {detail} #. Translators: a background job's progress. {title} is the job, {detail}
#. what it is working on; {done} and {total} are counts. #. what it is working on; {done} and {total} are counts.
#: crates/pdfs-gui/src/app/pages/status.rs:1120 #: crates/pdfs-gui/src/app/pages/status.rs:1121
#, rust-format #, rust-format
msgid "{title} — {detail} ({done} of {total})" msgid "{title} — {detail} ({done} of {total})"
msgstr "{title} — {detail} ({done} de {total})" msgstr "{title} — {detail} ({done} de {total})"
#. Translators: a background job still running. {title} is the job. #. Translators: a background job still running. {title} is the job.
#: crates/pdfs-gui/src/app/pages/status.rs:1122 #: crates/pdfs-gui/src/app/pages/status.rs:1123
#, rust-format #, rust-format
msgid "{title}…" msgid "{title}…"
msgstr "{title}…" msgstr "{title}…"
#. Translators: a background job still running. {title} is the job, #. Translators: a background job still running. {title} is the job,
#. {detail} what it is working on. #. {detail} what it is working on.
#: crates/pdfs-gui/src/app/pages/status.rs:1125 #: crates/pdfs-gui/src/app/pages/status.rs:1126
#, rust-format #, rust-format
msgid "{title} — {detail}…" msgid "{title} — {detail}…"
msgstr "{title} — {detail}…" msgstr "{title} — {detail}…"
@@ -4674,7 +4727,7 @@ msgstr "{title} — {detail}…"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} the size moved so far and {speed} a size such as #. file name, {done} the size moved so far and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1154 #: crates/pdfs-gui/src/app/pages/status.rs:1155
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} ({speed}/s)" msgid "{arrow} {name} — {done} ({speed}/s)"
msgstr "{arrow} {name} — {done} ({speed}/s)" msgstr "{arrow} {name} — {done} ({speed}/s)"
@@ -4682,118 +4735,118 @@ msgstr "{arrow} {name} — {done} ({speed}/s)"
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the #. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
#. file name, {done} and {total} sizes and {speed} a size such as #. file name, {done} and {total} sizes and {speed} a size such as
#. "1.2 MiB"; "/s" means per second. #. "1.2 MiB"; "/s" means per second.
#: crates/pdfs-gui/src/app/pages/status.rs:1162 #: crates/pdfs-gui/src/app/pages/status.rs:1163
#, rust-format #, rust-format
msgid "{arrow} {name} — {done} of {total} ({speed}/s)" msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
msgstr "{arrow} {name} — {done} de {total} ({speed}/s)" msgstr "{arrow} {name} — {done} de {total} ({speed}/s)"
#: crates/pdfs-gui/src/app/pages/status.rs:1254 #: crates/pdfs-gui/src/app/pages/status.rs:1255
#, rust-format #, rust-format
msgid "{used} cached — no limit set" msgid "{used} cached — no limit set"
msgstr "{used} em cache — sem limite definido" msgstr "{used} em cache — sem limite definido"
#: crates/pdfs-gui/src/app/pages/status.rs:1260 #: crates/pdfs-gui/src/app/pages/status.rs:1261
#, rust-format #, rust-format
msgid "{used} of {limit} used" msgid "{used} of {limit} used"
msgstr "{used} de {limit} usados" msgstr "{used} de {limit} usados"
#: crates/pdfs-gui/src/app/pages/status.rs:1328 #: crates/pdfs-gui/src/app/pages/status.rs:1329
#, rust-format #, rust-format
msgid "{queued} · resumes {time}" msgid "{queued} · resumes {time}"
msgstr "{queued} · retoma {time}" msgstr "{queued} · retoma {time}"
#. Translators: {time} is when syncing resumes, such as "at 14:30" #. Translators: {time} is when syncing resumes, such as "at 14:30"
#. or "Tue 09:00". #. or "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1333 #: crates/pdfs-gui/src/app/pages/status.rs:1334
#, rust-format #, rust-format
msgid "Resumes {time}" msgid "Resumes {time}"
msgstr "Retoma {time}" msgstr "Retoma {time}"
#: crates/pdfs-gui/src/app/pages/status.rs:1335 #: crates/pdfs-gui/src/app/pages/status.rs:1336
msgid "Until you resume" msgid "Until you resume"
msgstr "Até você retomar" msgstr "Até você retomar"
#: crates/pdfs-gui/src/app/pages/status.rs:1342 crates/pdfs-gui/src/main.rs:239 #: crates/pdfs-gui/src/app/pages/status.rs:1343 crates/pdfs-gui/src/main.rs:248
#, rust-format #, rust-format
msgid "{n} change needs attention" msgid "{n} change needs attention"
msgid_plural "{n} changes need attention" msgid_plural "{n} changes need attention"
msgstr[0] "{n} alteração requer atenção" msgstr[0] "{n} alteração requer atenção"
msgstr[1] "{n} alterações requerem atenção" msgstr[1] "{n} alterações requerem atenção"
#: crates/pdfs-gui/src/app/pages/status.rs:1352 #: crates/pdfs-gui/src/app/pages/status.rs:1353
#: crates/pdfs-gui/src/app/widgets/details.rs:108 #: crates/pdfs-gui/src/app/widgets/details.rs:108
msgctxt "state" msgctxt "state"
msgid "Offline" msgid "Offline"
msgstr "Offline" msgstr "Offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1353 #: crates/pdfs-gui/src/app/pages/status.rs:1354
msgid "Cached files only" msgid "Cached files only"
msgstr "Somente arquivos em cache" msgstr "Somente arquivos em cache"
#: crates/pdfs-gui/src/app/pages/status.rs:1358 #: crates/pdfs-gui/src/app/pages/status.rs:1359
msgctxt "state" msgctxt "state"
msgid "Syncing" msgid "Syncing"
msgstr "Sincronizando" msgstr "Sincronizando"
#: crates/pdfs-gui/src/app/pages/status.rs:1364 #: crates/pdfs-gui/src/app/pages/status.rs:1365
msgid "Up to date" msgid "Up to date"
msgstr "Atualizado" msgstr "Atualizado"
#: crates/pdfs-gui/src/app/pages/status.rs:1371 #: crates/pdfs-gui/src/app/pages/status.rs:1372
#: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622 #: crates/pdfs-gui/src/hud/mod.rs:608 crates/pdfs-gui/src/hud/mod.rs:622
msgid "Proton Drive isn't running" msgid "Proton Drive isn't running"
msgstr "O Proton Drive não está em execução" msgstr "O Proton Drive não está em execução"
#: crates/pdfs-gui/src/app/pages/status.rs:1376 #: crates/pdfs-gui/src/app/pages/status.rs:1377
msgid "Not responding" msgid "Not responding"
msgstr "Não está respondendo" msgstr "Não está respondendo"
#: crates/pdfs-gui/src/app/pages/status.rs:1377 #: crates/pdfs-gui/src/app/pages/status.rs:1378
msgid "Proton Drive is taking too long to answer" msgid "Proton Drive is taking too long to answer"
msgstr "O Proton Drive está demorando demais para responder" msgstr "O Proton Drive está demorando demais para responder"
#. Translators: stands in for a time that could not be read, as in #. Translators: stands in for a time that could not be read, as in
#. "Resumes later". #. "Resumes later".
#: crates/pdfs-gui/src/app/pages/status.rs:1415 #: crates/pdfs-gui/src/app/pages/status.rs:1416
#: crates/pdfs-gui/src/app/pages/status.rs:1430 #: crates/pdfs-gui/src/app/pages/status.rs:1431
msgid "later" msgid "later"
msgstr "mais tarde" msgstr "mais tarde"
#. Translators: strftime format for a time later today, such as "at 14:30". #. Translators: strftime format for a time later today, such as "at 14:30".
#: crates/pdfs-gui/src/app/pages/status.rs:1419 #: crates/pdfs-gui/src/app/pages/status.rs:1420
msgid "at %H:%M" msgid "at %H:%M"
msgstr "às %H:%M" msgstr "às %H:%M"
#. Translators: strftime format for a time within the next week, such as #. Translators: strftime format for a time within the next week, such as
#. "Tue 09:00". #. "Tue 09:00".
#: crates/pdfs-gui/src/app/pages/status.rs:1423 #: crates/pdfs-gui/src/app/pages/status.rs:1424
msgid "%a %H:%M" msgid "%a %H:%M"
msgstr "%a às %H:%M" msgstr "%a às %H:%M"
#. Translators: strftime format for a date further ahead, such as "23 Sep". #. Translators: strftime format for a date further ahead, such as "23 Sep".
#: crates/pdfs-gui/src/app/pages/status.rs:1426 #: crates/pdfs-gui/src/app/pages/status.rs:1427
msgid "%e %b" msgid "%e %b"
msgstr "em %-d de %b" msgstr "em %-d de %b"
#: crates/pdfs-gui/src/app/pages/status.rs:1456 #: crates/pdfs-gui/src/app/pages/status.rs:1457
msgid "No files kept offline" msgid "No files kept offline"
msgstr "Nenhum arquivo mantido offline" msgstr "Nenhum arquivo mantido offline"
#: crates/pdfs-gui/src/app/pages/status.rs:1458 #: crates/pdfs-gui/src/app/pages/status.rs:1459
msgid "Right-click a file and choose “Make available offline”." msgid "Right-click a file and choose “Make available offline”."
msgstr "" msgstr ""
"Clique com o botão direito em um arquivo e escolha “Disponibilizar offline”." "Clique com o botão direito em um arquivo e escolha “Disponibilizar offline”."
#: crates/pdfs-gui/src/app/pages/status.rs:1509 #: crates/pdfs-gui/src/app/pages/status.rs:1510
#: crates/pdfs-gui/src/app/pages/status.rs:1516 #: crates/pdfs-gui/src/app/pages/status.rs:1517
msgid "Couldn't make it online only" msgid "Couldn't make it online only"
msgstr "Não foi possível torná-lo somente online" msgstr "Não foi possível torná-lo somente online"
#: crates/pdfs-gui/src/app/pages/status.rs:1533 #: crates/pdfs-gui/src/app/pages/status.rs:1534
msgid "Show fewer" msgid "Show fewer"
msgstr "Mostrar menos" msgstr "Mostrar menos"
#: crates/pdfs-gui/src/app/pages/status.rs:1536 #: crates/pdfs-gui/src/app/pages/status.rs:1537
#, rust-format #, rust-format
msgid "Show all {n} file" msgid "Show all {n} file"
msgid_plural "Show all {n} files" msgid_plural "Show all {n} files"
@@ -5855,40 +5908,45 @@ msgstr[1] "↑ {n} enviando"
msgid "Proton Drive isn't responding" msgid "Proton Drive isn't responding"
msgstr "O Proton Drive não está respondendo" msgstr "O Proton Drive não está respondendo"
#: crates/pdfs-gui/src/main.rs:172 #: crates/pdfs-gui/src/main.rs:173
#, rust-format
msgid "Signed in as {username} — locked"
msgstr "Conectado como {username} — bloqueado"
#: crates/pdfs-gui/src/main.rs:181
#, rust-format #, rust-format
msgid "Signed in as {username} — not connected" msgid "Signed in as {username} — not connected"
msgstr "Conectado como {username} — sem conexão" msgstr "Conectado como {username} — sem conexão"
#: crates/pdfs-gui/src/main.rs:177 #: crates/pdfs-gui/src/main.rs:186
msgid "Not signed in" msgid "Not signed in"
msgstr "Não conectado" msgstr "Não conectado"
#. Translators: {error} is an error message, in English. #. Translators: {error} is an error message, in English.
#: crates/pdfs-gui/src/main.rs:180 #: crates/pdfs-gui/src/main.rs:189
#, rust-format #, rust-format
msgid "Error: {error}" msgid "Error: {error}"
msgstr "Erro: {error}" msgstr "Erro: {error}"
#: crates/pdfs-gui/src/main.rs:201 #: crates/pdfs-gui/src/main.rs:210
msgid "Proton Drive sent an unexpected reply" msgid "Proton Drive sent an unexpected reply"
msgstr "O Proton Drive enviou uma resposta inesperada" msgstr "O Proton Drive enviou uma resposta inesperada"
#: crates/pdfs-gui/src/main.rs:246 #: crates/pdfs-gui/src/main.rs:255
#, rust-format #, rust-format
msgid "Up to date in {mountpoint} ({n} pinned)" msgid "Up to date in {mountpoint} ({n} pinned)"
msgid_plural "Up to date in {mountpoint} ({n} pinned)" msgid_plural "Up to date in {mountpoint} ({n} pinned)"
msgstr[0] "Atualizado em {mountpoint} ({n} fixado)" msgstr[0] "Atualizado em {mountpoint} ({n} fixado)"
msgstr[1] "Atualizado em {mountpoint} ({n} fixados)" msgstr[1] "Atualizado em {mountpoint} ({n} fixados)"
#: crates/pdfs-gui/src/main.rs:253 #: crates/pdfs-gui/src/main.rs:262
#, rust-format #, rust-format
msgid "Syncing — {queued} ({n} pinned)" msgid "Syncing — {queued} ({n} pinned)"
msgid_plural "Syncing — {queued} ({n} pinned)" msgid_plural "Syncing — {queued} ({n} pinned)"
msgstr[0] "Sincronizando — {queued} ({n} fixado)" msgstr[0] "Sincronizando — {queued} ({n} fixado)"
msgstr[1] "Sincronizando — {queued} ({n} fixados)" msgstr[1] "Sincronizando — {queued} ({n} fixados)"
#: crates/pdfs-gui/src/main.rs:260 #: crates/pdfs-gui/src/main.rs:269
#, rust-format #, rust-format
msgid "Offline — cached files only ({n} pinned)" msgid "Offline — cached files only ({n} pinned)"
msgid_plural "Offline — cached files only ({n} pinned)" msgid_plural "Offline — cached files only ({n} pinned)"
@@ -5896,52 +5954,52 @@ msgstr[0] "Offline — somente arquivos em cache ({n} fixado)"
msgstr[1] "Offline — somente arquivos em cache ({n} fixados)" msgstr[1] "Offline — somente arquivos em cache ({n} fixados)"
#. Translators: {queued} is a queue summary such as "3 uploads queued". #. Translators: {queued} is a queue summary such as "3 uploads queued".
#: crates/pdfs-gui/src/main.rs:266 #: crates/pdfs-gui/src/main.rs:275
#, rust-format #, rust-format
msgid "Offline — {queued}" msgid "Offline — {queued}"
msgstr "Offline — {queued}" msgstr "Offline — {queued}"
#. Translators: a menu item that opens the list of failing changes. #. Translators: a menu item that opens the list of failing changes.
#: crates/pdfs-gui/src/main.rs:296 #: crates/pdfs-gui/src/main.rs:305
#, rust-format #, rust-format
msgid "{n} issue — View" msgid "{n} issue — View"
msgid_plural "{n} issues — View" msgid_plural "{n} issues — View"
msgstr[0] "{n} problema — Ver" msgstr[0] "{n} problema — Ver"
msgstr[1] "{n} problemas — Ver" msgstr[1] "{n} problemas — Ver"
#: crates/pdfs-gui/src/main.rs:402 #: crates/pdfs-gui/src/main.rs:411
msgid "Sign In…" msgid "Sign In…"
msgstr "Entrar…" msgstr "Entrar…"
#: crates/pdfs-gui/src/main.rs:403 #: crates/pdfs-gui/src/main.rs:412
msgid "Open Proton Drive" msgid "Open Proton Drive"
msgstr "Abrir o Proton Drive" msgstr "Abrir o Proton Drive"
#: crates/pdfs-gui/src/main.rs:409 #: crates/pdfs-gui/src/main.rs:418
msgid "Open Folder" msgid "Open Folder"
msgstr "Abrir pasta" msgstr "Abrir pasta"
#: crates/pdfs-gui/src/main.rs:421 #: crates/pdfs-gui/src/main.rs:430
msgid "Resume Sync" msgid "Resume Sync"
msgstr "Retomar sincronização" msgstr "Retomar sincronização"
#: crates/pdfs-gui/src/main.rs:423 #: crates/pdfs-gui/src/main.rs:432
msgid "Pause Sync" msgid "Pause Sync"
msgstr "Pausar sincronização" msgstr "Pausar sincronização"
#: crates/pdfs-gui/src/main.rs:442 #: crates/pdfs-gui/src/main.rs:451
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
#: crates/pdfs-gui/src/main.rs:449 #: crates/pdfs-gui/src/main.rs:458
msgid "Hide Tray Icon" msgid "Hide Tray Icon"
msgstr "Ocultar ícone da bandeja" msgstr "Ocultar ícone da bandeja"
#: crates/pdfs-gui/src/main.rs:453 #: crates/pdfs-gui/src/main.rs:462
msgid "Stop Proton Drive…" msgid "Stop Proton Drive…"
msgstr "Parar o Proton Drive…" msgstr "Parar o Proton Drive…"
#: crates/pdfs-gui/src/main.rs:457 #: crates/pdfs-gui/src/main.rs:466
msgid "Quit" msgid "Quit"
msgstr "Sair" msgstr "Sair"