mirror of
https://github.com/narrrl/proton-drive-linux.git
synced 2026-11-03 16:41:26 +01:00
Merge pull request #27 from narrrl/feature/two-password-mode
Feature/two password mode
This commit is contained in:
26 files changed
+2921
-1419
No files matched your search
Generated
+14
-10
@@ -3474,7 +3474,7 @@ checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4"
|
||||
|
||||
[[package]]
|
||||
name = "pdfs-cli"
|
||||
version = "3.0.0"
|
||||
version = "3.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
@@ -3485,13 +3485,15 @@ dependencies = [
|
||||
"tokio",
|
||||
"tracing",
|
||||
"tracing-subscriber",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pdfs-core"
|
||||
version = "3.0.0"
|
||||
version = "3.1.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"base64 0.23.1",
|
||||
"dbus-secret-service-keyring-store",
|
||||
"directories",
|
||||
"ignore",
|
||||
@@ -3508,12 +3510,13 @@ dependencies = [
|
||||
"thiserror 2.0.20",
|
||||
"tokio",
|
||||
"tracing",
|
||||
"zeroize",
|
||||
"zip",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pdfs-fuse"
|
||||
version = "3.0.0"
|
||||
version = "3.1.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"base64 0.23.1",
|
||||
@@ -3535,7 +3538,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pdfs-gui"
|
||||
version = "3.0.0"
|
||||
version = "3.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-channel",
|
||||
@@ -3572,9 +3575,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
|
||||
|
||||
[[package]]
|
||||
name = "pgp"
|
||||
version = "0.20.0"
|
||||
version = "0.21.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1cfa4743b28656065ff4c0ba09e46b357a65e8c00fc2341e89084b82f87cbdf1"
|
||||
checksum = "ae70f4d9325a391db30d115d6191a7bb67cec856aa0bba131290f0c4e09a532a"
|
||||
dependencies = [
|
||||
"aead 0.5.2",
|
||||
"aes 0.8.4",
|
||||
@@ -3775,9 +3778,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "proton-drive-rs"
|
||||
version = "0.7.2"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6ce113d234474821d34787436ee80e1458e3d8a8f97212219615ed315eb70be"
|
||||
checksum = "5bde475139afb5fc2649621e1d283e243f9df2bb412f08802cdf3f4ffaf97c44"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"base64 0.23.1",
|
||||
@@ -3802,9 +3805,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "proton-sdk"
|
||||
version = "0.7.2"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2a33c67df9694f90ce60e5b34984275956244138511b4640ca0d100e1dac8b3d"
|
||||
checksum = "faf32d0a03f7d13bd9bdcc8c9503e35e9df9318ca9f2a100dcf06cf50cb7ac8c"
|
||||
dependencies = [
|
||||
"aes-gcm 0.11.1",
|
||||
"async-trait",
|
||||
@@ -3831,6 +3834,7 @@ dependencies = [
|
||||
"thiserror 2.0.20",
|
||||
"tokio",
|
||||
"tracing",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
+4
-3
@@ -3,7 +3,7 @@ resolver = "2"
|
||||
members = ["crates/pdfs-core", "crates/pdfs-fuse", "crates/pdfs-cli", "crates/pdfs-gui"]
|
||||
|
||||
[workspace.package]
|
||||
version = "3.0.0"
|
||||
version = "3.1.0"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
authors = ["Nils Pukropp <contact@narl.io>"]
|
||||
@@ -15,8 +15,8 @@ keywords = ["proton", "drive", "fuse", "sync", "linux"]
|
||||
categories = ["filesystem", "command-line-utilities"]
|
||||
|
||||
[workspace.dependencies]
|
||||
proton-sdk = { version = "0.7.2" }
|
||||
proton-drive-rs = { version = "0.7.2" }
|
||||
proton-sdk = { version = "0.8.0" }
|
||||
proton-drive-rs = { version = "0.8.0" }
|
||||
|
||||
# Internal crates.
|
||||
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_json = "1"
|
||||
base64 = "0.23"
|
||||
zeroize = "1"
|
||||
thiserror = "2"
|
||||
anyhow = "1"
|
||||
# Non-poisoning mutexes. A handler that panics while holding a lock must not
|
||||
|
||||
@@ -23,3 +23,4 @@ tracing-subscriber.workspace = true
|
||||
clap.workspace = true
|
||||
rpassword.workspace = true
|
||||
serde_json.workspace = true
|
||||
zeroize.workspace = true
|
||||
+156
-7
@@ -135,6 +135,24 @@ enum Command {
|
||||
/// Account email; prompted if omitted.
|
||||
#[arg(short, long)]
|
||||
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.
|
||||
Logout,
|
||||
@@ -803,7 +821,9 @@ fn main() -> Result<()> {
|
||||
let cli = Cli::parse();
|
||||
JSON_OUTPUT.store(cli.json, std::sync::atomic::Ordering::Relaxed);
|
||||
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::Status => cmd_status(),
|
||||
Command::Locations => cmd_locations(),
|
||||
@@ -1781,7 +1801,7 @@ fn prompt_line(label: &str) -> Result<String> {
|
||||
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 {
|
||||
Some(u) => u,
|
||||
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}")))
|
||||
};
|
||||
|
||||
// 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()?;
|
||||
// Solving a CAPTCHA needs a browser engine, which the CLI has no business
|
||||
// carrying. Point at the app that does rather than failing with the raw API
|
||||
// message, which reads as "your login is broken".
|
||||
rt.block_on(auth::login(&username, &password, get_totp))
|
||||
rt.block_on(auth::login(&username, &password, get_totp, get_mailbox))
|
||||
.map_err(|e| match e {
|
||||
pdfs_core::Error::HumanVerificationRequired(_) => anyhow::anyhow!(
|
||||
"Proton is asking for a CAPTCHA before it will accept this sign-in.\n\
|
||||
@@ -1818,9 +1841,88 @@ fn cmd_login(username: Option<String>) -> Result<()> {
|
||||
}
|
||||
|
||||
println!("Logged in as {username}. Session stored in the system keyring.");
|
||||
report_key_state();
|
||||
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<()> {
|
||||
auth::logout()?;
|
||||
println!("Stored session cleared.");
|
||||
@@ -1848,6 +1950,7 @@ fn cmd_status() -> Result<()> {
|
||||
"username": session.as_ref().map(|s| s.username.clone()),
|
||||
"user_id": session.as_ref().map(|s| s.user_id.clone()),
|
||||
"scopes": session.as_ref().map(|s| s.scopes.clone()),
|
||||
"keys": session.as_ref().map(|_| key_state_name()),
|
||||
"mount": mount,
|
||||
});
|
||||
println!("{}", serde_json::to_string_pretty(&out)?);
|
||||
@@ -1858,6 +1961,11 @@ fn cmd_status() -> Result<()> {
|
||||
Ok(s) => {
|
||||
println!("Logged in as {} (user {})", s.username, s.user_id);
|
||||
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) => {
|
||||
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))
|
||||
}
|
||||
|
||||
/// 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
|
||||
/// schedule can be tested without a keyring and without real time passing.
|
||||
@@ -2014,6 +2122,16 @@ where
|
||||
sleep(delay);
|
||||
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()),
|
||||
}
|
||||
}
|
||||
@@ -2024,10 +2142,13 @@ where
|
||||
/// an external unmount triggers a remount; errors back off and retry. This is
|
||||
/// the entry point for the systemd user service.
|
||||
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 {
|
||||
// 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.
|
||||
wait_for_session(|| auth::load().map(|_| ()), std::thread::sleep)?;
|
||||
wait_for_session(auth::ready, pdfs_fuse::idle_sleep)?;
|
||||
|
||||
match mount_once(mountpoint.clone()) {
|
||||
Ok(pdfs_fuse::MountOutcome::Shutdown) => {
|
||||
@@ -2036,13 +2157,13 @@ fn cmd_daemon(mountpoint: Option<PathBuf>) -> Result<()> {
|
||||
}
|
||||
Ok(pdfs_fuse::MountOutcome::Unmounted) => {
|
||||
tracing::warn!("mount ended externally; remounting in 2s");
|
||||
std::thread::sleep(std::time::Duration::from_secs(2));
|
||||
pdfs_fuse::idle_sleep(std::time::Duration::from_secs(2));
|
||||
}
|
||||
Err(e) => {
|
||||
// `{:#}` so the whole anyhow chain lands in the log — the top
|
||||
// context alone ("mount failed") never says *why*.
|
||||
tracing::error!(error = format!("{e:#}"), "mount failed; retrying in 5s");
|
||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||
pdfs_fuse::idle_sleep(std::time::Duration::from_secs(5));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3224,6 +3345,19 @@ fn cmd_diagnose() -> Result<()> {
|
||||
match pdfs_core::auth::load() {
|
||||
Ok(session) => {
|
||||
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) => {
|
||||
// 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]
|
||||
fn a_stored_session_is_not_waited_for_at_all() {
|
||||
let mut slept = 0;
|
||||
|
||||
@@ -28,3 +28,5 @@ dbus-secret-service-keyring-store.workspace = true
|
||||
parking_lot.workspace = true
|
||||
async-trait.workspace = true
|
||||
libc.workspace = true
|
||||
zeroize.workspace = true
|
||||
base64.workspace = true
|
||||
+467
-118
@@ -1,22 +1,50 @@
|
||||
//! Login, session persistence, and Drive-client construction.
|
||||
//!
|
||||
//! 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
|
||||
//! 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.
|
||||
//! holding the resumable session tokens, the account's key salts and — unless
|
||||
//! the user chose otherwise — the per-key *passphrases* derived from the
|
||||
//! mailbox password. The password itself is never stored: the passphrases are
|
||||
//! 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 proton_drive_rs::{KeySalt, ProtonDriveClient};
|
||||
use proton_sdk::account::KeyPassphrases;
|
||||
use proton_sdk::api::{HumanVerification, HumanVerificationCredential};
|
||||
use proton_sdk::cache::EncryptedCacheRepository;
|
||||
use proton_sdk::config::ProtonClientConfiguration;
|
||||
use proton_sdk::error::ProtonError;
|
||||
use proton_sdk::session::{PasswordMode, ProtonApiSession, ResumeParameters};
|
||||
use proton_sdk::telemetry::TracingTelemetry;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use zeroize::Zeroizing;
|
||||
|
||||
use crate::config::{APP_VERSION, AppDirs, KEYRING_SERVICE, USER_AGENT};
|
||||
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.
|
||||
const KEYRING_USER: &str = "session";
|
||||
@@ -32,8 +60,11 @@ pub struct StoredSession {
|
||||
pub scopes: Vec<String>,
|
||||
/// `1` = single password, `2` = dual (Proton wire value).
|
||||
pub password_mode: u8,
|
||||
/// Mailbox (data) password — required by `ProtonDriveClient::new` to derive
|
||||
/// the key chain. Lives only in the OS keyring, never on disk in cleartext.
|
||||
/// The mailbox password of a blob written by 3.0.x and earlier.
|
||||
///
|
||||
/// 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,
|
||||
/// The account's key salts, captured at login.
|
||||
///
|
||||
@@ -49,6 +80,11 @@ pub struct StoredSession {
|
||||
/// backfilling) them.
|
||||
#[serde(default)]
|
||||
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 {
|
||||
@@ -89,6 +125,26 @@ fn keyring_entry() -> Result<Entry> {
|
||||
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.
|
||||
///
|
||||
/// `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
|
||||
/// 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
|
||||
/// that can present the challenge should use [`login_interactive`] instead.
|
||||
pub async fn login(
|
||||
username: &str,
|
||||
password: &str,
|
||||
get_totp: impl Fn() -> Result<String>,
|
||||
get_mailbox: impl Fn(u32) -> Result<Mailbox>,
|
||||
) -> 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.
|
||||
@@ -123,12 +184,20 @@ pub async fn login_interactive(
|
||||
username: &str,
|
||||
password: &str,
|
||||
get_totp: impl Fn() -> Result<String>,
|
||||
get_mailbox: impl Fn(u32) -> Result<Mailbox>,
|
||||
get_hv: impl FnOnce(HumanVerification) -> Result<HumanVerificationCredential>,
|
||||
) -> 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)) => {
|
||||
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,
|
||||
}
|
||||
@@ -145,15 +214,18 @@ pub async fn login_verified(
|
||||
password: &str,
|
||||
verification: Option<&HumanVerificationCredential>,
|
||||
get_totp: impl Fn() -> Result<String>,
|
||||
get_mailbox: impl Fn(u32) -> Result<Mailbox>,
|
||||
) -> Result<()> {
|
||||
let mut session = ProtonApiSession::begin_verified(
|
||||
let password = Zeroizing::new(password.to_owned());
|
||||
let session = ProtonApiSession::begin_verified(
|
||||
client_config(),
|
||||
username,
|
||||
password.as_bytes(),
|
||||
verification,
|
||||
)
|
||||
.await
|
||||
.map_err(classify_verification_gate)?;
|
||||
.map_err(classify_verification_gate);
|
||||
let mut session = session?;
|
||||
|
||||
if session.is_waiting_for_second_factor() {
|
||||
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:
|
||||
// after its first refresh it never will again, and without them no later
|
||||
// resume can unlock the key chain. See `StoredSession::key_salts`.
|
||||
let client = ProtonDriveClient::new(&session, password.as_bytes().to_vec());
|
||||
let key_salts = client.account().key_salts().await?;
|
||||
let key_salts = ProtonDriveClient::new(&session, Vec::new())
|
||||
.account()
|
||||
.key_salts()
|
||||
.await?;
|
||||
|
||||
register_refresh_handler(&session, password.to_owned(), key_salts.clone());
|
||||
|
||||
save(&session, password, key_salts).await?;
|
||||
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: proton_sdk::error::ProtonError) -> Error {
|
||||
let proton_sdk::error::ProtonError::Api(api) = &e else {
|
||||
return e.into();
|
||||
// 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
|
||||
// against the account now — a typo found at login is a retry, found later it
|
||||
// is a daemon that never mounts.
|
||||
let (passphrases, remember) = match session.password_mode() {
|
||||
PasswordMode::Single => (
|
||||
derive_verified(&session, password.as_bytes(), key_salts.clone()).await?,
|
||||
true,
|
||||
),
|
||||
PasswordMode::Dual => {
|
||||
let mut attempt = 0;
|
||||
loop {
|
||||
let mailbox = get_mailbox(attempt)?;
|
||||
match derive_verified(&session, mailbox.password.as_bytes(), key_salts.clone())
|
||||
.await
|
||||
{
|
||||
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.
|
||||
pub async fn save(
|
||||
session: &ProtonApiSession,
|
||||
mailbox_password: &str,
|
||||
key_salts: Vec<KeySalt>,
|
||||
) -> Result<()> {
|
||||
register_refresh_handler(&session);
|
||||
let tokens = session.current_tokens().await;
|
||||
let stored = StoredSession {
|
||||
session_id: session.session_id().as_str().to_owned(),
|
||||
@@ -207,10 +279,103 @@ pub async fn save(
|
||||
PasswordMode::Single => 1,
|
||||
PasswordMode::Dual => 2,
|
||||
},
|
||||
mailbox_password: mailbox_password.to_owned(),
|
||||
mailbox_password: String::new(),
|
||||
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)?;
|
||||
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).
|
||||
pub fn logout() -> Result<()> {
|
||||
// The persisted entity cache describes the account being logged out of. It
|
||||
// is encrypted under that account's mailbox password, but leaving it behind
|
||||
// would also mean the next account inherits a store it can only ever read as
|
||||
// misses. Best-effort: failing to remove a cache must not block the logout.
|
||||
// is encrypted under a key derived from that account's passphrases, but
|
||||
// leaving it behind would also mean the next account inherits a store it can
|
||||
// only ever read as misses. Best-effort: failing to remove a cache must not
|
||||
// block the logout.
|
||||
if let Ok(dirs) = AppDirs::new() {
|
||||
let path = dirs.state_dir().join("sdk_cache.db");
|
||||
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()));
|
||||
}
|
||||
}
|
||||
if let Err(e) = kernelkey::clear() {
|
||||
tracing::warn!(error = %e, "clearing the kernel-keyring unlock on logout failed");
|
||||
}
|
||||
match keyring_entry()?.delete_credential() {
|
||||
Ok(()) | Err(keyring_core::Error::NoEntry) => Ok(()),
|
||||
Err(e) => Err(e.into()),
|
||||
@@ -250,44 +499,87 @@ pub fn logout() -> Result<()> {
|
||||
|
||||
/// Resume a persisted session and build an authenticated Drive client.
|
||||
///
|
||||
/// Returns `Error::NotLoggedIn` when no session has been saved. The caller is
|
||||
/// responsible for persisting rotated tokens over the session's lifetime via
|
||||
/// [`persist`] — Proton refresh tokens are single-use, so a refresh that is not
|
||||
/// written back leaves the keyring holding a stale (now-invalid) refresh token,
|
||||
/// and the next resume fails with `InvalidRefreshToken`.
|
||||
/// Returns `Error::NotLoggedIn` when no session has been saved and
|
||||
/// [`Error::Locked`] when the account is waiting for its mailbox password. Tokens
|
||||
/// the session rotates are written back to the keyring as they happen (see
|
||||
/// [`register_refresh_handler`]); Proton refresh tokens are single-use, so a
|
||||
/// 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)> {
|
||||
let stored = load()?;
|
||||
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
|
||||
// more and write them back, 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() {
|
||||
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
|
||||
let passphrases = match find_passphrases(&stored)? {
|
||||
Some((passphrases, _)) => passphrases,
|
||||
None if !stored.mailbox_password.is_empty() => migrate_legacy(&session, &stored).await?,
|
||||
None => return Err(Error::Locked),
|
||||
};
|
||||
|
||||
register_refresh_handler(&session, password.clone(), key_salts.clone());
|
||||
|
||||
let client = tune(
|
||||
ProtonDriveClient::with_key_salts(&session, password.clone().into_bytes(), key_salts),
|
||||
password.as_bytes(),
|
||||
ProtonDriveClient::with_key_passphrases(&session, passphrases.clone()),
|
||||
&passphrases,
|
||||
);
|
||||
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
|
||||
/// [`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.
|
||||
/// - **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
|
||||
/// wrapped in the SDK's [`EncryptedCacheRepository`] keyed by the mailbox
|
||||
/// password, so the decrypted node names it holds are not readable from the
|
||||
/// file alone — and a password change simply reads as a cold cache, since the
|
||||
/// SDK treats an undecryptable entry as a miss and clears the store.
|
||||
/// wrapped in the SDK's [`EncryptedCacheRepository`] keyed by a secret derived
|
||||
/// from the key passphrases, so the decrypted node names it holds are not
|
||||
/// readable from the file alone — and a password change simply reads as a cold
|
||||
/// 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
|
||||
/// hits, not the session, so the client falls back to the SDK's in-memory
|
||||
/// default.
|
||||
fn tune(client: ProtonDriveClient, mailbox_password: &[u8]) -> ProtonDriveClient {
|
||||
fn tune(client: ProtonDriveClient, passphrases: &KeyPassphrases) -> ProtonDriveClient {
|
||||
let client = client
|
||||
.with_telemetry(TracingTelemetry::shared())
|
||||
.with_small_file_upload(true);
|
||||
match AppDirs::new().and_then(|dirs| crate::sdkcache::SdkCache::shared(&dirs)) {
|
||||
Ok(cache) => client.with_entity_repository(EncryptedCacheRepository::shared(
|
||||
cache,
|
||||
mailbox_password.to_vec(),
|
||||
)),
|
||||
Ok(cache) => {
|
||||
let key = passphrases.derive_secret(ENTITY_CACHE_PURPOSE);
|
||||
client.with_entity_repository(EncryptedCacheRepository::shared(cache, key.to_vec()))
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::warn!(error = %e, "persistent SDK entity cache unavailable; using memory");
|
||||
client
|
||||
@@ -327,49 +620,105 @@ fn tune(client: ProtonDriveClient, mailbox_password: &[u8]) -> ProtonDriveClient
|
||||
|
||||
/// Write the session's current tokens back to the keyring.
|
||||
///
|
||||
/// The session does not carry the mailbox password (it is only needed to rebuild
|
||||
/// the key chain on resume), so it is re-read from the existing stored blob and
|
||||
/// preserved. Call whenever the session may have rotated its tokens through the
|
||||
/// 401-refresh path so a later [`resume_client`] presents a live refresh token.
|
||||
/// Everything else in the stored blob — salts, passphrases — is preserved, so
|
||||
/// this never undoes an [`unlock`] or [`lock`] made since the session started.
|
||||
/// Call whenever the session may have rotated its tokens so a later
|
||||
/// [`resume_client`] presents a live refresh token.
|
||||
pub async fn persist(session: &ProtonApiSession) -> Result<()> {
|
||||
let stored = load()?;
|
||||
save(session, &stored.mailbox_password, stored.key_salts).await
|
||||
let tokens = session.current_tokens().await;
|
||||
store_tokens(tokens.access_token, tokens.refresh_token)
|
||||
}
|
||||
|
||||
fn register_refresh_handler(
|
||||
session: &ProtonApiSession,
|
||||
mailbox_password: String,
|
||||
key_salts: Vec<KeySalt>,
|
||||
) {
|
||||
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,
|
||||
};
|
||||
fn store_tokens(access_token: String, refresh_token: String) -> Result<()> {
|
||||
let mut stored = load()?;
|
||||
stored.access_token = access_token;
|
||||
stored.refresh_token = refresh_token;
|
||||
write_stored(&stored)
|
||||
}
|
||||
|
||||
/// 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| {
|
||||
let stored = StoredSession {
|
||||
session_id: session_id.clone(),
|
||||
username: username.clone(),
|
||||
user_id: user_id.clone(),
|
||||
access_token: tokens.access_token,
|
||||
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");
|
||||
match store_tokens(tokens.access_token, tokens.refresh_token) {
|
||||
Ok(()) => tracing::info!("successfully auto-persisted refreshed tokens in keyring"),
|
||||
Err(Error::NotLoggedIn) => {}
|
||||
Err(e) => {
|
||||
tracing::warn!(error = %e, "failed to auto-persist 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());
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,16 @@ pub enum Error {
|
||||
#[error("saved session can no longer unlock your keys — run `pdfs login` again")]
|
||||
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
|
||||
/// 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)).
|
||||
@@ -199,9 +209,11 @@ impl From<serde_json::Error> for CoreError {
|
||||
impl From<Error> for CoreError {
|
||||
fn from(e: Error) -> Self {
|
||||
let kind = match &e {
|
||||
Error::NotLoggedIn | Error::ReloginRequired | Error::HumanVerificationRequired(_) => {
|
||||
ErrorKind::Denied
|
||||
}
|
||||
Error::NotLoggedIn
|
||||
| Error::ReloginRequired
|
||||
| Error::Locked
|
||||
| Error::WrongMailboxPassword
|
||||
| Error::HumanVerificationRequired(_) => ErrorKind::Denied,
|
||||
Error::Proton(proton_sdk::ProtonError::Api(api)) => api_kind(api.code),
|
||||
// A `ProtonError` that never reached the API is a transport failure.
|
||||
Error::Proton(_) => ErrorKind::Offline,
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
//! 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_SETPERM: libc::c_long = 5;
|
||||
const KEYCTL_SEARCH: libc::c_long = 10;
|
||||
const KEYCTL_READ: libc::c_long = 11;
|
||||
|
||||
/// Possessor and owner may view, read, write, search, link and set attributes;
|
||||
/// group and others get nothing.
|
||||
///
|
||||
/// A new key's default grants the owner only *view*, and read access to the
|
||||
/// possessor. A process possesses the user keyring only when its session
|
||||
/// keyring links to it, which a systemd user service or a container does not
|
||||
/// guarantee — so with the default, the daemon could store a key it then
|
||||
/// cannot read back. The owner is the same user that could ptrace the daemon
|
||||
/// anyway, so granting it read access gives up nothing.
|
||||
const PERM_OWNER_AND_POSSESSOR: u32 = 0x3f3f_0000;
|
||||
|
||||
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();
|
||||
}
|
||||
// SAFETY: plain integer arguments.
|
||||
let rc = unsafe {
|
||||
libc::syscall(
|
||||
libc::SYS_keyctl,
|
||||
KEYCTL_SETPERM,
|
||||
id,
|
||||
PERM_OWNER_AND_POSSESSOR,
|
||||
)
|
||||
};
|
||||
if rc < 0 {
|
||||
// A key whose permissions are unknown is not one to leave behind.
|
||||
let err = io::Error::last_os_error();
|
||||
let _ = clear();
|
||||
return Err(err);
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ pub mod config;
|
||||
pub mod control;
|
||||
pub mod db;
|
||||
pub mod error;
|
||||
pub mod kernelkey;
|
||||
pub mod localindex;
|
||||
pub mod menu;
|
||||
pub mod mounts;
|
||||
|
||||
@@ -123,6 +123,7 @@ use mount::{
|
||||
};
|
||||
use reads::{BlockFlight, BlockRing, PREFETCH_BUDGET, Prefetch, ReaderSlot, STREAM_BYPASS_MIN};
|
||||
use state::{Entry, Intervals, PendingRevision, State, StateGuard, WriteHandle};
|
||||
pub use systemd::idle_sleep;
|
||||
use tracing::{debug, error, info, warn};
|
||||
use transfers::{CountingWriter, JobGuard, OwnedCountingReader, TransferRegistry};
|
||||
use r#virtual::{
|
||||
|
||||
@@ -74,6 +74,26 @@ pub(crate) fn watchdog_ping() {
|
||||
let _ = notify("WATCHDOG=1\n");
|
||||
}
|
||||
|
||||
/// Sleep for `duration`, pinging the watchdog on the way.
|
||||
///
|
||||
/// For the stretches where the daemon is alive but has no mount, and so no
|
||||
/// supervisor: waiting for a login, or backing off after a failed mount. The
|
||||
/// manager arms the watchdog when the process starts, so without these pings a
|
||||
/// daemon that is merely retrying is aborted after `WatchdogSec` and leaves a
|
||||
/// coredump instead of the error it was logging. Never use this while mounted:
|
||||
/// there the ping must prove the control socket answers.
|
||||
pub fn idle_sleep(duration: Duration) {
|
||||
const CHUNK: Duration = Duration::from_secs(10);
|
||||
let mut left = duration;
|
||||
watchdog_ping();
|
||||
while !left.is_zero() {
|
||||
let step = left.min(CHUNK);
|
||||
std::thread::sleep(step);
|
||||
left -= step;
|
||||
watchdog_ping();
|
||||
}
|
||||
}
|
||||
|
||||
/// Tell the manager the daemon is stopping, so a slow teardown is not mistaken
|
||||
/// for a hang by the watchdog it is racing.
|
||||
pub(crate) fn stopping() {
|
||||
|
||||
@@ -119,6 +119,9 @@ struct Ui {
|
||||
/// keyring (a DBus round-trip). Populated at startup and updated only on
|
||||
/// login / logout. `None` = signed out.
|
||||
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
|
||||
/// (which need the daemon to evict + re-hydrate) and every mutating action.
|
||||
mounted: RefCell<bool>,
|
||||
@@ -362,6 +365,7 @@ fn build_window(app: &adw::Application) {
|
||||
busy: Cell::new(0),
|
||||
opening: RefCell::new(HashSet::new()),
|
||||
session: RefCell::new(auth::load().ok()),
|
||||
unlock_offered: Cell::new(false),
|
||||
mounted: RefCell::new(false),
|
||||
sidebar: sidebar_list.clone(),
|
||||
nav: split.clone(),
|
||||
|
||||
@@ -128,7 +128,12 @@ pub(crate) fn wire_login(ui: &Rc<Ui>) {
|
||||
|
||||
set_signing_in(&ui, true);
|
||||
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.
|
||||
// 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();
|
||||
glib::spawn_future_local(async move {
|
||||
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") => {
|
||||
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(
|
||||
"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
|
||||
/// runtime. Returns two channels: the first yields the final login result once;
|
||||
/// the second fires *only if* the account needs a 2FA code, carrying a
|
||||
/// [`std::sync::mpsc::Sender`] the UI uses to feed the code back. The login
|
||||
/// closure blocks the worker on that sender until the dialog answers, so the
|
||||
/// 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>)>,
|
||||
) {
|
||||
/// runtime. The returned [`LoginChannels`] carry the final result and the lazy
|
||||
/// prompts. Each login closure blocks the worker on a sender the UI answers, so
|
||||
/// a code is requested lazily and can't expire before the password proof.
|
||||
pub(crate) fn spawn_login(username: String, password: String) -> LoginChannels {
|
||||
let (tx, rx) = async_channel::bounded(1);
|
||||
// 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.
|
||||
let (totp_req_tx, totp_req_rx) = async_channel::bounded(2);
|
||||
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 || {
|
||||
let rt = match tokio::runtime::Builder::new_current_thread()
|
||||
.enable_all()
|
||||
@@ -267,6 +298,19 @@ pub(crate) fn spawn_login(
|
||||
.recv()
|
||||
.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| {
|
||||
// Gated: hand the UI the page to show, block on the token the
|
||||
// user earns by solving it.
|
||||
@@ -287,7 +331,143 @@ pub(crate) fn spawn_login(
|
||||
});
|
||||
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
|
||||
@@ -374,6 +554,12 @@ mod tests {
|
||||
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]
|
||||
fn an_unmapped_error_keeps_its_text() {
|
||||
let error = pdfs_core::Error::Other("something odd".into());
|
||||
|
||||
@@ -860,6 +860,7 @@ pub(crate) fn refresh(ui: &Rc<Ui>) {
|
||||
}
|
||||
}
|
||||
|
||||
offer_unlock(ui);
|
||||
refresh_status(ui);
|
||||
refresh_transfers(ui);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
Err(_) => {
|
||||
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) => (
|
||||
// Translators: {username} is the Proton account name.
|
||||
gettext_f(
|
||||
|
||||
@@ -11,6 +11,42 @@ scratch (user data in `staging/` and `recovery/` is never touched by this).
|
||||
|
||||
## [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
|
||||
|
||||
Schema: **42**. The queue table is rebuilt so an id is never given out twice; queued changes
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
# Build + install: cd packaging && makepkg -fi
|
||||
|
||||
pkgname=proton-drive-linux
|
||||
pkgver=3.0.0
|
||||
pkgver=3.1.0
|
||||
pkgrel=1
|
||||
pkgdesc="Unofficial Proton Drive client for Linux: files-on-demand FUSE mount, CLI, GTK4 app + tray"
|
||||
arch=('x86_64')
|
||||
|
||||
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: German\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "%-d. %b %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:819
|
||||
@@ -70,91 +70,91 @@ msgstr "%A, %-d. %B %Y, %H:%M"
|
||||
msgid "My files"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "Photos"
|
||||
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:482
|
||||
msgid "Shared with me"
|
||||
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
|
||||
msgid "Shared by me"
|
||||
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:481
|
||||
msgid "Computers"
|
||||
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
|
||||
msgid "Trash"
|
||||
msgstr "Papierkorb"
|
||||
|
||||
#. 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"
|
||||
msgstr "Synchronisierung"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
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"
|
||||
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"
|
||||
msgstr "Hauptmenü"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "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 ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -166,23 +166,23 @@ msgstr ""
|
||||
"Inoffizieller Client – nicht mit Proton AG verbunden, von Proton AG "
|
||||
"unterstützt oder befürwortet."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1220
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
msgid "Source Code"
|
||||
msgstr "Quellcode"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
msgid "Proton Terms of Service"
|
||||
msgstr "Nutzungsbedingungen von Proton"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
#: crates/pdfs-gui/src/app/main.rs:1232
|
||||
msgid "Proton Privacy Policy"
|
||||
msgstr "Datenschutzerklärung von Proton"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1233
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
msgid "Disclaimer"
|
||||
msgstr "Haftungsausschluss"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"endorsed by, or supported by Proton AG.\n"
|
||||
@@ -207,7 +207,7 @@ msgstr ""
|
||||
"bereitgestellt. Daten, deren Verlust nicht hinnehmbar ist, sollten "
|
||||
"zusätzlich gesichert werden."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1245
|
||||
#: crates/pdfs-gui/src/app/main.rs:1249
|
||||
msgid ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.org/"
|
||||
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
|
||||
@@ -217,7 +217,7 @@ msgstr ""
|
||||
"\">GeoNames</a>, lizenziert unter <a href=\"https://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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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 "
|
||||
"gemeinfrei sind."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1261
|
||||
#: crates/pdfs-gui/src/app/main.rs:1265
|
||||
msgid ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "Proton Drive beenden?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
@@ -260,7 +260,7 @@ msgstr ""
|
||||
"eine Verbindung hergestellt wird. Proton Drive startet bei der nächsten "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -290,30 +291,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
msgstr "Beenden"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1331
|
||||
#: crates/pdfs-gui/src/app/main.rs:1335
|
||||
msgid "Couldn't stop Proton Drive"
|
||||
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."
|
||||
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
|
||||
msgid "General"
|
||||
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
|
||||
msgid "Search Drive"
|
||||
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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -322,38 +323,38 @@ msgstr "Drive durchsuchen"
|
||||
msgid "Refresh"
|
||||
msgstr "Aktualisieren"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Tastenkürzel"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
msgstr "Dateien hochladen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "Back / forward"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr "Übergeordneter Ordner"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -362,7 +363,7 @@ msgstr "Raster / Liste"
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -372,73 +373,73 @@ msgstr "Umbenennen"
|
||||
msgid "Move to Trash"
|
||||
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"
|
||||
msgstr "Auswahl aufheben"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Größere Vorschaubilder"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
msgstr "Kleinere Vorschaubilder"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1394
|
||||
#: crates/pdfs-gui/src/app/main.rs:1398
|
||||
msgid "Reset thumbnail size"
|
||||
msgstr "Vorschaubildgröße zurücksetzen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1395
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
msgid "Select all"
|
||||
msgstr "Alles auswählen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr "Fotobetrachter"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
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"
|
||||
msgstr "Erstes / letztes Foto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
#: crates/pdfs-gui/src/app/main.rs:1407
|
||||
msgid "Show details"
|
||||
msgstr "Details anzeigen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Vollbild"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1555,7 +1556,7 @@ msgid "Make available offline"
|
||||
msgstr "Offline verfügbar machen"
|
||||
|
||||
#: 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"
|
||||
msgstr "Nur online verfügbar machen"
|
||||
|
||||
@@ -2724,7 +2725,7 @@ msgid "Sync paused until you resume"
|
||||
msgstr "Synchronisierung bis zur Fortsetzung pausiert"
|
||||
|
||||
#: 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"
|
||||
msgstr "Synchronisierung pausiert"
|
||||
|
||||
@@ -3200,25 +3201,25 @@ msgstr "E-Mail-Adresse und Passwort eingeben."
|
||||
msgid "Signing in…"
|
||||
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…"
|
||||
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"
|
||||
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."
|
||||
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."
|
||||
msgstr ""
|
||||
"Proton ist nicht erreichbar. Bitte die Internetverbindung prüfen und erneut "
|
||||
"versuchen."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:207
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:227
|
||||
msgid ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
@@ -3227,11 +3228,19 @@ msgstr ""
|
||||
"gespeichert werden. Bitte sicherstellen, dass ein Schlüsselbund (GNOME "
|
||||
"Keyring oder KWallet) läuft und entsperrt ist."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:210
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:230
|
||||
msgid "Sign-in cancelled: no two-factor code was entered."
|
||||
msgstr "Anmeldung abgebrochen: Es wurde kein Zwei-Faktor-Code eingegeben."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs: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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3240,35 +3249,79 @@ msgstr ""
|
||||
"neue Überprüfung erneut anmelden."
|
||||
|
||||
#. 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
|
||||
msgid "Sign-in failed: {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"
|
||||
msgstr "Zwei-Faktor-Authentifizierung"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:300
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:480
|
||||
msgid ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
"Den Code aus der Authentifizierungs-App oder einen der "
|
||||
"Wiederherstellungscodes eingeben."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
msgstr "Authentifizierungscode"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:313
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:493
|
||||
msgid "Confirm"
|
||||
msgstr "Bestätigen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "Abmelden?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"already on this computer stay where they are."
|
||||
@@ -3277,7 +3330,7 @@ msgstr ""
|
||||
"nächsten Anmeldung. Dateien, die sich bereits auf diesem Computer befinden, "
|
||||
"bleiben, wo sie sind."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:345
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:525
|
||||
msgid "Sign Out"
|
||||
msgstr "Abmelden"
|
||||
|
||||
@@ -4645,40 +4698,40 @@ msgid "Restart Now"
|
||||
msgstr "Jetzt neu starten"
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr "{size} belegt"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Proton Drive getrennt"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:969
|
||||
msgid ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"Der Proton-Drive-Dienst wurde beendet. Dateien sind erst nach seinem "
|
||||
"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"
|
||||
msgstr "Synchronisierung abgeschlossen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title} – {done} von {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title} – {detail} ({done} von {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title} …"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title} – {detail} …"
|
||||
@@ -4715,7 +4768,7 @@ msgstr "{title} – {detail} …"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {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
|
||||
msgid "{used} cached — no limit set"
|
||||
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
|
||||
msgid "{used} of {limit} used"
|
||||
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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · wird {time} fortgesetzt"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {time}"
|
||||
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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] "{n} Änderung erfordert 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
|
||||
msgctxt "state"
|
||||
msgid "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"
|
||||
msgstr "Nur zwischengespeicherte Dateien"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1358
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1359
|
||||
msgctxt "state"
|
||||
msgid "Syncing"
|
||||
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"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
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"
|
||||
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"
|
||||
msgstr "Proton Drive braucht zu lange für eine Antwort"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "später"
|
||||
|
||||
#. 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"
|
||||
msgstr "um %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "am %a um %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
msgstr ""
|
||||
"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:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
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"
|
||||
msgstr "Weniger anzeigen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5898,40 +5951,45 @@ msgstr[1] "↑ {n} werden hochgeladen"
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
msgstr "Angemeldet als {username} – nicht verbunden"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:177
|
||||
#: crates/pdfs-gui/src/main.rs:186
|
||||
msgid "Not signed in"
|
||||
msgstr "Nicht angemeldet"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "Error: {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"
|
||||
msgstr "Proton Drive hat unerwartet geantwortet"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgstr[0] "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
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] "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
|
||||
msgid "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)"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Offline – {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] "{n} Problem – Anzeigen"
|
||||
msgstr[1] "{n} Probleme – Anzeigen"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr "Anmelden …"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Proton Drive öffnen"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Ordner öffnen"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Synchronisierung fortsetzen"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Synchronisierung pausieren"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Verbinden"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
msgstr "Symbol im Benachrichtigungsfeld ausblenden"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:453
|
||||
#: crates/pdfs-gui/src/main.rs:462
|
||||
msgid "Stop Proton Drive…"
|
||||
msgstr "Proton Drive beenden …"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Beenden"
|
||||
|
||||
|
||||
+198
-140
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: English (United Kingdom)\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:819
|
||||
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y, %H:%M"
|
||||
msgid "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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "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:482
|
||||
msgid "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
|
||||
msgid "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:481
|
||||
msgid "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
|
||||
msgid "Trash"
|
||||
msgstr "Trash"
|
||||
|
||||
#. 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"
|
||||
msgstr "Sync"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "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
|
||||
msgid "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"
|
||||
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"
|
||||
msgstr "Main menu"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "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 ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -166,23 +166,23 @@ msgstr ""
|
||||
"Unofficial client — not affiliated with, endorsed by, or supported by Proton "
|
||||
"AG."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1220
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
msgid "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"
|
||||
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"
|
||||
msgstr "Proton Privacy Policy"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1233
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
msgid "Disclaimer"
|
||||
msgstr "Disclaimer"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"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 "
|
||||
"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 ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.org/"
|
||||
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
|
||||
@@ -214,7 +214,7 @@ msgstr ""
|
||||
"\">GeoNames</a>, licensed under <a href=\"https://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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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 "
|
||||
"public domain."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1261
|
||||
#: crates/pdfs-gui/src/app/main.rs:1265
|
||||
msgid ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "Stop Proton Drive?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
@@ -256,7 +256,7 @@ msgstr ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -286,30 +287,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "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"
|
||||
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."
|
||||
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
|
||||
msgid "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
|
||||
msgid "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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -318,38 +319,38 @@ msgstr "Search Drive"
|
||||
msgid "Refresh"
|
||||
msgstr "Refresh"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Keyboard shortcuts"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "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
|
||||
msgid "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
|
||||
msgid "Upload files"
|
||||
msgstr "Upload files"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "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
|
||||
msgid "Parent folder"
|
||||
msgstr "Parent folder"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -358,7 +359,7 @@ msgstr "Grid / list"
|
||||
msgid "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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -368,73 +369,73 @@ msgstr "Rename"
|
||||
msgid "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"
|
||||
msgstr "Clear the selection"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Larger thumbnails"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "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"
|
||||
msgstr "Reset thumbnail size"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1395
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
msgid "Select all"
|
||||
msgstr "Select all"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "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"
|
||||
msgstr "Previous / next photo"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1402
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
msgid "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"
|
||||
msgstr "Show details"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Fullscreen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1543,7 +1544,7 @@ msgid "Make available offline"
|
||||
msgstr "Make available offline"
|
||||
|
||||
#: 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"
|
||||
msgstr "Make online only"
|
||||
|
||||
@@ -2686,7 +2687,7 @@ msgid "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/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"
|
||||
msgstr "Sync paused"
|
||||
|
||||
@@ -3149,23 +3150,23 @@ msgstr "Enter your email and password."
|
||||
msgid "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…"
|
||||
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"
|
||||
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."
|
||||
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."
|
||||
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 ""
|
||||
"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."
|
||||
@@ -3173,11 +3174,19 @@ msgstr ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:210
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:230
|
||||
msgid "Sign-in cancelled: no two-factor code was entered."
|
||||
msgstr "Sign-in cancelled: no two-factor code was entered."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs: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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3186,34 +3195,78 @@ msgstr ""
|
||||
"new one."
|
||||
|
||||
#. 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
|
||||
msgid "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"
|
||||
msgstr "Two-Factor Authentication"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:300
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:480
|
||||
msgid ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "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"
|
||||
msgstr "Confirm"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "Sign Out?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"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 "
|
||||
"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"
|
||||
msgstr "Sign Out"
|
||||
|
||||
@@ -4556,39 +4609,39 @@ msgid "Restart Now"
|
||||
msgstr "Restart Now"
|
||||
|
||||
#. 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
|
||||
msgid "{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
|
||||
msgid "{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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Proton Drive disconnected"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:969
|
||||
msgid ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"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"
|
||||
msgstr "Sync complete"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title} — {done} of {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title} — {detail} ({done} of {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title}…"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title} — {detail}…"
|
||||
@@ -4625,7 +4678,7 @@ msgstr "{title} — {detail}…"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
msgid "{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
|
||||
msgid "{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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · resumes {time}"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] "{n} change needs 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
|
||||
msgctxt "state"
|
||||
msgid "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"
|
||||
msgstr "Cached files only"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1358
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1359
|
||||
msgctxt "state"
|
||||
msgid "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"
|
||||
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
|
||||
msgid "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"
|
||||
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"
|
||||
msgstr "Proton Drive is taking too long to answer"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "later"
|
||||
|
||||
#. 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"
|
||||
msgstr "at %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
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:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "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"
|
||||
msgstr "Show fewer"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5788,40 +5841,45 @@ msgstr[1] "↑ {n} uploading"
|
||||
msgid "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
|
||||
msgid "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"
|
||||
msgstr "Not signed in"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "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"
|
||||
msgstr "Proton Drive sent an unexpected reply"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "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[1] "Up to date in {mountpoint} ({n} pinned)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:253
|
||||
#: crates/pdfs-gui/src/main.rs:262
|
||||
#, rust-format
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] "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
|
||||
msgid "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)"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Offline — {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] "{n} issue — View"
|
||||
msgstr[1] "{n} issues — View"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr "Sign In…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Open Proton Drive"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Open Folder"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Resume Sync"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Pause Sync"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Connect"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "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…"
|
||||
msgstr "Stop Proton Drive…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Quit"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: Spanish\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: 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"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "Photos"
|
||||
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:482
|
||||
msgid "Shared with me"
|
||||
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
|
||||
msgid "Shared by me"
|
||||
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:481
|
||||
msgid "Computers"
|
||||
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
|
||||
msgid "Trash"
|
||||
msgstr "Papelera"
|
||||
|
||||
#. 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"
|
||||
msgstr "Sincronización"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
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"
|
||||
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"
|
||||
msgstr "Menú principal"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "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 ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -166,23 +166,23 @@ msgstr ""
|
||||
"Cliente no oficial: no está afiliado a Proton AG, ni respaldado ni mantenido "
|
||||
"por esta."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1220
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
msgid "Source Code"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Aviso legal"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"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 "
|
||||
"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 ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.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://"
|
||||
"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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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 "
|
||||
"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 ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "¿Detener Proton Drive?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"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 "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -288,30 +289,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
msgstr "Detener"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1331
|
||||
#: crates/pdfs-gui/src/app/main.rs:1335
|
||||
msgid "Couldn't stop 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."
|
||||
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
|
||||
msgid "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
|
||||
msgid "Search 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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -320,38 +321,38 @@ msgstr "Buscar en Drive"
|
||||
msgid "Refresh"
|
||||
msgstr "Actualizar"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Atajos del teclado"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
msgstr "Subir archivos"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "Back / forward"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr "Carpeta superior"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -360,7 +361,7 @@ msgstr "Cuadrícula / lista"
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -370,73 +371,73 @@ msgstr "Renombrar"
|
||||
msgid "Move to Trash"
|
||||
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"
|
||||
msgstr "Anular la selección"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Miniaturas más grandes"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
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"
|
||||
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"
|
||||
msgstr "Seleccionar todo"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr "Visor de fotos"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
msgstr "Foto anterior / siguiente"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1402
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
msgid "First / last photo"
|
||||
msgstr "Primera / última foto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
#: crates/pdfs-gui/src/app/main.rs:1407
|
||||
msgid "Show details"
|
||||
msgstr "Mostrar detalles"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Pantalla completa"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1549,7 +1550,7 @@ msgid "Make available offline"
|
||||
msgstr "Hacer disponible sin conexión"
|
||||
|
||||
#: 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"
|
||||
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"
|
||||
|
||||
#: 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"
|
||||
msgstr "Sincronización en pausa"
|
||||
|
||||
@@ -3174,27 +3175,27 @@ msgstr "Introduzca su correo electrónico y su contraseña."
|
||||
msgid "Signing in…"
|
||||
msgstr "Iniciando sesión…"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:155
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:160
|
||||
msgid "Complete the verification to continue…"
|
||||
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"
|
||||
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."
|
||||
msgstr ""
|
||||
"Demasiados intentos de inicio de sesión. Espere unos minutos e inténtelo de "
|
||||
"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."
|
||||
msgstr ""
|
||||
"No se pudo contactar con Proton. Compruebe su conexión a Internet e "
|
||||
"inténtelo de nuevo."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:207
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:227
|
||||
msgid ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
@@ -3203,12 +3204,20 @@ msgstr ""
|
||||
"sistema. Asegúrese de que un depósito de claves (GNOME Keyring o KWallet) "
|
||||
"esté en ejecución y desbloqueado."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:210
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:230
|
||||
msgid "Sign-in cancelled: no two-factor code was entered."
|
||||
msgstr ""
|
||||
"Inicio de sesión cancelado: no se introdujo ningún código de dos factores."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs: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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3217,35 +3226,79 @@ msgstr ""
|
||||
"sesión para obtener una nueva."
|
||||
|
||||
#. 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
|
||||
msgid "Sign-in failed: {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"
|
||||
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 ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
"Introduzca el código de su aplicación de autenticación o uno de sus códigos "
|
||||
"de recuperación."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
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"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "¿Cerrar la sesión?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"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 "
|
||||
"están."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:345
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:525
|
||||
msgid "Sign Out"
|
||||
msgstr "Cerrar la sesión"
|
||||
|
||||
@@ -4606,40 +4659,40 @@ msgid "Restart Now"
|
||||
msgstr "Reiniciar ahora"
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr "{size} usados"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Proton Drive desconectado"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:969
|
||||
msgid ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"El servicio de Proton Drive se detuvo. Los archivos no estarán disponibles "
|
||||
"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"
|
||||
msgstr "Sincronización completada"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title}: {done} de {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title}: {detail} ({done} de {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title}…"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title}: {detail}…"
|
||||
@@ -4676,7 +4729,7 @@ msgstr "{title}: {detail}…"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {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
|
||||
msgid "{used} cached — no limit set"
|
||||
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
|
||||
msgid "{used} of {limit} used"
|
||||
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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · se reanuda {time}"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] "{n} cambio requiere 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
|
||||
msgctxt "state"
|
||||
msgid "Offline"
|
||||
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"
|
||||
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"
|
||||
msgid "Syncing"
|
||||
msgstr "Sincronizando"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1364
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1365
|
||||
msgid "Up to date"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
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"
|
||||
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"
|
||||
msgstr "Proton Drive está tardando demasiado en responder"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "más tarde"
|
||||
|
||||
#. 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"
|
||||
msgstr "a las %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
msgstr ""
|
||||
"Pulse con el botón derecho en un archivo y elija “Hacer disponible sin "
|
||||
"conexión”."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1509
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
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"
|
||||
msgstr "Mostrar menos"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5858,40 +5911,45 @@ msgstr[1] "↑ {n} subiendo"
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
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"
|
||||
msgstr "Sesión no iniciada"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "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"
|
||||
msgstr "Proton Drive envió una respuesta inesperada"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgstr[0] "Actualizado en {mountpoint} ({n} fijado)"
|
||||
msgstr[1] "Actualizado en {mountpoint} ({n} fijados)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:253
|
||||
#: crates/pdfs-gui/src/main.rs:262
|
||||
#, rust-format
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] "Sincronizando: {queued} ({n} anclado)"
|
||||
msgstr[1] "Sincronizando: {queued} ({n} anclados)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:260
|
||||
#: crates/pdfs-gui/src/main.rs:269
|
||||
#, rust-format
|
||||
msgid "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)"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Sin conexión: {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] "{n} problema: ver"
|
||||
msgstr[1] "{n} problemas: ver"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr "Iniciar sesión…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Abrir Proton Drive"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Abrir carpeta"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Reanudar la sincronización"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Pausar la sincronización"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Conectar"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
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…"
|
||||
msgstr "Detener Proton Drive…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: French\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:819
|
||||
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y à %H:%M"
|
||||
msgid "My files"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "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:482
|
||||
msgid "Shared with me"
|
||||
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
|
||||
msgid "Shared by me"
|
||||
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:481
|
||||
msgid "Computers"
|
||||
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
|
||||
msgid "Trash"
|
||||
msgstr "Corbeille"
|
||||
|
||||
#. 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"
|
||||
msgstr "Synchronisation"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
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"
|
||||
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"
|
||||
msgstr "Menu principal"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "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 ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -166,23 +166,23 @@ msgstr ""
|
||||
"Client non officiel — non affilié à Proton AG, ni approuvé ni pris en charge "
|
||||
"par Proton AG."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1220
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
msgid "Source Code"
|
||||
msgstr "Code source"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
msgid "Proton Terms of Service"
|
||||
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"
|
||||
msgstr "Politique de confidentialité de Proton"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1233
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
msgid "Disclaimer"
|
||||
msgstr "Avertissement"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"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 "
|
||||
"perdre."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1245
|
||||
#: crates/pdfs-gui/src/app/main.rs:1249
|
||||
msgid ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.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://"
|
||||
"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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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 "
|
||||
"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 ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "Arrêter Proton Drive ?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
@@ -260,7 +260,7 @@ msgstr ""
|
||||
"vous reconnectez pas. Proton Drive redémarrera à votre prochaine ouverture "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -290,30 +291,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
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"
|
||||
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."
|
||||
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
|
||||
msgid "General"
|
||||
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
|
||||
msgid "Search 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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -322,38 +323,38 @@ msgstr "Rechercher dans Drive"
|
||||
msgid "Refresh"
|
||||
msgstr "Actualiser"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Raccourcis clavier"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
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"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr "Dossier parent"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -362,7 +363,7 @@ msgstr "Grille / liste"
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -372,73 +373,73 @@ msgstr "Renommer"
|
||||
msgid "Move to Trash"
|
||||
msgstr "Mettre à la corbeille"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1386
|
||||
#: crates/pdfs-gui/src/app/main.rs:1390
|
||||
msgid "Clear the selection"
|
||||
msgstr "Effacer la sélection"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Miniatures plus grandes"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
msgstr "Miniatures plus petites"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1394
|
||||
#: crates/pdfs-gui/src/app/main.rs:1398
|
||||
msgid "Reset thumbnail size"
|
||||
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"
|
||||
msgstr "Tout sélectionner"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr "Visionneuse de photos"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
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"
|
||||
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"
|
||||
msgstr "Afficher les détails"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Plein écran"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1560,7 +1561,7 @@ msgid "Make available offline"
|
||||
msgstr "Rendre disponible hors ligne"
|
||||
|
||||
#: 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"
|
||||
msgstr "Garder en ligne uniquement"
|
||||
|
||||
@@ -2724,7 +2725,7 @@ msgid "Sync paused until you resume"
|
||||
msgstr "Synchronisation en pause jusqu’à la reprise"
|
||||
|
||||
#: 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"
|
||||
msgstr "Synchronisation en pause"
|
||||
|
||||
@@ -3200,25 +3201,25 @@ msgstr "Saisissez votre adresse électronique et votre mot de passe."
|
||||
msgid "Signing in…"
|
||||
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…"
|
||||
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"
|
||||
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."
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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 ""
|
||||
"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."
|
||||
@@ -3227,11 +3228,19 @@ msgstr ""
|
||||
"système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en "
|
||||
"cours d’exécution et déverrouillé."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:210
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:230
|
||||
msgid "Sign-in cancelled: no two-factor code was entered."
|
||||
msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs: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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3240,35 +3249,79 @@ msgstr ""
|
||||
"pour en obtenir une nouvelle."
|
||||
|
||||
#. 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
|
||||
msgid "Sign-in failed: {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"
|
||||
msgstr "Authentification à deux facteurs"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:300
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:480
|
||||
msgid ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
"Saisissez le code de votre application d’authentification ou l’un de vos "
|
||||
"codes de récupération."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
msgstr "Code d’authentification"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:313
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:493
|
||||
msgid "Confirm"
|
||||
msgstr "Confirmer"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "Se déconnecter ?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"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 "
|
||||
"restent en place."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:345
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:525
|
||||
msgid "Sign Out"
|
||||
msgstr "Se déconnecter"
|
||||
|
||||
@@ -4643,40 +4696,40 @@ msgid "Restart Now"
|
||||
msgstr "Redémarrer maintenant"
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr "{size} utilisés"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Proton Drive déconnecté"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:969
|
||||
msgid ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"Le service Proton Drive s’est arrêté. Les fichiers ne sont pas disponibles "
|
||||
"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"
|
||||
msgstr "Synchronisation terminée"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title} — {done} sur {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title} — {detail} ({done} sur {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title}…"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title} — {detail}…"
|
||||
@@ -4713,7 +4766,7 @@ msgstr "{title} — {detail}…"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {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
|
||||
msgid "{used} cached — no limit set"
|
||||
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
|
||||
msgid "{used} of {limit} used"
|
||||
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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · reprise {time}"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] "{n} modification requiert 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
|
||||
msgctxt "state"
|
||||
msgid "Offline"
|
||||
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"
|
||||
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"
|
||||
msgid "Syncing"
|
||||
msgstr "Synchronisation"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1364
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1365
|
||||
msgid "Up to date"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
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"
|
||||
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"
|
||||
msgstr "Proton Drive met trop de temps à répondre"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "plus tard"
|
||||
|
||||
#. 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"
|
||||
msgstr "à %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
msgstr ""
|
||||
"Faites un clic droit sur un fichier et choisissez « Rendre disponible hors "
|
||||
"ligne »."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1509
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
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"
|
||||
msgstr "Afficher moins"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5899,40 +5952,45 @@ msgstr[1] "↑ {n} en téléversement"
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
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"
|
||||
msgstr "Non connecté"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "Error: {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"
|
||||
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
|
||||
msgid "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgstr[0] "À jour dans {mountpoint} ({n} épinglé)"
|
||||
msgstr[1] "À jour dans {mountpoint} ({n} épinglés)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:253
|
||||
#: crates/pdfs-gui/src/main.rs:262
|
||||
#, rust-format
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] "Synchronisation — {queued} ({n} épinglé)"
|
||||
msgstr[1] "Synchronisation — {queued} ({n} épinglés)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:260
|
||||
#: crates/pdfs-gui/src/main.rs:269
|
||||
#, rust-format
|
||||
msgid "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)"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Hors ligne — {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] "{n} problème — Afficher"
|
||||
msgstr[1] "{n} problèmes — Afficher"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr "Se connecter…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Ouvrir Proton Drive"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Ouvrir le dossier"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Reprendre la synchronisation"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Mettre en pause la synchronisation"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Connecter"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
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…"
|
||||
msgstr "Arrêter Proton Drive…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Quitter"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: Italian\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:819
|
||||
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y, %H:%M"
|
||||
msgid "My files"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "Photos"
|
||||
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:482
|
||||
msgid "Shared with 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
|
||||
msgid "Shared by 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:481
|
||||
msgid "Computers"
|
||||
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
|
||||
msgid "Trash"
|
||||
msgstr "Cestino"
|
||||
|
||||
#. 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"
|
||||
msgstr "Sincronizzazione"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
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"
|
||||
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"
|
||||
msgstr "Menu principale"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "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 ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -165,23 +165,23 @@ msgstr ""
|
||||
"\n"
|
||||
"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"
|
||||
msgstr "Codice sorgente"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
msgid "Proton Terms of Service"
|
||||
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"
|
||||
msgstr "Informativa sulla privacy di Proton"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1233
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
msgid "Disclaimer"
|
||||
msgstr "Esclusione di responsabilità"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"endorsed by, or supported by Proton AG.\n"
|
||||
@@ -204,7 +204,7 @@ msgstr ""
|
||||
"Questo software è fornito “così com’è”, senza alcuna garanzia. Conserva una "
|
||||
"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 ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.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/"
|
||||
"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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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 "
|
||||
"Earth</a>, che sono di pubblico dominio."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1261
|
||||
#: crates/pdfs-gui/src/app/main.rs:1265
|
||||
msgid ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "Arrestare Proton Drive?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
@@ -256,7 +256,7 @@ msgstr ""
|
||||
"I miei file andranno offline e nulla verrà sincronizzato finché non ti "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -286,30 +287,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
msgstr "Arresta"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1331
|
||||
#: crates/pdfs-gui/src/app/main.rs:1335
|
||||
msgid "Couldn't stop 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."
|
||||
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
|
||||
msgid "General"
|
||||
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
|
||||
msgid "Search 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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -318,38 +319,38 @@ msgstr "Cerca in Drive"
|
||||
msgid "Refresh"
|
||||
msgstr "Aggiorna"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Scorciatoie da tastiera"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
msgstr "Carica file"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "Back / forward"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr "Cartella superiore"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -358,7 +359,7 @@ msgstr "Griglia / elenco"
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -368,73 +369,73 @@ msgstr "Rinomina"
|
||||
msgid "Move to Trash"
|
||||
msgstr "Sposta nel cestino"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1386
|
||||
#: crates/pdfs-gui/src/app/main.rs:1390
|
||||
msgid "Clear the selection"
|
||||
msgstr "Annulla la selezione"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Miniature più grandi"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
msgstr "Miniature più piccole"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1394
|
||||
#: crates/pdfs-gui/src/app/main.rs:1398
|
||||
msgid "Reset thumbnail size"
|
||||
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"
|
||||
msgstr "Seleziona tutto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr "Visualizzatore di foto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
msgstr "Foto precedente / successiva"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1402
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
msgid "First / last photo"
|
||||
msgstr "Prima / ultima foto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
#: crates/pdfs-gui/src/app/main.rs:1407
|
||||
msgid "Show details"
|
||||
msgstr "Mostra dettagli"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Schermo intero"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1554,7 +1555,7 @@ msgid "Make available offline"
|
||||
msgstr "Rendi disponibile offline"
|
||||
|
||||
#: 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"
|
||||
msgstr "Rendi solo online"
|
||||
|
||||
@@ -2722,7 +2723,7 @@ msgid "Sync paused until you resume"
|
||||
msgstr "Sincronizzazione in pausa finché non riprendi"
|
||||
|
||||
#: 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"
|
||||
msgstr "Sincronizzazione in pausa"
|
||||
|
||||
@@ -3192,25 +3193,25 @@ msgstr "Inserisci la tua email e la password."
|
||||
msgid "Signing in…"
|
||||
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…"
|
||||
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"
|
||||
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."
|
||||
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."
|
||||
msgstr ""
|
||||
"Impossibile raggiungere Proton. Controlla la connessione a Internet e "
|
||||
"riprova."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:207
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:227
|
||||
msgid ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
@@ -3219,13 +3220,21 @@ msgstr ""
|
||||
"portachiavi di sistema. Assicurati che un portachiavi (GNOME Keyring o "
|
||||
"KWallet) sia in esecuzione e sbloccato."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:210
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:230
|
||||
msgid "Sign-in cancelled: no two-factor code was entered."
|
||||
msgstr ""
|
||||
"Accesso annullato: non è stato inserito alcun codice di autenticazione a due "
|
||||
"fattori."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs: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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3234,35 +3243,79 @@ msgstr ""
|
||||
"riceverne una nuova."
|
||||
|
||||
#. 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
|
||||
msgid "Sign-in failed: {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"
|
||||
msgstr "Autenticazione a due fattori"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:300
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:480
|
||||
msgid ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
"Inserisci il codice dell'app di autenticazione o uno dei tuoi codici di "
|
||||
"recupero."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
msgstr "Codice di autenticazione"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:313
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:493
|
||||
msgid "Confirm"
|
||||
msgstr "Conferma"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "Disconnettersi?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"already on this computer stay where they are."
|
||||
@@ -3270,7 +3323,7 @@ msgstr ""
|
||||
"Proton Drive si disconnetterà e interromperà la sincronizzazione finché non "
|
||||
"accedi di nuovo. I file già presenti su questo computer restano dove sono."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:345
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:525
|
||||
msgid "Sign Out"
|
||||
msgstr "Disconnetti"
|
||||
|
||||
@@ -4621,40 +4674,40 @@ msgid "Restart Now"
|
||||
msgstr "Riavvia ora"
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr "{size} utilizzati"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Proton Drive disconnesso"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:969
|
||||
msgid ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"Il servizio di Proton Drive si è arrestato. I file non sono disponibili "
|
||||
"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"
|
||||
msgstr "Sincronizzazione completata"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title}: {done} di {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title}: {detail} ({done} di {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title}…"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title}: {detail}…"
|
||||
@@ -4691,7 +4744,7 @@ msgstr "{title}: {detail}…"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {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
|
||||
msgid "{used} cached — no limit set"
|
||||
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
|
||||
msgid "{used} of {limit} used"
|
||||
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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · riprende {time}"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] "{n} modifica richiede 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
|
||||
msgctxt "state"
|
||||
msgid "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"
|
||||
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"
|
||||
msgid "Syncing"
|
||||
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"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
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"
|
||||
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"
|
||||
msgstr "Proton Drive impiega troppo tempo a rispondere"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "più tardi"
|
||||
|
||||
#. 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"
|
||||
msgstr "alle %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
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:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
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"
|
||||
msgstr "Mostra meno"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5876,40 +5929,45 @@ msgstr[1] "↑ {n} in caricamento"
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
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"
|
||||
msgstr "Accesso non eseguito"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "Error: {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"
|
||||
msgstr "Proton Drive ha inviato una risposta inattesa"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgstr[0] "Aggiornato in {mountpoint} ({n} fissato)"
|
||||
msgstr[1] "Aggiornato in {mountpoint} ({n} fissati)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:253
|
||||
#: crates/pdfs-gui/src/main.rs:262
|
||||
#, rust-format
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] "Sincronizzazione: {queued} ({n} fissato)"
|
||||
msgstr[1] "Sincronizzazione: {queued} ({n} fissati)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:260
|
||||
#: crates/pdfs-gui/src/main.rs:269
|
||||
#, rust-format
|
||||
msgid "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)"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Offline: {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] "{n} problema: visualizza"
|
||||
msgstr[1] "{n} problemi: visualizza"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr "Accedi…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Apri Proton Drive"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Apri cartella"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Riprendi sincronizzazione"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Metti in pausa sincronizzazione"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Connetti"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
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…"
|
||||
msgstr "Arresta Proton Drive…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Esci"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: Dutch\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "%-d %b %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:819
|
||||
@@ -70,91 +70,91 @@ msgstr "%A %-d %B %Y, %H:%M"
|
||||
msgid "My files"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "Photos"
|
||||
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:482
|
||||
msgid "Shared with me"
|
||||
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
|
||||
msgid "Shared by me"
|
||||
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:481
|
||||
msgid "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
|
||||
msgid "Trash"
|
||||
msgstr "Prullenbak"
|
||||
|
||||
#. 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"
|
||||
msgstr "Synchronisatie"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr "Sneltoetsen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1146
|
||||
#: crates/pdfs-gui/src/app/main.rs:1150
|
||||
msgid "About 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"
|
||||
msgstr "Hoofdmenu"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "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 ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -166,23 +166,23 @@ msgstr ""
|
||||
"Onofficiële client — niet gelieerd aan, onderschreven door of ondersteund "
|
||||
"door Proton AG."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1220
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
msgid "Source Code"
|
||||
msgstr "Broncode"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
msgid "Proton Terms of Service"
|
||||
msgstr "Servicevoorwaarden van Proton"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
#: crates/pdfs-gui/src/app/main.rs:1232
|
||||
msgid "Proton Privacy Policy"
|
||||
msgstr "Privacybeleid van Proton"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1233
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
msgid "Disclaimer"
|
||||
msgstr "Disclaimer"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"endorsed by, or supported by Proton AG.\n"
|
||||
@@ -205,7 +205,7 @@ msgstr ""
|
||||
"Deze software wordt geleverd “zoals ze is”, zonder enige garantie. Bewaar "
|
||||
"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 ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.org/"
|
||||
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
|
||||
@@ -215,7 +215,7 @@ msgstr ""
|
||||
"\">GeoNames</a>, gelicentieerd onder <a href=\"https://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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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 "
|
||||
"publieke domein vallen."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1261
|
||||
#: crates/pdfs-gui/src/app/main.rs:1265
|
||||
msgid ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "Proton Drive stoppen?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
@@ -257,7 +257,7 @@ msgstr ""
|
||||
"Mijn bestanden gaat offline en er wordt niets gesynchroniseerd tot je weer "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -287,30 +288,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Annuleren"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
msgstr "Stoppen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1331
|
||||
#: crates/pdfs-gui/src/app/main.rs:1335
|
||||
msgid "Couldn't stop Proton Drive"
|
||||
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."
|
||||
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
|
||||
msgid "General"
|
||||
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
|
||||
msgid "Search Drive"
|
||||
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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -319,38 +320,38 @@ msgstr "Drive doorzoeken"
|
||||
msgid "Refresh"
|
||||
msgstr "Verversen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Sneltoetsen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
msgstr "Bestanden uploaden"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "Back / forward"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr "Bovenliggende map"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -359,7 +360,7 @@ msgstr "Raster / lijst"
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -369,73 +370,73 @@ msgstr "Hernoemen"
|
||||
msgid "Move to Trash"
|
||||
msgstr "Naar prullenbak verplaatsen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1386
|
||||
#: crates/pdfs-gui/src/app/main.rs:1390
|
||||
msgid "Clear the selection"
|
||||
msgstr "Selectie wissen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Grotere miniaturen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
msgstr "Kleinere miniaturen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1394
|
||||
#: crates/pdfs-gui/src/app/main.rs:1398
|
||||
msgid "Reset thumbnail size"
|
||||
msgstr "Miniatuurgrootte herstellen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1395
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
msgid "Select all"
|
||||
msgstr "Alles selecteren"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr "Fotoweergave"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
msgstr "Vorige / volgende foto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1402
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
msgid "First / last photo"
|
||||
msgstr "Eerste / laatste foto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
#: crates/pdfs-gui/src/app/main.rs:1407
|
||||
msgid "Show details"
|
||||
msgstr "Details tonen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Volledig scherm"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1550,7 +1551,7 @@ msgid "Make available offline"
|
||||
msgstr "Offline beschikbaar maken"
|
||||
|
||||
#: 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"
|
||||
msgstr "Alleen online maken"
|
||||
|
||||
@@ -2713,7 +2714,7 @@ msgid "Sync paused until you resume"
|
||||
msgstr "Synchronisatie gepauzeerd totdat je hervat"
|
||||
|
||||
#: 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"
|
||||
msgstr "Synchronisatie gepauzeerd"
|
||||
|
||||
@@ -3185,26 +3186,26 @@ msgstr "Voer je e-mailadres en wachtwoord in."
|
||||
msgid "Signing in…"
|
||||
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…"
|
||||
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"
|
||||
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."
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Kon Proton niet bereiken. Controleer je internetverbinding en probeer het "
|
||||
"opnieuw."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:207
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:227
|
||||
msgid ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
@@ -3213,11 +3214,19 @@ msgstr ""
|
||||
"opgeslagen. Zorg dat een sleutelbos (GNOME Keyring of KWallet) actief en "
|
||||
"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."
|
||||
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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3226,33 +3235,77 @@ msgstr ""
|
||||
"om een nieuwe te krijgen."
|
||||
|
||||
#. 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
|
||||
msgid "Sign-in failed: {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"
|
||||
msgstr "Tweestapsverificatie"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:300
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:480
|
||||
msgid ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr "Voer de code uit je authenticator-app in, of een van je herstelcodes."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
msgstr "Verificatiecode"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:313
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:493
|
||||
msgid "Confirm"
|
||||
msgstr "Bevestigen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "Afmelden?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"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 "
|
||||
"ze zijn."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:345
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:525
|
||||
msgid "Sign Out"
|
||||
msgstr "Afmelden"
|
||||
|
||||
@@ -4620,40 +4673,40 @@ msgid "Restart Now"
|
||||
msgstr "Nu opnieuw starten"
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr "{size} gebruikt"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({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"
|
||||
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."
|
||||
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"
|
||||
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 ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"De Proton Drive-service is gestopt. Bestanden zijn pas weer beschikbaar als "
|
||||
"hij opnieuw start."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1037
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1038
|
||||
msgid "Sync complete"
|
||||
msgstr "Synchronisatie voltooid"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title} — {done} van {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title} — {detail} ({done} van {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title}…"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title} — {detail}…"
|
||||
@@ -4690,7 +4743,7 @@ msgstr "{title} — {detail}…"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {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
|
||||
msgid "{used} cached — no limit set"
|
||||
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
|
||||
msgid "{used} of {limit} used"
|
||||
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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · hervat {time}"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] "{n} wijziging vereist 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
|
||||
msgctxt "state"
|
||||
msgid "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"
|
||||
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"
|
||||
msgid "Syncing"
|
||||
msgstr "Synchroniseren"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1364
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1365
|
||||
msgid "Up to date"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
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"
|
||||
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"
|
||||
msgstr "Proton Drive doet er te lang over om te antwoorden"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "later"
|
||||
|
||||
#. 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"
|
||||
msgstr "om %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
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:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
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"
|
||||
msgstr "Minder tonen"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5868,40 +5921,45 @@ msgstr[1] "↑ {n} worden geüpload"
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
msgstr "Aangemeld als {username} — niet verbonden"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:177
|
||||
#: crates/pdfs-gui/src/main.rs:186
|
||||
msgid "Not signed in"
|
||||
msgstr "Niet aangemeld"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "Error: {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"
|
||||
msgstr "Proton Drive gaf een onverwacht antwoord"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgstr[0] "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
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] "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
|
||||
msgid "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)"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Offline — {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] "{n} probleem — Bekijken"
|
||||
msgstr[1] "{n} problemen — Bekijken"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr "Aanmelden…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Proton Drive openen"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Map openen"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Synchronisatie hervatten"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Synchronisatie pauzeren"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Verbinden"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
msgstr "Pictogram in systeemvak verbergen"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:453
|
||||
#: crates/pdfs-gui/src/main.rs:462
|
||||
msgid "Stop Proton Drive…"
|
||||
msgstr "Proton Drive stoppen…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Afsluiten"
|
||||
|
||||
|
||||
+199
-141
@@ -6,9 +6,9 @@
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
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"
|
||||
"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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -60,7 +60,7 @@ msgstr ""
|
||||
msgid "%A, %B %-d, %Y, %H:%M"
|
||||
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/browser.rs:454
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:819
|
||||
@@ -73,91 +73,91 @@ msgstr ""
|
||||
msgid "My files"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "Photos"
|
||||
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:482
|
||||
msgid "Shared with me"
|
||||
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
|
||||
msgid "Shared by me"
|
||||
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:481
|
||||
msgid "Computers"
|
||||
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
|
||||
msgid "Trash"
|
||||
msgstr ""
|
||||
|
||||
#. 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"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{what}: {detail}"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1098
|
||||
#: crates/pdfs-gui/src/app/main.rs:1102
|
||||
msgid "You're offline"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1099
|
||||
#: crates/pdfs-gui/src/app/main.rs:1103
|
||||
msgid "That's not there any more"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1101
|
||||
#: crates/pdfs-gui/src/app/main.rs:1105
|
||||
msgid "Something changed this first"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1102
|
||||
#: crates/pdfs-gui/src/app/main.rs:1106
|
||||
msgid "Your Proton Drive is full"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1146
|
||||
#: crates/pdfs-gui/src/app/main.rs:1150
|
||||
msgid "About Proton Drive for Linux"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1151
|
||||
#: crates/pdfs-gui/src/app/main.rs:1155
|
||||
msgid "Main menu"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "Proton Drive for Linux"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1215
|
||||
#: crates/pdfs-gui/src/app/main.rs:1219
|
||||
msgid ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -165,23 +165,23 @@ msgid ""
|
||||
"AG."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1220
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
msgid "Source Code"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
msgid "Proton Terms of Service"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1228
|
||||
#: crates/pdfs-gui/src/app/main.rs:1232
|
||||
msgid "Proton Privacy Policy"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1233
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
msgid "Disclaimer"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"endorsed by, or supported by Proton AG.\n"
|
||||
@@ -194,21 +194,21 @@ msgid ""
|
||||
"of any data you cannot afford to lose."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1245
|
||||
#: crates/pdfs-gui/src/app/main.rs:1249
|
||||
msgid ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.org/"
|
||||
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
|
||||
"licenses/by/4.0/\">CC BY 4.0</a>."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1253
|
||||
#: crates/pdfs-gui/src/app/main.rs:1257
|
||||
msgid ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">Natural Earth</a> land outlines and country borders, which are in the "
|
||||
"public domain."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1261
|
||||
#: crates/pdfs-gui/src/app/main.rs:1265
|
||||
msgid ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1310
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
msgid "Stop Proton Drive?"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -263,30 +264,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1331
|
||||
#: crates/pdfs-gui/src/app/main.rs:1335
|
||||
msgid "Couldn't stop Proton Drive"
|
||||
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."
|
||||
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
|
||||
msgid "General"
|
||||
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
|
||||
msgid "Search Drive"
|
||||
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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -295,38 +296,38 @@ msgstr ""
|
||||
msgid "Refresh"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "Back / forward"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -335,7 +336,7 @@ msgstr ""
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -345,73 +346,73 @@ msgstr ""
|
||||
msgid "Move to Trash"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1386
|
||||
#: crates/pdfs-gui/src/app/main.rs:1390
|
||||
msgid "Clear the selection"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1394
|
||||
#: crates/pdfs-gui/src/app/main.rs:1398
|
||||
msgid "Reset thumbnail size"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1395
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
msgid "Select all"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1402
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
msgid "First / last photo"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
#: crates/pdfs-gui/src/app/main.rs:1407
|
||||
msgid "Show details"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
@@ -1240,7 +1241,7 @@ msgstr ""
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1006
|
||||
#: 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: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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1508,7 +1509,7 @@ msgid "Make available offline"
|
||||
msgstr ""
|
||||
|
||||
#: 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"
|
||||
msgstr ""
|
||||
|
||||
@@ -2616,7 +2617,7 @@ msgid "Sync paused until you resume"
|
||||
msgstr ""
|
||||
|
||||
#: 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"
|
||||
msgstr ""
|
||||
|
||||
@@ -3052,72 +3053,124 @@ msgstr ""
|
||||
msgid "Signing in…"
|
||||
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…"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:165
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:185
|
||||
msgid "login cancelled"
|
||||
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."
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:207
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:227
|
||||
msgid ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:210
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:230
|
||||
msgid "Sign-in cancelled: no two-factor code was entered."
|
||||
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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: {error} is an error message, usually in English.
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:218
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:244
|
||||
#, rust-format
|
||||
msgid "Sign-in failed: {error}"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:300
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:480
|
||||
msgid ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:313
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:493
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"already on this computer stay where they are."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:345
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:525
|
||||
msgid "Sign Out"
|
||||
msgstr ""
|
||||
|
||||
@@ -4433,38 +4486,38 @@ msgid "Restart Now"
|
||||
msgstr ""
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({percent}%)"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:961
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:962
|
||||
msgid "Proton Drive connected"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:962
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:963
|
||||
msgid "Your files are available."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:967
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
msgid "Proton Drive disconnected"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:969
|
||||
msgid ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1037
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1038
|
||||
msgid "Sync complete"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr ""
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr ""
|
||||
@@ -4501,7 +4554,7 @@ msgstr ""
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} ({speed}/s)"
|
||||
msgstr ""
|
||||
@@ -4509,117 +4562,117 @@ msgstr ""
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {total} ({speed}/s)"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1254
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1255
|
||||
#, rust-format
|
||||
msgid "{used} cached — no limit set"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1260
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1261
|
||||
#, rust-format
|
||||
msgid "{used} of {limit} used"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1328
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1329
|
||||
#, rust-format
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {time}"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1335
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1336
|
||||
msgid "Until you resume"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] ""
|
||||
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
|
||||
msgctxt "state"
|
||||
msgid "Offline"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1353
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1354
|
||||
msgid "Cached files only"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1358
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1359
|
||||
msgctxt "state"
|
||||
msgid "Syncing"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1364
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1365
|
||||
msgid "Up to date"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1376
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1377
|
||||
msgid "Not responding"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr ""
|
||||
|
||||
#. 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"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr ""
|
||||
|
||||
#. 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"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1456
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1457
|
||||
msgid "No files kept offline"
|
||||
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”."
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1509
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1533
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1534
|
||||
msgid "Show fewer"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5644,40 +5697,45 @@ msgstr[1] ""
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:177
|
||||
#: crates/pdfs-gui/src/main.rs:186
|
||||
msgid "Not signed in"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "Error: {error}"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:201
|
||||
#: crates/pdfs-gui/src/main.rs:210
|
||||
msgid "Proton Drive sent an unexpected reply"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:253
|
||||
#: crates/pdfs-gui/src/main.rs:262
|
||||
#, rust-format
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:260
|
||||
#: crates/pdfs-gui/src/main.rs:269
|
||||
#, rust-format
|
||||
msgid "Offline — cached files only ({n} pinned)"
|
||||
msgid_plural "Offline — cached files only ({n} pinned)"
|
||||
@@ -5685,52 +5743,52 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr ""
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:453
|
||||
#: crates/pdfs-gui/src/main.rs:462
|
||||
msgid "Stop Proton Drive…"
|
||||
msgstr ""
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: Polish\n"
|
||||
@@ -59,7 +59,7 @@ msgstr "%-d %b %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:819
|
||||
@@ -72,91 +72,91 @@ msgstr "%A, %-d %B %Y, %H:%M"
|
||||
msgid "My files"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "Photos"
|
||||
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:482
|
||||
msgid "Shared with me"
|
||||
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
|
||||
msgid "Shared by me"
|
||||
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:481
|
||||
msgid "Computers"
|
||||
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
|
||||
msgid "Trash"
|
||||
msgstr "Kosz"
|
||||
|
||||
#. 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"
|
||||
msgstr "Synchronizacja"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Proton Drive for Linux"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1215
|
||||
#: crates/pdfs-gui/src/app/main.rs:1219
|
||||
msgid ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -168,23 +168,23 @@ msgstr ""
|
||||
"Nieoficjalny klient — niepowiązany z Proton AG, niepopierany ani "
|
||||
"niewspierany przez tę firmę."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1220
|
||||
#: crates/pdfs-gui/src/app/main.rs:1224
|
||||
msgid "Source Code"
|
||||
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"
|
||||
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"
|
||||
msgstr "Polityka prywatności Proton"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1233
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
msgid "Disclaimer"
|
||||
msgstr "Zastrzeżenia"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"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 "
|
||||
"pozwolić."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1245
|
||||
#: crates/pdfs-gui/src/app/main.rs:1249
|
||||
msgid ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.org/"
|
||||
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
|
||||
@@ -218,7 +218,7 @@ msgstr ""
|
||||
"\">GeoNames</a> udostępnionych na licencji <a href=\"https://"
|
||||
"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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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 "
|
||||
"publicznej."
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1261
|
||||
#: crates/pdfs-gui/src/app/main.rs:1265
|
||||
msgid ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "Zatrzymać Proton Drive?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
@@ -261,7 +261,7 @@ msgstr ""
|
||||
"ponownego połączenia. Proton Drive uruchomi się ponownie przy następnym "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -291,30 +292,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Anuluj"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
msgstr "Zatrzymaj"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1331
|
||||
#: crates/pdfs-gui/src/app/main.rs:1335
|
||||
msgid "Couldn't stop 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."
|
||||
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
|
||||
msgid "General"
|
||||
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
|
||||
msgid "Search 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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -323,38 +324,38 @@ msgstr "Przeszukaj Drive"
|
||||
msgid "Refresh"
|
||||
msgstr "Odśwież"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Skróty klawiszowe"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
msgstr "Wyślij pliki"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "Back / forward"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr "Katalog nadrzędny"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -363,7 +364,7 @@ msgstr "Siatka/lista"
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -373,73 +374,73 @@ msgstr "Zmień nazwę"
|
||||
msgid "Move to Trash"
|
||||
msgstr "Przenieś do kosza"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1386
|
||||
#: crates/pdfs-gui/src/app/main.rs:1390
|
||||
msgid "Clear the selection"
|
||||
msgstr "Wyczyść zaznaczenie"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Większe miniatury"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
msgstr "Mniejsze miniatury"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1394
|
||||
#: crates/pdfs-gui/src/app/main.rs:1398
|
||||
msgid "Reset thumbnail size"
|
||||
msgstr "Przywróć rozmiar miniatur"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1395
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
msgid "Select all"
|
||||
msgstr "Zaznacz wszystko"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr "Przeglądarka zdjęć"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
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"
|
||||
msgstr "Pierwsze/ostatnie zdjęcie"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
#: crates/pdfs-gui/src/app/main.rs:1407
|
||||
msgid "Show details"
|
||||
msgstr "Wyświetl szczegóły"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Pełny ekran"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1586,7 +1587,7 @@ msgid "Make available offline"
|
||||
msgstr "Oznacz jako dostępne offline"
|
||||
|
||||
#: 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"
|
||||
msgstr "Oznacz jako tylko online"
|
||||
|
||||
@@ -2770,7 +2771,7 @@ msgid "Sync paused until you resume"
|
||||
msgstr "Wstrzymano synchronizację do czasu wznowienia"
|
||||
|
||||
#: 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"
|
||||
msgstr "Wstrzymano synchronizację"
|
||||
|
||||
@@ -3242,26 +3243,26 @@ msgstr "Proszę podać adres e-mail i hasło."
|
||||
msgid "Signing in…"
|
||||
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…"
|
||||
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"
|
||||
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."
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"Nie można połączyć się z Proton. Proszę sprawdzić połączenie z Internetem i "
|
||||
"spróbować ponownie."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:207
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:227
|
||||
msgid ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
@@ -3270,11 +3271,19 @@ msgstr ""
|
||||
"upewnić, że baza kluczy (GNOME Keyring lub KWallet) jest uruchomiona i "
|
||||
"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."
|
||||
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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3283,35 +3292,79 @@ msgstr ""
|
||||
"ponownie, aby otrzymać nową."
|
||||
|
||||
#. 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
|
||||
msgid "Sign-in failed: {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"
|
||||
msgstr "Uwierzytelnianie dwuskładnikowe"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:300
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:480
|
||||
msgid ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
"Proszę wpisać kod z aplikacji uwierzytelniającej lub jeden z kodów "
|
||||
"odzyskiwania."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
msgstr "Kod uwierzytelniania"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:313
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:493
|
||||
msgid "Confirm"
|
||||
msgstr "Potwierdź"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "Wylogować się?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"already on this computer stay where they are."
|
||||
@@ -3319,7 +3372,7 @@ msgstr ""
|
||||
"Proton Drive rozłączy się i przestanie synchronizować do czasu ponownego "
|
||||
"zalogowania. Pliki znajdujące się już na tym komputerze pozostaną na miejscu."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:345
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:525
|
||||
msgid "Sign Out"
|
||||
msgstr "Wyloguj się"
|
||||
|
||||
@@ -4689,40 +4742,40 @@ msgid "Restart Now"
|
||||
msgstr "Uruchom ponownie teraz"
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr "Użyto {size}"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({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"
|
||||
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."
|
||||
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"
|
||||
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 ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"Usługa Proton Drive zatrzymała się. Pliki będą niedostępne do jej ponownego "
|
||||
"uruchomienia."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1037
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1038
|
||||
msgid "Sync complete"
|
||||
msgstr "Ukończono synchronizację"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1039
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1040
|
||||
#, rust-format
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title} — {done} z {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title} — {detail} ({done} z {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title}…"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title} — {detail}…"
|
||||
@@ -4760,7 +4813,7 @@ msgstr "{title} — {detail}…"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {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
|
||||
msgid "{used} cached — no limit set"
|
||||
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
|
||||
msgid "{used} of {limit} used"
|
||||
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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · wznowienie {time}"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
@@ -4807,81 +4860,81 @@ msgstr[0] "{n} zmiana wymaga uwagi"
|
||||
msgstr[1] "{n} zmiany wymagają 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
|
||||
msgctxt "state"
|
||||
msgid "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"
|
||||
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"
|
||||
msgid "Syncing"
|
||||
msgstr "Synchronizowanie"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1364
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1365
|
||||
msgid "Up to date"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
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"
|
||||
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"
|
||||
msgstr "Proton Drive zbyt długo nie odpowiada"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "później"
|
||||
|
||||
#. 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"
|
||||
msgstr "o %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "%a %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
msgstr ""
|
||||
"Należy kliknąć plik prawym przyciskiem myszy i wybrać „Oznacz jako dostępne "
|
||||
"offline”."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1509
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
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"
|
||||
msgstr "Wyświetl mniej"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5959,26 +6012,31 @@ msgstr[2] "↑ wysyłanie: {n}"
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
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"
|
||||
msgstr "Nie zalogowano"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "Error: {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"
|
||||
msgstr "Proton Drive wysłał nieoczekiwaną odpowiedź"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "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[2] "Aktualne w {mountpoint} ({n} przypiętych)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:253
|
||||
#: crates/pdfs-gui/src/main.rs:262
|
||||
#, rust-format
|
||||
msgid "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[2] "Synchronizowanie — {queued} (przypięte: {n})"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:260
|
||||
#: crates/pdfs-gui/src/main.rs:269
|
||||
#, rust-format
|
||||
msgid "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})"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Offline — {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
@@ -6017,39 +6075,39 @@ msgstr[0] "{n} problem — wyświetl"
|
||||
msgstr[1] "{n} problemy — 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…"
|
||||
msgstr "Zaloguj się…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Otwórz Proton Drive"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Otwórz katalog"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Wznów synchronizację"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Wstrzymaj synchronizację"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Połącz"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
msgstr "Ukryj ikonę w obszarze powiadamiania"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:453
|
||||
#: crates/pdfs-gui/src/main.rs:462
|
||||
msgid "Stop Proton Drive…"
|
||||
msgstr "Zatrzymaj Proton Drive…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Zakończ"
|
||||
|
||||
|
||||
+198
-140
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: proton-drive-linux 2.1.0\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
|
||||
"POT-Creation-Date: 2026-10-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"
|
||||
"Last-Translator: Proton Drive for Linux contributors\n"
|
||||
"Language-Team: Portuguese (Brazil)\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "%-d de %b de %Y"
|
||||
msgid "%A, %B %-d, %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/browser.rs:454
|
||||
#: 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"
|
||||
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/photos.rs:842
|
||||
#: crates/pdfs-gui/src/app/pages/places.rs:441
|
||||
msgid "Photos"
|
||||
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:482
|
||||
msgid "Shared with me"
|
||||
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
|
||||
msgid "Shared by me"
|
||||
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:481
|
||||
msgid "Computers"
|
||||
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
|
||||
msgid "Trash"
|
||||
msgstr "Lixeira"
|
||||
|
||||
#. 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"
|
||||
msgstr "Sincronização"
|
||||
|
||||
#. Translators: a failed action's toast. {what} says what failed, such as
|
||||
#. "Couldn't rename"; {detail} is the reason, usually untranslated text
|
||||
#. from the mount service.
|
||||
#: crates/pdfs-gui/src/app/main.rs:1079
|
||||
#: crates/pdfs-gui/src/app/main.rs:1083
|
||||
#, rust-format
|
||||
msgid "{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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Preferences"
|
||||
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
|
||||
msgid "Keyboard Shortcuts"
|
||||
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"
|
||||
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"
|
||||
msgstr "Menu principal"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1207
|
||||
#: crates/pdfs-gui/src/app/main.rs:1211
|
||||
msgid "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 ""
|
||||
"Files-on-demand Proton Drive for the Linux desktop.\n"
|
||||
"\n"
|
||||
@@ -165,23 +165,23 @@ msgstr ""
|
||||
"\n"
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Aviso legal"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1237
|
||||
#: crates/pdfs-gui/src/app/main.rs:1241
|
||||
msgid ""
|
||||
"This is an unofficial, community-built client. It is not affiliated with, "
|
||||
"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 "
|
||||
"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 ""
|
||||
"Places are named with data from <a href=\"https://www.geonames.org/"
|
||||
"\">GeoNames</a>, licensed under <a href=\"https://creativecommons.org/"
|
||||
@@ -214,7 +214,7 @@ msgstr ""
|
||||
"\">GeoNames</a>, licenciados sob <a href=\"https://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 ""
|
||||
"The places map is drawn from <a href=\"https://www.naturalearthdata.com/"
|
||||
"\">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/"
|
||||
"\">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 ""
|
||||
"The street map, when turned on, comes from <a href=\"https://openfreemap.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
|
||||
#. 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"
|
||||
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?"
|
||||
msgstr "Parar o Proton Drive?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1311
|
||||
#: crates/pdfs-gui/src/app/main.rs:1315
|
||||
msgid ""
|
||||
"My files goes offline and nothing syncs until you connect again. Proton "
|
||||
"Drive starts again at your next login."
|
||||
@@ -256,7 +256,7 @@ msgstr ""
|
||||
"Meus arquivos fica offline e nada é sincronizado até você se conectar "
|
||||
"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:428
|
||||
#: 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:1488
|
||||
#: 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/shared.rs:946
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:1027
|
||||
@@ -286,30 +287,30 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1314
|
||||
#: crates/pdfs-gui/src/app/main.rs:1318
|
||||
msgctxt "verb"
|
||||
msgid "Stop"
|
||||
msgstr "Parar"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1331
|
||||
#: crates/pdfs-gui/src/app/main.rs:1335
|
||||
msgid "Couldn't stop 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."
|
||||
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
|
||||
msgid "General"
|
||||
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
|
||||
msgid "Search 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/devices.rs:554
|
||||
#: crates/pdfs-gui/src/app/pages/shared.rs:586
|
||||
@@ -318,38 +319,38 @@ msgstr "Pesquisar no Drive"
|
||||
msgid "Refresh"
|
||||
msgstr "Atualizar"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1373
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
msgid "Keyboard shortcuts"
|
||||
msgstr "Atalhos de teclado"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1377
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
msgid "Files"
|
||||
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
|
||||
msgid "New folder"
|
||||
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
|
||||
msgid "Upload files"
|
||||
msgstr "Enviar arquivos"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1381
|
||||
#: crates/pdfs-gui/src/app/main.rs:1385
|
||||
msgid "Back / forward"
|
||||
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
|
||||
msgid "Parent folder"
|
||||
msgstr "Pasta superior"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1383
|
||||
#: crates/pdfs-gui/src/app/main.rs:1387
|
||||
msgid "Grid / list"
|
||||
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/browser.rs:1871
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:1893
|
||||
@@ -358,7 +359,7 @@ msgstr "Grade / lista"
|
||||
msgid "Rename"
|
||||
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:900
|
||||
#: crates/pdfs-gui/src/app/pages/browser.rs:932
|
||||
@@ -368,73 +369,73 @@ msgstr "Renomear"
|
||||
msgid "Move to Trash"
|
||||
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"
|
||||
msgstr "Limpar a seleção"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1392
|
||||
#: crates/pdfs-gui/src/app/main.rs:1396
|
||||
msgid "Larger thumbnails"
|
||||
msgstr "Miniaturas maiores"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1393
|
||||
#: crates/pdfs-gui/src/app/main.rs:1397
|
||||
msgid "Smaller thumbnails"
|
||||
msgstr "Miniaturas menores"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1394
|
||||
#: crates/pdfs-gui/src/app/main.rs:1398
|
||||
msgid "Reset thumbnail size"
|
||||
msgstr "Redefinir tamanho das miniaturas"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1395
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
msgid "Select all"
|
||||
msgstr "Selecionar tudo"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1399
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
msgid "Photo Viewer"
|
||||
msgstr "Visualizador de fotos"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1401
|
||||
#: crates/pdfs-gui/src/app/main.rs:1405
|
||||
msgid "Previous / next photo"
|
||||
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"
|
||||
msgstr "Primeira / última foto"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1403
|
||||
#: crates/pdfs-gui/src/app/main.rs:1407
|
||||
msgid "Show details"
|
||||
msgstr "Mostrar detalhes"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1404
|
||||
#: crates/pdfs-gui/src/app/main.rs:1408
|
||||
msgid "Fullscreen"
|
||||
msgstr "Tela cheia"
|
||||
|
||||
#: crates/pdfs-gui/src/app/main.rs:1406
|
||||
#: crates/pdfs-gui/src/app/main.rs:1410
|
||||
msgid "Close"
|
||||
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"
|
||||
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/places.rs:104
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1370
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1371
|
||||
msgid "Not connected"
|
||||
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."
|
||||
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/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…"
|
||||
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."
|
||||
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:1122
|
||||
#: 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:617
|
||||
#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:438
|
||||
@@ -1551,7 +1552,7 @@ msgid "Make available offline"
|
||||
msgstr "Disponibilizar offline"
|
||||
|
||||
#: 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"
|
||||
msgstr "Tornar somente online"
|
||||
|
||||
@@ -2708,7 +2709,7 @@ msgid "Sync paused until you resume"
|
||||
msgstr "Sincronização pausada até você retomar"
|
||||
|
||||
#: 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"
|
||||
msgstr "Sincronização pausada"
|
||||
|
||||
@@ -3177,25 +3178,25 @@ msgstr "Digite seu e-mail e senha."
|
||||
msgid "Signing in…"
|
||||
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…"
|
||||
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"
|
||||
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."
|
||||
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."
|
||||
msgstr ""
|
||||
"Não foi possível acessar o Proton. Verifique sua conexão com a internet e "
|
||||
"tente novamente."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:207
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:227
|
||||
msgid ""
|
||||
"Signed in, but the session couldn't be saved to the system keyring. Make "
|
||||
"sure a keyring (GNOME Keyring or KWallet) is running and unlocked."
|
||||
@@ -3204,11 +3205,19 @@ msgstr ""
|
||||
"Certifique-se de que um chaveiro (GNOME Keyring ou KWallet) esteja em "
|
||||
"execução e desbloqueado."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:210
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:230
|
||||
msgid "Sign-in cancelled: no two-factor code was entered."
|
||||
msgstr "Entrada cancelada: nenhum código de dois fatores foi digitado."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs: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 ""
|
||||
"Sign-in cancelled: the verification wasn't completed. Sign in again to get a "
|
||||
"new one."
|
||||
@@ -3217,35 +3226,79 @@ msgstr ""
|
||||
"receber uma nova."
|
||||
|
||||
#. 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
|
||||
msgid "Sign-in failed: {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"
|
||||
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 ""
|
||||
"Enter the code from your authenticator app, or one of your recovery codes."
|
||||
msgstr ""
|
||||
"Digite o código do seu aplicativo autenticador ou um dos seus códigos de "
|
||||
"recuperação."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:306
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:486
|
||||
msgid "Authentication code"
|
||||
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"
|
||||
msgstr "Confirmar"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:341
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:521
|
||||
msgid "Sign Out?"
|
||||
msgstr "Sair?"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:343
|
||||
#: crates/pdfs-gui/src/app/pages/login.rs:523
|
||||
msgid ""
|
||||
"Proton Drive will disconnect and stop syncing until you sign in again. Files "
|
||||
"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 "
|
||||
"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"
|
||||
msgstr "Sair"
|
||||
|
||||
@@ -4604,40 +4657,40 @@ msgid "Restart Now"
|
||||
msgstr "Reiniciar agora"
|
||||
|
||||
#. 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
|
||||
msgid "{size} used"
|
||||
msgstr "{size} usados"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:923
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:924
|
||||
#, rust-format
|
||||
msgid "{used} of {total} used ({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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Proton Drive desconectado"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:968
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:969
|
||||
msgid ""
|
||||
"The Proton Drive service stopped. Files aren't available until it restarts."
|
||||
msgstr ""
|
||||
"O serviço do Proton Drive parou. Os arquivos ficarão indisponíveis até ele "
|
||||
"reiniciar."
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1037
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1038
|
||||
msgid "Sync complete"
|
||||
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
|
||||
msgid "{n} file 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
|
||||
#. "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
|
||||
msgid "{title} — {done} of {total}"
|
||||
msgstr "{title} — {done} de {total}"
|
||||
|
||||
#. Translators: a background job's progress. {title} is the job, {detail}
|
||||
#. 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
|
||||
msgid "{title} — {detail} ({done} of {total})"
|
||||
msgstr "{title} — {detail} ({done} de {total})"
|
||||
|
||||
#. 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
|
||||
msgid "{title}…"
|
||||
msgstr "{title}…"
|
||||
|
||||
#. Translators: a background job still running. {title} is the job,
|
||||
#. {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
|
||||
msgid "{title} — {detail}…"
|
||||
msgstr "{title} — {detail}…"
|
||||
@@ -4674,7 +4727,7 @@ msgstr "{title} — {detail}…"
|
||||
#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the
|
||||
#. file name, {done} the size moved so far and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{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
|
||||
#. file name, {done} and {total} sizes and {speed} a size such as
|
||||
#. "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
|
||||
msgid "{arrow} {name} — {done} of {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
|
||||
msgid "{used} cached — no limit set"
|
||||
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
|
||||
msgid "{used} of {limit} used"
|
||||
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
|
||||
msgid "{queued} · resumes {time}"
|
||||
msgstr "{queued} · retoma {time}"
|
||||
|
||||
#. Translators: {time} is when syncing resumes, such as "at 14:30"
|
||||
#. or "Tue 09:00".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1333
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1334
|
||||
#, rust-format
|
||||
msgid "Resumes {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"
|
||||
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
|
||||
msgid "{n} change needs attention"
|
||||
msgid_plural "{n} changes need attention"
|
||||
msgstr[0] "{n} alteração requer 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
|
||||
msgctxt "state"
|
||||
msgid "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"
|
||||
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"
|
||||
msgid "Syncing"
|
||||
msgstr "Sincronizando"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1364
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1365
|
||||
msgid "Up to date"
|
||||
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
|
||||
msgid "Proton Drive isn't running"
|
||||
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"
|
||||
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"
|
||||
msgstr "O Proton Drive está demorando demais para responder"
|
||||
|
||||
#. Translators: stands in for a time that could not be read, as in
|
||||
#. "Resumes later".
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1415
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1430
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1416
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1431
|
||||
msgid "later"
|
||||
msgstr "mais tarde"
|
||||
|
||||
#. 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"
|
||||
msgstr "às %H:%M"
|
||||
|
||||
#. Translators: strftime format for a time within the next week, such as
|
||||
#. "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"
|
||||
msgstr "%a às %H:%M"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
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”."
|
||||
msgstr ""
|
||||
"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:1516
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1510
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1517
|
||||
msgid "Couldn't make it online only"
|
||||
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"
|
||||
msgstr "Mostrar menos"
|
||||
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1536
|
||||
#: crates/pdfs-gui/src/app/pages/status.rs:1537
|
||||
#, rust-format
|
||||
msgid "Show all {n} file"
|
||||
msgid_plural "Show all {n} files"
|
||||
@@ -5855,40 +5908,45 @@ msgstr[1] "↑ {n} enviando"
|
||||
msgid "Proton Drive isn't responding"
|
||||
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
|
||||
msgid "Signed in as {username} — not connected"
|
||||
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"
|
||||
msgstr "Não conectado"
|
||||
|
||||
#. Translators: {error} is an error message, in English.
|
||||
#: crates/pdfs-gui/src/main.rs:180
|
||||
#: crates/pdfs-gui/src/main.rs:189
|
||||
#, rust-format
|
||||
msgid "Error: {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"
|
||||
msgstr "O Proton Drive enviou uma resposta inesperada"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:246
|
||||
#: crates/pdfs-gui/src/main.rs:255
|
||||
#, rust-format
|
||||
msgid "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgid_plural "Up to date in {mountpoint} ({n} pinned)"
|
||||
msgstr[0] "Atualizado em {mountpoint} ({n} fixado)"
|
||||
msgstr[1] "Atualizado em {mountpoint} ({n} fixados)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:253
|
||||
#: crates/pdfs-gui/src/main.rs:262
|
||||
#, rust-format
|
||||
msgid "Syncing — {queued} ({n} pinned)"
|
||||
msgid_plural "Syncing — {queued} ({n} pinned)"
|
||||
msgstr[0] "Sincronizando — {queued} ({n} fixado)"
|
||||
msgstr[1] "Sincronizando — {queued} ({n} fixados)"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:260
|
||||
#: crates/pdfs-gui/src/main.rs:269
|
||||
#, rust-format
|
||||
msgid "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)"
|
||||
|
||||
#. 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
|
||||
msgid "Offline — {queued}"
|
||||
msgstr "Offline — {queued}"
|
||||
|
||||
#. 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
|
||||
msgid "{n} issue — View"
|
||||
msgid_plural "{n} issues — View"
|
||||
msgstr[0] "{n} problema — Ver"
|
||||
msgstr[1] "{n} problemas — Ver"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:402
|
||||
#: crates/pdfs-gui/src/main.rs:411
|
||||
msgid "Sign In…"
|
||||
msgstr "Entrar…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:403
|
||||
#: crates/pdfs-gui/src/main.rs:412
|
||||
msgid "Open Proton Drive"
|
||||
msgstr "Abrir o Proton Drive"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:409
|
||||
#: crates/pdfs-gui/src/main.rs:418
|
||||
msgid "Open Folder"
|
||||
msgstr "Abrir pasta"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:421
|
||||
#: crates/pdfs-gui/src/main.rs:430
|
||||
msgid "Resume Sync"
|
||||
msgstr "Retomar sincronização"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:423
|
||||
#: crates/pdfs-gui/src/main.rs:432
|
||||
msgid "Pause Sync"
|
||||
msgstr "Pausar sincronização"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:442
|
||||
#: crates/pdfs-gui/src/main.rs:451
|
||||
msgid "Connect"
|
||||
msgstr "Conectar"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:449
|
||||
#: crates/pdfs-gui/src/main.rs:458
|
||||
msgid "Hide Tray Icon"
|
||||
msgstr "Ocultar ícone da bandeja"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:453
|
||||
#: crates/pdfs-gui/src/main.rs:462
|
||||
msgid "Stop Proton Drive…"
|
||||
msgstr "Parar o Proton Drive…"
|
||||
|
||||
#: crates/pdfs-gui/src/main.rs:457
|
||||
#: crates/pdfs-gui/src/main.rs:466
|
||||
msgid "Quit"
|
||||
msgstr "Sair"
|
||||
|
||||
|
||||
Reference in new issue
Block a user