From 0183f17435002d206f5990be7f1478882c92ffa0 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Sat, 14 Nov 2026 02:17:18 +0100 Subject: [PATCH 1/4] feat(gui,fuse,core): video thumbnails in file views My files, Shared, Trash and the launcher now ask the daemon for video thumbnails, not only image ones. Grid tiles with a video thumbnail show a small play badge. A `.ts` file is a video from 1 MiB up and a TypeScript source below that. One rule in pdfs-core (`is_video_file_name`) decides it for the file icon, the thumbnail gate, the launcher icon and preview, and the opener's `@media` / `@text` classes. The daemon also checks the MPEG-TS sync byte before it runs ffmpeg, so a large TypeScript bundle gets no retries. A video thumbnail no longer downloads the whole file into memory (B283): - the server thumbnail is tried first, at no content cost; - files up to 24 MiB come whole; - larger ones bring a 16 MiB head, plus the MP4/MOV `moov` box when it lies past the head, into a sparse staging file that ffmpeg reads. The 256 MiB cap is gone. Without ffmpeg, a video answers "no thumbnail" at once. The folder thumbnail build includes videos. --- crates/pdfs-core/src/control.rs | 63 ++ crates/pdfs-core/src/opener.rs | 77 +- crates/pdfs-fuse/src/drive.rs | 18 +- crates/pdfs-fuse/src/photos.rs | 496 ++++++++-- crates/pdfs-fuse/src/sim/daemon.rs | 106 +++ crates/pdfs-fuse/src/sim/fake_drive.rs | 46 +- crates/pdfs-gui/src/app/pages/browser.rs | 53 +- crates/pdfs-gui/src/app/widgets/thumbnails.rs | 58 +- crates/pdfs-gui/src/hud/preview.rs | 4 +- crates/pdfs-gui/src/hud/row.rs | 23 +- crates/pdfs-gui/src/hud/thumbs.rs | 16 +- crates/pdfs-gui/src/query.rs | 2 +- docs/BUGS.md | 46 + docs/CHANGELOG.md | 14 + po/de.po | 870 ++++++++--------- po/en_GB.po | 894 +++++++++--------- po/es.po | 868 ++++++++--------- po/fr.po | 870 ++++++++--------- po/it.po | 870 ++++++++--------- po/nl.po | 870 ++++++++--------- po/pdfs.pot | 858 ++++++++--------- po/pl.po | 888 ++++++++--------- po/pt_BR.po | 868 ++++++++--------- 23 files changed, 4883 insertions(+), 3995 deletions(-) diff --git a/crates/pdfs-core/src/control.rs b/crates/pdfs-core/src/control.rs index 14a37db..4a757d5 100644 --- a/crates/pdfs-core/src/control.rs +++ b/crates/pdfs-core/src/control.rs @@ -1851,6 +1851,34 @@ pub fn is_thumbnail_image_name(name: &str) -> bool { || RAW_THUMBNAIL_EXTENSIONS.contains(&extension.as_str()) } +/// The smallest `.ts` file taken for an MPEG transport stream. `.ts` is +/// TypeScript source as often as it is a recording, and the two sit far apart +/// in size: a source file is kilobytes, while a second of broadcast video is +/// already megabytes. Drive often stores either kind as +/// `application/octet-stream`, so the size is the only signal a listing has. +pub const TS_VIDEO_MIN_BYTES: u64 = 1024 * 1024; + +/// Whether a file named `name`, of `size` bytes when the caller knows it, is a +/// video. The extension decides, except for `.ts`, which counts as video only +/// from [`TS_VIDEO_MIN_BYTES`] up. A `.ts` of unknown size counts as video, as +/// [`PhotoKind::classify`] has it. +pub fn is_video_file_name(name: &str, size: Option) -> bool { + if PhotoKind::classify(Some(name), None) != PhotoKind::Video { + return false; + } + let transport_stream = name + .rsplit_once('.') + .is_some_and(|(_, extension)| extension.eq_ignore_ascii_case("ts")); + !transport_stream || size.is_none_or(|size| size >= TS_VIDEO_MIN_BYTES) +} + +/// Whether file listings show a thumbnail for a file named `name`, of `size` +/// bytes when known: an image [`is_thumbnail_image_name`] accepts, or a video, +/// whose thumbnail is a frame the daemon takes with ffmpeg. +pub fn is_thumbnail_media_name(name: &str, size: Option) -> bool { + is_thumbnail_image_name(name) || is_video_file_name(name, size) +} + /// Whether `name` is one of the concrete RAW formats handled by the exiftool /// embedded-preview path. Deliberately excludes generic/legacy grab-bags whose /// preview availability is not dependable. @@ -2675,6 +2703,41 @@ mod tests { assert_eq!(PhotoKind::classify(Some("x.jpg"), Some("video/mp4")), Photo); } + #[test] + fn a_ts_file_is_a_video_only_at_the_size_of_one() { + const GB: u64 = 1024 * 1024 * 1024; + assert!(!is_video_file_name("app.ts", Some(3 * 1024))); + assert!(!is_video_file_name( + "bundle.TS", + Some(TS_VIDEO_MIN_BYTES - 1) + )); + assert!(is_video_file_name("recording.ts", Some(9 * GB))); + assert!(is_video_file_name("recording.TS", Some(TS_VIDEO_MIN_BYTES))); + assert!(is_video_file_name("recording.ts", None)); + // Only `.ts` is in doubt; every other video name is one at any size. + assert!(is_video_file_name("clip.mkv", Some(10))); + assert!(is_video_file_name("clip.m2ts", Some(10))); + assert!(!is_video_file_name("notes.txt", Some(9 * GB))); + assert!(!is_video_file_name("ts", Some(9 * GB))); + } + + #[test] + fn listings_thumbnail_images_and_videos() { + assert!(is_thumbnail_media_name("photo.JPG", Some(10))); + assert!(is_thumbnail_media_name("camera.nef", None)); + assert!(is_thumbnail_media_name("clip.mp4", Some(10))); + assert!(is_thumbnail_media_name( + "recording.ts", + Some(64 * 1024 * 1024) + )); + assert!(!is_thumbnail_media_name("app.ts", Some(2048))); + assert!(!is_thumbnail_media_name( + "song.flac", + Some(64 * 1024 * 1024) + )); + assert!(!is_thumbnail_media_name("notes.txt", None)); + } + /// Keep every extension accepted by the shared classifier covered. Drive /// activation uses this classification before it knows whether opening a /// file should stream through FUSE or materialise a complete cache entry; diff --git a/crates/pdfs-core/src/opener.rs b/crates/pdfs-core/src/opener.rs index 6795f86..c21d477 100644 --- a/crates/pdfs-core/src/opener.rs +++ b/crates/pdfs-core/src/opener.rs @@ -27,6 +27,7 @@ use std::os::unix::process::CommandExt; use std::path::Path; use std::process::{Command, Stdio}; +use crate::control::is_video_file_name; use serde::{Deserialize, Serialize}; /// Environment override for the terminal used by `"terminal": true` rules. @@ -108,11 +109,12 @@ impl OpenWith { /// a Markdown file). The rules are about *what the user opened*, so the /// caller passes that name and the argv still gets the real path. pub fn command_for_named(&self, path: &Path, name: &str, is_dir: bool) -> Vec { + let kind = Kind::of(path, name, is_dir); for rule in &self.rules { if rule.command.is_empty() { continue; } - if !rule.patterns.iter().any(|p| matches(p, name, is_dir)) { + if !rule.patterns.iter().any(|p| matches(p, name, kind)) { continue; } let argv = expand(&rule.command, path); @@ -325,16 +327,46 @@ fn expand_env(token: &str) -> Option { value.filter(|v| !v.is_empty()) } +/// What is being opened, as far as the `@class` patterns care. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Kind { + Dir, + Video, + File, +} + +impl Kind { + /// `.ts` names TypeScript and MPEG transport streams alike, so for that + /// one extension the size on disk decides (see + /// [`is_video_file_name`](crate::control::is_video_file_name)). No other + /// name costs a `stat`. + fn of(path: &Path, name: &str, is_dir: bool) -> Kind { + if is_dir { + return Kind::Dir; + } + let size = extension(name) + .eq_ignore_ascii_case("ts") + .then(|| std::fs::metadata(path).ok().map(|meta| meta.len())) + .flatten(); + if is_video_file_name(name, size) { + Kind::Video + } else { + Kind::File + } + } +} + /// Whether `pattern` — a glob or an `@class` — matches this name. -fn matches(pattern: &str, name: &str, is_dir: bool) -> bool { +fn matches(pattern: &str, name: &str, kind: Kind) -> bool { let name_lower = name.to_lowercase(); + let file = kind == Kind::File; match pattern.to_lowercase().as_str() { "@any" => true, - "@dir" => is_dir, - "@text" => !is_dir && class_text(&name_lower), - "@document" => !is_dir && class_document(&name_lower), - "@image" => !is_dir && class_image(&name_lower), - "@media" => !is_dir && class_media(&name_lower), + "@dir" => kind == Kind::Dir, + "@text" => file && class_text(&name_lower), + "@document" => file && class_document(&name_lower), + "@image" => file && class_image(&name_lower), + "@media" => kind == Kind::Video || (file && class_media(&name_lower)), other if other.starts_with('@') => false, other => glob_match(other, &name_lower), } @@ -533,6 +565,37 @@ mod tests { ); } + #[test] + fn a_ts_file_opens_as_media_or_text_by_its_size() { + let policy = OpenWith { + terminal: Some(vec!["alacritty".into(), "-e".into()]), + default: None, + rules: vec![ + rule(&["@text"], &["nvim"], true), + rule(&["@media"], &["mpv"], false), + ], + }; + let dir = std::env::temp_dir().join(format!("pdfs-opener-ts-{}", std::process::id())); + std::fs::create_dir_all(&dir).unwrap(); + let source = dir.join("blob-source"); + std::fs::write(&source, "export const answer = 42;\n").unwrap(); + let recording = dir.join("blob-recording"); + std::fs::File::create(&recording) + .unwrap() + .set_len(crate::control::TS_VIDEO_MIN_BYTES) + .unwrap(); + + let source_argv = policy.command_for_named(&source, "app.ts", false); + let recording_argv = policy.command_for_named(&recording, "recording.ts", false); + // A file that is not on this machine yet has no size to go by. + let unknown_argv = policy.command_for_named(&dir.join("missing"), "recording.ts", false); + std::fs::remove_dir_all(&dir).unwrap(); + + assert_eq!(source_argv[..3], ["alacritty", "-e", "nvim"]); + assert_eq!(recording_argv[0], "mpv"); + assert_eq!(unknown_argv[0], "mpv"); + } + #[test] fn an_empty_policy_is_xdg_open() { let policy = OpenWith::default(); diff --git a/crates/pdfs-fuse/src/drive.rs b/crates/pdfs-fuse/src/drive.rs index f1196ab..162c60e 100644 --- a/crates/pdfs-fuse/src/drive.rs +++ b/crates/pdfs-fuse/src/drive.rs @@ -29,7 +29,7 @@ use proton_drive_rs::proton_sdk::error::Result; use proton_drive_rs::proton_sdk::ids::{DriveEventId, NodeUid, ShareId}; use proton_drive_rs::{ AvailableNameTarget, Device, DeviceType, DriveEvent, DriveEventScopeId, Node, NodeMoveItem, - ProtonDriveClient, RevisionReader, Thumbnail, + ProtonDriveClient, RevisionReader, Thumbnail, ThumbnailType, }; /// One outcome per node of a batch request; see [`ProtonDriveClient::trash_nodes`]. @@ -118,6 +118,14 @@ pub(crate) trait DriveApi: Send + Sync { async fn open_revision(&self, uid: &NodeUid) -> Result>; + /// The file's thumbnail of `thumbnail_type`, or `None` when its revision + /// carries none. + async fn download_thumbnail( + &self, + uid: &NodeUid, + thumbnail_type: ThumbnailType, + ) -> Result>>; + async fn download_file_to_dyn( &self, uid: &NodeUid, @@ -445,6 +453,14 @@ impl DriveApi for ProtonDriveClient { Ok(Arc::new(reader)) } + async fn download_thumbnail( + &self, + uid: &NodeUid, + thumbnail_type: ThumbnailType, + ) -> Result>> { + ProtonDriveClient::download_thumbnail(self, uid, thumbnail_type).await + } + async fn download_file_to_dyn( &self, uid: &NodeUid, diff --git a/crates/pdfs-fuse/src/photos.rs b/crates/pdfs-fuse/src/photos.rs index d53198f..4e7b36b 100644 --- a/crates/pdfs-fuse/src/photos.rs +++ b/crates/pdfs-fuse/src/photos.rs @@ -9,7 +9,7 @@ use std::collections::{HashMap, HashSet}; use std::ffi::OsStr; use std::fs::OpenOptions; use std::io::{Read as _, Write as _}; -use std::os::unix::fs::OpenOptionsExt as _; +use std::os::unix::fs::{FileExt as _, OpenOptionsExt as _}; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::sync::atomic::{AtomicU64, Ordering}; @@ -20,14 +20,17 @@ use base64::Engine as _; use pdfs_core::control::{ FileThumbRequest, MappingProgress, PhotoItem, PhotoKind, PhotoLocation, PhotoThumb, PlaceInfo, ThumbnailBuildStatus, Topic, is_raw_image_name, is_thumbnail_image_name, + is_thumbnail_media_name, }; use pdfs_core::db::{self, StoredPhoto}; use pdfs_core::{CoreError, CoreResult}; +use proton_drive_rs::proton_sdk::error::Result as DriveResult; use proton_drive_rs::proton_sdk::ids::NodeUid; use proton_drive_rs::{NodeKind, PhotoTag, PhotoTagsUpdate, Thumbnail, ThumbnailType}; use tracing::{debug, info, warn}; +use super::drive::RevisionRead; use super::{ Core, PHOTOS_AVAILABLE, PHOTOS_SYNCED_MS, TIMELINE_ENRICH_CHUNK, TIMELINE_TTL, WriteAuthority, node_size, now_ms, parse_uid, @@ -58,9 +61,18 @@ const EXIFTOOL_TIMEOUT: Duration = Duration::from_secs(20); static RAW_TEMP_NONCE: AtomicU64 = AtomicU64::new(0); static EXIFTOOL_MISSING_WARNING: Once = Once::new(); static FFMPEG_MISSING_WARNING: Once = Once::new(); -/// Largest video downloaded whole to grab one frame for its thumbnail. The -/// download lands in memory, so a long 4K recording is left without one. -const VIDEO_THUMB_MAX_BYTES: u64 = 256 * 1024 * 1024; +/// How much of a video's start a thumbnail downloads. The first frame, and +/// the one a second in, sit inside it at any common bitrate. A video is never +/// downloaded whole for one frame: a recording can be many gigabytes. +const VIDEO_HEAD_BYTES: u64 = 16 * 1024 * 1024; +/// A video no larger than this is downloaded whole: its head and tail would +/// cover most of it anyway. +const VIDEO_WHOLE_MAX_BYTES: u64 = 24 * 1024 * 1024; +/// Largest MP4/MOV index (`moov` box) fetched from past the head. An hour of +/// video indexes in a few MiB; anything larger is not worth one frame. +const VIDEO_INDEX_MAX_BYTES: u64 = 32 * 1024 * 1024; +/// Top-level boxes walked looking for the index before giving up. +const VIDEO_BOX_WALK_MAX: usize = 32; /// A single frame is seconds of work even for 4K; this only stops a wedged /// ffmpeg from holding a thumbnail permit. const FFMPEG_TIMEOUT: Duration = Duration::from_secs(30); @@ -245,8 +257,8 @@ struct RawPreviewUnavailable; /// the photo will never have a thumbnail, and only that verdict is persisted. enum ThumbAttempt { Made(GeneratedThumb), - /// Decoded nothing — a format this build has no decoder for, or a video - /// too large to fetch for one frame. Permanent. + /// Decoded nothing: a format this build has no decoder for, a video + /// ffmpeg takes no frame from, or a `.ts` that is not one. Permanent. Undecodable, /// The photo couldn't be downloaded. Transient: try again next time. Unavailable, @@ -577,21 +589,6 @@ fn warn_ffmpeg_missing() { }); } -/// A thumbnail from one frame of a downloaded video, which ffmpeg reads from a -/// staging copy. See [`video_file_thumbnail`]. -fn video_thumbnail( - bytes: &[u8], - name: &str, - staging_dir: &Path, - ffmpeg: &OsStr, - timeout: Duration, -) -> ScaleAttempt { - let Some(file) = RawTempFile::create_in(staging_dir, bytes, name) else { - return ScaleAttempt::Unavailable; - }; - video_file_thumbnail(&file.0, ffmpeg, timeout) -} - /// A thumbnail from one frame of the video at `path`. A second in, past the /// black lead-in most clips open on, and the first frame for a clip shorter than /// that. ffmpeg applies the clip's rotation, so a portrait phone video comes out @@ -624,6 +621,151 @@ fn video_file_thumbnail(path: &Path, ffmpeg: &OsStr, timeout: Duration) -> Scale ScaleAttempt::Undecodable } +/// What a thumbnail is made from. +enum Fetched { + /// The thumbnail itself, from the server. + Ready(Vec), + /// Nothing: a video with no server thumbnail, and no ffmpeg to take one. + Nothing, + /// A whole image. + Whole(Vec), + Video(VideoSample), +} + +/// The parts of a video its thumbnail needs, downloaded: the start of the +/// file, and for an MP4 or MOV whose index is further in, that index. +struct VideoSample { + /// The whole file's length. + size: u64, + head: Vec, + /// The `moov` box and its offset, when it is not inside `head`. + index: Option<(u64, Vec)>, +} + +impl VideoSample { + /// Whether this could be an MPEG transport stream: one opens on the 0x47 + /// sync byte, and repeats it every 188-byte packet. Only asked of `.ts` + /// files, which are TypeScript source as often as they are video. + fn is_transport_stream(&self) -> bool { + self.head.first() == Some(&0x47) && self.head.get(188).is_none_or(|&byte| byte == 0x47) + } +} + +/// Download what a thumbnail of the video `reader` reads needs. A file of up +/// to [`VIDEO_WHOLE_MAX_BYTES`] comes whole. A larger one brings its first +/// [`VIDEO_HEAD_BYTES`], which is all a stream format (Matroska, WebM, MPEG-TS, +/// AVI) needs for a frame, plus the index of an ISO media file (MP4, MOV, 3GP) +/// written with its index after the media data, which is how most cameras and +/// phones write it. +async fn sample_video(reader: &dyn RevisionRead) -> DriveResult { + let size = reader.size(); + if size <= VIDEO_WHOLE_MAX_BYTES { + let head = reader.read_at(0, size).await?; + return Ok(VideoSample { + size, + head, + index: None, + }); + } + let head = reader.read_at(0, VIDEO_HEAD_BYTES).await?; + let index = match iso_media_index(reader, &head, size).await? { + Some((offset, len)) if offset.saturating_add(len) > head.len() as u64 => { + Some((offset, reader.read_at(offset, len).await?)) + } + _ => None, + }; + Ok(VideoSample { size, head, index }) +} + +/// Where the `moov` box of an ISO media file sits, as `(offset, length)`. +/// `None` for a file that is not one, or whose index is missing, oversized or +/// past [`VIDEO_BOX_WALK_MAX`] boxes. Box headers past `head` are read one at a +/// time, 16 bytes each. +async fn iso_media_index( + reader: &dyn RevisionRead, + head: &[u8], + size: u64, +) -> DriveResult> { + const FIRST_BOXES: [&[u8; 4]; 6] = [b"ftyp", b"moov", b"mdat", b"wide", b"free", b"skip"]; + if !head + .get(4..8) + .is_some_and(|kind| FIRST_BOXES.iter().any(|known| kind == *known)) + { + return Ok(None); + } + let mut offset = 0u64; + for _ in 0..VIDEO_BOX_WALK_MAX { + if offset.saturating_add(8) > size { + break; + } + let header = match usize::try_from(offset) + .ok() + .and_then(|start| head.get(start..start.checked_add(16)?)) + { + Some(header) => header.to_vec(), + None => reader.read_at(offset, 16).await?, + }; + let Some((kind, len)) = iso_box_header(&header, size - offset) else { + break; + }; + if kind == *b"moov" { + return Ok((len <= VIDEO_INDEX_MAX_BYTES).then_some((offset, len))); + } + offset = offset.saturating_add(len); + } + Ok(None) +} + +/// The type and length of the ISO box whose header starts `header`, of a box +/// that may run at most `left` bytes to the end of the file. +fn iso_box_header(header: &[u8], left: u64) -> Option<([u8; 4], u64)> { + let size = u32::from_be_bytes(header.get(0..4)?.try_into().ok()?); + let kind: [u8; 4] = header.get(4..8)?.try_into().ok()?; + let len = match size { + // Runs to the end of the file. + 0 => left, + // The real length follows as 64 bits. + 1 => u64::from_be_bytes(header.get(8..16)?.try_into().ok()?), + len => u64::from(len), + }; + (8..=left).contains(&len).then_some((kind, len)) +} + +/// A thumbnail from one frame of a downloaded [`VideoSample`]. The sample is +/// laid out in a staging file at the offsets it came from, so ffmpeg finds an +/// index where the file's own boxes say it is. The gap between holds no data +/// and costs no disk. +fn video_sample_thumbnail( + sample: &VideoSample, + name: &str, + staging_dir: &Path, + ffmpeg: &OsStr, + timeout: Duration, +) -> ScaleAttempt { + let transport_stream_name = Path::new(name) + .extension() + .is_some_and(|extension| extension.eq_ignore_ascii_case("ts")); + if transport_stream_name && !sample.is_transport_stream() { + return ScaleAttempt::Undecodable; + } + let Some(file) = RawTempFile::create_in(staging_dir, &sample.head, name) else { + return ScaleAttempt::Unavailable; + }; + if let Some((offset, index)) = &sample.index { + let laid_out = OpenOptions::new() + .write(true) + .open(&file.0) + .and_then(|staged| { + staged.write_all_at(index, *offset)?; + staged.set_len(sample.size.max(offset + index.len() as u64)) + }); + if laid_out.is_err() { + return ScaleAttempt::Unavailable; + } + } + video_file_thumbnail(&file.0, ffmpeg, timeout) +} + /// The thumbnail to attach to an upload of the local file at `path`, which is /// named `name` in Drive. Without one, Drive's own apps show a generic icon and /// the gallery has to download the whole file to make its own. @@ -1406,10 +1548,10 @@ impl Core { .map(|item| (item.uid.clone(), item.name.clone())) .collect(); - // Proton only stores server-generated thumbnails for nodes in Photos. - // These requests come exclusively from ordinary Drive, Shared and Trash - // views, so downloading a remote thumbnail here would be a guaranteed - // miss. Generate directly from the full image and cache the result. + // Drive makes no thumbnails itself; a file has one only when its + // uploader attached it, as this client and Proton's apps do. The + // generation step asks for that first, and only makes one from the + // file's content without it. let mut wanted = Vec::new(); let mut seen = HashSet::new(); for (raw, uid, modified) in &parsed { @@ -1560,7 +1702,10 @@ impl Core { return (uid, ThumbAttempt::Cancelled); } let video = is_video_name(&name); - if video && !ffmpeg_available() { + // Without ffmpeg a video can still have its uploader's + // thumbnail, but Photos has asked the server already. + let can_sample = !video || ffmpeg_available(); + if !can_sample && matches!(job, ThumbJob::Photos) { return (uid, ThumbAttempt::Unavailable); } @@ -1609,21 +1754,34 @@ impl Core { return (uid, ThumbAttempt::Cancelled); } - // A video is downloaded whole for one frame, so a long - // recording is not worth it — and would not fit in memory. - if video { - match core.photos().get_node(&uid).await { - Ok(Some(node)) if node_size(&node) > VIDEO_THUMB_MAX_BYTES => { - info!(%uid, size = node_size(&node), "video too large for a local thumbnail"); - return (uid, ThumbAttempt::Undecodable); - } - Ok(Some(_)) => {} - Ok(None) | Err(_) => return (uid, ThumbAttempt::Unavailable), - } - } - let download_uid = uid.clone(); - let download = async move { client.download_file(&download_uid).await }; + let drive = core.drive.clone(); + let download = async move { + // Photos asked the server in one batch already. A + // file view's or a build's file may carry a + // thumbnail its uploader made, which costs one + // small download instead of its content. + if !matches!(job, ThumbJob::Photos) + && let Some(bytes) = drive + .download_thumbnail(&download_uid, ThumbnailType::Thumbnail) + .await? + .filter(|bytes| !bytes.is_empty()) + { + return Ok(Fetched::Ready(bytes)); + } + if !can_sample { + return Ok(Fetched::Nothing); + } + if video { + let reader = drive.open_revision(&download_uid).await?; + sample_video(reader.as_ref()).await.map(Fetched::Video) + } else { + client + .download_file(&download_uid) + .await + .map(Fetched::Whole) + } + }; tokio::pin!(download); let downloaded = match job { ThumbJob::Files(_) => loop { @@ -1661,10 +1819,10 @@ impl Core { let Some(downloaded) = downloaded else { return (uid, ThumbAttempt::Cancelled); }; - let bytes = match downloaded { - Ok(bytes) => bytes, + let fetched = match downloaded { + Ok(fetched) => fetched, Err(e) => { - warn!(%uid, error = %e, "image download for thumbnail failed"); + warn!(%uid, error = %e, "download for a thumbnail failed"); return (uid, ThumbAttempt::Unavailable); } }; @@ -1674,18 +1832,20 @@ impl Core { // Decoding + scaling a 20 MP JPEG is CPU-bound and would // stall the runtime's worker; hand it to the blocking pool. let staging_dir = core.cache.raw_thumbnail_staging_dir().to_path_buf(); - let made = tokio::task::spawn_blocking(move || { - if video { - video_thumbnail( - &bytes, - &name, - &staging_dir, - OsStr::new("ffmpeg"), - FFMPEG_TIMEOUT, - ) - } else { - scale_thumbnail(&bytes, &name, &staging_dir) - } + let made = tokio::task::spawn_blocking(move || match fetched { + Fetched::Video(sample) => video_sample_thumbnail( + &sample, + &name, + &staging_dir, + OsStr::new("ffmpeg"), + FFMPEG_TIMEOUT, + ), + Fetched::Whole(bytes) => scale_thumbnail(&bytes, &name, &staging_dir), + Fetched::Nothing => ScaleAttempt::Unavailable, + Fetched::Ready(bytes) => match ratio_of(&bytes) { + Some(ratio) => ScaleAttempt::Made(GeneratedThumb { bytes, ratio }), + None => ScaleAttempt::Undecodable, + }, }) .await .unwrap_or(ScaleAttempt::Unavailable); @@ -1869,7 +2029,7 @@ impl Core { if seen_folders.insert(entry.uid) { folders.push(folder.join(entry.name)); } - } else if is_thumbnail_image_name(&entry.name) { + } else if is_thumbnail_media_name(&entry.name, Some(entry.size)) { match parse_uid(&entry.uid) { Some(uid) if seen_images.insert(uid.clone()) => { found_here += 1; @@ -2295,15 +2455,19 @@ mod decode_budget_tests { mod thumb_tests { use super::{ RawTempFile, ScaleAttempt, THUMB_EDGE, UPLOAD_IMAGE_MAX_BYTES, UPLOAD_THUMB_MAX_BYTES, - can_make_thumbnail, exiftool_binary, ffmpeg_available, fit_upload_thumb, is_video_name, - ratio_of, scale_thumbnail, scale_thumbnail_with_exiftool, similar_hashes, - thumbnail_build_may_start, upload_thumbnails_with, video_thumbnail, + VIDEO_HEAD_BYTES, VIDEO_WHOLE_MAX_BYTES, VideoSample, can_make_thumbnail, exiftool_binary, + ffmpeg_available, fit_upload_thumb, is_video_name, ratio_of, sample_video, scale_thumbnail, + scale_thumbnail_with_exiftool, similar_hashes, thumbnail_build_may_start, + upload_thumbnails_with, video_sample_thumbnail, }; + use crate::drive::RevisionRead; use pdfs_core::control::{ThumbnailBuildStatus, is_thumbnail_image_name}; use proton_drive_rs::ThumbnailType; + use proton_drive_rs::proton_sdk::error::Result as DriveResult; use std::collections::HashMap; use std::ffi::OsStr; use std::os::unix::fs::PermissionsExt as _; + use std::sync::atomic::{AtomicU64, Ordering}; use std::time::Duration; /// A `width`×`height` JPEG, standing in for a camera photo the server never @@ -2536,6 +2700,199 @@ mod thumb_tests { std::env::temp_dir().join(format!("pdfs-{test}-{}", std::process::id())) } + /// A sample of a video small enough to come whole. + fn whole(bytes: &[u8]) -> VideoSample { + VideoSample { + size: bytes.len() as u64, + head: bytes.to_vec(), + index: None, + } + } + + fn block_on(future: F) -> F::Output { + tokio::runtime::Builder::new_current_thread() + .build() + .unwrap() + .block_on(future) + } + + /// A Drive revision of `size` bytes, zero except for the parts written in, + /// that counts the bytes read from it. Stands for a recording far larger + /// than a test should hold in memory. + struct FakeRevision { + size: u64, + parts: Vec<(u64, Vec)>, + read: AtomicU64, + } + + impl FakeRevision { + fn new(size: u64) -> Self { + Self { + size, + parts: Vec::new(), + read: AtomicU64::new(0), + } + } + + fn with(mut self, offset: u64, bytes: Vec) -> Self { + self.parts.push((offset, bytes)); + self + } + } + + #[async_trait::async_trait] + impl RevisionRead for FakeRevision { + fn size(&self) -> u64 { + self.size + } + + fn block_sizes(&self) -> &[u64] { + &[] + } + + async fn read_at(&self, offset: u64, length: u64) -> DriveResult> { + let end = offset.saturating_add(length).min(self.size); + let mut out = vec![0u8; end.saturating_sub(offset) as usize]; + for (start, bytes) in &self.parts { + let part_end = start + bytes.len() as u64; + let (from, to) = (offset.max(*start), end.min(part_end)); + if from < to { + out[(from - offset) as usize..(to - offset) as usize] + .copy_from_slice(&bytes[(from - start) as usize..(to - start) as usize]); + } + } + self.read.fetch_add(out.len() as u64, Ordering::Relaxed); + Ok(out) + } + } + + /// An ISO media box of `len` bytes, of which only the header is returned. + fn iso_box_header(kind: &[u8; 4], len: u64) -> Vec { + if let Ok(len) = u32::try_from(len) { + [&len.to_be_bytes()[..], kind].concat() + } else { + [&1u32.to_be_bytes()[..], kind, &len.to_be_bytes()[..]].concat() + } + } + + const GIB: u64 = 1024 * 1024 * 1024; + + #[test] + fn a_large_stream_video_downloads_its_head_alone() { + let mut head = vec![0u8; 188 * 2]; + head[0] = 0x47; + head[188] = 0x47; + let revision = FakeRevision::new(9 * GIB).with(0, head); + let sample = block_on(sample_video(&revision)).unwrap(); + assert_eq!(sample.size, 9 * GIB); + assert_eq!(sample.head.len() as u64, VIDEO_HEAD_BYTES); + assert!(sample.index.is_none()); + assert!(sample.is_transport_stream()); + assert_eq!(revision.read.load(Ordering::Relaxed), VIDEO_HEAD_BYTES); + } + + /// A camera MP4 keeps its index after gigabytes of media data. The sample + /// is the head, the box headers on the way, and the index itself. + #[test] + fn a_large_mp4_downloads_its_head_and_its_index() { + let ftyp = [ + iso_box_header(b"ftyp", 24), + b"isom\0\0\0\0mp41isom".to_vec(), + ] + .concat(); + let mdat_len = 6 * GIB; + let moov_at = ftyp.len() as u64 + mdat_len; + let moov = [iso_box_header(b"moov", 4096), vec![7u8; 4088]].concat(); + let size = moov_at + moov.len() as u64; + let revision = FakeRevision::new(size) + .with(0, ftyp.clone()) + .with(ftyp.len() as u64, iso_box_header(b"mdat", mdat_len)) + .with(moov_at, moov.clone()); + + let sample = block_on(sample_video(&revision)).unwrap(); + assert_eq!(sample.index, Some((moov_at, moov))); + assert!( + revision.read.load(Ordering::Relaxed) <= VIDEO_HEAD_BYTES + 4096 + 16, + "read {} bytes", + revision.read.load(Ordering::Relaxed) + ); + } + + #[test] + fn an_mp4_with_its_index_up_front_downloads_its_head_alone() { + let ftyp = [iso_box_header(b"ftyp", 16), b"isom\0\0\0\0".to_vec()].concat(); + let moov = [iso_box_header(b"moov", 64), vec![1u8; 56]].concat(); + let revision = FakeRevision::new(GIB) + .with(0, ftyp.clone()) + .with(ftyp.len() as u64, moov) + .with(80, iso_box_header(b"mdat", GIB - 80)); + let sample = block_on(sample_video(&revision)).unwrap(); + assert!(sample.index.is_none()); + assert_eq!(revision.read.load(Ordering::Relaxed), VIDEO_HEAD_BYTES); + } + + #[test] + fn a_small_video_downloads_whole() { + let revision = FakeRevision::new(VIDEO_WHOLE_MAX_BYTES).with(0, vec![3u8; 64]); + let sample = block_on(sample_video(&revision)).unwrap(); + assert_eq!(sample.head.len() as u64, VIDEO_WHOLE_MAX_BYTES); + assert!(sample.index.is_none()); + } + + /// `.ts` that is TypeScript reaches ffmpeg never: the sync byte is missing, + /// and that is a final answer, not a retry. + #[test] + fn a_ts_without_the_sync_byte_is_no_video() { + let attempt = video_sample_thumbnail( + &whole(b"export const answer = 42;"), + "bundle.ts", + &std::env::temp_dir(), + OsStr::new("pdfs-ffmpeg-deliberately-absent"), + Duration::from_millis(10), + ); + assert!(matches!(attempt, ScaleAttempt::Undecodable)); + } + + /// ffmpeg reads the index where the file's own boxes put it, so the staging + /// file has the full length and the index at its offset. + #[test] + fn the_index_is_staged_at_its_own_offset() { + let tmp = scratch("video-index"); + let frame = tmp.join("frame.jpg"); + std::fs::create_dir_all(&tmp).unwrap(); + std::fs::write(&frame, jpeg(640, 360)).unwrap(); + let size: u64 = 3 * GIB; + let at: u64 = size - 4096; + // Arguments: -nostdin -loglevel error -ss -i … + let ffmpeg = fake_ffmpeg( + &tmp, + &format!( + "[ \"$(stat -c %s \"$7\")\" = {size} ] && \ + [ \"$(tail -c +{} \"$7\" | head -c 4)\" = moov ] && cat '{}'", + // The box type, after its 4-byte length; `tail` counts from 1. + at + 5, + frame.display() + ), + ); + let sample = VideoSample { + size, + head: vec![0u8; 1024], + index: Some(( + at, + [iso_box_header(b"moov", 4096), vec![0u8; 4088]].concat(), + )), + }; + let attempt = video_sample_thumbnail( + &sample, + "clip.mp4", + &tmp, + ffmpeg.as_os_str(), + Duration::from_secs(10), + ); + std::fs::remove_dir_all(&tmp).unwrap(); + assert!(matches!(attempt, ScaleAttempt::Made(_))); + } + #[test] fn a_video_frame_becomes_a_thumbnail() { let tmp = scratch("video-frame"); @@ -2544,8 +2901,8 @@ mod thumb_tests { std::fs::write(&frame, jpeg(1080, 1920)).unwrap(); let ffmpeg = fake_ffmpeg(&tmp, &format!("cat '{}'", frame.display())); - let ScaleAttempt::Made(thumb) = video_thumbnail( - b"video bytes", + let ScaleAttempt::Made(thumb) = video_sample_thumbnail( + &whole(b"video bytes"), "clip.mp4", &tmp, ffmpeg.as_os_str(), @@ -2561,8 +2918,8 @@ mod thumb_tests { fn a_video_ffmpeg_cannot_read_is_a_permanent_miss() { let tmp = scratch("video-broken"); let ffmpeg = fake_ffmpeg(&tmp, "exit 1"); - let attempt = video_thumbnail( - b"not a video", + let attempt = video_sample_thumbnail( + &whole(b"not a video"), "clip.mp4", &tmp, ffmpeg.as_os_str(), @@ -2574,8 +2931,8 @@ mod thumb_tests { #[test] fn missing_ffmpeg_is_retryable() { - let attempt = video_thumbnail( - b"video bytes", + let attempt = video_sample_thumbnail( + &whole(b"video bytes"), "clip.mp4", &std::env::temp_dir(), OsStr::new("pdfs-ffmpeg-deliberately-absent"), @@ -2591,9 +2948,12 @@ mod thumb_tests { let path = std::env::var_os("PDFS_VIDEO_FIXTURE").expect("PDFS_VIDEO_FIXTURE"); let path = std::path::PathBuf::from(path); let name = path.file_name().unwrap().to_string_lossy(); - let bytes = std::fs::read(&path).unwrap(); - let ScaleAttempt::Made(thumb) = video_thumbnail( - &bytes, + // Through the same partial download a Drive video gets. + let revision = FakeRevision::new(std::fs::read(&path).unwrap().len() as u64) + .with(0, std::fs::read(&path).unwrap()); + let sample = block_on(sample_video(&revision)).unwrap(); + let ScaleAttempt::Made(thumb) = video_sample_thumbnail( + &sample, &name, &std::env::temp_dir(), OsStr::new("ffmpeg"), diff --git a/crates/pdfs-fuse/src/sim/daemon.rs b/crates/pdfs-fuse/src/sim/daemon.rs index d1f2d41..4e33268 100644 --- a/crates/pdfs-fuse/src/sim/daemon.rs +++ b/crates/pdfs-fuse/src/sim/daemon.rs @@ -3619,4 +3619,110 @@ mod tests { assert!(matches!(daemon.stop(), Ok(MountOutcome::Shutdown))); let _ = std::fs::remove_dir_all(&dir); } + + /// A video in My files gets a thumbnail from a frame of its own, but a + /// recording can be gigabytes: only its start, and an MP4's index, are + /// downloaded for it. A video with a thumbnail from its uploader is not + /// downloaded at all, and a `.ts` that is TypeScript gets no thumbnail. + #[test] + #[ignore = "mounts FUSE: run with `cargo test -p pdfs-fuse sim:: -- --ignored`"] + fn a_video_thumbnail_downloads_a_small_part_of_the_video() { + if std::process::Command::new("ffmpeg") + .arg("-version") + .output() + .is_err() + { + eprintln!("skipped: needs ffmpeg"); + return; + } + let dir = scratch("video-thumbs"); + std::fs::create_dir_all(&dir).unwrap(); + // Twenty seconds at 30 Mbit/s: larger than a thumbnail downloads whole. + // An MP4 written this way has its index at the end. + let encode = |name: &str| { + let path = dir.join(name); + let status = std::process::Command::new("ffmpeg") + .args(["-nostdin", "-loglevel", "error", "-y", "-f", "lavfi"]) + .args(["-i", "testsrc2=size=1280x720:rate=30", "-t", "20"]) + .args(["-c:v", "libx264", "-preset", "ultrafast"]) + .args(["-b:v", "30M", "-maxrate", "30M", "-bufsize", "30M"]) + .arg(&path) + .status() + .unwrap(); + assert!(status.success()); + let bytes = std::fs::read(&path).unwrap(); + std::fs::remove_file(&path).unwrap(); + assert!(bytes.len() > 30 << 20, "{name} is {} bytes", bytes.len()); + bytes + }; + let (recording, clip) = (encode("recording.ts"), encode("clip.mp4")); + let source = b"export const answer = 42;\n".repeat(64 * 1024); + + let drive = FakeDrive::new(); + drive.device().write("recording.ts", &recording); + drive.device().write("clip.mp4", &clip); + drive.device().write("app.ts", &source); + let phone = drive.device().write("phone.mp4", &clip); + let mut frame = Vec::new(); + image::codecs::jpeg::JpegEncoder::new(&mut frame) + .encode_image(&image::RgbImage::new(320, 180)) + .unwrap(); + let client = drive.client(1, Faults::lan()); + client.set_thumbnail(&phone, frame); + let daemon = Daemon::start(&dir.join("daemon"), client.clone()).unwrap(); + let Ok(Response::Entries { entries }) = daemon.request(&Request::ListDir { + path: String::new(), + }) else { + panic!("listing"); + }; + let items: Vec = entries + .iter() + .filter(|entry| !entry.is_dir) + .map(|entry| control::FileThumbRequest { + uid: entry.uid.clone(), + modified: entry.modified, + name: entry.name.clone(), + }) + .collect(); + let Ok(Response::FileThumbGeneration { generation }) = + daemon.request(&Request::ReserveFileThumbGeneration) + else { + panic!("generation"); + }; + let read_before = client.content_read(); + + let mut paths = std::collections::HashMap::new(); + let settled = wait_until(Duration::from_secs(120), || { + let Ok(Response::Thumbs { items: replies }) = daemon.request(&Request::FileThumbs { + items: items.clone(), + generation, + }) else { + return false; + }; + paths = replies + .iter() + .filter_map(|reply| { + let name = &items.iter().find(|item| item.uid == reply.uid)?.name; + Some((name.clone(), (reply.path.clone(), reply.pending))) + }) + .collect(); + paths.values().all(|(_, pending)| !pending) && paths.len() == 4 + }); + assert!(settled, "{paths:?}"); + let read = client.content_read() - read_before; + + for name in ["recording.ts", "clip.mp4", "phone.mp4"] { + assert!(paths[name].0.is_some(), "{name} has a thumbnail: {paths:?}"); + } + assert_eq!(paths["app.ts"].0, None, "TypeScript is no video"); + // Two 16 MiB heads, one MP4 index and the TypeScript file, and nothing + // of the video that came with a thumbnail. + assert!( + read < 34 << 20, + "downloaded {} MiB for three thumbnails", + read >> 20 + ); + assert!(matches!(daemon.stop(), Ok(MountOutcome::Shutdown))); + let _ = std::fs::remove_dir_all(&dir); + } } diff --git a/crates/pdfs-fuse/src/sim/fake_drive.rs b/crates/pdfs-fuse/src/sim/fake_drive.rs index cbfc18e..a9869e8 100644 --- a/crates/pdfs-fuse/src/sim/fake_drive.rs +++ b/crates/pdfs-fuse/src/sim/fake_drive.rs @@ -62,7 +62,7 @@ use proton_drive_rs::proton_sdk::ids::{ }; use proton_drive_rs::{ AvailableNameTarget, Device as Computer, DeviceType, DriveEvent, DriveEventScopeId, Node, - NodeKind, NodeMoveItem, RevisionState, Thumbnail, + NodeKind, NodeMoveItem, RevisionState, Thumbnail, ThumbnailType, }; use sha1::{Digest as _, Sha1}; @@ -396,6 +396,8 @@ impl FakeDrive { hold_answer: Mutex::new(None), hold_trash: Mutex::new(None), hold_download: Mutex::new(None), + thumbnails: Mutex::new(HashMap::new()), + content_read: AtomicU64::new(0), hold_any_landing: AtomicBool::new(false), hold_landing: Mutex::new(None), drop_after_create: AtomicBool::new(false), @@ -677,6 +679,10 @@ struct ClientInner { hold_trash: Mutex>>, /// The download [`FakeClient::hold_next_download`] is waiting for. hold_download: Mutex>>, + /// Thumbnails set by [`FakeClient::set_thumbnail`]. + thumbnails: Mutex>>, + /// File content bytes served, by downloads and ranged reads alike. + content_read: AtomicU64, /// The landing [`FakeClient::hold_next_landing`] is waiting for. hold_landing: Mutex>>, /// Set by [`FakeClient::hold_next_landing_of_any`]: hold whichever node @@ -821,6 +827,16 @@ impl FakeClient { /// Hold the next download of `uid`'s content once Drive has answered it, /// before the bytes reach the daemon, until the answer is dropped. + /// Give `uid` a server thumbnail, as an upload that carried one would. + pub(crate) fn set_thumbnail(&self, uid: &NodeUid, bytes: Vec) { + self.0.thumbnails.lock().insert(uid.clone(), bytes); + } + + /// File content bytes served so far, by whole downloads and ranged reads. + pub(crate) fn content_read(&self) -> u64 { + self.0.content_read.load(Ordering::SeqCst) + } + pub(crate) fn hold_next_download(&self, uid: &NodeUid) -> Held { let state = Arc::new(HoldState { uid: uid.clone(), @@ -1475,6 +1491,21 @@ impl DriveApi for FakeClient { })) } + async fn download_thumbnail( + &self, + uid: &NodeUid, + _thumbnail_type: ThumbnailType, + ) -> Result>> { + self.request(false, |server| { + server + .current(uid) + .map(|_| ()) + .ok_or_else(|| api(ResponseCode::DoesNotExist, "file not found")) + }) + .await?; + Ok(self.0.thumbnails.lock().get(uid).cloned()) + } + async fn download_file_to_dyn( &self, uid: &NodeUid, @@ -1490,6 +1521,9 @@ impl DriveApi for FakeClient { .await?; self.wait_if_held(&self.0.hold_download, std::slice::from_ref(uid)) .await; + self.0 + .content_read + .fetch_add(content.len() as u64, Ordering::SeqCst); output.write_all(&content).map_err(io_error) } @@ -1733,13 +1767,19 @@ impl RevisionRead for FakeRevision { async fn read_at(&self, offset: u64, length: u64) -> Result> { let content = self.content.clone(); - self.client + let read = self + .client .request(false, move |_| { let start = (offset as usize).min(content.len()); let end = (offset.saturating_add(length) as usize).min(content.len()); Ok(content[start..end].to_vec()) }) - .await + .await?; + self.client + .0 + .content_read + .fetch_add(read.len() as u64, Ordering::SeqCst); + Ok(read) } } diff --git a/crates/pdfs-gui/src/app/pages/browser.rs b/crates/pdfs-gui/src/app/pages/browser.rs index b24130e..59ded50 100644 --- a/crates/pdfs-gui/src/app/pages/browser.rs +++ b/crates/pdfs-gui/src/app/pages/browser.rs @@ -1728,8 +1728,9 @@ fn repaint_thumbnail_build(ui: &Rc, status: &ThumbnailBuildStatus) { let text = if status.scanning { ui.browser.thumbnail_progress.pulse(); let folders = ngettext_f("{n} folder", "{n} folders", status.folders_scanned, &[]); - let images = ngettext_f("{n} image", "{n} images", status.images_found, &[]); - // Translators: {root} is a folder path or "Proton Drive"; {folders} and {images} are counts such as "3 folders" and "12 images". + // Translators: a count of images and videos that can have a thumbnail. + let images = ngettext_f("{n} file", "{n} files", status.images_found, &[]); + // Translators: {root} is a folder path or "Proton Drive"; {folders} and {images} are counts such as "3 folders" and "12 files". gettext_f( "Scanning {root}… {folders}, {images}", &[("root", root), ("folders", &folders), ("images", &images)], @@ -1743,7 +1744,7 @@ fn repaint_thumbnail_build(ui: &Rc, status: &ThumbnailBuildStatus) { ui.browser .thumbnail_progress .set_fraction(fraction.clamp(0.0, 1.0)); - // Translators: {root} is a folder path or "Proton Drive"; {done} and {total} are image counts. + // Translators: {root} is a folder path or "Proton Drive"; {done} and {total} are counts of images and videos. gettext_f( "Building thumbnails in {root}… {done} of {total}", &[ @@ -1756,17 +1757,17 @@ fn repaint_thumbnail_build(ui: &Rc, status: &ThumbnailBuildStatus) { ui.browser.thumbnail_progress.set_fraction(1.0); let available = status.completed.saturating_sub(status.failed); match status.failed { - // Translators: {root} is a folder path or "Proton Drive". + // Translators: {root} is a folder path or "Proton Drive"; {n} counts images and videos. 0 => ngettext_f( - "Thumbnails ready for {n} image in {root}", - "Thumbnails ready for {n} images in {root}", + "Thumbnails ready for {n} file in {root}", + "Thumbnails ready for {n} files in {root}", available, &[("root", root)], ), - // Translators: {root} is a folder path or "Proton Drive"; {failed} is how many images could not get a thumbnail. + // Translators: {root} is a folder path or "Proton Drive"; {failed} is how many images and videos could not get a thumbnail. failed => ngettext_f( - "Thumbnails ready for {n} image in {root}; {failed} unavailable", - "Thumbnails ready for {n} images in {root}; {failed} unavailable", + "Thumbnails ready for {n} file in {root}; {failed} unavailable", + "Thumbnails ready for {n} files in {root}; {failed} unavailable", available, &[("root", root), ("failed", &failed.to_string())], ), @@ -2765,6 +2766,11 @@ pub(crate) fn icon_base_for(entry: &DirEntry) -> &'static str { if entry.is_dir { return "folder"; } + // Every video type, including a `.ts` recording, which by its name alone + // is TypeScript. + if pdfs_core::control::is_video_file_name(&entry.name, Some(entry.size)) { + return "video-x-generic"; + } let ext = entry .name .rsplit('.') @@ -2775,7 +2781,6 @@ pub(crate) fn icon_base_for(entry: &DirEntry) -> &'static str { "png" | "jpg" | "jpeg" | "gif" | "webp" | "bmp" | "svg" | "heic" | "tiff" => { "image-x-generic" } - "mp4" | "mkv" | "mov" | "avi" | "webm" | "m4v" => "video-x-generic", "mp3" | "flac" | "wav" | "ogg" | "opus" | "m4a" => "audio-x-generic", "pdf" | "doc" | "docx" | "odt" => "x-office-document", "xls" | "xlsx" | "ods" | "csv" => "x-office-spreadsheet", @@ -3122,7 +3127,7 @@ fn listing_summary(files: usize, folders: usize, file_bytes: u64) -> String { #[cfg(test)] mod tests { use super::{ - MoveTarget, badge_for, copy_target_allowed, hit_location, listing_summary, + MoveTarget, badge_for, copy_target_allowed, hit_location, icon_base_for, listing_summary, move_target_allowed, show_thumbnail_build_progress, sort_entries, }; use pdfs_core::config::{FileSort, FilesView}; @@ -3149,6 +3154,32 @@ mod tests { } } + #[test] + fn every_video_type_gets_the_video_icon() { + const MIB: u64 = 1024 * 1024; + for name in [ + "clip.mp4", + "clip.MKV", + "broadcast.m2ts", + "camera.mts", + "old.flv", + ] { + assert_eq!( + icon_base_for(&entry(name, false, 10, 0)), + "video-x-generic", + "{name}" + ); + } + assert_eq!( + icon_base_for(&entry("recording.ts", false, 900 * MIB, 0)), + "video-x-generic" + ); + assert_eq!( + icon_base_for(&entry("app.ts", false, 4096, 0)), + "text-x-generic" + ); + } + fn names(entries: &[DirEntry]) -> Vec<&str> { entries.iter().map(|e| e.name.as_str()).collect() } diff --git a/crates/pdfs-gui/src/app/widgets/thumbnails.rs b/crates/pdfs-gui/src/app/widgets/thumbnails.rs index d874940..ad9abd4 100644 --- a/crates/pdfs-gui/src/app/widgets/thumbnails.rs +++ b/crates/pdfs-gui/src/app/widgets/thumbnails.rs @@ -1,4 +1,4 @@ -//! Shared thumbnails for ordinary Drive image files. +//! Shared thumbnails for ordinary Drive image and video files. //! //! The Photos gallery has timeline-specific batching and aspect-ratio state. //! File listings need a smaller, reusable surface: one loader backs My files, @@ -6,7 +6,7 @@ //! so a replaced image never flashes its previous contents. use crate::*; -use pdfs_core::control::{FileThumbRequest, is_thumbnail_image_name}; +use pdfs_core::control::{FileThumbRequest, is_thumbnail_media_name, is_video_file_name}; const THUMB_BATCH: usize = 32; const THUMB_CACHE_MAX: usize = 256; @@ -125,6 +125,18 @@ pub(crate) fn file_thumbnail_widget(size: i32, fallback_size: i32) -> gtk4::Over .build(); picture.add_css_class("file-thumbnail"); + // Over a video's frame, so it does not pass for a photo. + let play = gtk4::Image::builder() + .icon_name("media-playback-start-symbolic") + .pixel_size(16) + .halign(gtk4::Align::Center) + .valign(gtk4::Align::Center) + .can_target(false) + .visible(false) + .build(); + play.add_css_class("photo-video-badge"); + play.add_css_class("photo-video-badge-small"); + let overlay = gtk4::Overlay::new(); overlay.set_width_request(size); overlay.set_height_request(size); @@ -133,9 +145,21 @@ pub(crate) fn file_thumbnail_widget(size: i32, fallback_size: i32) -> gtk4::Over overlay.set_overflow(gtk4::Overflow::Hidden); overlay.set_child(Some(&fallback)); overlay.add_overlay(&picture); + overlay.add_overlay(&play); overlay } +/// The play badge [`file_thumbnail_widget`] puts after `picture`. +fn play_badge(picture: >k4::Picture) -> Option { + picture + .next_sibling() + .and_downcast::() + .filter(|image| image.has_css_class("photo-video-badge")) +} + +/// Marks a play badge to show once its video's frame is painted. +const VIDEO_BADGE: &str = "video"; + /// Resize an existing thumbnail surface. Grid rows are recycled, so changing /// these requests in place and rebinding the model is enough to implement the /// status-bar zoom without downloading or decoding an image again. @@ -179,6 +203,16 @@ pub(crate) fn bind_file_thumbnail( fallback.set_visible(true); picture.set_visible(false); picture.set_paintable(gtk4::gdk::Paintable::NONE); + // List rows are too small for a badge; their icon says video already. + let video = !entry.is_dir && is_video_file_name(&entry.name, Some(entry.size)); + if let Some(play) = play_badge(&picture) { + play.set_visible(false); + play.set_widget_name(if video && !symbolic_fallback { + VIDEO_BADGE + } else { + "" + }); + } // The widget name is a cheap binding token. List factories recycle their // children; a reply for the previous entry must not paint into the new one. @@ -186,7 +220,10 @@ pub(crate) fn bind_file_thumbnail( picture.set_widget_name(&key); remove_waiter(ui, &picture); - if entry.is_dir || !is_image_name(&entry.name) || entry.uid.is_empty() { + if entry.is_dir + || !is_thumbnail_media_name(&entry.name, Some(entry.size)) + || entry.uid.is_empty() + { return; } if let Some(texture) = ui.file_thumbs.textures.borrow().get(&key) { @@ -214,12 +251,6 @@ pub(crate) fn bind_file_thumbnail( schedule_file_thumbs(ui); } -/// Whether the file name denotes an image format for which Proton or the local -/// decoder can reasonably provide a thumbnail. -pub(crate) fn is_image_name(name: &str) -> bool { - is_thumbnail_image_name(name) -} - fn thumbnail_key(uid: &str, modified: i64) -> String { format!("{uid}:{modified}") } @@ -238,6 +269,9 @@ fn paint(picture: >k4::Picture, key: &str, texture: >k4::gdk::Texture) { } picture.set_paintable(Some(texture)); picture.set_visible(true); + if let Some(play) = play_badge(picture) { + play.set_visible(play.widget_name() == VIDEO_BADGE); + } if let Some(overlay) = picture.parent().and_downcast::() && let Some(fallback) = overlay.child().and_downcast::() { @@ -413,7 +447,11 @@ fn retry_file_thumbs(ui: &Rc, items: Vec) { #[cfg(test)] mod tests { - use super::{ReplyDisposition, is_image_name, reply_disposition}; + use super::{ReplyDisposition, reply_disposition}; + + fn is_image_name(name: &str) -> bool { + pdfs_core::control::is_thumbnail_image_name(name) + } #[test] fn image_extensions_are_case_insensitive_and_specific() { diff --git a/crates/pdfs-gui/src/hud/preview.rs b/crates/pdfs-gui/src/hud/preview.rs index 7314dad..e14677a 100644 --- a/crates/pdfs-gui/src/hud/preview.rs +++ b/crates/pdfs-gui/src/hud/preview.rs @@ -10,7 +10,7 @@ use std::time::Duration; use adw::prelude::*; use gtk4::{gio, glib}; -use super::row::{fill_slot, thumb_slot}; +use super::row::{content_type_for, fill_slot, thumb_slot}; use super::thumbs::Thumbs; use crate::{Hit, dates, gettext, human_bytes, pgettext}; @@ -235,7 +235,7 @@ impl Preview { let content_type = if hit.is_dir() { glib::GString::from("inode/directory") } else { - gio::functions::content_type_guess(Some(hit.name()), None).0 + content_type_for(hit.name(), hit.size()) }; self.kind .set_label(&gio::functions::content_type_get_description(&content_type)); diff --git a/crates/pdfs-gui/src/hud/row.rs b/crates/pdfs-gui/src/hud/row.rs index 719d64a..e1c26dd 100644 --- a/crates/pdfs-gui/src/hud/row.rs +++ b/crates/pdfs-gui/src/hud/row.rs @@ -6,7 +6,7 @@ use std::path::{Path, PathBuf}; use std::rc::Rc; use adw::prelude::*; -use gtk4::{gdk, gio}; +use gtk4::{gdk, gio, glib}; use super::highlight; use super::thumbs::Thumbs; @@ -53,7 +53,7 @@ pub(crate) fn fill_slot(slot: >k4::Overlay, hit: &Hit, thumbs: &Rc, mo let Some(picture) = fallback.next_sibling().and_downcast::() else { return; }; - fallback.set_from_gicon(&icon_for(hit.name(), hit.is_dir())); + fallback.set_from_gicon(&icon_for(hit.name(), hit.is_dir(), hit.size())); fallback.set_visible(true); picture.set_visible(false); picture.set_paintable(gdk::Paintable::NONE); @@ -63,7 +63,7 @@ pub(crate) fn fill_slot(slot: >k4::Overlay, hit: &Hit, thumbs: &Rc, mo /// The desktop's own full-colour icon for a file name, so results look like /// the user's file manager. Folders are Proton's purple ones while the Proton /// theme is on, as in the app's browser. -pub(crate) fn icon_for(name: &str, is_dir: bool) -> gio::Icon { +pub(crate) fn icon_for(name: &str, is_dir: bool, size: u64) -> gio::Icon { if is_dir { let folder = if proton_theme_active() { "pdfs-proton-folder" @@ -72,8 +72,21 @@ pub(crate) fn icon_for(name: &str, is_dir: bool) -> gio::Icon { }; return gio::ThemedIcon::new(folder).upcast(); } - let (content_type, _uncertain) = gio::functions::content_type_guess(Some(name), None); - gio::functions::content_type_get_icon(&content_type) + gio::functions::content_type_get_icon(&content_type_for(name, size)) +} + +/// The content type of a file named `name` of `size` bytes, guessed from the +/// name. GIO takes every `.ts` for TypeScript (or Qt translations); a +/// recording's size says otherwise (see +/// [`is_video_file_name`](pdfs_core::control::is_video_file_name)). +pub(crate) fn content_type_for(name: &str, size: u64) -> glib::GString { + let transport_stream = std::path::Path::new(name) + .extension() + .is_some_and(|extension| extension.eq_ignore_ascii_case("ts")); + if transport_stream && pdfs_core::control::is_video_file_name(name, Some(size)) { + return glib::GString::from("video/mp2t"); + } + gio::functions::content_type_guess(Some(name), None).0 } /// The sync badge of a Drive file, as in the app's browser: pinned, cached, diff --git a/crates/pdfs-gui/src/hud/thumbs.rs b/crates/pdfs-gui/src/hud/thumbs.rs index 1e66df4..93bcbe1 100644 --- a/crates/pdfs-gui/src/hud/thumbs.rs +++ b/crates/pdfs-gui/src/hud/thumbs.rs @@ -9,8 +9,8 @@ //! matches the file's; //! 2. for local images, decoding the file itself, and writing the result back //! to that cache for the next time and for every other application; -//! 3. for Drive images, the daemon's `FileThumbs`, batched after a short quiet -//! period. +//! 3. for Drive images and videos, the daemon's `FileThumbs`, batched after a +//! short quiet period. //! //! Workers hand back `gdk::Texture`s, never a `Pixbuf`, which may not cross //! threads. Each job carries the render epoch it was queued in, and workers @@ -30,7 +30,9 @@ use gtk4::gdk_pixbuf::Pixbuf; use gtk4::prelude::*; use gtk4::{gdk, glib}; -use pdfs_core::control::{FileThumbRequest, Request, Response, is_thumbnail_image_name}; +use pdfs_core::control::{ + FileThumbRequest, Request, Response, is_thumbnail_image_name, is_thumbnail_media_name, +}; use crate::{Hit, spawn_request}; @@ -165,7 +167,13 @@ impl Thumbs { // The widget name binds the picture to one key: a late reply for // another hit must not paint into it. picture.set_widget_name(&key); - if hit.is_dir() || !is_thumbnail_image_name(hit.name()) { + // A video's frame comes from the daemon, which has ffmpeg's help; a + // local video has only what another application cached. + let thumbnailed = match hit { + Hit::Drive(drive) => is_thumbnail_media_name(&drive.name, Some(drive.size)), + Hit::Local(_) => is_thumbnail_image_name(hit.name()), + }; + if hit.is_dir() || !thumbnailed { return; } if matches!(hit, Hit::Drive(drive) if drive.uid.is_empty()) { diff --git a/crates/pdfs-gui/src/query.rs b/crates/pdfs-gui/src/query.rs index e91e85a..5e6696e 100644 --- a/crates/pdfs-gui/src/query.rs +++ b/crates/pdfs-gui/src/query.rs @@ -94,7 +94,7 @@ pub(crate) fn icon_name(hit: &Hit) -> String { let name = hit.name(); if is_image(name) { "image-x-generic" - } else if is_media(name) { + } else if is_media(name) || pdfs_core::control::is_video_file_name(name, Some(hit.size())) { "video-x-generic" } else if is_document(name) { "text-x-generic" diff --git a/docs/BUGS.md b/docs/BUGS.md index 9b2155e..2338590 100644 --- a/docs/BUGS.md +++ b/docs/BUGS.md @@ -109,6 +109,7 @@ a live account since. | Entry | Title | |---|---| +| [B283](#b283--videos-have-no-thumbnail-outside-photos-and-a-ts-recording-looks-like-source-code) | Videos have no thumbnail outside Photos, and a `.ts` recording looks like source code | | [B280](#b280--uploading-a-batch-of-large-photos-swaps-the-machine-until-the-daemon-is-killed) | Uploading a batch of large photos swaps the machine until the daemon is killed | | [B279](#b279--after-a-watchdog-kill-the-mount-never-comes-back) | After a watchdog kill the mount never comes back | | [B278](#b278--sync-list-and-devices-list-show-the-last-sync-as-epoch-seconds) | `sync list` and `devices list` show the last sync as epoch seconds | @@ -383,6 +384,51 @@ a live account since. Newest first. +### B283 — Videos have no thumbnail outside Photos, and a `.ts` recording looks like source code + +**Status:** Fixed, not verified live +**Found:** 2026-11-14, from a user report: large `.ts` video recordings in My files showed a text +icon, and no video in My files had a thumbnail although the same videos had one in Photos. +**Where:** `is_video_file_name` in `crates/pdfs-core/src/control.rs`; `generate_thumbs` and +`sample_video` in `crates/pdfs-fuse/src/photos.rs`; `bind_file_thumbnail` in +`crates/pdfs-gui/src/app/widgets/thumbnails.rs` + +**Repro:** Put an `.mp4` and a recorded `.ts` of a few GB in My files and open the folder in the +app's grid view. Both show a generic icon, and the `.ts` shows a text one. + +**Cause.** Four things: +- File views asked the daemon for thumbnails of images only (`is_thumbnail_image_name`), so a + video was never asked for. +- `.ts` is TypeScript as often as it is an MPEG transport stream. Drive stores both as + `application/octet-stream`, and every place that names a file's type went by the extension: + the browser's icon list had no `.ts`, GIO guesses text, and the opener's `@text` class listed + `.ts`. +- The daemon downloaded a video whole into memory for one frame, so it refused anything over + 256 MiB, and the size check behind that refusal asked the Photos client, which knows nothing + of a My files node. +- `file_thumbs` never asked for the thumbnail an uploader attached, on the belief that only + Photos nodes have one. This client attaches one to every upload it can make one for. + +**Fix.** `is_video_file_name(name, size)` is the one rule: a video extension, and for `.ts` a +size of at least 1 MiB. The browser icon, the thumbnail gate, the launcher's icon and type, and +the opener's classes use it. For a file view, the daemon first asks Drive for the file's own +thumbnail. Without one, a video of up to 24 MiB is downloaded whole. A larger one brings its first +16 MiB, and for an MP4 or MOV whose `moov` box lies further in, the box headers on the way and +that box. The parts are laid out at their offsets in a sparse staging file, which ffmpeg reads. +A `.ts` whose head lacks the 0x47 sync byte is recorded as having no thumbnail. + +**Test:** `a_ts_file_is_a_video_only_at_the_size_of_one` and +`listings_thumbnail_images_and_videos` in `crates/pdfs-core/src/control.rs`; +`a_ts_file_opens_as_media_or_text_by_its_size` in `crates/pdfs-core/src/opener.rs`; +`a_large_mp4_downloads_its_head_and_its_index` and the other `sample_video` tests in +`crates/pdfs-fuse/src/photos.rs`; the simulation +`a_video_thumbnail_downloads_a_small_part_of_the_video`, which reads under 34 MiB for two +videos of over 70 MiB and takes nothing from a video with an uploader's thumbnail. +`real_video_fixture_yields_a_frame` passed on 2026-11-14 with ffmpeg 9.0 for a 46 MB MP4 with its +index at the end, an MPEG-TS and an MKV. + +--- + ### B280 — Uploading a batch of large photos swaps the machine until the daemon is killed **Status:** Fixed, not verified live diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 9d3637e..9a10662 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -32,6 +32,20 @@ Existing folders remain device backups; older builds cannot open the upgraded da My files folder. The first sync preserves one-sided files and differing versions (#67). Attachments stay in mirror mode, are excluded from device profiles, and cannot delete the remote root when syncing is stopped. +- **Video thumbnails in My files, Shared, Trash and the launcher**, as in Photos, with a play + badge in the grid. A video's thumbnail is the one its uploader attached when it has one. + Otherwise the daemon takes a frame with ffmpeg from the start of the file, plus an MP4's + index, and never downloads more than about 16 MiB of a video for it, however large the + video is. **Build Thumbnails** covers videos too (B283). + +### Fixed + +- Large `.ts` recordings (MPEG transport streams) show and open as videos: the video icon, a + thumbnail, and the `@media` open rule rather than `@text`. A `.ts` of 1 MiB or more counts + as a video, a smaller one stays TypeScript source, and the daemon checks the stream's sync + byte before it takes a frame (B283). +- A video over 256 MiB never got a thumbnail, and a smaller one was downloaded whole into + memory for one frame (B283). ## [3.7.0] — 2026-11-02 diff --git a/po/de.po b/po/de.po index bf0a2c0..1fd9f3c 100644 --- a/po/de.po +++ b/po/de.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: German\n" @@ -62,9 +62,9 @@ msgstr "%A, %-d. %B %Y, %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -246,21 +246,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -338,7 +338,7 @@ msgid "Back / forward" msgstr "Zurück / Vor" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Übergeordneter Ordner" @@ -348,9 +348,9 @@ msgstr "Raster / Liste" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Umbenennen" @@ -569,9 +569,9 @@ msgstr "Ansichtsoptionen" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -592,8 +592,8 @@ msgid "Couldn't read activity" msgstr "Aktivität konnte nicht gelesen werden" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -744,7 +744,7 @@ msgid "Couldn't add a sync folder" msgstr "Synchronisierungsordner konnte nicht hinzugefügt werden" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "Ordner konnten nicht wiederhergestellt werden" @@ -1333,24 +1333,24 @@ msgstr "Alben konnten nicht geladen werden" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1402,7 +1402,7 @@ msgid "Album name" msgstr "Albumname" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Erstellen" @@ -1529,7 +1529,7 @@ msgid "Forward (Alt+Right)" msgstr "Vor (Alt+Rechts)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "Neuer Ordner" @@ -1622,7 +1622,7 @@ msgid "Cancel thumbnail build" msgstr "Erstellen der Vorschaubilder abbrechen" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Nur diesen Ordner durchsuchen" @@ -1678,10 +1678,10 @@ msgstr "Verschieben in den Papierkorb fehlgeschlagen" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1945,293 +1945,16 @@ msgstr "" "Der Proton-Drive-Dienst meldet keinen Fortschritt der Vorschaubilder mehr." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "{n} Ordner" msgstr[1] "{n} Ordner" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} Bild" -msgstr[1] "{n} Bilder" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "{root} wird durchsucht … {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Vorschaubilder in {root} werden erstellt … {done} von {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Vorschaubilder für {n} Bild in {root} bereit" -msgstr[1] "Vorschaubilder für {n} Bilder in {root} bereit" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "" -"Vorschaubilder für {n} Bild in {root} bereit; {failed} nicht verfügbar" -msgstr[1] "" -"Vorschaubilder für {n} Bilder in {root} bereit; {failed} nicht verfügbar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "Neuer Name" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Umbenannt in „{name}“" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "Umbenennen fehlgeschlagen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "„{name}“ verschieben" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Den Zielordner auswählen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Hierher verschieben" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "{n} Element verschieben" -msgstr[1] "{n} Elemente verschieben" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "„{name}“ kopieren" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Den Zielordner für die Kopie auswählen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Hierher kopieren" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "{n} Element kopieren" -msgstr[1] "{n} Elemente kopieren" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Speicherorte" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "Dieser Ordner konnte nicht gelesen werden." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "Hier gibt es keine Ordner." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "Verschieben fehlgeschlagen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "{n} Element nach {place} verschoben, aber nicht alle" -msgstr[1] "{n} Elemente nach {place} verschoben, aber nicht alle" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Nach {place} verschoben" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "{n} Element nach {place} verschoben" -msgstr[1] "{n} Elemente nach {place} verschoben" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "Kopieren fehlgeschlagen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "{n} Element nach {place} kopiert, aber nicht alle" -msgstr[1] "{n} Elemente nach {place} kopiert, aber nicht alle" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Nach {place} kopiert" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "{n} Element nach {place} kopiert" -msgstr[1] "{n} Elemente nach {place} kopiert" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "„{name}“" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Einen Ordner im aktuellen Verzeichnis erstellen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Ordnername" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "„{name}“ erstellt" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "Ordner konnte nicht erstellt werden" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Dateien hochladen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Ordner hochladen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "Hochladen fehlgeschlagen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Wird hochgeladen …" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "{n} Element wird hochgeladen …" -msgstr[1] "{n} Elemente werden hochgeladen …" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "Anzeigen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Nach „{name}“ verschoben" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Dieser Ordner wird gelesen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Ordner nicht verfügbar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "Dieser Ordner konnte nicht geöffnet werden" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "Dieser Ordner ist leer" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" -"Dateien hierher ziehen oder zum Einstieg eine Datei hochladen oder einen " -"Ordner erstellen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Überall suchen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Suche läuft …" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Suche nach „{query}“." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary} – das erste Suchergebnis wird angezeigt" -msgstr[1] "{summary} – die ersten {n} Suchergebnisse werden angezeigt" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary} – Suchergebnisse" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "Keine Treffer" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "Keine Dateien oder Ordner entsprechen dieser Suche." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2239,17 +1962,287 @@ msgid_plural "{n} files" msgstr[0] "{n} Datei" msgstr[1] "{n} Dateien" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "{root} wird durchsucht … {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Vorschaubilder in {root} werden erstellt … {done} von {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Vorschaubilder für {n} Datei in {root} bereit" +msgstr[1] "Vorschaubilder für {n} Dateien in {root} bereit" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Vorschaubilder für {n} Datei in {root} bereit; {failed} nicht verfügbar" +msgstr[1] "Vorschaubilder für {n} Dateien in {root} bereit; {failed} nicht verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "Neuer Name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Umbenannt in „{name}“" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "Umbenennen fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "„{name}“ verschieben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Den Zielordner auswählen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Hierher verschieben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "{n} Element verschieben" +msgstr[1] "{n} Elemente verschieben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "„{name}“ kopieren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Den Zielordner für die Kopie auswählen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Hierher kopieren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "{n} Element kopieren" +msgstr[1] "{n} Elemente kopieren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Speicherorte" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "Dieser Ordner konnte nicht gelesen werden." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "Hier gibt es keine Ordner." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "Verschieben fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} Element nach {place} verschoben, aber nicht alle" +msgstr[1] "{n} Elemente nach {place} verschoben, aber nicht alle" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Nach {place} verschoben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} Element nach {place} verschoben" +msgstr[1] "{n} Elemente nach {place} verschoben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "Kopieren fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "{n} Element nach {place} kopiert, aber nicht alle" +msgstr[1] "{n} Elemente nach {place} kopiert, aber nicht alle" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Nach {place} kopiert" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "{n} Element nach {place} kopiert" +msgstr[1] "{n} Elemente nach {place} kopiert" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "„{name}“" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Einen Ordner im aktuellen Verzeichnis erstellen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Ordnername" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "„{name}“ erstellt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "Ordner konnte nicht erstellt werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Dateien hochladen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Ordner hochladen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "Hochladen fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Wird hochgeladen …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "{n} Element wird hochgeladen …" +msgstr[1] "{n} Elemente werden hochgeladen …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "Anzeigen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Nach „{name}“ verschoben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Dieser Ordner wird gelesen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Ordner nicht verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "Dieser Ordner konnte nicht geöffnet werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "Dieser Ordner ist leer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Dateien hierher ziehen oder zum Einstieg eine Datei hochladen oder einen " +"Ordner erstellen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Überall suchen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Suche läuft …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Suche nach „{query}“." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} – das erste Suchergebnis wird angezeigt" +msgstr[1] "{summary} – die ersten {n} Suchergebnisse werden angezeigt" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} – Suchergebnisse" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "Keine Treffer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "Keine Dateien oder Ordner entsprechen dieser Suche." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2330,98 +2323,98 @@ msgstr "{platform} · letzte Sicherung {time}" msgid "{platform} · no backups yet" msgstr "{platform} · noch keine Sicherungen" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "Noch keine Ordner gesichert" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "{n} Ordner gesichert" msgstr[1] "{n} Ordner gesichert" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "{folders} · {n} wartet auf die erste Synchronisierung" msgstr[1] "{folders} · {n} warten auf die erste Synchronisierung" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "{folders} · {n} erfordert Aufmerksamkeit" msgstr[1] "{folders} · {n} erfordern Aufmerksamkeit" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "wird synchronisiert …" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "Synchronisierungsfehler" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "erfordert Aufmerksamkeit" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "wartet auf erste Synchronisierung" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "aktuell" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "wird auf Änderungen geprüft …" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "wird auf Änderungen geprüft – {n} Element geprüft" msgstr[1] "wird auf Änderungen geprüft – {n} Elemente geprüft" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "wird auf Änderungen geprüft – {done} von {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "{done} von {total} wird synchronisiert" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "{file} wird synchronisiert – {done} von {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Ordner zur Synchronisierung hinzufügen" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Ordner wird synchronisiert …" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "Ordner konnte nicht hinzugefügt werden" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "Wiederherstellbare Ordner konnten nicht aufgelistet werden" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2429,19 +2422,19 @@ msgstr "" "Die Ordner ankreuzen, die mit diesem Rechner synchronisiert werden sollen, " "und für jeden den Speicherort anpassen." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Ordner wiederherstellen" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Wiederherstellen" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Ordner werden wiederhergestellt …" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2450,37 +2443,44 @@ msgstr "" "Diese Ordner werden von „{name}“ gesichert. Wiederhergestellte Ordner werden " "weiterhin mit der Kopie dieses Computers synchronisiert." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "Diese Ordner werden in Proton Drive unter diesem Computer gesichert." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" "Nichts wiederherzustellen – alle Ordner von „{name}“ werden bereits hier " "synchronisiert." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" "Nichts wiederherzustellen – alle Ordner dieses Computers werden bereits hier " "synchronisiert." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "Ordner wird auf „Nur online“ umgestellt" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "Ordner wird heruntergeladen und bleibt synchronisiert" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "Modus konnte nicht geändert werden" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "Synchronisierung von „{path}“ beenden? Die lokalen Dateien und der Ordner in Meine Dateien bleiben erhalten." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2498,7 +2498,7 @@ msgstr "" "Ordner auf „Synchronisiert“ umstellen und vor dem Entfernen warten, bis der " "Download abgeschlossen ist." -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2512,68 +2512,68 @@ msgstr "" "mehr synchronisiert. Es kann zusätzlich ausgewählt werden, die Kopie in " "Proton Drive zu löschen." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "Synchronisierung des Ordners beenden?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Auch aus Proton Drive löschen" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Löscht die einzige Kopie dieser Dateien." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "Die lokale Kopie bleibt unverändert." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Synchronisierung beenden" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "Synchronisierung des Ordners beendet" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "Synchronisierung des Ordners konnte nicht beendet werden" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Computer umbenennen" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "„{name}“ umbenennen." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "Der Computer konnte nicht umbenannt werden" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "Ein Name ist erforderlich." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Computer umbenannt" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Zur Bestätigung „{name}“ eingeben" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "Computer entfernen?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2588,26 +2588,26 @@ msgstr "" "gelöscht. Die Dateien auf dem Computer selbst bleiben unberührt – dies kann " "jedoch von hier aus nicht rückgängig gemacht werden." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Entfernen" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Computer entfernt" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "Der Computer konnte nicht entfernt werden" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "Diese Sicherung hier fortsetzen?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2626,25 +2626,25 @@ msgstr "" "werden nicht verschoben. Mit „Auf diesem Computer wiederherstellen“ lässt " "sich danach zurückholen, was „{name}“ synchronisiert hat." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Hier fortsetzen" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Sicherung jetzt als „{name}“" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "Diese Sicherung konnte hier nicht fortgesetzt werden" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "Mit diesem Computer synchronisieren?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2661,25 +2661,25 @@ msgstr "" "„{name}“. Bereits hier synchronisierte Ordner bleiben, wo sie sind. Als " "Nächstes wählen Sie, welche seiner Ordner hier synchronisiert werden." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Hier synchronisieren" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Jetzt synchron mit „{name}“" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "Synchronisierung mit diesem Computer nicht möglich" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "Sicherung auf diesen Computer verschieben?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2696,12 +2696,12 @@ msgstr "" "verschwinden." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Sicherung von „{name}“ verschoben" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "Diese Sicherung konnte nicht verschoben werden" @@ -3293,59 +3293,59 @@ msgstr "In Dateien öffnen" msgid "Change Location…" msgstr "Ort ändern …" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "" "Auswählen, ob dieser Ordner eine vollständige Kopie auf diesem Computer " "behält" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Jede Datei auf diesem Computer und in Proton Drive behalten." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "" "Dateien in Proton Drive behalten und jede erst beim Öffnen herunterladen." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "Nur online" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Synchronisiert" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Jetzt synchronisieren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Synchronisierung fortsetzen" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Synchronisierung pausieren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Neu synchronisieren …" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Synchronisierung beenden …" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "Neu synchronisieren?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3357,20 +3357,20 @@ msgstr "" "Datei, die nur auf einer Seite liegt, wird auf die andere kopiert, und von " "einer Datei, die sich unterscheidet, bleiben beide Versionen erhalten." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Neu synchronisieren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "Der Ordner konnte nicht neu synchronisiert werden" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "Ordner auf „Nur online“ umstellen?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3379,11 +3379,11 @@ msgstr "" "Dateien in {path} werden von diesem Computer entfernt und nur in Proton " "Drive behalten. Jede Datei wird beim Öffnen erneut heruntergeladen." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Nur online verfügbar machen" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3392,62 +3392,66 @@ msgstr "" "Jede Datei in {path} wird auf diesen Computer heruntergeladen und bleibt " "synchronisiert. Auf diesem Datenträger sind {free} frei." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" "Jede Datei in {path} wird auf diesen Computer heruntergeladen und bleibt " "synchronisiert." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "Ordner herunterladen?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Herunterladen" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "Der Ordner konnte nicht pausiert werden" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "Der Ordner konnte nicht fortgesetzt werden" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Ordner pausiert" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Ordner fortgesetzt" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "Synchronisieren fehlgeschlagen" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Geteilter Ordner" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "Spiegel von Meine Dateien" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Wird auf „Nur online“ umgestellt" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Wird auf synchronisiert umgestellt" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "pausiert" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "nicht verfügbar" @@ -6657,6 +6661,12 @@ msgstr "{count} J." msgid "cannot reach the Proton Drive daemon: {error}" msgstr "Proton-Drive-Hintergrunddienst nicht erreichbar: {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} Bild" +#~ msgstr[1] "{n} Bilder" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " diff --git a/po/en_GB.po b/po/en_GB.po index 214a015..3ca356b 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\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" @@ -62,9 +62,9 @@ msgstr "%A %-d %B %Y, %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -242,21 +242,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -334,7 +334,7 @@ msgid "Back / forward" msgstr "Back / forward" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Parent folder" @@ -344,9 +344,9 @@ msgstr "Grid / list" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Rename" @@ -562,9 +562,9 @@ msgstr "View Options" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -585,8 +585,8 @@ msgid "Couldn't read activity" msgstr "Couldn't read activity" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -735,7 +735,7 @@ msgid "Couldn't add a sync folder" msgstr "Couldn't add a sync folder" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "Couldn't restore folders" @@ -1320,24 +1320,24 @@ msgstr "Couldn't load albums" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1389,7 +1389,7 @@ msgid "Album name" msgstr "Album name" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Create" @@ -1516,7 +1516,7 @@ msgid "Forward (Alt+Right)" msgstr "Forward (Alt+Right)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "New Folder" @@ -1609,7 +1609,7 @@ msgid "Cancel thumbnail build" msgstr "Cancel thumbnail build" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Search this folder only" @@ -1665,10 +1665,10 @@ msgstr "Couldn't move to Trash" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1927,289 +1927,16 @@ msgid "The Proton Drive service stopped reporting thumbnail progress." msgstr "The Proton Drive service stopped reporting thumbnail progress." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "{n} folder" msgstr[1] "{n} folders" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} image" -msgstr[1] "{n} images" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "Scanning {root}… {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Building thumbnails in {root}… {done} of {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Thumbnails ready for {n} image in {root}" -msgstr[1] "Thumbnails ready for {n} images in {root}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgstr[1] "Thumbnails ready for {n} images in {root}; {failed} unavailable" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "New name" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Renamed to “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "Couldn't rename" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "Move “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Choose the folder to move into." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Move Here" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "Move {n} item" -msgstr[1] "Move {n} items" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "Copy “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Choose the folder to copy into." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Copy Here" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "Copy {n} item" -msgstr[1] "Copy {n} items" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Locations" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "Couldn't read this folder." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "No folders here." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "Couldn't move" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "Moved {n} item to {place}, but not all" -msgstr[1] "Moved {n} items to {place}, but not all" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Moved to {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "Moved {n} item to {place}" -msgstr[1] "Moved {n} items to {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "Couldn't copy" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "Copied {n} item to {place}, but not all" -msgstr[1] "Copied {n} items to {place}, but not all" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Copied to {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "Copied {n} item to {place}" -msgstr[1] "Copied {n} items to {place}" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "“{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Create a folder in the current directory." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Folder name" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "Created “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "Couldn't create folder" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Upload Files" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Upload Folder" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "Couldn't upload" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Uploading…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "Uploading {n} item…" -msgstr[1] "Uploading {n} items…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "View" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Moved into “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Reading this folder." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Folder unavailable" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "Couldn't open this folder" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "This folder is empty" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "Drop files here, or upload a file or create a folder to get started." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Search everywhere" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Searching…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Looking for “{query}”." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary} — showing the first {n} search result" -msgstr[1] "{summary} — showing the first {n} search results" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary} — search results" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "No matches" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "No files or folders match that search." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2217,17 +1944,285 @@ msgid_plural "{n} files" msgstr[0] "{n} file" msgstr[1] "{n} files" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Scanning {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Building thumbnails in {root}… {done} of {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Thumbnails ready for {n} file in {root}" +msgstr[1] "Thumbnails ready for {n} files in {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgstr[1] "Thumbnails ready for {n} files in {root}; {failed} unavailable" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "New name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renamed to “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "Couldn't rename" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "Move “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Choose the folder to move into." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Move Here" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Move {n} item" +msgstr[1] "Move {n} items" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "Copy “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Choose the folder to copy into." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Copy Here" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "Copy {n} item" +msgstr[1] "Copy {n} items" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Locations" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "Couldn't read this folder." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "No folders here." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "Couldn't move" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "Moved {n} item to {place}, but not all" +msgstr[1] "Moved {n} items to {place}, but not all" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Moved to {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "Moved {n} item to {place}" +msgstr[1] "Moved {n} items to {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "Couldn't copy" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "Copied {n} item to {place}, but not all" +msgstr[1] "Copied {n} items to {place}, but not all" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Copied to {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "Copied {n} item to {place}" +msgstr[1] "Copied {n} items to {place}" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Create a folder in the current directory." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Folder name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "Created “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "Couldn't create folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Upload Files" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Upload Folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "Couldn't upload" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Uploading…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Uploading {n} item…" +msgstr[1] "Uploading {n} items…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "View" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Moved into “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Reading this folder." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Folder unavailable" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "Couldn't open this folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "This folder is empty" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "Drop files here, or upload a file or create a folder to get started." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Search everywhere" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Searching…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Looking for “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — showing the first {n} search result" +msgstr[1] "{summary} — showing the first {n} search results" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — search results" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "No matches" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "No files or folders match that search." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2306,98 +2301,98 @@ msgstr "{platform} · last backup {time}" msgid "{platform} · no backups yet" msgstr "{platform} · no backups yet" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "No folders backed up yet" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "{n} folder backed up" msgstr[1] "{n} folders backed up" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "{folders} · {n} waiting for its first sync" msgstr[1] "{folders} · {n} waiting for their first sync" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "{folders} · {n} needs attention" msgstr[1] "{folders} · {n} need attention" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "syncing…" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "sync error" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "needs attention" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "waiting for first sync" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "up to date" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "checking for changes…" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "checking for changes — {n} item checked" msgstr[1] "checking for changes — {n} items checked" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "checking for changes — {done} of {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "syncing {done} of {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "syncing {file} — {done} of {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Add Folder to Sync" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Syncing folder…" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "Couldn't add folder" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "Couldn't list folders to restore" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2405,19 +2400,19 @@ msgstr "" "Tick the folders to sync to this machine, and adjust where each one should " "live." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Restore Folders" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Restore" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Restoring folders…" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2426,52 +2421,59 @@ msgstr "" "These folders are backed up from “{name}”. Restored folders keep syncing " "with that computer's copy." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "These folders are backed up under this computer in Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "Nothing to restore — “{name}”'s folders are all synced here." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "Nothing to restore — this computer's folders are all synced here." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "Folder will switch to online only" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "Folder will download and stay synced" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "Couldn't change mode" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 -#, rust-format -msgid "" -"Stop syncing “{path}”?\n" -"\n" -"This folder is online only: its files live in Proton Drive, not on this " -"disk, so the folder will be empty once it stops syncing. To keep a local " -"copy, cancel, switch the folder to Synced, and wait for the download to " -"finish before removing it." -msgstr "" -"Stop syncing “{path}”?\n" -"\n" -"This folder is online only: its files live in Proton Drive, not on this " -"disk, so the folder will be empty once it stops syncing. To keep a local " -"copy, cancel, switch the folder to Synced, and wait for the download to " -"finish before removing it." - #: crates/pdfs-gui/src/app/pages/devices.rs:959 #, rust-format msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "Stop syncing “{path}”? Both the local files and the folder in My files are kept." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is online only: its files live in Proton Drive, not on this " +"disk, so the folder will be empty once it stops syncing. To keep a local " +"copy, cancel, switch the folder to Synced, and wait for the download to " +"finish before removing it." +msgstr "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is online only: its files live in Proton Drive, not on this " +"disk, so the folder will be empty once it stops syncing. To keep a local " +"copy, cancel, switch the folder to Synced, and wait for the download to " +"finish before removing it." + +#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#, rust-format +msgid "" "Stop syncing “{path}”?\n" "\n" "The local files stay on this disk and simply stop being synced. Choose " @@ -2482,68 +2484,68 @@ msgstr "" "The local files stay on this disk and simply stop being synced. Choose " "whether to also delete the copy in Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "Stop Syncing Folder?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Also delete from Proton Drive" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Deletes the only copy of these files." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "The local copy is unaffected." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Stop Syncing" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "Stopped syncing folder" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "Couldn't stop syncing the folder" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Rename Computer" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "Rename “{name}”." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "Couldn't rename the computer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "A name is required." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Computer renamed" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Type “{name}” to confirm" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "Remove Computer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2558,26 +2560,26 @@ msgstr "" "on that computer itself are not touched — but this cannot be undone from " "here." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Remove" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Computer removed" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "Couldn't remove the computer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "Continue This Backup Here?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2596,25 +2598,25 @@ msgstr "" "“Restore to This Computer” afterwards to bring back what “{name}” was " "syncing." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Continue Here" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Now backing up as “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "Couldn't continue that backup here" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "Sync With This Computer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2631,25 +2633,25 @@ msgstr "" "Folders already synced here stay where they are. Next you choose which of " "its folders to sync here." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Sync Here" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Now syncing with “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "Couldn't sync with that computer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "Move Backup to This Computer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2665,12 +2667,12 @@ msgstr "" "Stop Proton Drive on “{name}” first. Otherwise it sees its folders disappear." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Moved the backup of “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "Couldn't move that backup" @@ -3245,56 +3247,56 @@ msgstr "Open in Files" msgid "Change Location…" msgstr "Change Location…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "Choose whether this folder keeps a full copy on this computer" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Keep every file on this computer and in Proton Drive." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "Keep the files in Proton Drive and download each one when you open it." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "Online only" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Synced" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Sync Now" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Resume Syncing" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Pause Syncing" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Sync From Scratch…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Stop Syncing…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "Sync From Scratch?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3305,20 +3307,20 @@ msgstr "" "folder with Proton Drive again. Nothing is deleted: a file on one side only " "is copied to the other, and a file that differs keeps both versions." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Sync From Scratch" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "Couldn't sync the folder from scratch" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "Make Folder Online Only?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3327,11 +3329,11 @@ msgstr "" "Files in {path} will be removed from this computer and kept in Proton Drive " "only. Each file downloads again when you open it." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Make Online Only" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3340,60 +3342,64 @@ msgstr "" "Every file in {path} will download to this computer and stay synced. {free} " "is free on this disk." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "Every file in {path} will download to this computer and stay synced." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "Download Folder?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Download" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "Couldn't pause the folder" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "Couldn't resume the folder" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Folder paused" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Folder resumed" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "Couldn't sync" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Shared folder" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "My files mirror" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Going online only" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Switching to synced" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "paused" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "not available" @@ -6531,6 +6537,12 @@ msgstr "{count}y" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "cannot reach the Proton Drive daemon: {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} image" +#~ msgstr[1] "{n} images" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " diff --git a/po/es.po b/po/es.po index f9ef66f..57192b0 100644 --- a/po/es.po +++ b/po/es.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Spanish\n" @@ -62,9 +62,9 @@ msgstr "%A, %-d de %B de %Y, %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -244,21 +244,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -336,7 +336,7 @@ msgid "Back / forward" msgstr "Atrás / adelante" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Carpeta superior" @@ -346,9 +346,9 @@ msgstr "Cuadrícula / lista" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Renombrar" @@ -565,9 +565,9 @@ msgstr "Opciones de vista" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -588,8 +588,8 @@ msgid "Couldn't read activity" msgstr "No se pudo leer la actividad" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -740,7 +740,7 @@ msgid "Couldn't add a sync folder" msgstr "No se pudo añadir una carpeta sincronizada" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "No se pudieron restaurar las carpetas" @@ -1326,24 +1326,24 @@ msgstr "No se pudieron cargar los álbumes" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1395,7 +1395,7 @@ msgid "Album name" msgstr "Nombre del álbum" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Crear" @@ -1522,7 +1522,7 @@ msgid "Forward (Alt+Right)" msgstr "Adelante (Alt+Derecha)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "Carpeta nueva" @@ -1615,7 +1615,7 @@ msgid "Cancel thumbnail build" msgstr "Cancelar la generación de miniaturas" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Buscar solo en esta carpeta" @@ -1671,10 +1671,10 @@ msgstr "No se pudo mover a la papelera" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1936,292 +1936,16 @@ msgstr "" "El servicio de Proton Drive dejó de informar del progreso de las miniaturas." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "{n} carpeta" msgstr[1] "{n} carpetas" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} imagen" -msgstr[1] "{n} imágenes" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "Analizando {root}… {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Generando miniaturas en {root}… {done} de {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Miniaturas listas para {n} imagen en {root}" -msgstr[1] "Miniaturas listas para {n} imágenes en {root}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "" -"Miniaturas listas para {n} imagen en {root}; {failed} no disponibles" -msgstr[1] "" -"Miniaturas listas para {n} imágenes en {root}; {failed} no disponibles" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "Nombre nuevo" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Renombrado a “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "No se pudo renombrar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "Mover “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Elija la carpeta de destino." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Mover aquí" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "Mover {n} elemento" -msgstr[1] "Mover {n} elementos" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "Copiar “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Elija la carpeta donde copiar." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Copiar aquí" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "Copiar {n} elemento" -msgstr[1] "Copiar {n} elementos" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Ubicaciones" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "No se pudo leer esta carpeta." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "No hay carpetas aquí." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "No se pudo mover" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "Se movió {n} elemento a {place}, pero no todos" -msgstr[1] "Se movieron {n} elementos a {place}, pero no todos" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Movido a {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "Se movió {n} elemento a {place}" -msgstr[1] "Se movieron {n} elementos a {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "No se pudo copiar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "Se copió {n} elemento a {place}, pero no todos" -msgstr[1] "Se copiaron {n} elementos a {place}, pero no todos" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Copiado a {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "Se copió {n} elemento a {place}" -msgstr[1] "Se copiaron {n} elementos a {place}" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "“{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Crear una carpeta en la carpeta actual." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Nombre de la carpeta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "Se creó “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "No se pudo crear la carpeta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Subir archivos" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Subir carpeta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "No se pudo subir" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Subiendo…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "Subiendo {n} elemento…" -msgstr[1] "Subiendo {n} elementos…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "Ver" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Movido a “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Leyendo esta carpeta." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Carpeta no disponible" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "No se pudo abrir esta carpeta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "Esta carpeta está vacía" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" -"Suelte archivos aquí, o suba un archivo o cree una carpeta para empezar." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Buscar en todas partes" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Buscando…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Buscando “{query}”." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary}: se muestra el primer resultado de búsqueda" -msgstr[1] "{summary}: se muestran los primeros {n} resultados de búsqueda" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary}: resultados de búsqueda" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "Sin coincidencias" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "Ningún archivo ni carpeta coincide con esa búsqueda." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2229,17 +1953,286 @@ msgid_plural "{n} files" msgstr[0] "{n} archivo" msgstr[1] "{n} archivos" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Analizando {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Generando miniaturas en {root}… {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Miniaturas listas para {n} archivo en {root}" +msgstr[1] "Miniaturas listas para {n} archivos en {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Miniaturas listas para {n} archivo en {root}; {failed} no disponibles" +msgstr[1] "Miniaturas listas para {n} archivos en {root}; {failed} no disponibles" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "Nombre nuevo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renombrado a “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "No se pudo renombrar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "Mover “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Elija la carpeta de destino." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Mover aquí" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Mover {n} elemento" +msgstr[1] "Mover {n} elementos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "Copiar “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Elija la carpeta donde copiar." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Copiar aquí" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "Copiar {n} elemento" +msgstr[1] "Copiar {n} elementos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Ubicaciones" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "No se pudo leer esta carpeta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "No hay carpetas aquí." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "No se pudo mover" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "Se movió {n} elemento a {place}, pero no todos" +msgstr[1] "Se movieron {n} elementos a {place}, pero no todos" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Movido a {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "Se movió {n} elemento a {place}" +msgstr[1] "Se movieron {n} elementos a {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "No se pudo copiar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "Se copió {n} elemento a {place}, pero no todos" +msgstr[1] "Se copiaron {n} elementos a {place}, pero no todos" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Copiado a {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "Se copió {n} elemento a {place}" +msgstr[1] "Se copiaron {n} elementos a {place}" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Crear una carpeta en la carpeta actual." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Nombre de la carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "Se creó “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "No se pudo crear la carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Subir archivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Subir carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "No se pudo subir" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Subiendo…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Subiendo {n} elemento…" +msgstr[1] "Subiendo {n} elementos…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "Ver" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Movido a “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Leyendo esta carpeta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Carpeta no disponible" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "No se pudo abrir esta carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "Esta carpeta está vacía" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Suelte archivos aquí, o suba un archivo o cree una carpeta para empezar." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Buscar en todas partes" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Buscando…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Buscando “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary}: se muestra el primer resultado de búsqueda" +msgstr[1] "{summary}: se muestran los primeros {n} resultados de búsqueda" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary}: resultados de búsqueda" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "Sin coincidencias" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "Ningún archivo ni carpeta coincide con esa búsqueda." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2318,98 +2311,98 @@ msgstr "{platform} · última copia de seguridad {time}" msgid "{platform} · no backups yet" msgstr "{platform} · aún no hay copias de seguridad" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "Aún no hay carpetas con copia de seguridad" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "{n} carpeta con copia de seguridad" msgstr[1] "{n} carpetas con copia de seguridad" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "{folders} · {n} espera su primera sincronización" msgstr[1] "{folders} · {n} esperan su primera sincronización" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "{folders} · {n} requiere atención" msgstr[1] "{folders} · {n} requieren atención" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "sincronizando…" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "error de sincronización" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "requiere atención" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "esperando la primera sincronización" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "actualizado" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "buscando cambios…" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "buscando cambios: {n} elemento revisado" msgstr[1] "buscando cambios: {n} elementos revisados" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "buscando cambios: {done} de {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "sincronizando {done} de {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "sincronizando {file}: {done} de {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Añadir carpeta para sincronizar" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Sincronizando la carpeta…" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "No se pudo añadir la carpeta" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "No se pudieron listar las carpetas para restaurar" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2417,19 +2410,19 @@ msgstr "" "Marque las carpetas que sincronizar con esta máquina y ajuste dónde debe " "estar cada una." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Restaurar carpetas" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Restaurar" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Restaurando carpetas…" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2438,36 +2431,43 @@ msgstr "" "Estas carpetas tienen copia de seguridad desde “{name}”. Las carpetas " "restauradas siguen sincronizándose con la copia de ese equipo." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "" "Estas carpetas tienen copia de seguridad bajo este equipo en Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" "Nada que restaurar: todas las carpetas de “{name}” ya se sincronizan aquí." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" "Nada que restaurar: todas las carpetas de este equipo ya se sincronizan aquí." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "La carpeta pasará a solo en línea" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "La carpeta se descargará y permanecerá sincronizada" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "No se pudo cambiar el modo" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "¿Dejar de sincronizar “{path}”? Se conservan tanto los archivos locales como la carpeta en Mis archivos." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2484,7 +2484,7 @@ msgstr "" "Para conservar una copia local, cancele, cambie la carpeta a Sincronizada y " "espere a que termine la descarga antes de quitarla." -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2497,68 +2497,68 @@ msgstr "" "Los archivos locales permanecen en este disco y simplemente dejan de " "sincronizarse. Elija si quiere eliminar también la copia en Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "¿Dejar de sincronizar la carpeta?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Eliminar también de Proton Drive" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Elimina la única copia de estos archivos." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "La copia local no se ve afectada." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Dejar de sincronizar" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "Se dejó de sincronizar la carpeta" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "No se pudo dejar de sincronizar la carpeta" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Renombrar equipo" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "Renombrar “{name}”." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "No se pudo renombrar el equipo" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "Se necesita un nombre." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Equipo renombrado" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Escriba “{name}” para confirmar" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "¿Quitar el equipo?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2572,26 +2572,26 @@ msgstr "" "Todo lo que respaldó en Proton Drive se eliminará con él. Los archivos de " "ese equipo no se tocan, pero esto no se puede deshacer desde aquí." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Quitar" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Equipo quitado" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "No se pudo quitar el equipo" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "¿Continuar esta copia de seguridad aquí?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2610,25 +2610,25 @@ msgstr "" "no se mueven. Después, use “Restaurar en este equipo” para recuperar lo que " "“{name}” sincronizaba." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Continuar aquí" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Ahora se hace copia de seguridad como “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "No se pudo continuar esa copia de seguridad aquí" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "¿Sincronizar con este equipo?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2645,25 +2645,25 @@ msgstr "" "Proton Drive. Las carpetas ya sincronizadas aquí se quedan donde están. A " "continuación, elija qué carpetas suyas sincronizar aquí." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Sincronizar aquí" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Ahora se sincroniza con “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "No se pudo sincronizar con ese equipo" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "¿Mover la copia de seguridad a este equipo?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2680,12 +2680,12 @@ msgstr "" "carpetas." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Se movió la copia de seguridad de “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "No se pudo mover esa copia de seguridad" @@ -3268,57 +3268,57 @@ msgstr "Abrir en Archivos" msgid "Change Location…" msgstr "Cambiar ubicación…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "Elegir si esta carpeta guarda una copia completa en este equipo" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Conservar todos los archivos en este equipo y en Proton Drive." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "" "Conservar los archivos en Proton Drive y descargar cada uno al abrirlo." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "Solo en línea" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Sincronizada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Sincronizar ahora" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Reanudar la sincronización" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Pausar la sincronización" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Sincronizar desde cero…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Dejar de sincronizar…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "¿Sincronizar desde cero?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3330,20 +3330,20 @@ msgstr "" "lado se copia al otro, y de un archivo que difiere se conservan ambas " "versiones." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Sincronizar desde cero" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "No se pudo sincronizar la carpeta desde cero" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "¿Hacer la carpeta solo en línea?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3352,11 +3352,11 @@ msgstr "" "Los archivos de {path} se quitarán de este equipo y se conservarán solo en " "Proton Drive. Cada archivo se vuelve a descargar al abrirlo." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Hacer solo en línea" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3365,62 +3365,66 @@ msgstr "" "Todos los archivos de {path} se descargarán en este equipo y se mantendrán " "sincronizados. Hay {free} libres en este disco." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" "Todos los archivos de {path} se descargarán en este equipo y se mantendrán " "sincronizados." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "¿Descargar la carpeta?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Descargar" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "No se pudo pausar la carpeta" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "No se pudo reanudar la carpeta" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Carpeta en pausa" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Carpeta reanudada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "No se pudo sincronizar" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Carpeta compartida" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "Réplica de Mis archivos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Pasando a solo en línea" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Pasando a sincronizada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "en pausa" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "no disponible" @@ -6612,6 +6616,12 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "no se puede contactar con el demonio de Proton Drive: {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} imagen" +#~ msgstr[1] "{n} imágenes" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " diff --git a/po/fr.po b/po/fr.po index 25f4120..2867ed4 100644 --- a/po/fr.po +++ b/po/fr.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: French\n" @@ -62,9 +62,9 @@ msgstr "%A %-d %B %Y à %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -246,21 +246,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -338,7 +338,7 @@ msgid "Back / forward" msgstr "Précédent / suivant" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Dossier parent" @@ -348,9 +348,9 @@ msgstr "Grille / liste" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Renommer" @@ -568,9 +568,9 @@ msgstr "Options d’affichage" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -591,8 +591,8 @@ msgid "Couldn't read activity" msgstr "Impossible de lire l’activité" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -743,7 +743,7 @@ msgid "Couldn't add a sync folder" msgstr "Impossible d’ajouter un dossier synchronisé" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "Impossible de restaurer les dossiers" @@ -1337,24 +1337,24 @@ msgstr "Impossible de charger les albums" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1406,7 +1406,7 @@ msgid "Album name" msgstr "Nom de l’album" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Créer" @@ -1533,7 +1533,7 @@ msgid "Forward (Alt+Right)" msgstr "Suivant (Alt+Droite)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "Nouveau dossier" @@ -1626,7 +1626,7 @@ msgid "Cancel thumbnail build" msgstr "Annuler la génération des miniatures" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Rechercher uniquement dans ce dossier" @@ -1682,10 +1682,10 @@ msgstr "Impossible de mettre à la corbeille" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1948,293 +1948,16 @@ msgid "The Proton Drive service stopped reporting thumbnail progress." msgstr "Le service Proton Drive ne signale plus la progression des miniatures." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "{n} dossier" msgstr[1] "{n} dossiers" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} image" -msgstr[1] "{n} images" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "Analyse de {root}… {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Génération des miniatures dans {root}… {done} sur {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Miniatures prêtes pour {n} image dans {root}" -msgstr[1] "Miniatures prêtes pour {n} images dans {root}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "" -"Miniatures prêtes pour {n} image dans {root} ; indisponibles : {failed}" -msgstr[1] "" -"Miniatures prêtes pour {n} images dans {root} ; indisponibles : {failed}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "Nouveau nom" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Renommé en « {name} »" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "Impossible de renommer" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "Déplacer « {name} »" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Choisissez le dossier de destination." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Déplacer ici" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "Déplacer {n} élément" -msgstr[1] "Déplacer {n} éléments" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "Copier « {name} »" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Choisissez le dossier où copier." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Copier ici" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "Copier {n} élément" -msgstr[1] "Copier {n} éléments" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Emplacements" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "Impossible de lire ce dossier." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "Aucun dossier ici." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "Impossible de déplacer" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "{n} élément déplacé vers {place}, mais pas tous" -msgstr[1] "{n} éléments déplacés vers {place}, mais pas tous" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Déplacé vers {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "{n} élément déplacé vers {place}" -msgstr[1] "{n} éléments déplacés vers {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "Impossible de copier" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "{n} élément copié vers {place}, mais pas tous" -msgstr[1] "{n} éléments copiés vers {place}, mais pas tous" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Copié vers {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "{n} élément copié vers {place}" -msgstr[1] "{n} éléments copiés vers {place}" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "« {name} »" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Créer un dossier dans le répertoire actuel." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Nom du dossier" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "« {name} » créé" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "Impossible de créer le dossier" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Téléverser des fichiers" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Téléverser un dossier" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "Impossible de téléverser" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Téléversement…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "Téléversement de {n} élément…" -msgstr[1] "Téléversement de {n} éléments…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "Afficher" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Déplacé dans « {name} »" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Lecture de ce dossier." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Dossier indisponible" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "Impossible d’ouvrir ce dossier" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "Ce dossier est vide" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" -"Déposez des fichiers ici, ou téléversez un fichier ou créez un dossier pour " -"commencer." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Rechercher partout" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Recherche…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Recherche de « {query} »." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary} — affichage de {n} premier résultat de recherche" -msgstr[1] "{summary} — affichage des {n} premiers résultats de recherche" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary} — résultats de recherche" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "Aucun résultat" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "Aucun fichier ni dossier ne correspond à cette recherche." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2242,17 +1965,287 @@ msgid_plural "{n} files" msgstr[0] "{n} fichier" msgstr[1] "{n} fichiers" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Analyse de {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Génération des miniatures dans {root}… {done} sur {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Miniatures prêtes pour {n} fichier dans {root}" +msgstr[1] "Miniatures prêtes pour {n} fichiers dans {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Miniatures prêtes pour {n} fichier dans {root} ; indisponibles : {failed}" +msgstr[1] "Miniatures prêtes pour {n} fichiers dans {root} ; indisponibles : {failed}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "Nouveau nom" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renommé en « {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "Impossible de renommer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "Déplacer « {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Choisissez le dossier de destination." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Déplacer ici" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Déplacer {n} élément" +msgstr[1] "Déplacer {n} éléments" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "Copier « {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Choisissez le dossier où copier." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Copier ici" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "Copier {n} élément" +msgstr[1] "Copier {n} éléments" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Emplacements" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "Impossible de lire ce dossier." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "Aucun dossier ici." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "Impossible de déplacer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} élément déplacé vers {place}, mais pas tous" +msgstr[1] "{n} éléments déplacés vers {place}, mais pas tous" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Déplacé vers {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} élément déplacé vers {place}" +msgstr[1] "{n} éléments déplacés vers {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "Impossible de copier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "{n} élément copié vers {place}, mais pas tous" +msgstr[1] "{n} éléments copiés vers {place}, mais pas tous" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Copié vers {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "{n} élément copié vers {place}" +msgstr[1] "{n} éléments copiés vers {place}" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "« {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Créer un dossier dans le répertoire actuel." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Nom du dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "« {name} » créé" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "Impossible de créer le dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Téléverser des fichiers" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Téléverser un dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "Impossible de téléverser" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Téléversement…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Téléversement de {n} élément…" +msgstr[1] "Téléversement de {n} éléments…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "Afficher" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Déplacé dans « {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Lecture de ce dossier." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Dossier indisponible" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "Impossible d’ouvrir ce dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "Ce dossier est vide" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Déposez des fichiers ici, ou téléversez un fichier ou créez un dossier pour " +"commencer." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Rechercher partout" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Recherche…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Recherche de « {query} »." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — affichage de {n} premier résultat de recherche" +msgstr[1] "{summary} — affichage des {n} premiers résultats de recherche" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — résultats de recherche" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "Aucun résultat" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "Aucun fichier ni dossier ne correspond à cette recherche." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2331,98 +2324,98 @@ msgstr "{platform} · dernière sauvegarde {time}" msgid "{platform} · no backups yet" msgstr "{platform} · aucune sauvegarde pour l’instant" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "Aucun dossier sauvegardé pour l’instant" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "{n} dossier sauvegardé" msgstr[1] "{n} dossiers sauvegardés" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "{folders} · {n} attend sa première synchronisation" msgstr[1] "{folders} · {n} attendent leur première synchronisation" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "{folders} · {n} requiert votre attention" msgstr[1] "{folders} · {n} requièrent votre attention" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "synchronisation…" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "erreur de synchronisation" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "attention requise" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "en attente de la première synchronisation" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "à jour" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "recherche de modifications…" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "recherche de modifications — {n} élément vérifié" msgstr[1] "recherche de modifications — {n} éléments vérifiés" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "recherche de modifications — {done} sur {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "synchronisation de {done} sur {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "synchronisation de {file} — {done} sur {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Ajouter un dossier à synchroniser" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Synchronisation du dossier…" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "Impossible d’ajouter le dossier" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "Impossible de lister les dossiers à restaurer" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2430,19 +2423,19 @@ msgstr "" "Cochez les dossiers à synchroniser sur cette machine et ajustez " "l’emplacement de chacun." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Restaurer les dossiers" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Restaurer" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Restauration des dossiers…" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2451,35 +2444,42 @@ msgstr "" "Ces dossiers sont sauvegardés depuis « {name} ». Les dossiers restaurés " "restent synchronisés avec la copie de cet ordinateur." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "Ces dossiers sont sauvegardés sous cet ordinateur dans Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" "Rien à restaurer — les dossiers de « {name} » sont tous synchronisés ici." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" "Rien à restaurer — les dossiers de cet ordinateur sont tous synchronisés ici." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "Le dossier passera en ligne uniquement" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "Le dossier va être téléchargé et rester synchronisé" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "Impossible de changer de mode" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "Arrêter la synchronisation de « {path} » ? Les fichiers locaux et le dossier dans Mes fichiers sont conservés." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2496,7 +2496,7 @@ msgstr "" "arrêtée. Pour conserver une copie locale, annulez, passez le dossier en " "« Synchronisé » et attendez la fin du téléchargement avant de le retirer." -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2510,68 +2510,68 @@ msgstr "" "synchronisés. Choisissez s’il faut aussi supprimer la copie dans Proton " "Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "Arrêter la synchronisation du dossier ?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Supprimer aussi de Proton Drive" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Supprime l’unique copie de ces fichiers." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "La copie locale n’est pas affectée." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Arrêter la synchronisation" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "Synchronisation du dossier arrêtée" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "Impossible d’arrêter la synchronisation du dossier" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Renommer l’ordinateur" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "Renommer « {name} »." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "Impossible de renommer l’ordinateur" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "Un nom est requis." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Ordinateur renommé" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Saisissez « {name} » pour confirmer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "Retirer l’ordinateur ?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2586,26 +2586,26 @@ msgstr "" "fichiers présents sur cet ordinateur ne sont pas touchés — mais cette action " "ne peut pas être annulée d’ici." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Retirer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Ordinateur retiré" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "Impossible de retirer l’ordinateur" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "Continuer cette sauvegarde ici ?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2624,25 +2624,25 @@ msgstr "" "ne sont pas déplacés. Utilisez ensuite « Restaurer sur cet ordinateur » pour " "récupérer ce que « {name} » synchronisait." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Continuer ici" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Sauvegarde désormais en tant que « {name} »" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "Impossible de continuer cette sauvegarde ici" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "Synchroniser avec cet ordinateur ?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2659,25 +2659,25 @@ msgstr "" "dans Proton Drive. Les dossiers déjà synchronisés ici restent où ils sont. " "Vous choisissez ensuite lesquels de ses dossiers synchroniser ici." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Synchroniser ici" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Synchronisé désormais avec « {name} »" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "Impossible de synchroniser avec cet ordinateur" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "Déplacer la sauvegarde vers cet ordinateur ?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2694,12 +2694,12 @@ msgstr "" "disparaître." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Sauvegarde de « {name} » déplacée" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "Impossible de déplacer cette sauvegarde" @@ -3293,57 +3293,57 @@ msgstr "Ouvrir dans Fichiers" msgid "Change Location…" msgstr "Changer l’emplacement…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "Choisir si ce dossier garde une copie complète sur cet ordinateur" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Conserver chaque fichier sur cet ordinateur et dans Proton Drive." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "" "Garder les fichiers dans Proton Drive et télécharger chacun à son ouverture." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "En ligne uniquement" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Synchronisé" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Synchroniser maintenant" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Reprendre la synchronisation" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Mettre en pause la synchronisation" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Resynchroniser depuis le début…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Arrêter la synchronisation…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "Resynchroniser depuis le début ?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3355,20 +3355,20 @@ msgstr "" "fichier présent d’un seul côté est copié de l’autre, et un fichier qui " "diffère garde ses deux versions." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Resynchroniser depuis le début" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "Impossible de resynchroniser le dossier depuis le début" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "Garder le dossier en ligne uniquement ?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3378,11 +3378,11 @@ msgstr "" "uniquement dans Proton Drive. Chaque fichier sera à nouveau téléchargé à son " "ouverture." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Garder en ligne uniquement" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3391,62 +3391,66 @@ msgstr "" "Chaque fichier de {path} sera téléchargé sur cet ordinateur et restera " "synchronisé. {free} sont libres sur ce disque." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" "Chaque fichier de {path} sera téléchargé sur cet ordinateur et restera " "synchronisé." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "Télécharger le dossier ?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Télécharger" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "Impossible de mettre en pause le dossier" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "Impossible de reprendre le dossier" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Dossier en pause" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Dossier repris" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "Impossible de synchroniser" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Dossier partagé" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "Miroir de Mes fichiers" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Passage en ligne uniquement" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Passage en mode synchronisé" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "en pause" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "non disponible" @@ -6660,6 +6664,12 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "impossible de joindre le démon Proton Drive : {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} image" +#~ msgstr[1] "{n} images" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " diff --git a/po/it.po b/po/it.po index edbaa24..b22bd23 100644 --- a/po/it.po +++ b/po/it.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Italian\n" @@ -62,9 +62,9 @@ msgstr "%A %-d %B %Y, %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -242,21 +242,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -334,7 +334,7 @@ msgid "Back / forward" msgstr "Indietro / avanti" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Cartella superiore" @@ -344,9 +344,9 @@ msgstr "Griglia / elenco" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Rinomina" @@ -564,9 +564,9 @@ msgstr "Opzioni di visualizzazione" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -587,8 +587,8 @@ msgid "Couldn't read activity" msgstr "Impossibile leggere le attività" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -739,7 +739,7 @@ msgid "Couldn't add a sync folder" msgstr "Impossibile aggiungere una cartella sincronizzata" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "Impossibile ripristinare le cartelle" @@ -1331,24 +1331,24 @@ msgstr "Impossibile caricare gli album" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1400,7 +1400,7 @@ msgid "Album name" msgstr "Nome dell'album" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Crea" @@ -1527,7 +1527,7 @@ msgid "Forward (Alt+Right)" msgstr "Avanti (Alt+Destra)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "Nuova cartella" @@ -1620,7 +1620,7 @@ msgid "Cancel thumbnail build" msgstr "Annulla la generazione delle miniature" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Cerca solo in questa cartella" @@ -1676,10 +1676,10 @@ msgstr "Impossibile spostare nel cestino" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1942,293 +1942,16 @@ msgstr "" "miniature." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "{n} cartella" msgstr[1] "{n} cartelle" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} immagine" -msgstr[1] "{n} immagini" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "Analisi di {root}… {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Generazione delle miniature in {root}… {done} di {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Miniature pronte per {n} immagine in {root}" -msgstr[1] "Miniature pronte per {n} immagini in {root}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "" -"Miniature pronte per {n} immagine in {root}; {failed} non disponibili" -msgstr[1] "" -"Miniature pronte per {n} immagini in {root}; {failed} non disponibili" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "Nuovo nome" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Rinominato in “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "Impossibile rinominare" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "Sposta “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Scegli la cartella di destinazione." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Sposta qui" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "Sposta {n} elemento" -msgstr[1] "Sposta {n} elementi" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "Copia “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Scegli la cartella in cui copiare." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Copia qui" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "Copia {n} elemento" -msgstr[1] "Copia {n} elementi" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Posizioni" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "Impossibile leggere questa cartella." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "Nessuna cartella qui." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "Impossibile spostare" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "{n} elemento spostato in {place}, ma non tutti" -msgstr[1] "{n} elementi spostati in {place}, ma non tutti" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Spostato in {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "{n} elemento spostato in {place}" -msgstr[1] "{n} elementi spostati in {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "Impossibile copiare" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "{n} elemento copiato in {place}, ma non tutti" -msgstr[1] "{n} elementi copiati in {place}, ma non tutti" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Copiato in {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "{n} elemento copiato in {place}" -msgstr[1] "{n} elementi copiati in {place}" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "“{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Crea una cartella nella directory corrente." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Nome della cartella" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "“{name}” creata" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "Impossibile creare la cartella" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Carica file" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Carica cartella" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "Impossibile caricare" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Caricamento…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "Caricamento di {n} elemento…" -msgstr[1] "Caricamento di {n} elementi…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "Visualizza" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Spostato in “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Lettura di questa cartella." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Cartella non disponibile" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "Impossibile aprire questa cartella" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "Questa cartella è vuota" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" -"Trascina qui dei file, oppure carica un file o crea una cartella per " -"iniziare." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Cerca ovunque" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Ricerca…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Ricerca di “{query}”." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary}: visualizzato il primo {n} risultato della ricerca" -msgstr[1] "{summary}: visualizzati i primi {n} risultati della ricerca" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary}: risultati della ricerca" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "Nessuna corrispondenza" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "Nessun file o cartella corrisponde alla ricerca." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2236,17 +1959,287 @@ msgid_plural "{n} files" msgstr[0] "{n} file" msgstr[1] "{n} file" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Analisi di {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Generazione delle miniature in {root}… {done} di {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Miniature pronte per {n} file in {root}" +msgstr[1] "Miniature pronte per {n} file in {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Miniature pronte per {n} file in {root}; {failed} non disponibili" +msgstr[1] "Miniature pronte per {n} file in {root}; {failed} non disponibili" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "Nuovo nome" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Rinominato in “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "Impossibile rinominare" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "Sposta “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Scegli la cartella di destinazione." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Sposta qui" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Sposta {n} elemento" +msgstr[1] "Sposta {n} elementi" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "Copia “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Scegli la cartella in cui copiare." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Copia qui" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "Copia {n} elemento" +msgstr[1] "Copia {n} elementi" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Posizioni" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "Impossibile leggere questa cartella." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "Nessuna cartella qui." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "Impossibile spostare" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} elemento spostato in {place}, ma non tutti" +msgstr[1] "{n} elementi spostati in {place}, ma non tutti" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Spostato in {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} elemento spostato in {place}" +msgstr[1] "{n} elementi spostati in {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "Impossibile copiare" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "{n} elemento copiato in {place}, ma non tutti" +msgstr[1] "{n} elementi copiati in {place}, ma non tutti" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Copiato in {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "{n} elemento copiato in {place}" +msgstr[1] "{n} elementi copiati in {place}" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Crea una cartella nella directory corrente." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Nome della cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "“{name}” creata" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "Impossibile creare la cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Carica file" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Carica cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "Impossibile caricare" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Caricamento…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Caricamento di {n} elemento…" +msgstr[1] "Caricamento di {n} elementi…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "Visualizza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Spostato in “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Lettura di questa cartella." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Cartella non disponibile" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "Impossibile aprire questa cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "Questa cartella è vuota" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Trascina qui dei file, oppure carica un file o crea una cartella per " +"iniziare." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Cerca ovunque" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Ricerca…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Ricerca di “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary}: visualizzato il primo {n} risultato della ricerca" +msgstr[1] "{summary}: visualizzati i primi {n} risultati della ricerca" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary}: risultati della ricerca" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "Nessuna corrispondenza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "Nessun file o cartella corrisponde alla ricerca." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2325,98 +2318,98 @@ msgstr "{platform} · ultimo backup {time}" msgid "{platform} · no backups yet" msgstr "{platform} · ancora nessun backup" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "Ancora nessuna cartella sottoposta a backup" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "{n} cartella sottoposta a backup" msgstr[1] "{n} cartelle sottoposte a backup" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "{folders} · {n} attende la prima sincronizzazione" msgstr[1] "{folders} · {n} attendono la prima sincronizzazione" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "{folders} · {n} richiede attenzione" msgstr[1] "{folders} · {n} richiedono attenzione" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "sincronizzazione…" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "errore di sincronizzazione" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "richiede attenzione" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "in attesa della prima sincronizzazione" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "aggiornato" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "controllo delle modifiche…" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "controllo delle modifiche: {n} elemento controllato" msgstr[1] "controllo delle modifiche: {n} elementi controllati" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "controllo delle modifiche: {done} di {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "sincronizzazione {done} di {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "sincronizzazione di {file}: {done} di {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Aggiungi cartella da sincronizzare" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Sincronizzazione della cartella…" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "Impossibile aggiungere la cartella" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "Impossibile elencare le cartelle da ripristinare" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2424,19 +2417,19 @@ msgstr "" "Seleziona le cartelle da sincronizzare su questa macchina e regola dove deve " "trovarsi ciascuna." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Ripristina cartelle" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Ripristina" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Ripristino delle cartelle…" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2445,39 +2438,46 @@ msgstr "" "Queste cartelle sono sottoposte a backup da “{name}”. Le cartelle " "ripristinate continuano a sincronizzarsi con la copia di quel computer." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "" "Queste cartelle sono sottoposte a backup sotto questo computer in Proton " "Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" "Niente da ripristinare: le cartelle di “{name}” sono già tutte sincronizzate " "qui." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" "Niente da ripristinare: le cartelle di questo computer sono già tutte " "sincronizzate qui." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "La cartella passerà a solo online" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "La cartella verrà scaricata e resterà sincronizzata" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "Impossibile cambiare modalità" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "Interrompere la sincronizzazione di “{path}”? Sia i file locali sia la cartella in I miei file vengono mantenuti." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2495,7 +2495,7 @@ msgstr "" "cartella a Sincronizzata e attendi il completamento del download prima di " "rimuoverla." -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2508,68 +2508,68 @@ msgstr "" "I file locali restano su questo disco e semplicemente smettono di essere " "sincronizzati. Scegli se eliminare anche la copia in Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "Interrompere la sincronizzazione della cartella?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Elimina anche da Proton Drive" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Elimina l'unica copia di questi file." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "La copia locale non viene modificata." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Interrompi sincronizzazione" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "Sincronizzazione della cartella interrotta" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "Impossibile interrompere la sincronizzazione della cartella" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Rinomina computer" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "Rinomina “{name}”." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "Impossibile rinominare il computer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "È richiesto un nome." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Computer rinominato" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Digita “{name}” per confermare" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "Rimuovere il computer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2584,26 +2584,26 @@ msgstr "" "insieme a esso. I file su quel computer non vengono toccati, ma questa " "operazione non può essere annullata da qui." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Rimuovi" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Computer rimosso" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "Impossibile rimuovere il computer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "Continuare questo backup qui?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2622,25 +2622,25 @@ msgstr "" "qui non vengono spostate. Usa poi “Ripristina su questo computer” per " "recuperare ciò che “{name}” sincronizzava." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Continua qui" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Ora il backup avviene come “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "Impossibile continuare quel backup qui" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "Sincronizzare con questo computer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2657,25 +2657,25 @@ msgstr "" "in Proton Drive. Le cartelle già sincronizzate qui restano dove sono. Poi " "scegli quali delle sue cartelle sincronizzare qui." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Sincronizza qui" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Ora sincronizzato con “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "Impossibile sincronizzare con quel computer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "Spostare il backup su questo computer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2692,12 +2692,12 @@ msgstr "" "cartelle." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Backup di “{name}” spostato" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "Impossibile spostare quel backup" @@ -3286,57 +3286,57 @@ msgstr "Apri in File" msgid "Change Location…" msgstr "Cambia posizione…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "" "Scegli se questa cartella conserva una copia completa su questo computer" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Conserva ogni file su questo computer e in Proton Drive." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "Conserva i file in Proton Drive e scarica ciascuno quando lo apri." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "Solo online" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Sincronizzata" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Sincronizza ora" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Riprendi sincronizzazione" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Metti in pausa sincronizzazione" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Sincronizza da zero…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Interrompi sincronizzazione…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "Sincronizzare da zero?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3348,20 +3348,20 @@ msgstr "" "un file presente su un solo lato viene copiato sull’altro e di un file " "diverso vengono mantenute entrambe le versioni." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Sincronizza da zero" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "Impossibile sincronizzare la cartella da zero" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "Rendere la cartella solo online?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3370,11 +3370,11 @@ msgstr "" "I file in {path} verranno rimossi da questo computer e mantenuti solo in " "Proton Drive. Ogni file viene scaricato di nuovo quando lo apri." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Rendi solo online" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3383,62 +3383,66 @@ msgstr "" "Ogni file in {path} verrà scaricato su questo computer e resterà " "sincronizzato. Su questo disco sono liberi {free}." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" "Ogni file in {path} verrà scaricato su questo computer e resterà " "sincronizzato." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "Scaricare la cartella?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Scarica" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "Impossibile mettere in pausa la cartella" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "Impossibile riprendere la cartella" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Cartella in pausa" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Cartella ripresa" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "Impossibile sincronizzare" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Cartella condivisa" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "Copia speculare di I miei file" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Passaggio a solo online" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Passaggio a sincronizzata" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "in pausa" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "non disponibile" @@ -6636,6 +6640,12 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "impossibile raggiungere il demone di Proton Drive: {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} immagine" +#~ msgstr[1] "{n} immagini" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " diff --git a/po/nl.po b/po/nl.po index b90b987..9d40789 100644 --- a/po/nl.po +++ b/po/nl.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Dutch\n" @@ -62,9 +62,9 @@ msgstr "%A %-d %B %Y, %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -243,21 +243,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -335,7 +335,7 @@ msgid "Back / forward" msgstr "Terug / vooruit" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Bovenliggende map" @@ -345,9 +345,9 @@ msgstr "Raster / lijst" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Hernoemen" @@ -565,9 +565,9 @@ msgstr "Weergaveopties" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -588,8 +588,8 @@ msgid "Couldn't read activity" msgstr "Kon activiteit niet lezen" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -740,7 +740,7 @@ msgid "Couldn't add a sync folder" msgstr "Kon geen synchronisatiemap toevoegen" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "Kon mappen niet terugzetten" @@ -1327,24 +1327,24 @@ msgstr "Kon albums niet laden" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1396,7 +1396,7 @@ msgid "Album name" msgstr "Albumnaam" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Aanmaken" @@ -1523,7 +1523,7 @@ msgid "Forward (Alt+Right)" msgstr "Vooruit (Alt+Rechts)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "Nieuwe map" @@ -1616,7 +1616,7 @@ msgid "Cancel thumbnail build" msgstr "Aanmaken van miniaturen annuleren" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Alleen in deze map zoeken" @@ -1672,10 +1672,10 @@ msgstr "Kon niet naar prullenbak verplaatsen" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1936,293 +1936,16 @@ msgid "The Proton Drive service stopped reporting thumbnail progress." msgstr "De Proton Drive-service meldt geen voortgang van miniaturen meer." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "{n} map" msgstr[1] "{n} mappen" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} afbeelding" -msgstr[1] "{n} afbeeldingen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "{root} scannen… {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Miniaturen aanmaken in {root}… {done} van {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Miniaturen klaar voor {n} afbeelding in {root}" -msgstr[1] "Miniaturen klaar voor {n} afbeeldingen in {root}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "" -"Miniaturen klaar voor {n} afbeelding in {root}; {failed} niet beschikbaar" -msgstr[1] "" -"Miniaturen klaar voor {n} afbeeldingen in {root}; {failed} niet beschikbaar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "Nieuwe naam" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Hernoemd naar “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "Kon niet hernoemen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "“{name}” verplaatsen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Kies de map waarnaar je wilt verplaatsen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Hierheen verplaatsen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "{n} item verplaatsen" -msgstr[1] "{n} items verplaatsen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "“{name}” kopiëren" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Kies de map waarnaar je wilt kopiëren." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Hierheen kopiëren" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "{n} item kopiëren" -msgstr[1] "{n} items kopiëren" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Locaties" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "Kon deze map niet lezen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "Geen mappen hier." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "Kon niet verplaatsen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "{n} item verplaatst naar {place}, maar niet alles" -msgstr[1] "{n} items verplaatst naar {place}, maar niet alles" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Verplaatst naar {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "{n} item verplaatst naar {place}" -msgstr[1] "{n} items verplaatst naar {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "Kon niet kopiëren" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "{n} item gekopieerd naar {place}, maar niet alles" -msgstr[1] "{n} items gekopieerd naar {place}, maar niet alles" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Gekopieerd naar {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "{n} item gekopieerd naar {place}" -msgstr[1] "{n} items gekopieerd naar {place}" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "“{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Een map aanmaken in de huidige map." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Mapnaam" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "“{name}” aangemaakt" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "Kon map niet aanmaken" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Bestanden uploaden" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Map uploaden" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "Kon niet uploaden" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Uploaden…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "{n} item uploaden…" -msgstr[1] "{n} items uploaden…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "Bekijken" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Verplaatst naar “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Deze map wordt gelezen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Map niet beschikbaar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "Kon deze map niet openen" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "Deze map is leeg" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" -"Sleep bestanden hierheen, of upload een bestand of maak een map aan om te " -"beginnen." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Overal zoeken" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Zoeken…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Zoeken naar “{query}”." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary} — eerste {n} zoekresultaat wordt getoond" -msgstr[1] "{summary} — eerste {n} zoekresultaten worden getoond" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary} — zoekresultaten" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "Geen overeenkomsten" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "Geen bestanden of mappen komen overeen met deze zoekopdracht." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2230,17 +1953,287 @@ msgid_plural "{n} files" msgstr[0] "{n} bestand" msgstr[1] "{n} bestanden" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "{root} scannen… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Miniaturen aanmaken in {root}… {done} van {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Miniaturen klaar voor {n} bestand in {root}" +msgstr[1] "Miniaturen klaar voor {n} bestanden in {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Miniaturen klaar voor {n} bestand in {root}; {failed} niet beschikbaar" +msgstr[1] "Miniaturen klaar voor {n} bestanden in {root}; {failed} niet beschikbaar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "Nieuwe naam" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Hernoemd naar “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "Kon niet hernoemen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "“{name}” verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Kies de map waarnaar je wilt verplaatsen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Hierheen verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "{n} item verplaatsen" +msgstr[1] "{n} items verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "“{name}” kopiëren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Kies de map waarnaar je wilt kopiëren." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Hierheen kopiëren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "{n} item kopiëren" +msgstr[1] "{n} items kopiëren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Locaties" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "Kon deze map niet lezen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "Geen mappen hier." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "Kon niet verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} item verplaatst naar {place}, maar niet alles" +msgstr[1] "{n} items verplaatst naar {place}, maar niet alles" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Verplaatst naar {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} item verplaatst naar {place}" +msgstr[1] "{n} items verplaatst naar {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "Kon niet kopiëren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "{n} item gekopieerd naar {place}, maar niet alles" +msgstr[1] "{n} items gekopieerd naar {place}, maar niet alles" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Gekopieerd naar {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "{n} item gekopieerd naar {place}" +msgstr[1] "{n} items gekopieerd naar {place}" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Een map aanmaken in de huidige map." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Mapnaam" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "“{name}” aangemaakt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "Kon map niet aanmaken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Bestanden uploaden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Map uploaden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "Kon niet uploaden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Uploaden…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "{n} item uploaden…" +msgstr[1] "{n} items uploaden…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "Bekijken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Verplaatst naar “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Deze map wordt gelezen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Map niet beschikbaar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "Kon deze map niet openen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "Deze map is leeg" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Sleep bestanden hierheen, of upload een bestand of maak een map aan om te " +"beginnen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Overal zoeken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Zoeken…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Zoeken naar “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — eerste {n} zoekresultaat wordt getoond" +msgstr[1] "{summary} — eerste {n} zoekresultaten worden getoond" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — zoekresultaten" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "Geen overeenkomsten" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "Geen bestanden of mappen komen overeen met deze zoekopdracht." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2319,98 +2312,98 @@ msgstr "{platform} · laatste back-up {time}" msgid "{platform} · no backups yet" msgstr "{platform} · nog geen back-ups" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "Nog geen mappen geback-upt" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "{n} map in back-up" msgstr[1] "{n} mappen in back-up" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "{folders} · {n} wacht op de eerste synchronisatie" msgstr[1] "{folders} · {n} wachten op de eerste synchronisatie" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "{folders} · {n} vereist aandacht" msgstr[1] "{folders} · {n} vereisen aandacht" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "synchroniseren…" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "synchronisatiefout" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "vereist aandacht" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "wacht op eerste synchronisatie" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "bijgewerkt" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "controleren op wijzigingen…" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "controleren op wijzigingen — {n} item gecontroleerd" msgstr[1] "controleren op wijzigingen — {n} items gecontroleerd" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "controleren op wijzigingen — {done} van {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "synchroniseren: {done} van {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "{file} synchroniseren — {done} van {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Map toevoegen aan synchronisatie" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Map synchroniseren…" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "Kon map niet toevoegen" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "Kon mappen om terug te zetten niet weergeven" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2418,19 +2411,19 @@ msgstr "" "Vink de mappen aan die je met dit apparaat wilt synchroniseren en pas aan " "waar elke map moet komen." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Mappen herstellen" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Terugzetten" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Mappen terugzetten…" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2439,38 +2432,45 @@ msgstr "" "Van deze mappen is een back-up gemaakt vanaf “{name}”. Teruggezette mappen " "blijven synchroniseren met de kopie van die computer." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "" "Van deze mappen is een back-up gemaakt onder deze computer in Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" "Niets om terug te zetten — de mappen van “{name}” worden hier al allemaal " "gesynchroniseerd." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" "Niets om terug te zetten — de mappen van deze computer worden hier al " "allemaal gesynchroniseerd." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "Map wordt alleen online" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "Map wordt gedownload en blijft gesynchroniseerd" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "Kon modus niet wijzigen" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "Synchroniseren van “{path}” stoppen? Zowel de lokale bestanden als de map in Mijn bestanden blijven behouden." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2487,7 +2487,7 @@ msgstr "" "kopie houden, annuleer dan, zet de map op Gesynchroniseerd en wacht tot de " "download klaar is voordat je hem verwijdert." -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2500,68 +2500,68 @@ msgstr "" "De lokale bestanden blijven op deze schijf en worden gewoon niet meer " "gesynchroniseerd. Kies of je ook de kopie in Proton Drive wilt verwijderen." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "Synchroniseren van map stoppen?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Ook uit Proton Drive verwijderen" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Verwijdert de enige kopie van deze bestanden." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "De lokale kopie blijft ongewijzigd." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Synchroniseren stoppen" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "Synchroniseren van map gestopt" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "Kon het synchroniseren van de map niet stoppen" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Computer hernoemen" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "“{name}” hernoemen." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "Kon de computer niet hernoemen" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "Een naam is vereist." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Computer hernoemd" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Typ “{name}” om te bevestigen" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "Computer verwijderen?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2576,26 +2576,26 @@ msgstr "" "mee verwijderd. De bestanden op die computer zelf blijven onaangeroerd — " "maar dit kan hier niet ongedaan worden gemaakt." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Verwijderen" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Computer verwijderd" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "Kon de computer niet verwijderen" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "Deze back-up hier voortzetten?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2614,25 +2614,25 @@ msgstr "" "gesynchroniseerd, worden niet verplaatst. Gebruik daarna “Terugzetten op " "deze computer” om terug te halen wat “{name}” synchroniseerde." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Hier voortzetten" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Back-up nu als “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "Kon die back-up hier niet voortzetten" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "Synchroniseren met deze computer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2649,25 +2649,25 @@ msgstr "" "Proton Drive. Mappen die hier al worden gesynchroniseerd, blijven waar ze " "zijn. Daarna kiest u welke van zijn mappen u hier synchroniseert." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Hier synchroniseren" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Nu gesynchroniseerd met “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "Kon niet synchroniseren met die computer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "Back-up naar deze computer verplaatsen?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2683,12 +2683,12 @@ msgstr "" "Stop Proton Drive eerst op “{name}”. Anders ziet het zijn mappen verdwijnen." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Back-up van “{name}” verplaatst" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "Kon die back-up niet verplaatsen" @@ -3277,58 +3277,58 @@ msgstr "Openen in Bestanden" msgid "Change Location…" msgstr "Locatie wijzigen…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "Kiezen of deze map een volledige kopie op deze computer houdt" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Elk bestand op deze computer en in Proton Drive bewaren." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "" "De bestanden in Proton Drive bewaren en elk bestand downloaden zodra je het " "opent." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "Alleen online" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Gesynchroniseerd" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Nu synchroniseren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Synchronisatie hervatten" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Synchronisatie pauzeren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Opnieuw synchroniseren…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Synchroniseren stoppen…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "Opnieuw synchroniseren?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3340,20 +3340,20 @@ msgstr "" "bestand dat maar aan één kant staat, wordt naar de andere kant gekopieerd, " "en van een bestand dat verschilt blijven beide versies bewaard." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Opnieuw synchroniseren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "Kon de map niet opnieuw synchroniseren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "Map alleen online maken?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3362,11 +3362,11 @@ msgstr "" "Bestanden in {path} worden van deze computer verwijderd en alleen in Proton " "Drive bewaard. Elk bestand wordt opnieuw gedownload wanneer je het opent." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Alleen online maken" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3375,62 +3375,66 @@ msgstr "" "Elk bestand in {path} wordt naar deze computer gedownload en blijft " "gesynchroniseerd. Er is {free} vrij op deze schijf." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" "Elk bestand in {path} wordt naar deze computer gedownload en blijft " "gesynchroniseerd." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "Map downloaden?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Downloaden" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "Kon de map niet pauzeren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "Kon de map niet hervatten" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Map gepauzeerd" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Map hervat" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "Kon niet synchroniseren" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Gedeelde map" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "Spiegel van Mijn bestanden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Wordt alleen online" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Overschakelen naar gesynchroniseerd" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "gepauzeerd" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "niet beschikbaar" @@ -6622,6 +6626,12 @@ msgstr "{count}j" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "kan de achtergronddienst van Proton Drive niet bereiken: {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} afbeelding" +#~ msgstr[1] "{n} afbeeldingen" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " diff --git a/po/pdfs.pot b/po/pdfs.pot index ebeac28..ef6e2a0 100644 --- a/po/pdfs.pot +++ b/po/pdfs.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: proton-drive-linux 3.7.0\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" -"POT-Creation-Date: 2026-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -65,9 +65,9 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -219,21 +219,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -311,7 +311,7 @@ msgid "Back / forward" msgstr "" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "" @@ -321,9 +321,9 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "" @@ -526,9 +526,9 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -549,8 +549,8 @@ msgid "Couldn't read activity" msgstr "" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -699,7 +699,7 @@ msgid "Couldn't add a sync folder" msgstr "" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "" @@ -1274,24 +1274,24 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1343,7 +1343,7 @@ msgid "Album name" msgstr "" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "" @@ -1470,7 +1470,7 @@ msgid "Forward (Alt+Right)" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "" @@ -1563,7 +1563,7 @@ msgid "Cancel thumbnail build" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "" @@ -1619,10 +1619,10 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1881,289 +1881,16 @@ msgid "The Proton Drive service stopped reporting thumbnail progress." msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "" -msgstr[1] "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "" -msgstr[1] "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "" -msgstr[1] "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "" -msgstr[1] "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "" -msgstr[1] "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "" -msgstr[1] "" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "" -msgstr[1] "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "" -msgstr[1] "" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "" -msgstr[1] "" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "" -msgstr[1] "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "" -msgstr[1] "" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2171,18 +1898,286 @@ msgid_plural "{n} files" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 #, rust-format -msgid "{files} ({size})" +msgid "Scanning {root}… {folders}, {images}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "" +msgstr[1] "" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format -msgid "{folders}, {files}" +msgid "{files} ({size})" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format +msgid "{folders}, {files}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 +#, rust-format msgid "{folders}, {files} ({size})" msgstr "" @@ -2260,149 +2255,156 @@ msgstr "" msgid "{platform} · no backups yet" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " "with that computer's copy." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2413,7 +2415,7 @@ msgid "" "finish before removing it." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2422,68 +2424,68 @@ msgid "" "whether to also delete the copy in Proton Drive." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2493,26 +2495,26 @@ msgid "" "here." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2524,25 +2526,25 @@ msgid "" "syncing." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2553,25 +2555,25 @@ msgid "" "its folders to sync here." msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2582,12 +2584,12 @@ msgid "" msgstr "" #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "" @@ -3130,56 +3132,56 @@ msgstr "" msgid "Change Location…" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "" #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3187,91 +3189,95 @@ msgid "" "is copied to the other, and a file that differs keeps both versions." msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " "only. Each file downloads again when you open it." msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " "is free on this disk." msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "" diff --git a/po/pl.po b/po/pl.po index df3a2e9..219e573 100644 --- a/po/pl.po +++ b/po/pl.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Polish\n" @@ -64,9 +64,9 @@ msgstr "%A, %-d %B %Y, %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -247,21 +247,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -339,7 +339,7 @@ msgid "Back / forward" msgstr "Wstecz/dalej" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Katalog nadrzędny" @@ -349,9 +349,9 @@ msgstr "Siatka/lista" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Zmień nazwę" @@ -576,9 +576,9 @@ msgstr "Opcje widoku" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -599,8 +599,8 @@ msgid "Couldn't read activity" msgstr "Nie można odczytać aktywności" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -761,7 +761,7 @@ msgid "Couldn't add a sync folder" msgstr "Nie można dodać katalogu synchronizacji" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "Nie można przywrócić katalogów" @@ -1362,24 +1362,24 @@ msgstr "Nie można wczytać albumów" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1431,7 +1431,7 @@ msgid "Album name" msgstr "Nazwa albumu" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Utwórz" @@ -1563,7 +1563,7 @@ msgid "Forward (Alt+Right)" msgstr "Dalej (Alt+Strzałka w prawo)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "Nowy katalog" @@ -1656,7 +1656,7 @@ msgid "Cancel thumbnail build" msgstr "Anuluj tworzenie miniatur" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Przeszukaj tylko ten katalog" @@ -1714,10 +1714,10 @@ msgstr "Nie można przenieść do kosza" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1986,7 +1986,7 @@ msgid "The Proton Drive service stopped reporting thumbnail progress." msgstr "Usługa Proton Drive przestała zgłaszać postęp miniatur." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" @@ -1994,294 +1994,9 @@ msgstr[0] "{n} katalog" msgstr[1] "{n} katalogi" msgstr[2] "{n} katalogów" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} obraz" -msgstr[1] "{n} obrazy" -msgstr[2] "{n} obrazów" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "Skanowanie {root}… {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Tworzenie miniatur w {root}… {done} z {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Miniatury gotowe dla {n} obrazu w {root}" -msgstr[1] "Miniatury gotowe dla {n} obrazów w {root}" -msgstr[2] "Miniatury gotowe dla {n} obrazów w {root}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "Miniatury gotowe dla {n} obrazu w {root}; niedostępne: {failed}" -msgstr[1] "Miniatury gotowe dla {n} obrazów w {root}; niedostępne: {failed}" -msgstr[2] "Miniatury gotowe dla {n} obrazów w {root}; niedostępne: {failed}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "Nowa nazwa" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Zmieniono nazwę na „{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "Nie można zmienić nazwy" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "Przenieś „{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Proszę wybrać katalog docelowy." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Przenieś tutaj" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "Przenieś {n} element" -msgstr[1] "Przenieś {n} elementy" -msgstr[2] "Przenieś {n} elementów" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "Skopiuj „{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Proszę wybrać katalog, do którego skopiować." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Skopiuj tutaj" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "Skopiuj {n} element" -msgstr[1] "Skopiuj {n} elementy" -msgstr[2] "Skopiuj {n} elementów" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Lokalizacje" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "Nie można odczytać tego katalogu." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "Brak katalogów." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "Nie można przenieść" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "Przeniesiono {n} element do {place}, ale nie wszystkie" -msgstr[1] "Przeniesiono {n} elementy do {place}, ale nie wszystkie" -msgstr[2] "Przeniesiono {n} elementów do {place}, ale nie wszystkie" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Przeniesiono do {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "Przeniesiono {n} element do {place}" -msgstr[1] "Przeniesiono {n} elementy do {place}" -msgstr[2] "Przeniesiono {n} elementów do {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "Nie można skopiować" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "Skopiowano {n} element do {place}, ale nie wszystkie" -msgstr[1] "Skopiowano {n} elementy do {place}, ale nie wszystkie" -msgstr[2] "Skopiowano {n} elementów do {place}, ale nie wszystkie" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Skopiowano do {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "Skopiowano {n} element do {place}" -msgstr[1] "Skopiowano {n} elementy do {place}" -msgstr[2] "Skopiowano {n} elementów do {place}" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "„{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Utwórz katalog w bieżącym katalogu." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Nazwa katalogu" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "Utworzono „{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "Nie można utworzyć katalogu" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Wysyłanie plików" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Wysyłanie katalogu" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "Nie można wysłać" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Wysyłanie…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "Wysyłanie {n} elementu…" -msgstr[1] "Wysyłanie {n} elementów…" -msgstr[2] "Wysyłanie {n} elementów…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "Wyświetl" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Przeniesiono do „{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Odczytywanie tego katalogu." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Katalog jest niedostępny" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "Nie można otworzyć tego katalogu" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "Ten katalog jest pusty" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" -"Można upuścić tutaj pliki, wysłać plik lub utworzyć katalog, aby zacząć." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Szukaj wszędzie" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Wyszukiwanie…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Wyszukiwanie „{query}”." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary} — wyświetlanie pierwszego {n} wyniku wyszukiwania" -msgstr[1] "{summary} — wyświetlanie pierwszych {n} wyników wyszukiwania" -msgstr[2] "{summary} — wyświetlanie pierwszych {n} wyników wyszukiwania" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary} — wyniki wyszukiwania" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "Brak wyników" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "Żadne pliki ani katalogi nie pasują do wyszukiwania." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2290,17 +2005,296 @@ msgstr[0] "{n} plik" msgstr[1] "{n} pliki" msgstr[2] "{n} plików" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Skanowanie {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Tworzenie miniatur w {root}… {done} z {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Miniatury gotowe dla {n} pliku w {root}" +msgstr[1] "Miniatury gotowe dla {n} plików w {root}" +msgstr[2] "Miniatury gotowe dla {n} plików w {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Miniatury gotowe dla {n} pliku w {root}; niedostępne: {failed}" +msgstr[1] "Miniatury gotowe dla {n} plików w {root}; niedostępne: {failed}" +msgstr[2] "Miniatury gotowe dla {n} plików w {root}; niedostępne: {failed}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "Nowa nazwa" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Zmieniono nazwę na „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "Nie można zmienić nazwy" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "Przenieś „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Proszę wybrać katalog docelowy." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Przenieś tutaj" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Przenieś {n} element" +msgstr[1] "Przenieś {n} elementy" +msgstr[2] "Przenieś {n} elementów" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "Skopiuj „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Proszę wybrać katalog, do którego skopiować." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Skopiuj tutaj" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "Skopiuj {n} element" +msgstr[1] "Skopiuj {n} elementy" +msgstr[2] "Skopiuj {n} elementów" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Lokalizacje" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "Nie można odczytać tego katalogu." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "Brak katalogów." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "Nie można przenieść" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "Przeniesiono {n} element do {place}, ale nie wszystkie" +msgstr[1] "Przeniesiono {n} elementy do {place}, ale nie wszystkie" +msgstr[2] "Przeniesiono {n} elementów do {place}, ale nie wszystkie" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Przeniesiono do {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "Przeniesiono {n} element do {place}" +msgstr[1] "Przeniesiono {n} elementy do {place}" +msgstr[2] "Przeniesiono {n} elementów do {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "Nie można skopiować" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "Skopiowano {n} element do {place}, ale nie wszystkie" +msgstr[1] "Skopiowano {n} elementy do {place}, ale nie wszystkie" +msgstr[2] "Skopiowano {n} elementów do {place}, ale nie wszystkie" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Skopiowano do {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "Skopiowano {n} element do {place}" +msgstr[1] "Skopiowano {n} elementy do {place}" +msgstr[2] "Skopiowano {n} elementów do {place}" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "„{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Utwórz katalog w bieżącym katalogu." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Nazwa katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "Utworzono „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "Nie można utworzyć katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Wysyłanie plików" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Wysyłanie katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "Nie można wysłać" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Wysyłanie…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Wysyłanie {n} elementu…" +msgstr[1] "Wysyłanie {n} elementów…" +msgstr[2] "Wysyłanie {n} elementów…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "Wyświetl" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Przeniesiono do „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Odczytywanie tego katalogu." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Katalog jest niedostępny" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "Nie można otworzyć tego katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "Ten katalog jest pusty" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Można upuścić tutaj pliki, wysłać plik lub utworzyć katalog, aby zacząć." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Szukaj wszędzie" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Wyszukiwanie…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Wyszukiwanie „{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — wyświetlanie pierwszego {n} wyniku wyszukiwania" +msgstr[1] "{summary} — wyświetlanie pierwszych {n} wyników wyszukiwania" +msgstr[2] "{summary} — wyświetlanie pierwszych {n} wyników wyszukiwania" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — wyniki wyszukiwania" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "Brak wyników" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "Żadne pliki ani katalogi nie pasują do wyszukiwania." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2380,11 +2374,11 @@ msgstr "{platform} · ostatnia kopia zapasowa: {time}" msgid "{platform} · no backups yet" msgstr "{platform} · brak kopii zapasowych" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "Brak zarchiwizowanych katalogów" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" @@ -2392,7 +2386,7 @@ msgstr[0] "{n} katalog z kopią zapasową" msgstr[1] "{n} katalogi z kopią zapasową" msgstr[2] "{n} katalogów z kopią zapasową" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" @@ -2400,7 +2394,7 @@ msgstr[0] "{folders} · {n} czeka na pierwszą synchronizację" msgstr[1] "{folders} · {n} czekają na pierwszą synchronizację" msgstr[2] "{folders} · {n} czeka na pierwszą synchronizację" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" @@ -2408,31 +2402,31 @@ msgstr[0] "{folders} · {n} wymaga uwagi" msgstr[1] "{folders} · {n} wymagają uwagi" msgstr[2] "{folders} · {n} wymaga uwagi" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "synchronizowanie…" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "błąd synchronizacji" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "wymaga uwagi" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "oczekiwanie na pierwszą synchronizację" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "aktualne" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "sprawdzanie zmian…" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" @@ -2440,42 +2434,42 @@ msgstr[0] "sprawdzanie zmian — sprawdzono {n} element" msgstr[1] "sprawdzanie zmian — sprawdzono {n} elementy" msgstr[2] "sprawdzanie zmian — sprawdzono {n} elementów" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "sprawdzanie zmian — {done} z {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "synchronizowanie {done} z {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "synchronizowanie {file} — {done} z {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Dodaj katalog do synchronizacji" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Synchronizowanie katalogu…" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "Nie można dodać katalogu" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "Nie można wyświetlić listy katalogów do przywrócenia" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2483,19 +2477,19 @@ msgstr "" "Należy zaznaczyć katalogi do synchronizacji z tym komputerem i dostosować " "położenie każdego z nich." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Przywróć katalogi" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Przywróć" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Przywracanie katalogów…" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2504,37 +2498,44 @@ msgstr "" "Te katalogi mają kopię zapasową z komputera „{name}”. Przywrócone katalogi " "nadal będą synchronizowane z kopią tego komputera." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "Te katalogi mają kopię zapasową w Proton Drive pod tym komputerem." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" "Nie ma nic do przywrócenia — wszystkie katalogi komputera „{name}” są tutaj " "synchronizowane." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" "Nie ma nic do przywrócenia — wszystkie katalogi tego komputera są tutaj " "synchronizowane." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "Katalog przejdzie w tryb tylko online" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "Katalog zostanie pobrany i będzie synchronizowany" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "Nie można zmienić trybu" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "Zatrzymać synchronizację „{path}”? Zarówno pliki lokalne, jak i katalog w Moich plikach zostaną zachowane." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2551,7 +2552,7 @@ msgstr "" "pusty. Aby zachować lokalną kopię, należy anulować, przełączyć katalog na " "tryb Synchronizowany i poczekać na ukończenie pobierania przed usunięciem." -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2564,68 +2565,68 @@ msgstr "" "Lokalne pliki pozostaną na tym dysku i po prostu przestaną być " "synchronizowane. Można też usunąć kopię w Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "Zatrzymać synchronizację katalogu?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Usuń także z Proton Drive" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Usuwa jedyną kopię tych plików." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "Lokalna kopia pozostanie bez zmian." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Zatrzymaj synchronizację" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "Zatrzymano synchronizację katalogu" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "Nie można zatrzymać synchronizacji katalogu" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Zmiana nazwy komputera" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "Proszę podać nową nazwę komputera „{name}”." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "Nie można zmienić nazwy komputera" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "Nazwa jest wymagana." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Zmieniono nazwę komputera" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Proszę wpisać „{name}”, aby potwierdzić" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "Usunąć komputer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2640,26 +2641,26 @@ msgstr "" "z nim. Pliki na samym komputerze pozostaną nietknięte — ale tej operacji nie " "można tutaj cofnąć." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Usuń" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Usunięto komputer" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "Nie można usunąć komputera" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "Kontynuować tę kopię zapasową tutaj?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2678,25 +2679,25 @@ msgstr "" "przeniesione. Aby odzyskać to, co synchronizował „{name}”, proszę potem użyć " "opcji „Przywróć na tym komputerze”." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Kontynuuj tutaj" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Kopia zapasowa jest teraz tworzona jako „{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "Nie można kontynuować tej kopii zapasowej tutaj" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "Synchronizować z tym komputerem?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2713,25 +2714,25 @@ msgstr "" "Drive. Katalogi już tu synchronizowane zostaną tam, gdzie są. Następnie " "proszę wybrać, które z jego katalogów synchronizować tutaj." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Synchronizuj tutaj" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Teraz synchronizowane z „{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "Nie można synchronizować z tym komputerem" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "Przenieść kopię zapasową na ten komputer?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2749,12 +2750,12 @@ msgstr "" "jego foldery znikają." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Przeniesiono kopię zapasową „{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "Nie można przenieść tej kopii zapasowej" @@ -3349,56 +3350,56 @@ msgstr "Otwórz w Plikach" msgid "Change Location…" msgstr "Zmień położenie…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "Wybierz, czy ten katalog przechowuje pełną kopię na tym komputerze" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Przechowuj każdy plik na tym komputerze i w Proton Drive." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "Przechowuj pliki w Proton Drive i pobieraj każdy przy jego otwarciu." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "Tylko online" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Synchronizowany" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Synchronizuj teraz" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Wznów synchronizację" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Wstrzymaj synchronizację" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Synchronizuj od nowa…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Zatrzymaj synchronizację…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "Synchronizować od nowa?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3410,20 +3411,20 @@ msgstr "" "jest tylko po jednej stronie, zostanie skopiowany na drugą, a z pliku, który " "się różni, zostaną zachowane obie wersje." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Synchronizuj od nowa" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "Nie można zsynchronizować katalogu od nowa" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "Oznaczyć katalog jako tylko online?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3432,11 +3433,11 @@ msgstr "" "Pliki w {path} zostaną usunięte z tego komputera i będą przechowywane tylko " "w Proton Drive. Każdy plik zostanie ponownie pobrany przy otwarciu." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Oznacz jako tylko online" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3445,62 +3446,66 @@ msgstr "" "Każdy plik w {path} zostanie pobrany na ten komputer i pozostanie " "synchronizowany. Wolne miejsce na tym dysku: {free}." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" "Każdy plik w {path} zostanie pobrany na ten komputer i pozostanie " "synchronizowany." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "Pobrać katalog?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Pobierz" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "Nie można wstrzymać katalogu" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "Nie można wznowić katalogu" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Wstrzymano katalog" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Wznowiono katalog" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "Nie można zsynchronizować" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Udostępniony katalog" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "Kopia lustrzana Moich plików" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Przechodzenie w tryb tylko online" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Przełączanie na synchronizację" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "wstrzymany" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "niedostępne" @@ -6736,6 +6741,13 @@ msgstr "{count} r." msgid "cannot reach the Proton Drive daemon: {error}" msgstr "nie można połączyć się z usługą Proton Drive: {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} obraz" +#~ msgstr[1] "{n} obrazy" +#~ msgstr[2] "{n} obrazów" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " diff --git a/po/pt_BR.po b/po/pt_BR.po index 2789e0b..f575cd9 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -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-11-01 17:51+0100\n" +"POT-Creation-Date: 2026-11-14 01:56+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Portuguese (Brazil)\n" @@ -62,9 +62,9 @@ msgstr "%A, %-d de %B de %Y, %H:%M" #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 #: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2167 -#: crates/pdfs-gui/src/app/pages/browser.rs:2246 -#: crates/pdfs-gui/src/app/pages/locations.rs:1717 +#: crates/pdfs-gui/src/app/pages/browser.rs:2168 +#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" @@ -242,21 +242,21 @@ msgstr "" #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1730 #: 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:1917 -#: crates/pdfs-gui/src/app/pages/browser.rs:2039 -#: crates/pdfs-gui/src/app/pages/browser.rs:2540 -#: crates/pdfs-gui/src/app/pages/devices.rs:826 -#: crates/pdfs-gui/src/app/pages/devices.rs:979 -#: crates/pdfs-gui/src/app/pages/devices.rs:1017 -#: crates/pdfs-gui/src/app/pages/devices.rs:1069 -#: crates/pdfs-gui/src/app/pages/devices.rs:1113 -#: crates/pdfs-gui/src/app/pages/devices.rs:1153 -#: crates/pdfs-gui/src/app/pages/devices.rs:1216 +#: crates/pdfs-gui/src/app/pages/browser.rs:1918 +#: crates/pdfs-gui/src/app/pages/browser.rs:2040 +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1031 +#: crates/pdfs-gui/src/app/pages/devices.rs:1083 +#: crates/pdfs-gui/src/app/pages/devices.rs:1127 +#: crates/pdfs-gui/src/app/pages/devices.rs:1167 +#: crates/pdfs-gui/src/app/pages/devices.rs:1230 #: crates/pdfs-gui/src/app/pages/locations.rs:850 #: crates/pdfs-gui/src/app/pages/locations.rs:1054 -#: crates/pdfs-gui/src/app/pages/locations.rs:1537 -#: crates/pdfs-gui/src/app/pages/locations.rs:1581 -#: crates/pdfs-gui/src/app/pages/locations.rs:1631 +#: crates/pdfs-gui/src/app/pages/locations.rs:1541 +#: crates/pdfs-gui/src/app/pages/locations.rs:1585 +#: crates/pdfs-gui/src/app/pages/locations.rs:1635 #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 @@ -334,7 +334,7 @@ msgid "Back / forward" msgstr "Voltar / avançar" #: crates/pdfs-gui/src/app/main.rs:1524 -#: crates/pdfs-gui/src/app/pages/browser.rs:2014 +#: crates/pdfs-gui/src/app/pages/browser.rs:2015 msgid "Parent folder" msgstr "Pasta superior" @@ -344,9 +344,9 @@ msgstr "Grade / lista" #: crates/pdfs-gui/src/app/main.rs:1526 #: crates/pdfs-gui/src/app/pages/albums.rs:298 -#: crates/pdfs-gui/src/app/pages/browser.rs:1896 -#: crates/pdfs-gui/src/app/pages/browser.rs:1918 -#: crates/pdfs-gui/src/app/pages/devices.rs:1018 +#: crates/pdfs-gui/src/app/pages/browser.rs:1897 +#: crates/pdfs-gui/src/app/pages/browser.rs:1919 +#: crates/pdfs-gui/src/app/pages/devices.rs:1032 #: crates/pdfs-gui/src/app/widgets/details.rs:161 msgid "Rename" msgstr "Renomear" @@ -564,9 +564,9 @@ msgstr "Opções de exibição" #: crates/pdfs-gui/src/app/pages/activity.rs:441 #: crates/pdfs-gui/src/app/pages/browser.rs:385 -#: crates/pdfs-gui/src/app/pages/browser.rs:2188 -#: crates/pdfs-gui/src/app/pages/browser.rs:2803 -#: crates/pdfs-gui/src/app/pages/browser.rs:2807 +#: crates/pdfs-gui/src/app/pages/browser.rs:2189 +#: crates/pdfs-gui/src/app/pages/browser.rs:2808 +#: crates/pdfs-gui/src/app/pages/browser.rs:2812 #: crates/pdfs-gui/src/app/pages/devices.rs:327 #: crates/pdfs-gui/src/app/pages/locations.rs:198 #: crates/pdfs-gui/src/app/pages/locations.rs:1166 @@ -587,8 +587,8 @@ msgid "Couldn't read activity" msgstr "Não foi possível ler a atividade" #: crates/pdfs-gui/src/app/pages/activity.rs:472 -#: crates/pdfs-gui/src/app/pages/browser.rs:2839 -#: crates/pdfs-gui/src/app/pages/browser.rs:3021 +#: crates/pdfs-gui/src/app/pages/browser.rs:2844 +#: crates/pdfs-gui/src/app/pages/browser.rs:3026 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 #: crates/pdfs-gui/src/app/pages/photos.rs:3442 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 @@ -739,7 +739,7 @@ msgid "Couldn't add a sync folder" msgstr "Não foi possível adicionar uma pasta sincronizada" #: crates/pdfs-gui/src/app/pages/activity_text.rs:58 -#: crates/pdfs-gui/src/app/pages/devices.rs:861 +#: crates/pdfs-gui/src/app/pages/devices.rs:862 msgid "Couldn't restore folders" msgstr "Não foi possível restaurar as pastas" @@ -1328,24 +1328,24 @@ msgstr "Não foi possível carregar os álbuns" #: crates/pdfs-gui/src/app/pages/browser.rs:1210 #: crates/pdfs-gui/src/app/pages/browser.rs:1635 #: crates/pdfs-gui/src/app/pages/browser.rs:1673 -#: crates/pdfs-gui/src/app/pages/browser.rs:1873 -#: crates/pdfs-gui/src/app/pages/browser.rs:2500 -#: crates/pdfs-gui/src/app/pages/browser.rs:2650 -#: crates/pdfs-gui/src/app/pages/devices.rs:729 -#: crates/pdfs-gui/src/app/pages/devices.rs:769 -#: crates/pdfs-gui/src/app/pages/devices.rs:922 -#: crates/pdfs-gui/src/app/pages/devices.rs:1192 -#: crates/pdfs-gui/src/app/pages/devices.rs:1253 -#: crates/pdfs-gui/src/app/pages/devices.rs:1282 +#: crates/pdfs-gui/src/app/pages/browser.rs:1874 +#: crates/pdfs-gui/src/app/pages/browser.rs:2501 +#: crates/pdfs-gui/src/app/pages/browser.rs:2651 +#: crates/pdfs-gui/src/app/pages/devices.rs:730 +#: crates/pdfs-gui/src/app/pages/devices.rs:770 +#: crates/pdfs-gui/src/app/pages/devices.rs:923 +#: crates/pdfs-gui/src/app/pages/devices.rs:1206 +#: crates/pdfs-gui/src/app/pages/devices.rs:1267 +#: crates/pdfs-gui/src/app/pages/devices.rs:1296 #: crates/pdfs-gui/src/app/pages/duplicates.rs:221 #: crates/pdfs-gui/src/app/pages/locations.rs:577 #: crates/pdfs-gui/src/app/pages/locations.rs:824 #: crates/pdfs-gui/src/app/pages/locations.rs:881 #: crates/pdfs-gui/src/app/pages/locations.rs:904 #: crates/pdfs-gui/src/app/pages/locations.rs:1123 -#: crates/pdfs-gui/src/app/pages/locations.rs:1566 -#: crates/pdfs-gui/src/app/pages/locations.rs:1673 -#: crates/pdfs-gui/src/app/pages/locations.rs:1693 +#: crates/pdfs-gui/src/app/pages/locations.rs:1570 +#: crates/pdfs-gui/src/app/pages/locations.rs:1677 +#: crates/pdfs-gui/src/app/pages/locations.rs:1697 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 #: crates/pdfs-gui/src/app/pages/photos.rs:1421 #: crates/pdfs-gui/src/app/pages/photos.rs:2141 @@ -1397,7 +1397,7 @@ msgid "Album name" msgstr "Nome do álbum" #: crates/pdfs-gui/src/app/pages/albums.rs:265 -#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#: crates/pdfs-gui/src/app/pages/browser.rs:2542 msgid "Create" msgstr "Criar" @@ -1524,7 +1524,7 @@ msgid "Forward (Alt+Right)" msgstr "Avançar (Alt+Direita)" #: crates/pdfs-gui/src/app/pages/browser.rs:176 -#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2531 msgid "New Folder" msgstr "Nova pasta" @@ -1617,7 +1617,7 @@ msgid "Cancel thumbnail build" msgstr "Cancelar geração de miniaturas" #: crates/pdfs-gui/src/app/pages/browser.rs:255 -#: crates/pdfs-gui/src/app/pages/browser.rs:2952 +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 msgid "Search this folder only" msgstr "Pesquisar somente nesta pasta" @@ -1673,10 +1673,10 @@ msgstr "Não foi possível mover para a lixeira" #: crates/pdfs-gui/src/app/pages/browser.rs:572 #: crates/pdfs-gui/src/app/pages/browser.rs:1602 -#: crates/pdfs-gui/src/app/pages/browser.rs:1851 -#: crates/pdfs-gui/src/app/pages/browser.rs:2376 -#: crates/pdfs-gui/src/app/pages/browser.rs:2432 -#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:1852 +#: crates/pdfs-gui/src/app/pages/browser.rs:2377 +#: crates/pdfs-gui/src/app/pages/browser.rs:2433 +#: crates/pdfs-gui/src/app/pages/browser.rs:2621 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:341 #: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 msgid "Proton Drive isn't connected." @@ -1936,292 +1936,16 @@ msgstr "" "O serviço do Proton Drive parou de informar o progresso das miniaturas." #: crates/pdfs-gui/src/app/pages/browser.rs:1730 -#: crates/pdfs-gui/src/app/pages/browser.rs:3095 +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 #, rust-format msgid "{n} folder" msgid_plural "{n} folders" msgstr[0] "{n} pasta" msgstr[1] "{n} pastas" -#: crates/pdfs-gui/src/app/pages/browser.rs:1731 -#, rust-format -msgid "{n} image" -msgid_plural "{n} images" -msgstr[0] "{n} imagem" -msgstr[1] "{n} imagens" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1734 -#, rust-format -msgid "Scanning {root}… {folders}, {images}" -msgstr "Examinando {root}… {folders}, {images}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1748 -#, rust-format -msgid "Building thumbnails in {root}… {done} of {total}" -msgstr "Gerando miniaturas em {root}… {done} de {total}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1761 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}" -msgid_plural "Thumbnails ready for {n} images in {root}" -msgstr[0] "Miniaturas prontas para {n} imagem em {root}" -msgstr[1] "Miniaturas prontas para {n} imagens em {root}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1768 -#, rust-format -msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" -msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" -msgstr[0] "" -"Miniaturas prontas para {n} imagem em {root}; {failed} indisponíveis" -msgstr[1] "" -"Miniaturas prontas para {n} imagens em {root}; {failed} indisponíveis" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1778 -#, rust-format -msgid "{status}. {message}" -msgstr "{status}. {message}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1900 -#: crates/pdfs-gui/src/app/pages/devices.rs:1011 -msgid "New name" -msgstr "Novo nome" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1932 -#, rust-format -msgid "Renamed to “{name}”" -msgstr "Renomeado para “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1940 -msgid "Couldn't rename" -msgstr "Não foi possível renomear" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1987 -#, rust-format -msgid "Move “{name}”" -msgstr "Mover “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1988 -#: crates/pdfs-gui/src/app/pages/browser.rs:1993 -msgid "Choose the folder to move into." -msgstr "Escolha a pasta de destino." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1989 -#: crates/pdfs-gui/src/app/pages/browser.rs:1994 -#: crates/pdfs-gui/src/app/pages/devices.rs:1217 -msgid "Move Here" -msgstr "Mover para cá" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1992 -#, rust-format -msgid "Move {n} item" -msgid_plural "Move {n} items" -msgstr[0] "Mover {n} item" -msgstr[1] "Mover {n} itens" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1997 -#, rust-format -msgid "Copy “{name}”" -msgstr "Copiar “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:1998 -#: crates/pdfs-gui/src/app/pages/browser.rs:2003 -msgid "Choose the folder to copy into." -msgstr "Escolha a pasta onde copiar." - -#: crates/pdfs-gui/src/app/pages/browser.rs:1999 -#: crates/pdfs-gui/src/app/pages/browser.rs:2004 -msgid "Copy Here" -msgstr "Copiar para cá" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2002 -#, rust-format -msgid "Copy {n} item" -msgid_plural "Copy {n} items" -msgstr[0] "Copiar {n} item" -msgstr[1] "Copiar {n} itens" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2166 -msgid "Locations" -msgstr "Locais" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2211 -msgid "Couldn't read this folder." -msgstr "Não foi possível ler esta pasta." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2239 -msgid "No folders here." -msgstr "Nenhuma pasta aqui." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2375 -#: crates/pdfs-gui/src/app/pages/browser.rs:2395 -#: crates/pdfs-gui/src/app/pages/browser.rs:2746 -msgid "Couldn't move" -msgstr "Não foi possível mover" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2402 -#, rust-format -msgid "Moved {n} item to {place}, but not all" -msgid_plural "Moved {n} items to {place}, but not all" -msgstr[0] "{n} item movido para {place}, mas não todos" -msgstr[1] "{n} itens movidos para {place}, mas não todos" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2410 -#, rust-format -msgid "Moved to {place}" -msgstr "Movido para {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2415 -#, rust-format -msgid "Moved {n} item to {place}" -msgid_plural "Moved {n} items to {place}" -msgstr[0] "{n} item movido para {place}" -msgstr[1] "{n} itens movidos para {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2431 -#: crates/pdfs-gui/src/app/pages/browser.rs:2451 -msgid "Couldn't copy" -msgstr "Não foi possível copiar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2458 -#, rust-format -msgid "Copied {n} item to {place}, but not all" -msgid_plural "Copied {n} items to {place}, but not all" -msgstr[0] "{n} item copiado para {place}, mas não todos" -msgstr[1] "{n} itens copiados para {place}, mas não todos" - -#. Translators: {place} is a quoted folder name or "Proton Drive". -#: crates/pdfs-gui/src/app/pages/browser.rs:2466 -#, rust-format -msgid "Copied to {place}" -msgstr "Copiado para {place}" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2471 -#, rust-format -msgid "Copied {n} item to {place}" -msgid_plural "Copied {n} items to {place}" -msgstr[0] "{n} item copiado para {place}" -msgstr[1] "{n} itens copiados para {place}" - -#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". -#: crates/pdfs-gui/src/app/pages/browser.rs:2515 -#, rust-format -msgid "“{name}”" -msgstr "“{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2531 -msgid "Create a folder in the current directory." -msgstr "Crie uma pasta no diretório atual." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2535 -msgid "Folder name" -msgstr "Nome da pasta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2555 -#, rust-format -msgid "Created “{name}”" -msgstr "“{name}” criada" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2563 -msgid "Couldn't create folder" -msgstr "Não foi possível criar a pasta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2575 -msgid "Upload Files" -msgstr "Enviar arquivos" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2596 -msgid "Upload Folder" -msgstr "Enviar pasta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2619 -#: crates/pdfs-gui/src/app/pages/browser.rs:2645 -#: crates/pdfs-gui/src/app/pages/browser.rs:2649 -msgid "Couldn't upload" -msgstr "Não foi possível enviar" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2635 -msgid "Uploading…" -msgstr "Enviando…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2637 -#, rust-format -msgid "Uploading {n} item…" -msgid_plural "Uploading {n} items…" -msgstr[0] "Enviando {n} item…" -msgstr[1] "Enviando {n} itens…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2640 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 -msgctxt "verb" -msgid "View" -msgstr "Ver" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2738 -#, rust-format -msgid "Moved into “{name}”" -msgstr "Movido para “{name}”" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2808 -#: crates/pdfs-gui/src/app/pages/devices.rs:263 -msgid "Reading this folder." -msgstr "Lendo esta pasta." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2853 -msgid "Folder unavailable" -msgstr "Pasta indisponível" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2857 -msgid "Couldn't open this folder" -msgstr "Não foi possível abrir esta pasta" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2899 -#: crates/pdfs-gui/src/app/pages/devices.rs:101 -#: crates/pdfs-gui/src/app/pages/shared.rs:458 -msgid "This folder is empty" -msgstr "Esta pasta está vazia" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2900 -msgid "Drop files here, or upload a file or create a folder to get started." -msgstr "" -"Solte arquivos aqui, ou envie um arquivo ou crie uma pasta para começar." - -#: crates/pdfs-gui/src/app/pages/browser.rs:2950 -msgid "Search everywhere" -msgstr "Pesquisar em todos os lugares" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2986 -#: crates/pdfs-gui/src/app/pages/browser.rs:2990 -msgid "Searching…" -msgstr "Pesquisando…" - -#: crates/pdfs-gui/src/app/pages/browser.rs:2991 -#, rust-format -msgid "Looking for “{query}”." -msgstr "Procurando por “{query}”." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3047 -#, rust-format -msgid "{summary} — showing the first {n} search result" -msgid_plural "{summary} — showing the first {n} search results" -msgstr[0] "{summary} — mostrando o primeiro resultado da pesquisa" -msgstr[1] "{summary} — mostrando os primeiros {n} resultados da pesquisa" - -#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". -#: crates/pdfs-gui/src/app/pages/browser.rs:3054 -#, rust-format -msgid "{summary} — search results" -msgstr "{summary} — resultados da pesquisa" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3060 -msgid "No matches" -msgstr "Nenhuma correspondência" - -#: crates/pdfs-gui/src/app/pages/browser.rs:3061 -msgid "No files or folders match that search." -msgstr "Nenhum arquivo ou pasta corresponde a essa pesquisa." - -#: crates/pdfs-gui/src/app/pages/browser.rs:3096 +#. Translators: a count of images and videos that can have a thumbnail. +#: crates/pdfs-gui/src/app/pages/browser.rs:1732 +#: crates/pdfs-gui/src/app/pages/browser.rs:3101 #: crates/pdfs-gui/src/i18n.rs:252 #, rust-format msgid "{n} file" @@ -2229,17 +1953,286 @@ msgid_plural "{n} files" msgstr[0] "{n} arquivo" msgstr[1] "{n} arquivos" -#: crates/pdfs-gui/src/app/pages/browser.rs:3102 +#: crates/pdfs-gui/src/app/pages/browser.rs:1735 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Examinando {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1749 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Gerando miniaturas em {root}… {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1762 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}" +msgid_plural "Thumbnails ready for {n} files in {root}" +msgstr[0] "Miniaturas prontas para {n} arquivo em {root}" +msgstr[1] "Miniaturas prontas para {n} arquivos em {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1769 +#, rust-format +msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" +msgstr[0] "Miniaturas prontas para {n} arquivo em {root}; {failed} indisponíveis" +msgstr[1] "Miniaturas prontas para {n} arquivos em {root}; {failed} indisponíveis" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1779 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1901 +#: crates/pdfs-gui/src/app/pages/devices.rs:1025 +msgid "New name" +msgstr "Novo nome" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1933 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renomeado para “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1941 +msgid "Couldn't rename" +msgstr "Não foi possível renomear" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1988 +#, rust-format +msgid "Move “{name}”" +msgstr "Mover “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1989 +#: crates/pdfs-gui/src/app/pages/browser.rs:1994 +msgid "Choose the folder to move into." +msgstr "Escolha a pasta de destino." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1990 +#: crates/pdfs-gui/src/app/pages/browser.rs:1995 +#: crates/pdfs-gui/src/app/pages/devices.rs:1231 +msgid "Move Here" +msgstr "Mover para cá" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1993 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Mover {n} item" +msgstr[1] "Mover {n} itens" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1998 +#, rust-format +msgid "Copy “{name}”" +msgstr "Copiar “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1999 +#: crates/pdfs-gui/src/app/pages/browser.rs:2004 +msgid "Choose the folder to copy into." +msgstr "Escolha a pasta onde copiar." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2000 +#: crates/pdfs-gui/src/app/pages/browser.rs:2005 +msgid "Copy Here" +msgstr "Copiar para cá" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#, rust-format +msgid "Copy {n} item" +msgid_plural "Copy {n} items" +msgstr[0] "Copiar {n} item" +msgstr[1] "Copiar {n} itens" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2167 +msgid "Locations" +msgstr "Locais" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2212 +msgid "Couldn't read this folder." +msgstr "Não foi possível ler esta pasta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2240 +msgid "No folders here." +msgstr "Nenhuma pasta aqui." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2376 +#: crates/pdfs-gui/src/app/pages/browser.rs:2396 +#: crates/pdfs-gui/src/app/pages/browser.rs:2747 +msgid "Couldn't move" +msgstr "Não foi possível mover" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2403 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} item movido para {place}, mas não todos" +msgstr[1] "{n} itens movidos para {place}, mas não todos" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2411 +#, rust-format +msgid "Moved to {place}" +msgstr "Movido para {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2416 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} item movido para {place}" +msgstr[1] "{n} itens movidos para {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2432 +#: crates/pdfs-gui/src/app/pages/browser.rs:2452 +msgid "Couldn't copy" +msgstr "Não foi possível copiar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2459 +#, rust-format +msgid "Copied {n} item to {place}, but not all" +msgid_plural "Copied {n} items to {place}, but not all" +msgstr[0] "{n} item copiado para {place}, mas não todos" +msgstr[1] "{n} itens copiados para {place}, mas não todos" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2467 +#, rust-format +msgid "Copied to {place}" +msgstr "Copiado para {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2472 +#, rust-format +msgid "Copied {n} item to {place}" +msgid_plural "Copied {n} items to {place}" +msgstr[0] "{n} item copiado para {place}" +msgstr[1] "{n} itens copiados para {place}" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2516 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2532 +msgid "Create a folder in the current directory." +msgstr "Crie uma pasta no diretório atual." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2536 +msgid "Folder name" +msgstr "Nome da pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2556 +#, rust-format +msgid "Created “{name}”" +msgstr "“{name}” criada" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2564 +msgid "Couldn't create folder" +msgstr "Não foi possível criar a pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2576 +msgid "Upload Files" +msgstr "Enviar arquivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Upload Folder" +msgstr "Enviar pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2620 +#: crates/pdfs-gui/src/app/pages/browser.rs:2646 +#: crates/pdfs-gui/src/app/pages/browser.rs:2650 +msgid "Couldn't upload" +msgstr "Não foi possível enviar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2636 +msgid "Uploading…" +msgstr "Enviando…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Enviando {n} item…" +msgstr[1] "Enviando {n} itens…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2641 +#: crates/pdfs-gui/src/app/pages/photos.rs:829 +msgctxt "verb" +msgid "View" +msgstr "Ver" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2739 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Movido para “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2813 +#: crates/pdfs-gui/src/app/pages/devices.rs:263 +msgid "Reading this folder." +msgstr "Lendo esta pasta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2858 +msgid "Folder unavailable" +msgstr "Pasta indisponível" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2862 +msgid "Couldn't open this folder" +msgstr "Não foi possível abrir esta pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2904 +#: crates/pdfs-gui/src/app/pages/devices.rs:101 +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "This folder is empty" +msgstr "Esta pasta está vazia" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2905 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Solte arquivos aqui, ou envie um arquivo ou crie uma pasta para começar." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2955 +msgid "Search everywhere" +msgstr "Pesquisar em todos os lugares" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2991 +#: crates/pdfs-gui/src/app/pages/browser.rs:2995 +msgid "Searching…" +msgstr "Pesquisando…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2996 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Procurando por “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3052 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — mostrando o primeiro resultado da pesquisa" +msgstr[1] "{summary} — mostrando os primeiros {n} resultados da pesquisa" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3059 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — resultados da pesquisa" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3065 +msgid "No matches" +msgstr "Nenhuma correspondência" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +msgid "No files or folders match that search." +msgstr "Nenhum arquivo ou pasta corresponde a essa pesquisa." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 #, rust-format msgid "{files} ({size})" msgstr "{files} ({size})" -#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +#: crates/pdfs-gui/src/app/pages/browser.rs:3112 #, rust-format msgid "{folders}, {files}" msgstr "{folders}, {files}" -#: crates/pdfs-gui/src/app/pages/browser.rs:3112 +#: crates/pdfs-gui/src/app/pages/browser.rs:3117 #, rust-format msgid "{folders}, {files} ({size})" msgstr "{folders}, {files} ({size})" @@ -2318,98 +2311,98 @@ msgstr "{platform} · último backup {time}" msgid "{platform} · no backups yet" msgstr "{platform} · nenhum backup ainda" -#: crates/pdfs-gui/src/app/pages/devices.rs:592 +#: crates/pdfs-gui/src/app/pages/devices.rs:593 msgid "No folders backed up yet" msgstr "Nenhuma pasta com backup ainda" -#: crates/pdfs-gui/src/app/pages/devices.rs:595 +#: crates/pdfs-gui/src/app/pages/devices.rs:596 #, rust-format msgid "{n} folder backed up" msgid_plural "{n} folders backed up" msgstr[0] "{n} pasta com backup" msgstr[1] "{n} pastas com backup" -#: crates/pdfs-gui/src/app/pages/devices.rs:607 +#: crates/pdfs-gui/src/app/pages/devices.rs:608 #, rust-format msgid "{folders} · {n} waiting for its first sync" msgid_plural "{folders} · {n} waiting for their first sync" msgstr[0] "{folders} · {n} aguarda a primeira sincronização" msgstr[1] "{folders} · {n} aguardam a primeira sincronização" -#: crates/pdfs-gui/src/app/pages/devices.rs:621 +#: crates/pdfs-gui/src/app/pages/devices.rs:622 #, rust-format msgid "{folders} · {n} needs attention" msgid_plural "{folders} · {n} need attention" msgstr[0] "{folders} · {n} requer atenção" msgstr[1] "{folders} · {n} requerem atenção" -#: crates/pdfs-gui/src/app/pages/devices.rs:640 +#: crates/pdfs-gui/src/app/pages/devices.rs:641 msgid "syncing…" msgstr "sincronizando…" -#: crates/pdfs-gui/src/app/pages/devices.rs:641 +#: crates/pdfs-gui/src/app/pages/devices.rs:642 msgid "sync error" msgstr "erro de sincronização" -#: crates/pdfs-gui/src/app/pages/devices.rs:642 +#: crates/pdfs-gui/src/app/pages/devices.rs:643 msgid "needs attention" msgstr "requer atenção" -#: crates/pdfs-gui/src/app/pages/devices.rs:643 +#: crates/pdfs-gui/src/app/pages/devices.rs:644 msgid "waiting for first sync" msgstr "aguardando a primeira sincronização" -#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#: crates/pdfs-gui/src/app/pages/devices.rs:645 msgid "up to date" msgstr "atualizado" -#: crates/pdfs-gui/src/app/pages/devices.rs:654 +#: crates/pdfs-gui/src/app/pages/devices.rs:655 msgid "checking for changes…" msgstr "verificando alterações…" -#: crates/pdfs-gui/src/app/pages/devices.rs:660 +#: crates/pdfs-gui/src/app/pages/devices.rs:661 #, rust-format msgid "checking for changes — {n} item checked" msgid_plural "checking for changes — {n} items checked" msgstr[0] "verificando alterações — {n} item verificado" msgstr[1] "verificando alterações — {n} itens verificados" -#: crates/pdfs-gui/src/app/pages/devices.rs:667 +#: crates/pdfs-gui/src/app/pages/devices.rs:668 #, rust-format msgid "checking for changes — {done} of {total}" msgstr "verificando alterações — {done} de {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:679 +#: crates/pdfs-gui/src/app/pages/devices.rs:680 #, rust-format msgid "syncing {done} of {total}" msgstr "sincronizando {done} de {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:685 +#: crates/pdfs-gui/src/app/pages/devices.rs:686 #, rust-format msgid "syncing {file} — {done} of {total}" msgstr "sincronizando {file} — {done} de {total}" -#: crates/pdfs-gui/src/app/pages/devices.rs:697 +#: crates/pdfs-gui/src/app/pages/devices.rs:698 msgid "Add Folder to Sync" msgstr "Adicionar pasta à sincronização" -#: crates/pdfs-gui/src/app/pages/devices.rs:721 -#: crates/pdfs-gui/src/app/pages/locations.rs:1559 -#: crates/pdfs-gui/src/app/pages/locations.rs:1686 +#: crates/pdfs-gui/src/app/pages/devices.rs:722 +#: crates/pdfs-gui/src/app/pages/locations.rs:1563 +#: crates/pdfs-gui/src/app/pages/locations.rs:1690 msgid "Syncing folder…" msgstr "Sincronizando pasta…" -#: crates/pdfs-gui/src/app/pages/devices.rs:724 -#: crates/pdfs-gui/src/app/pages/devices.rs:728 +#: crates/pdfs-gui/src/app/pages/devices.rs:725 +#: crates/pdfs-gui/src/app/pages/devices.rs:729 msgid "Couldn't add folder" msgstr "Não foi possível adicionar a pasta" -#: crates/pdfs-gui/src/app/pages/devices.rs:762 -#: crates/pdfs-gui/src/app/pages/devices.rs:768 +#: crates/pdfs-gui/src/app/pages/devices.rs:763 +#: crates/pdfs-gui/src/app/pages/devices.rs:769 msgid "Couldn't list folders to restore" msgstr "Não foi possível listar as pastas para restaurar" -#: crates/pdfs-gui/src/app/pages/devices.rs:794 +#: crates/pdfs-gui/src/app/pages/devices.rs:795 msgid "" "Tick the folders to sync to this machine, and adjust where each one should " "live." @@ -2417,19 +2410,19 @@ msgstr "" "Marque as pastas a sincronizar com esta máquina e ajuste onde cada uma deve " "ficar." -#: crates/pdfs-gui/src/app/pages/devices.rs:820 +#: crates/pdfs-gui/src/app/pages/devices.rs:821 msgid "Restore Folders" msgstr "Restaurar pastas" -#: crates/pdfs-gui/src/app/pages/devices.rs:827 +#: crates/pdfs-gui/src/app/pages/devices.rs:828 msgid "Restore" msgstr "Restaurar" -#: crates/pdfs-gui/src/app/pages/devices.rs:860 +#: crates/pdfs-gui/src/app/pages/devices.rs:861 msgid "Restoring folders…" msgstr "Restaurando pastas…" -#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/devices.rs:873 #, rust-format msgid "" "These folders are backed up from “{name}”. Restored folders keep syncing " @@ -2438,36 +2431,43 @@ msgstr "" "Estas pastas têm backup a partir de “{name}”. As pastas restauradas " "continuam sincronizando com a cópia daquele computador." -#: crates/pdfs-gui/src/app/pages/devices.rs:875 +#: crates/pdfs-gui/src/app/pages/devices.rs:876 msgid "These folders are backed up under this computer in Proton Drive." msgstr "Estas pastas têm backup sob este computador no Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:884 +#: crates/pdfs-gui/src/app/pages/devices.rs:885 #, rust-format msgid "Nothing to restore — “{name}”'s folders are all synced here." msgstr "" "Nada a restaurar — as pastas de “{name}” já estão todas sincronizadas aqui." -#: crates/pdfs-gui/src/app/pages/devices.rs:887 +#: crates/pdfs-gui/src/app/pages/devices.rs:888 msgid "Nothing to restore — this computer's folders are all synced here." msgstr "" "Nada a restaurar — as pastas deste computador já estão todas sincronizadas " "aqui." -#: crates/pdfs-gui/src/app/pages/devices.rs:911 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 msgid "Folder will switch to online only" msgstr "A pasta passará a ser somente online" -#: crates/pdfs-gui/src/app/pages/devices.rs:913 +#: crates/pdfs-gui/src/app/pages/devices.rs:914 msgid "Folder will download and stay synced" msgstr "A pasta será baixada e permanecerá sincronizada" -#: crates/pdfs-gui/src/app/pages/devices.rs:917 -#: crates/pdfs-gui/src/app/pages/devices.rs:921 +#: crates/pdfs-gui/src/app/pages/devices.rs:918 +#: crates/pdfs-gui/src/app/pages/devices.rs:922 msgid "Couldn't change mode" msgstr "Não foi possível alterar o modo" -#: crates/pdfs-gui/src/app/pages/devices.rs:953 +#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#, rust-format +msgid "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." +msgstr "Parar de sincronizar “{path}”? Tanto os arquivos locais quanto a pasta em Meus arquivos são mantidos." + +#: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2484,7 +2484,7 @@ msgstr "" "uma cópia local, cancele, mude a pasta para Sincronizada e aguarde o " "download terminar antes de removê-la." -#: crates/pdfs-gui/src/app/pages/devices.rs:959 +#: crates/pdfs-gui/src/app/pages/devices.rs:971 #, rust-format msgid "" "Stop syncing “{path}”?\n" @@ -2497,68 +2497,68 @@ msgstr "" "Os arquivos locais permanecem neste disco e simplesmente deixam de ser " "sincronizados. Escolha se também deseja excluir a cópia no Proton Drive." -#: crates/pdfs-gui/src/app/pages/devices.rs:964 +#: crates/pdfs-gui/src/app/pages/devices.rs:976 msgid "Stop Syncing Folder?" msgstr "Parar de sincronizar a pasta?" -#: crates/pdfs-gui/src/app/pages/devices.rs:969 +#: crates/pdfs-gui/src/app/pages/devices.rs:981 msgid "Also delete from Proton Drive" msgstr "Também excluir do Proton Drive" -#: crates/pdfs-gui/src/app/pages/devices.rs:971 +#: crates/pdfs-gui/src/app/pages/devices.rs:983 msgid "Deletes the only copy of these files." msgstr "Exclui a única cópia destes arquivos." -#: crates/pdfs-gui/src/app/pages/devices.rs:973 +#: crates/pdfs-gui/src/app/pages/devices.rs:985 msgid "The local copy is unaffected." msgstr "A cópia local não é afetada." -#: crates/pdfs-gui/src/app/pages/devices.rs:980 +#: crates/pdfs-gui/src/app/pages/devices.rs:994 msgid "Stop Syncing" msgstr "Parar de sincronizar" -#: crates/pdfs-gui/src/app/pages/devices.rs:993 +#: crates/pdfs-gui/src/app/pages/devices.rs:1007 msgid "Stopped syncing folder" msgstr "A pasta deixou de ser sincronizada" -#: crates/pdfs-gui/src/app/pages/devices.rs:994 +#: crates/pdfs-gui/src/app/pages/devices.rs:1008 msgid "Couldn't stop syncing the folder" msgstr "Não foi possível parar de sincronizar a pasta" -#: crates/pdfs-gui/src/app/pages/devices.rs:1005 +#: crates/pdfs-gui/src/app/pages/devices.rs:1019 msgid "Rename Computer" msgstr "Renomear computador" #. Translators: {name} is the computer's current name. -#: crates/pdfs-gui/src/app/pages/devices.rs:1007 +#: crates/pdfs-gui/src/app/pages/devices.rs:1021 #, rust-format msgid "Rename “{name}”." msgstr "Renomear “{name}”." -#: crates/pdfs-gui/src/app/pages/devices.rs:1032 -#: crates/pdfs-gui/src/app/pages/devices.rs:1044 +#: crates/pdfs-gui/src/app/pages/devices.rs:1046 +#: crates/pdfs-gui/src/app/pages/devices.rs:1058 msgid "Couldn't rename the computer" msgstr "Não foi possível renomear o computador" -#: crates/pdfs-gui/src/app/pages/devices.rs:1033 +#: crates/pdfs-gui/src/app/pages/devices.rs:1047 msgid "A name is required." msgstr "Um nome é obrigatório." -#: crates/pdfs-gui/src/app/pages/devices.rs:1043 +#: crates/pdfs-gui/src/app/pages/devices.rs:1057 msgid "Computer renamed" msgstr "Computador renomeado" #. Translators: {name} is the computer's name, which the user must type. -#: crates/pdfs-gui/src/app/pages/devices.rs:1056 +#: crates/pdfs-gui/src/app/pages/devices.rs:1070 #, rust-format msgid "Type “{name}” to confirm" msgstr "Digite “{name}” para confirmar" -#: crates/pdfs-gui/src/app/pages/devices.rs:1061 +#: crates/pdfs-gui/src/app/pages/devices.rs:1075 msgid "Remove Computer?" msgstr "Remover computador?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1064 +#: crates/pdfs-gui/src/app/pages/devices.rs:1078 #, rust-format msgid "" "Remove “{name}” from this account?\n" @@ -2573,26 +2573,26 @@ msgstr "" "naquele próprio computador não são tocados — mas isso não pode ser desfeito " "daqui." -#: crates/pdfs-gui/src/app/pages/devices.rs:1070 +#: crates/pdfs-gui/src/app/pages/devices.rs:1084 #: crates/pdfs-gui/src/app/pages/shared.rs:1025 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:634 #: crates/pdfs-gui/src/app/widgets/share_dialog.rs:876 msgid "Remove" msgstr "Remover" -#: crates/pdfs-gui/src/app/pages/devices.rs:1087 +#: crates/pdfs-gui/src/app/pages/devices.rs:1101 msgid "Computer removed" msgstr "Computador removido" -#: crates/pdfs-gui/src/app/pages/devices.rs:1088 +#: crates/pdfs-gui/src/app/pages/devices.rs:1102 msgid "Couldn't remove the computer" msgstr "Não foi possível remover o computador" -#: crates/pdfs-gui/src/app/pages/devices.rs:1106 +#: crates/pdfs-gui/src/app/pages/devices.rs:1120 msgid "Continue This Backup Here?" msgstr "Continuar este backup aqui?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1109 +#: crates/pdfs-gui/src/app/pages/devices.rs:1123 #, rust-format msgid "" "This computer takes over the backup of “{name}”, for example after a " @@ -2611,25 +2611,25 @@ msgstr "" "movidas. Depois, use “Restaurar neste computador” para recuperar o que " "“{name}” sincronizava." -#: crates/pdfs-gui/src/app/pages/devices.rs:1114 +#: crates/pdfs-gui/src/app/pages/devices.rs:1128 msgid "Continue Here" msgstr "Continuar aqui" #. Translators: {name} is the name of the computer whose backup this one took over. -#: crates/pdfs-gui/src/app/pages/devices.rs:1121 +#: crates/pdfs-gui/src/app/pages/devices.rs:1135 #, rust-format msgid "Now backing up as “{name}”" msgstr "Agora fazendo backup como “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1130 +#: crates/pdfs-gui/src/app/pages/devices.rs:1144 msgid "Couldn't continue that backup here" msgstr "Não foi possível continuar esse backup aqui" -#: crates/pdfs-gui/src/app/pages/devices.rs:1146 +#: crates/pdfs-gui/src/app/pages/devices.rs:1160 msgid "Sync With This Computer?" msgstr "Sincronizar com este computador?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1149 +#: crates/pdfs-gui/src/app/pages/devices.rs:1163 #, rust-format msgid "" "This computer and “{name}” keep the same folders in step. A change or a " @@ -2646,25 +2646,25 @@ msgstr "" "Drive. As pastas já sincronizadas aqui ficam onde estão. Em seguida, você " "escolhe quais pastas dele sincronizar aqui." -#: crates/pdfs-gui/src/app/pages/devices.rs:1154 +#: crates/pdfs-gui/src/app/pages/devices.rs:1168 msgid "Sync Here" msgstr "Sincronizar aqui" #. Translators: {name} is the name of the other computer this one now syncs with. -#: crates/pdfs-gui/src/app/pages/devices.rs:1161 +#: crates/pdfs-gui/src/app/pages/devices.rs:1175 #, rust-format msgid "Now syncing with “{name}”" msgstr "Agora sincronizando com “{name}”" -#: crates/pdfs-gui/src/app/pages/devices.rs:1177 +#: crates/pdfs-gui/src/app/pages/devices.rs:1191 msgid "Couldn't sync with that computer" msgstr "Não foi possível sincronizar com esse computador" -#: crates/pdfs-gui/src/app/pages/devices.rs:1209 +#: crates/pdfs-gui/src/app/pages/devices.rs:1223 msgid "Move Backup to This Computer?" msgstr "Mover o backup para este computador?" -#: crates/pdfs-gui/src/app/pages/devices.rs:1212 +#: crates/pdfs-gui/src/app/pages/devices.rs:1226 #, rust-format msgid "" "The folders backed up by “{name}” move into this computer's backup in Proton " @@ -2681,12 +2681,12 @@ msgstr "" "pastas sumirem." #. Translators: {name} is the name of the computer whose folders moved to this one. -#: crates/pdfs-gui/src/app/pages/devices.rs:1224 +#: crates/pdfs-gui/src/app/pages/devices.rs:1238 #, rust-format msgid "Moved the backup of “{name}”" msgstr "Backup de “{name}” movido" -#: crates/pdfs-gui/src/app/pages/devices.rs:1238 +#: crates/pdfs-gui/src/app/pages/devices.rs:1252 msgid "Couldn't move that backup" msgstr "Não foi possível mover esse backup" @@ -3271,57 +3271,57 @@ msgstr "Abrir em Arquivos" msgid "Change Location…" msgstr "Alterar local…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1412 +#: crates/pdfs-gui/src/app/pages/locations.rs:1415 msgid "Choose whether this folder keeps a full copy on this computer" msgstr "Escolher se esta pasta mantém uma cópia completa neste computador" -#: crates/pdfs-gui/src/app/pages/locations.rs:1428 +#: crates/pdfs-gui/src/app/pages/locations.rs:1431 msgid "Keep every file on this computer and in Proton Drive." msgstr "Manter todos os arquivos neste computador e no Proton Drive." -#: crates/pdfs-gui/src/app/pages/locations.rs:1433 +#: crates/pdfs-gui/src/app/pages/locations.rs:1436 msgid "Keep the files in Proton Drive and download each one when you open it." msgstr "" "Manter os arquivos no Proton Drive e baixar cada um quando você o abrir." #. Translators: a folder mode: files are kept in Proton Drive and fetched when opened. -#: crates/pdfs-gui/src/app/pages/locations.rs:1487 +#: crates/pdfs-gui/src/app/pages/locations.rs:1490 msgctxt "folder mode" msgid "Online only" msgstr "Somente online" #. Translators: a folder mode: a full copy is kept on this computer. -#: crates/pdfs-gui/src/app/pages/locations.rs:1490 +#: crates/pdfs-gui/src/app/pages/locations.rs:1493 msgctxt "folder mode" msgid "Synced" msgstr "Sincronizada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1501 +#: crates/pdfs-gui/src/app/pages/locations.rs:1504 msgid "Sync Now" msgstr "Sincronizar agora" -#: crates/pdfs-gui/src/app/pages/locations.rs:1505 +#: crates/pdfs-gui/src/app/pages/locations.rs:1508 msgid "Resume Syncing" msgstr "Retomar sincronização" -#: crates/pdfs-gui/src/app/pages/locations.rs:1507 +#: crates/pdfs-gui/src/app/pages/locations.rs:1510 msgid "Pause Syncing" msgstr "Pausar sincronização" -#: crates/pdfs-gui/src/app/pages/locations.rs:1513 +#: crates/pdfs-gui/src/app/pages/locations.rs:1516 msgid "Sync From Scratch…" msgstr "Sincronizar do zero…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1523 +#: crates/pdfs-gui/src/app/pages/locations.rs:1527 msgid "Stop Syncing…" msgstr "Parar de sincronizar…" -#: crates/pdfs-gui/src/app/pages/locations.rs:1533 +#: crates/pdfs-gui/src/app/pages/locations.rs:1537 msgid "Sync From Scratch?" msgstr "Sincronizar do zero?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1535 +#: crates/pdfs-gui/src/app/pages/locations.rs:1539 #, rust-format msgid "" "This computer forgets what it synced in {path} before and compares the " @@ -3333,20 +3333,20 @@ msgstr "" "lado só é copiado para o outro, e de um arquivo diferente as duas versões " "são mantidas." -#: crates/pdfs-gui/src/app/pages/locations.rs:1538 +#: crates/pdfs-gui/src/app/pages/locations.rs:1542 msgid "Sync From Scratch" msgstr "Sincronizar do zero" -#: crates/pdfs-gui/src/app/pages/locations.rs:1557 +#: crates/pdfs-gui/src/app/pages/locations.rs:1561 msgid "Couldn't sync the folder from scratch" msgstr "Não foi possível sincronizar a pasta do zero" -#: crates/pdfs-gui/src/app/pages/locations.rs:1577 +#: crates/pdfs-gui/src/app/pages/locations.rs:1581 msgid "Make Folder Online Only?" msgstr "Tornar a pasta somente online?" #. Translators: {path} is a local folder path. -#: crates/pdfs-gui/src/app/pages/locations.rs:1579 +#: crates/pdfs-gui/src/app/pages/locations.rs:1583 #, rust-format msgid "" "Files in {path} will be removed from this computer and kept in Proton Drive " @@ -3355,11 +3355,11 @@ msgstr "" "Os arquivos em {path} serão removidos deste computador e mantidos somente no " "Proton Drive. Cada arquivo é baixado novamente quando você o abre." -#: crates/pdfs-gui/src/app/pages/locations.rs:1582 +#: crates/pdfs-gui/src/app/pages/locations.rs:1586 msgid "Make Online Only" msgstr "Tornar somente online" -#: crates/pdfs-gui/src/app/pages/locations.rs:1618 +#: crates/pdfs-gui/src/app/pages/locations.rs:1622 #, rust-format msgid "" "Every file in {path} will download to this computer and stay synced. {free} " @@ -3368,62 +3368,66 @@ msgstr "" "Todos os arquivos em {path} serão baixados para este computador e " "continuarão sincronizados. Há {free} livres neste disco." -#: crates/pdfs-gui/src/app/pages/locations.rs:1623 +#: crates/pdfs-gui/src/app/pages/locations.rs:1627 #, rust-format msgid "Every file in {path} will download to this computer and stay synced." msgstr "" "Todos os arquivos em {path} serão baixados para este computador e " "continuarão sincronizados." -#: crates/pdfs-gui/src/app/pages/locations.rs:1628 +#: crates/pdfs-gui/src/app/pages/locations.rs:1632 msgid "Download Folder?" msgstr "Baixar a pasta?" -#: crates/pdfs-gui/src/app/pages/locations.rs:1632 +#: crates/pdfs-gui/src/app/pages/locations.rs:1636 #: crates/pdfs-gui/src/app/update.rs:34 msgid "Download" msgstr "Baixar" -#: crates/pdfs-gui/src/app/pages/locations.rs:1656 +#: crates/pdfs-gui/src/app/pages/locations.rs:1660 msgid "Couldn't pause the folder" msgstr "Não foi possível pausar a pasta" -#: crates/pdfs-gui/src/app/pages/locations.rs:1657 +#: crates/pdfs-gui/src/app/pages/locations.rs:1661 msgid "Couldn't resume the folder" msgstr "Não foi possível retomar a pasta" -#: crates/pdfs-gui/src/app/pages/locations.rs:1663 +#: crates/pdfs-gui/src/app/pages/locations.rs:1667 msgid "Folder paused" msgstr "Pasta pausada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1664 +#: crates/pdfs-gui/src/app/pages/locations.rs:1668 msgid "Folder resumed" msgstr "Pasta retomada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1688 #: crates/pdfs-gui/src/app/pages/locations.rs:1692 +#: crates/pdfs-gui/src/app/pages/locations.rs:1696 msgid "Couldn't sync" msgstr "Não foi possível sincronizar" -#: crates/pdfs-gui/src/app/pages/locations.rs:1718 +#: crates/pdfs-gui/src/app/pages/locations.rs:1722 msgid "Shared folder" msgstr "Pasta compartilhada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1720 +#: crates/pdfs-gui/src/app/pages/locations.rs:1723 +msgid "My files mirror" +msgstr "Espelho de Meus arquivos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1725 msgid "Going online only" msgstr "Tornando somente online" -#: crates/pdfs-gui/src/app/pages/locations.rs:1721 +#: crates/pdfs-gui/src/app/pages/locations.rs:1726 msgid "Switching to synced" msgstr "Passando para sincronizada" -#: crates/pdfs-gui/src/app/pages/locations.rs:1731 +#: crates/pdfs-gui/src/app/pages/locations.rs:1739 msgctxt "state" msgid "paused" msgstr "pausada" #. Translators: a folder's files can't be opened right now. -#: crates/pdfs-gui/src/app/pages/locations.rs:1745 +#: crates/pdfs-gui/src/app/pages/locations.rs:1755 msgid "not available" msgstr "indisponível" @@ -6609,6 +6613,12 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "não foi possível acessar o daemon do Proton Drive: {error}" +#, rust-format +#~ msgid "{n} image" +#~ msgid_plural "{n} images" +#~ msgstr[0] "{n} imagem" +#~ msgstr[1] "{n} imagens" + #~ msgid "" #~ "The verification page couldn't be opened, so the sign-in was cancelled. " #~ "Your system may keep the web view's sandbox from starting; the " From 1c50797772b2f1e19e04db69fc6b8b83f9862cf2 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Sat, 14 Nov 2026 02:40:38 +0100 Subject: [PATCH 2/4] feat(gui,core): modern Photos layout Lay the timeline out in justified rows. Each photo keeps its own shape, clamped between 1:2 and 5:2, and every row but a section's last spans the width to the pixel. "Square Tiles" in the page menu restores the even grid, and the Year zoom stays square. The zoom level and the tile shape persist in a new `photos_view` config section. Move Timeline/Albums/Places into the header as an icon-and-label switch that shows only icons in a narrow window. The filters take a single row whose kind tabs scroll sideways. Selection mode follows GNOME apps: - the header shows "N selected" and Cancel; - an ActionBar along the bottom offers Favorite (or unfavorite), Add to Album, Remove from Album, Save Copies and Move to Trash; - each section heading gets a check that selects the whole section. One function, sync_header, decides the header for the page, an open album or place, and selection mode. The heading of the section at the top of the grid floats over the grid. Favorites get a star badge, and video placeholders a video glyph. New bundled icons: pdfs-photos, pdfs-album and pdfs-slideshow. Upload takes several photos and videos at once, and files dropped on the timeline upload too. The media type comes from the MIME database, except that a recording-sized .ts counts as video. The viewer's details panel moves into an OverlaySplitView that lies over the photo below 800sp. --- crates/pdfs-core/src/config.rs | 31 + .../scalable/actions/pdfs-album-symbolic.svg | 6 + .../scalable/actions/pdfs-photos-symbolic.svg | 8 + .../actions/pdfs-slideshow-symbolic.svg | 6 + crates/pdfs-gui/resources/pdfs.gresource.xml | 3 + crates/pdfs-gui/resources/style.css | 10 +- crates/pdfs-gui/src/app/main.rs | 22 +- crates/pdfs-gui/src/app/pages/albums.rs | 14 +- crates/pdfs-gui/src/app/pages/photo_viewer.rs | 58 +- crates/pdfs-gui/src/app/pages/photos.rs | 1281 ++++++++++++++--- crates/pdfs-gui/src/app/pages/places.rs | 8 +- crates/pdfs-gui/src/app/widgets/compat.rs | 83 +- crates/pdfs-gui/tests/icon_names.rs | 3 + docs/CHANGELOG.md | 24 + po/de.po | 453 +++--- po/en_GB.po | 447 +++--- po/es.po | 453 +++--- po/fr.po | 453 +++--- po/it.po | 447 +++--- po/nl.po | 453 +++--- po/pdfs.pot | 432 +++--- po/pl.po | 453 +++--- po/pt_BR.po | 453 +++--- 23 files changed, 3751 insertions(+), 1850 deletions(-) create mode 100644 crates/pdfs-gui/resources/icons/scalable/actions/pdfs-album-symbolic.svg create mode 100644 crates/pdfs-gui/resources/icons/scalable/actions/pdfs-photos-symbolic.svg create mode 100644 crates/pdfs-gui/resources/icons/scalable/actions/pdfs-slideshow-symbolic.svg diff --git a/crates/pdfs-core/src/config.rs b/crates/pdfs-core/src/config.rs index 5de4454..4064fcc 100644 --- a/crates/pdfs-core/src/config.rs +++ b/crates/pdfs-core/src/config.rs @@ -163,6 +163,10 @@ pub struct AppConfig { /// Defaulted for configs predating the field. #[serde(default)] pub files_view: FilesView, + /// How the desktop app's Photos page lays out its grid. Defaulted for + /// configs predating the field. + #[serde(default)] + pub photos_view: PhotosView, /// The desktop app's main window size, remembered between runs. Defaulted /// for configs predating the field. #[serde(default)] @@ -233,6 +237,18 @@ impl Default for FilesView { } } +/// The Photos page's grid choices, remembered between runs. +#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Default)] +#[serde(default)] +pub struct PhotosView { + /// The zoom level: the row height the grid aims for, in logical pixels. + /// `None` means the app's default. + pub row_height: Option, + /// Crop every photo to a square tile instead of showing it at its own + /// shape. + pub square: bool, +} + /// The desktop app's main window, as it was when it last closed. #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)] #[serde(default)] @@ -762,6 +778,10 @@ mod tests { descending: true, folders_first: false, }, + photos_view: PhotosView { + row_height: Some(240), + square: true, + }, window: WindowState { width: 1200, height: 800, @@ -792,6 +812,7 @@ mod tests { assert_eq!(decoded.upload_limit, Some(500_000)); assert_eq!(decoded.download_limit, None); assert_eq!(decoded.files_view, config.files_view); + assert_eq!(decoded.photos_view, config.photos_view); assert_eq!(decoded.window, config.window); } @@ -837,6 +858,16 @@ mod tests { assert!(partial.folders_first); } + #[test] + fn a_config_without_a_photos_view_gets_the_default() { + let decoded: AppConfig = + serde_json::from_str(r#"{"app_version":"a","user_agent":"b"}"#).unwrap(); + assert_eq!(decoded.photos_view, PhotosView::default()); + let partial: PhotosView = serde_json::from_str(r#"{"square":true}"#).unwrap(); + assert!(partial.square); + assert_eq!(partial.row_height, None); + } + #[test] fn the_old_proton_accent_setting_turns_on_the_proton_theme() { let decoded: AppConfig = diff --git a/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-album-symbolic.svg b/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-album-symbolic.svg new file mode 100644 index 0000000..3eb3634 --- /dev/null +++ b/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-album-symbolic.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-photos-symbolic.svg b/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-photos-symbolic.svg new file mode 100644 index 0000000..9ce78b7 --- /dev/null +++ b/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-photos-symbolic.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-slideshow-symbolic.svg b/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-slideshow-symbolic.svg new file mode 100644 index 0000000..e820b11 --- /dev/null +++ b/crates/pdfs-gui/resources/icons/scalable/actions/pdfs-slideshow-symbolic.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/crates/pdfs-gui/resources/pdfs.gresource.xml b/crates/pdfs-gui/resources/pdfs.gresource.xml index 80b0b1b..a61ad12 100644 --- a/crates/pdfs-gui/resources/pdfs.gresource.xml +++ b/crates/pdfs-gui/resources/pdfs.gresource.xml @@ -15,6 +15,9 @@ scalable/actions/pdfs-link-symbolic.svg scalable/actions/pdfs-map-symbolic.svg scalable/actions/pdfs-people-symbolic.svg + scalable/actions/pdfs-photos-symbolic.svg + scalable/actions/pdfs-album-symbolic.svg + scalable/actions/pdfs-slideshow-symbolic.svg scalable/actions/pdfs-share-symbolic.svg scalable/actions/pdfs-sync-symbolic.svg scalable/actions/pdfs-synced-symbolic.svg diff --git a/crates/pdfs-gui/resources/style.css b/crates/pdfs-gui/resources/style.css index a21039a..af7b2f2 100644 --- a/crates/pdfs-gui/resources/style.css +++ b/crates/pdfs-gui/resources/style.css @@ -80,7 +80,12 @@ scale.browser-status-meter trough { min-width: 104px; min-height: 6px; } .viewer-info-panel { background-color: var(--window-bg-color); border-left: 1px solid alpha(currentColor, 0.12); } /* Photos grid */ -.gallery-day { font-size: 0.82rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: alpha(currentColor, 0.65); padding: 2px 2px 6px 2px; } +.gallery-day { font-size: 1.1rem; font-weight: 700; padding: 4px 2px 8px 2px; } +/* The check that picks a whole section: on hover, and always while selecting. */ +.gallery-day-check { opacity: 0; transition: opacity 160ms ease; min-width: 24px; min-height: 24px; margin-bottom: 4px; } +.gallery-heading:hover .gallery-day-check, .gallery-heading.selecting .gallery-day-check, .gallery-day-check:focus-visible { opacity: 1; } +/* The section at the top of the grid, floating once its heading scrolled off. */ +.gallery-float-heading { font-weight: 700; padding: 4px 12px; border-radius: 999px; background-color: color-mix(in srgb, var(--popover-bg-color) 92%, transparent); color: var(--popover-fg-color); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25); } .photo-tile { padding: 0; margin: 0; min-height: 0; min-width: 0; border: none; border-radius: 4px; background: none; box-shadow: none; } .photo-tile:focus { outline: 2px solid var(--accent-color); outline-offset: -2px; } .photo-thumb { transition: transform 220ms ease; } @@ -94,6 +99,7 @@ scale.browser-status-meter trough { min-width: 104px; min-height: 6px; } .photo-video-badge { color: white; background: rgba(0, 0, 0, 0.45); border-radius: 999px; padding: 8px; min-width: 20px; min-height: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5); transition: background 160ms ease; } .photo-video-badge-small { padding: 3px; min-width: 0; min-height: 0; } .photo-tile:hover .photo-video-badge { background: color-mix(in srgb, var(--accent-bg-color) 85%, transparent); } +.photo-favorite-badge { color: white; -gtk-icon-shadow: 0 1px 3px rgba(0, 0, 0, 0.9); } .photo-group-badge { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.04em; color: white; background: rgba(0, 0, 0, 0.55); border-radius: 6px; padding: 1px 5px; margin: 6px; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.9); } .memory-card { padding: 0; border-radius: 12px; } .memory-cover { border-radius: 12px; background: alpha(currentColor, 0.06); } @@ -103,7 +109,7 @@ scale.browser-status-meter trough { min-width: 104px; min-height: 6px; } .album-cover { border-radius: 16px; background: alpha(currentColor, 0.06); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.32); transition: box-shadow 180ms ease; } .album-card:hover .album-cover { box-shadow: 0 10px 26px rgba(0, 0, 0, 0.5); } .album-card:hover .photo-thumb { transform: scale(1.05); } -.view-switch button, .view-switch toggle { padding-left: 18px; padding-right: 18px; } +.view-switch button, .view-switch toggle { padding-left: 12px; padding-right: 12px; } /* Shared with Me: what a share lets me do, as a tinted pill beside the name. */ .role-pill { padding: 2px 10px; border-radius: 999px; font-weight: 600; color: var(--accent-color); background-color: color-mix(in srgb, var(--accent-bg-color) 16%, transparent); } diff --git a/crates/pdfs-gui/src/app/main.rs b/crates/pdfs-gui/src/app/main.rs index cfb98be..a416ee4 100644 --- a/crates/pdfs-gui/src/app/main.rs +++ b/crates/pdfs-gui/src/app/main.rs @@ -71,7 +71,7 @@ use gtk4::glib::BoxedAnyObject; use pdfs_core::auth; -use pdfs_core::config::{AppDirs, FileSort, FilesView, WindowState}; +use pdfs_core::config::{AppDirs, FileSort, FilesView, PhotosView, WindowState}; use pdfs_core::control::{ ActivityEntry, ActivityKind, AlbumInfo, BookmarkInfo, ConflictInfo, ConflictKeep, DeviceInfo, @@ -587,10 +587,13 @@ fn build_window(app: &adw::Application) { selected: RefCell::new(HashSet::new()), select_anchor: RefCell::new(None), select_btn: gallery_widgets.select_btn.clone(), - select_bar: gallery_widgets.select_bar.clone(), - select_label: gallery_widgets.select_label.clone(), - select_trash: gallery_widgets.select_trash.clone(), - select_album: gallery_widgets.select_album.clone(), + selection: gallery_widgets.selection.clone(), + more: gallery_widgets.more.clone(), + upload_face: gallery_widgets.upload_face.clone(), + float_heading: gallery_widgets.float_heading.clone(), + float_label: gallery_widgets.float_label.clone(), + square: Cell::new(false), + zoom_save: RefCell::new(None), }, shared: SharedState::new(&shared_widgets), shared_by_me: SharedByMeState::new(&shared_by_me_widgets), @@ -693,7 +696,7 @@ fn build_window(app: &adw::Application) { &ui, &gallery_widgets.list, &gallery_widgets.scroll, - &gallery_widgets.select_done, + &gallery_widgets.square_action, ); wire_gallery_empty( &ui, @@ -795,6 +798,7 @@ fn build_window(app: &adw::Application) { /// split collapsed whatever the width. fn set_narrow(ui: &Ui, narrow: bool) { ui.narrow.set(narrow); + set_photos_narrow(ui, narrow); if ui.session.borrow().is_some() { ui.nav.set_collapsed(narrow); } @@ -858,11 +862,7 @@ fn window_hidden(window: &adw::ApplicationWindow) -> bool { /// sync, set off by a separator. const DESTINATIONS: [(&str, &str, &str); 7] = [ ("browser", gettext_noop("My files"), "folder-symbolic"), - ( - "gallery", - gettext_noop("Photos"), - "image-x-generic-symbolic", - ), + ("gallery", gettext_noop("Photos"), "pdfs-photos-symbolic"), ( "shared", gettext_noop("Shared with me"), diff --git a/crates/pdfs-gui/src/app/pages/albums.rs b/crates/pdfs-gui/src/app/pages/albums.rs index 29e64ec..6af6ffd 100644 --- a/crates/pdfs-gui/src/app/pages/albums.rs +++ b/crates/pdfs-gui/src/app/pages/albums.rs @@ -40,7 +40,7 @@ pub(crate) fn load_albums(ui: &Rc) { if ui.gallery.albums_stack.visible_child_name().as_deref() != Some("grid") { albums_status( ui, - "view-grid-symbolic", + "pdfs-album-symbolic", &gettext("Loading albums…"), &gettext("Reading your Proton Drive albums."), ); @@ -62,7 +62,7 @@ pub(crate) fn load_albums(ui: &Rc) { ), Ok(Ok(Response::Albums { items, .. })) if items.is_empty() => albums_status( &ui, - "view-grid-symbolic", + "pdfs-album-symbolic", &gettext("No albums"), &gettext("Create one with New Album, or in Proton Photos."), ), @@ -136,7 +136,7 @@ fn album_card(ui: &Rc, album: &AlbumInfo) -> gtk4::Button { picture.add_css_class("photo-thumb"); let placeholder = gtk4::Image::builder() - .icon_name("view-grid-symbolic") + .icon_name("pdfs-album-symbolic") .pixel_size(32) .halign(gtk4::Align::Center) .valign(gtk4::Align::Center) @@ -618,9 +618,7 @@ pub(crate) fn open_album(ui: &Rc, album: AlbumInfo) { // would silently do something else. The Photos/Albums switcher goes too: an // album is a level below it, and back is the way out. ui.gallery.filters.set_visible(false); - ui.gallery.view_switch.widget().set_visible(false); - ui.gallery.upload.set_visible(false); - ui.gallery.back.set_visible(true); + sync_header(ui); // A stale kind/date filter would otherwise be sent with the album request. ui.gallery.kind.set(None); ui.gallery.range.set(None); @@ -636,9 +634,7 @@ pub(crate) fn close_album(ui: &Rc) { return; } ui.gallery.title.set_title(&gettext("Photos")); - ui.gallery.view_switch.widget().set_visible(true); - ui.gallery.upload.set_visible(true); - ui.gallery.back.set_visible(false); + sync_header(ui); } /// Show the album grid's own status page (loading, empty, or an error). diff --git a/crates/pdfs-gui/src/app/pages/photo_viewer.rs b/crates/pdfs-gui/src/app/pages/photo_viewer.rs index 05460a6..7866633 100644 --- a/crates/pdfs-gui/src/app/pages/photo_viewer.rs +++ b/crates/pdfs-gui/src/app/pages/photo_viewer.rs @@ -40,7 +40,9 @@ pub(crate) struct Viewer { /// Details panel: the toggle that reveals it, the rows it fills in, and the /// "Show on map" button (hidden when the photo carries no GPS tags). pub(crate) info_toggle: gtk4::ToggleButton, - pub(crate) info_revealer: gtk4::Revealer, + /// Lays the details panel beside the photo, or over it in a narrow + /// window. + pub(crate) info_split: adw::OverlaySplitView, pub(crate) info_rows: gtk4::Box, pub(crate) info_map: gtk4::Button, /// Coordinates behind `info_map`, once a photo with GPS tags is shown. @@ -358,9 +360,7 @@ fn stop_slideshow(viewer: &Rc) { if viewer.slide_fullscreened.replace(false) { viewer.window.unfullscreen(); } - viewer - .slideshow - .set_icon_name("media-playback-start-symbolic"); + viewer.slideshow.set_icon_name("pdfs-slideshow-symbolic"); if viewer.slideshow.is_active() { viewer.slideshow.set_active(false); } @@ -1004,13 +1004,16 @@ fn show_photo_position(ui: &Rc, viewer: &Rc, index: u32, capture_tim pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let parent = ui.stack.root().and_downcast::().unwrap(); - let window = gtk4::Window::builder() + // An `adw::Window` for its breakpoints: the details panel lies over the + // photo once the window is too narrow to show both side by side. + let adw_window = adw::Window::builder() .title(gettext("Photo")) .modal(true) .transient_for(&parent) .default_width(1100) .default_height(760) .build(); + let window: gtk4::Window = adw_window.clone().upcast(); window.add_css_class("photo-viewer-window"); let overlay = gtk4::Overlay::new(); @@ -1120,7 +1123,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { favorite_btn.add_css_class("viewer-action-btn"); let slideshow_btn = gtk4::ToggleButton::builder() - .icon_name("media-playback-start-symbolic") + .icon_name("pdfs-slideshow-symbolic") .tooltip_text(gettext("Slideshow (F5)")) .valign(gtk4::Align::Center) .build(); @@ -1205,17 +1208,8 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let info_panel = gtk4::Box::new(gtk4::Orientation::Vertical, 0); info_panel.add_css_class("viewer-info-panel"); - info_panel.set_width_request(320); info_panel.append(&info_scroll); - // Set explicitly: the title's hexpand would otherwise propagate up and have - // the revealer take half the window even while it is closed. - let info_revealer = gtk4::Revealer::builder() - .transition_type(gtk4::RevealerTransitionType::SlideLeft) - .hexpand(false) - .child(&info_panel) - .build(); - let spinner = spinner(); spinner.set_halign(gtk4::Align::Center); spinner.set_valign(gtk4::Align::Center); @@ -1232,10 +1226,23 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { status_label.add_css_class("viewer-status"); overlay.add_overlay(&status_label); - let body = gtk4::Box::new(gtk4::Orientation::Horizontal, 0); - body.append(&overlay); - body.append(&info_revealer); - window.set_child(Some(&body)); + // The panel docks beside the photo, or lies over it in a narrow window, + // where a click on the photo closes it again. + let info_split = adw::OverlaySplitView::builder() + .content(&overlay) + .sidebar(&info_panel) + .sidebar_position(gtk4::PackType::End) + .min_sidebar_width(300.0) + .max_sidebar_width(360.0) + .show_sidebar(false) + .build(); + let narrow = adw::Breakpoint::new( + adw::BreakpointCondition::parse("max-width: 800sp").expect("static breakpoint"), + ); + narrow.add_setter(&info_split, "collapsed", Some(&true.to_value())); + adw_window.add_breakpoint(narrow); + let body = info_split.clone(); + adw_window.set_content(Some(&body)); let viewer = Rc::new(Viewer { window: window.clone(), @@ -1250,7 +1257,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { prev: prev_btn.clone(), next: next_btn.clone(), info_toggle: info_toggle.clone(), - info_revealer: info_revealer.clone(), + info_split: info_split.clone(), info_rows, info_map: info_map.clone(), favorite: favorite_btn.clone(), @@ -1435,9 +1442,14 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let Some(viewer_info) = viewer_info.upgrade() else { return; }; - viewer_info - .info_revealer - .set_reveal_child(toggle.is_active()); + viewer_info.info_split.set_show_sidebar(toggle.is_active()); + }); + // A collapsed panel also closes on its own, by a click on the photo. + let toggle_info = info_toggle.clone(); + info_split.connect_show_sidebar_notify(move |split| { + if toggle_info.is_active() != split.shows_sidebar() { + toggle_info.set_active(split.shows_sidebar()); + } }); let ui_slides = ui.clone(); diff --git a/crates/pdfs-gui/src/app/pages/photos.rs b/crates/pdfs-gui/src/app/pages/photos.rs index 979c379..09c74b5 100644 --- a/crates/pdfs-gui/src/app/pages/photos.rs +++ b/crates/pdfs-gui/src/app/pages/photos.rs @@ -204,12 +204,37 @@ pub(crate) struct GalleryState { /// The photo last picked or unpicked by a click, which a Shift+click /// selects a range from. pub(crate) select_anchor: RefCell>, - /// The Select toggle, the bar it reveals, and the bar's own widgets. - pub(crate) select_btn: gtk4::ToggleButton, - pub(crate) select_bar: gtk4::Revealer, - pub(crate) select_label: gtk4::Label, - pub(crate) select_trash: gtk4::Button, - pub(crate) select_album: gtk4::Button, + /// The Select button, and what selection mode shows instead of the + /// page's own header and actions. + pub(crate) select_btn: gtk4::Button, + pub(crate) selection: SelectionBar, + /// The header's page menu and the Upload button's face, which drops its + /// label in a narrow window. + pub(crate) more: gtk4::MenuButton, + pub(crate) upload_face: adw::ButtonContent, + /// The section the top of the timeline is in, floating over the grid + /// once its own heading has scrolled away. + pub(crate) float_heading: gtk4::Revealer, + pub(crate) float_label: gtk4::Label, + /// Crop every photo to a square tile (the page menu's "Square Tiles"). + pub(crate) square: Cell, + /// The pending save of the zoom level, debounced: a Ctrl+scroll is a + /// flood of steps and only where it stops is worth writing. + pub(crate) zoom_save: RefCell>, +} + +/// Selection mode's controls: the header's "N selected" title and Cancel, and +/// the action bar along the bottom of the page. +#[derive(Clone)] +pub(crate) struct SelectionBar { + pub(crate) bar: gtk4::ActionBar, + pub(crate) title: adw::WindowTitle, + pub(crate) cancel: gtk4::Button, + pub(crate) favorite: gtk4::Button, + pub(crate) album: gtk4::Button, + pub(crate) remove: gtk4::Button, + pub(crate) save: gtk4::Button, + pub(crate) trash: gtk4::Button, } impl GalleryState { @@ -332,10 +357,14 @@ pub(crate) enum GalleryRow { /// outside the list as the user scrolled resized the viewport under them, /// and the list shook between the two heights near the top. Memories, - /// A day heading: "Today", "3 June 2026". - Heading(String), + /// A section heading: "Today", "3 June 2026", with the check that picks + /// every photo under it. + Heading(SectionHeading), /// One row of a day's grid, already justified to the current width and zoom. Tiles { + /// The heading of the section the row belongs to, for the heading that + /// floats over the grid. + section: String, tiles: Vec, /// True for the last row of its day, which carries the section's bottom /// margin so days stay visually separated. @@ -343,7 +372,28 @@ pub(crate) enum GalleryRow { }, } +/// A section heading row. +#[derive(Clone, PartialEq)] +pub(crate) struct SectionHeading { + pub(crate) label: String, + /// The photos of the section, which its check selects. + pub(crate) uids: Vec, + /// Whether the grid is in selection mode, and whether every photo of the + /// section is picked. + pub(crate) selecting: bool, + pub(crate) selected: bool, +} + impl GalleryRow { + /// The section the row belongs to. + fn section(&self) -> Option<&str> { + match self { + GalleryRow::Memories => None, + GalleryRow::Heading(heading) => Some(&heading.label), + GalleryRow::Tiles { section, .. } => Some(section), + } + } + /// The uid of the row's first photo, or `None` for a heading — the anchor a /// relayout scrolls back to. fn anchor(&self) -> Option { @@ -361,10 +411,19 @@ impl GalleryRow { (GalleryRow::Memories, GalleryRow::Memories) => true, (GalleryRow::Heading(a), GalleryRow::Heading(b)) => a == b, ( - GalleryRow::Tiles { tiles: a, last: al }, - GalleryRow::Tiles { tiles: b, last: bl }, + GalleryRow::Tiles { + tiles: a, + last: al, + section: sa, + }, + GalleryRow::Tiles { + tiles: b, + last: bl, + section: sb, + }, ) => { al == bl + && sa == sb && a.len() == b.len() && a.iter().zip(b).all(|(x, y)| { x.photo.uid == y.photo.uid @@ -373,6 +432,7 @@ impl GalleryRow { && x.selecting == y.selecting && x.selected == y.selected && x.grouping == y.grouping + && x.photo.favorite == y.photo.favorite }) } _ => false, @@ -403,13 +463,15 @@ pub(crate) struct GalleryWidgets { pub(crate) empty_actions: gtk4::Box, pub(crate) empty_upload: gtk4::Button, pub(crate) empty_import: gtk4::Button, - /// The Select toggle and the bar it reveals. - pub(crate) select_btn: gtk4::ToggleButton, - pub(crate) select_bar: gtk4::Revealer, - pub(crate) select_label: gtk4::Label, - pub(crate) select_trash: gtk4::Button, - pub(crate) select_album: gtk4::Button, - pub(crate) select_done: gtk4::Button, + /// The Select button and what selection mode shows. + pub(crate) select_btn: gtk4::Button, + pub(crate) selection: SelectionBar, + pub(crate) more: gtk4::MenuButton, + pub(crate) upload_face: adw::ButtonContent, + pub(crate) float_heading: gtk4::Revealer, + pub(crate) float_label: gtk4::Label, + /// The page menu's "Square Tiles" check. + pub(crate) square_action: gio::SimpleAction, /// The Albums grid, its own status page and the stack between them, plus the /// Photos/Albums switcher and the back button out of an album. pub(crate) albums: gtk4::FlowBox, @@ -494,7 +556,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { status_child.append(&empty_actions); let status = adw::StatusPage::builder() - .icon_name("image-x-generic-symbolic") + .icon_name("pdfs-photos-symbolic") .vexpand(true) .child(&status_child) .build(); @@ -537,15 +599,14 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { Some(&gettext("Import from Google Photos…")), Some("win.show-import"), ); + let upload_face = adw::ButtonContent::builder() + .label(pgettext("verb", "Upload")) + .icon_name("pdfs-upload-symbolic") + .build(); let upload = adw::SplitButton::builder() - .child( - &adw::ButtonContent::builder() - .label(pgettext("verb", "Upload")) - .icon_name("list-add-symbolic") - .build(), - ) + .child(&upload_face) .menu_model(&upload_menu) - .tooltip_text(gettext("Upload photos")) + .tooltip_text(gettext("Upload photos and videos")) .dropdown_tooltip(gettext("More ways to add photos")) .valign(gtk4::Align::Center) .build(); @@ -554,10 +615,20 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // Hunting for duplicates is a rarer, heavier job than adding one photo, so // it waits in the page menu rather than taking a header button. let page_menu = gio::Menu::new(); - page_menu.append( + // Each photo at its own shape is the default; a grid of squares is the + // other way to see a library, and some prefer its even sheet. + let view_section = gio::Menu::new(); + view_section.append(Some(&gettext("Square Tiles")), Some("photos.square-tiles")); + page_menu.append_section(None, &view_section); + let tools_section = gio::Menu::new(); + tools_section.append( Some(&gettext("Find Duplicates…")), Some("win.find-duplicates"), ); + page_menu.append_section(None, &tools_section); + let square_action = gio::SimpleAction::new_stateful("square-tiles", None, &false.to_variant()); + let page_actions = gio::SimpleActionGroup::new(); + page_actions.add_action(&square_action); let more = gtk4::MenuButton::builder() .icon_name("view-more-symbolic") .tooltip_text(gettext("More")) @@ -566,51 +637,15 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { .build(); more.add_css_class("flat"); - // Picking photos is a mode, so its control is a toggle rather than a - // button. It has a label: no icon says "select" in every theme. - let select_btn = gtk4::ToggleButton::builder() - .label(pgettext("verb", "Select")) + // Picking photos is a mode: the button enters it, and the header then + // trades the page's own controls for Cancel and a count, as GNOME apps do. + let select_btn = gtk4::Button::builder() + .icon_name("selection-mode-symbolic") .tooltip_text(gettext("Select photos")) .valign(gtk4::Align::Center) .build(); select_btn.add_css_class("flat"); - - // What the selection can do, revealed with the mode. A revealer rather than - // a hidden box so the grid slides down instead of jumping. - let select_label = gtk4::Label::builder() - .label(gettext("Select photos")) - .hexpand(true) - .xalign(0.0) - .build(); - let select_trash = gtk4::Button::builder() - .label(gettext("Move to Trash")) - .valign(gtk4::Align::Center) - .sensitive(false) - .build(); - select_trash.add_css_class("destructive-action"); - let select_album = gtk4::Button::builder() - .label(gettext("Add to Album…")) - .valign(gtk4::Align::Center) - .sensitive(false) - .build(); - let select_done = gtk4::Button::builder() - .icon_name("window-close-symbolic") - .tooltip_text(gettext("Leave selection (Esc)")) - .valign(gtk4::Align::Center) - .build(); - select_done.add_css_class("flat"); - select_done.add_css_class("circular"); - let select_box = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); - select_box.add_css_class("toolbar"); - select_box.add_css_class("bulk-bar"); - select_box.append(&select_label); - select_box.append(&select_album); - select_box.append(&select_trash); - select_box.append(&select_done); - let select_bar = gtk4::Revealer::builder() - .transition_type(gtk4::RevealerTransitionType::SlideDown) - .child(&scroll_sideways(&select_box)) - .build(); + let selection = build_selection_bar(); // All / Photos / Videos / Raw filter. Linked toggles acting as one segmented // control: exactly one is active, and flipping it reloads the timeline @@ -669,30 +704,33 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // The kind toggles and the Filters button travel together: they filter the // timeline, and neither applies to the album grid or to an open album. + // One row: the kind tabs scroll sideways in a narrow window, and the + // Filters button stays at the end where it can always be reached. let filters = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); filters.set_hexpand(true); - filters.append(&tabs.widget()); - let spacer = gtk4::Box::new(gtk4::Orientation::Horizontal, 0); - spacer.set_hexpand(true); - filters.append(&spacer); + let tabs_scroll = scroll_sideways(&tabs.widget()); + tabs_scroll.set_hexpand(true); + tabs_scroll.set_propagate_natural_width(false); + filters.append(&tabs_scroll); filters.append(&filter_btn); - // The page's two views, as one segmented control under the title: the - // timeline, and the albums. This is navigation, not a filter — which is why - // it sits above the filter row rather than beside the kind toggles. - // "Timeline", not "Photos": the kind filter below has a Photos tab too. + // The page's views, as the header's title: navigation belongs in the + // header, and the grid gets the rows it used to take. "Timeline", not + // "Photos": the kind filter has a Photos tab too. let view_switch = ToggleGroup::new(&[ (&gettext("Timeline"), None), (&gettext("Albums"), None), (&gettext("Places"), None), ]); + view_switch.set_icons(&[ + "pdfs-photos-symbolic", + "pdfs-album-symbolic", + "mark-location-symbolic", + ]); view_switch.set_round(); let view_switch_widget = view_switch.widget(); view_switch_widget.add_css_class("view-switch"); - view_switch_widget.set_halign(gtk4::Align::Start); - - let filter_bar = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); - filter_bar.append(&filters); + view_switch_widget.set_valign(gtk4::Align::Center); // "On this day": a card per earlier year that has photos from today's // date. Shown as the first row of the unfiltered timeline (see @@ -717,12 +755,25 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // The timeline (plus its pager) or the status page, never both. let timeline = gtk4::Box::new(gtk4::Orientation::Vertical, 12); - timeline.append(&select_bar); // The scrubber lies over the grid's right edge and only shows when wanted, // so the grid keeps its full width. let timeline_view = gtk4::Overlay::new(); timeline_view.set_child(Some(&scroll)); let scrubber = Scrubber::new(&timeline_view); + // The section at the top of the grid, once its heading has scrolled off: + // a long day or month otherwise leaves the user guessing where they are. + let float_label = gtk4::Label::new(None); + float_label.add_css_class("gallery-float-heading"); + let float_heading = gtk4::Revealer::builder() + .transition_type(gtk4::RevealerTransitionType::Crossfade) + .halign(gtk4::Align::Start) + .valign(gtk4::Align::Start) + .margin_top(8) + .margin_start(8) + .can_target(false) + .child(&float_label) + .build(); + timeline_view.add_overlay(&float_heading); timeline.append(&timeline_view); timeline.append(&pager); @@ -742,7 +793,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { .child(&albums) .build(); let albums_status = adw::StatusPage::builder() - .icon_name("view-grid-symbolic") + .icon_name("pdfs-album-symbolic") .vexpand(true) .build(); albums_status.add_css_class("compact"); @@ -835,18 +886,29 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { inner.set_margin_bottom(12); inner.set_margin_start(12); inner.set_margin_end(12); - inner.append(&view_switch_widget); - inner.append(&filter_bar); + inner.append(&filters); inner.append(&content); let body = gtk4::Box::new(gtk4::Orientation::Vertical, 0); body.append(&import_banner); body.append(&inner); - let (frame, header, title) = page_frame(&gettext("Photos"), &body); + // The title slot holds the view switch on the page itself, the album's or + // place's name inside one, and the count in selection mode (see + // [`sync_header`]). + let title = adw::WindowTitle::new(&gettext("Photos"), ""); + title.set_visible(false); + let title_box = gtk4::Box::new(gtk4::Orientation::Horizontal, 0); + title_box.append(&view_switch_widget); + title_box.append(&title); + title_box.append(&selection.title); + let (frame, header) = page_frame_with(&title_box, &body); + frame.add_bottom_bar(&selection.bar); + frame.insert_action_group("photos", Some(&page_actions)); header.pack_start(&back); header.pack_start(&upload); header.pack_end(&more); header.pack_end(&select_btn); + header.pack_end(&selection.cancel); ( frame.upcast(), @@ -867,11 +929,12 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { empty_upload, empty_import, select_btn, - select_bar, - select_label, - select_trash, - select_album, - select_done, + selection, + more, + upload_face, + float_heading, + float_label, + square_action, tabs, favorites_row, not_in_album_row, @@ -899,6 +962,95 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { ) } +/// Selection mode's controls, hidden until it starts: the count and Cancel +/// for the header, and the actions along the bottom of the page. +fn build_selection_bar() -> SelectionBar { + let title = adw::WindowTitle::new(&gettext("Select photos"), ""); + title.set_visible(false); + let cancel = gtk4::Button::builder() + .label(gettext("Cancel")) + .tooltip_text(gettext("Leave selection (Esc)")) + .valign(gtk4::Align::Center) + .visible(false) + .build(); + let action = |icon: &str, tooltip: &str| { + let button = gtk4::Button::builder() + .icon_name(icon) + .tooltip_text(tooltip) + .valign(gtk4::Align::Center) + .sensitive(false) + .build(); + button.add_css_class("flat"); + button + }; + let favorite = action("starred-symbolic", &gettext("Add to Favorites")); + let album = action("pdfs-album-symbolic", &gettext("Add to Album…")); + let remove = action("list-remove-symbolic", &gettext("Remove from Album")); + remove.set_visible(false); + let save = action("folder-download-symbolic", &gettext("Save Copies…")); + let trash = action("user-trash-symbolic", &gettext("Move to Trash…")); + trash.remove_css_class("flat"); + trash.add_css_class("destructive-action"); + let bar = gtk4::ActionBar::new(); + bar.set_revealed(false); + bar.pack_start(&favorite); + bar.pack_start(&album); + bar.pack_start(&remove); + bar.pack_start(&save); + bar.pack_end(&trash); + SelectionBar { + bar, + title, + cancel, + favorite, + album, + remove, + save, + trash, + } +} + +/// Show what the page's state calls for in its header: the view switch on +/// the page itself, the name and Back inside an album or a place, and the +/// count and Cancel in selection mode. The one place that decides it, so +/// entering an album while selecting cannot leave the two half applied. +pub(crate) fn sync_header(ui: &Rc) { + let gallery = &ui.gallery; + let selecting = gallery.selecting.get(); + let collection = gallery.in_collection(); + let timeline = collection || gallery.view_switch.active() == VIEW_TIMELINE; + gallery + .view_switch + .widget() + .set_visible(!selecting && !collection); + gallery.title.set_visible(!selecting && collection); + gallery.back.set_visible(!selecting && collection); + gallery.upload.set_visible(!selecting && !collection); + gallery.more.set_visible(!selecting); + gallery.select_btn.set_visible(!selecting && timeline); + gallery.selection.title.set_visible(selecting); + gallery.selection.cancel.set_visible(selecting); + gallery.selection.bar.set_revealed(selecting); + let owned_album = gallery + .album + .borrow() + .as_ref() + .is_some_and(|album| !album.shared); + gallery.selection.remove.set_visible(owned_album); +} + +/// Follow the window's narrow breakpoint: the view switch shows its icons +/// alone, and Upload its icon, so the header keeps room for the window +/// buttons. +pub(crate) fn set_photos_narrow(ui: &Ui, narrow: bool) { + ui.gallery.view_switch.set_compact(narrow); + ui.gallery.upload_face.set_label(&if narrow { + String::new() + } else { + pgettext("verb", "Upload") + }); +} + /// The [`PhotoKind`] filter a gallery tab index selects: index 0 is All (no /// filter), then Photos / Videos / Raw. Index-aligned with the toggle array. pub(crate) fn kind_for_tab(index: usize) -> Option { @@ -1070,7 +1222,7 @@ pub(crate) fn wire_gallery( ui: &Rc, list: >k4::ListView, scroll: >k4::ScrolledWindow, - select_done: >k4::Button, + square_action: &gio::SimpleAction, ) { let factory = gtk4::SignalListItemFactory::new(); factory.connect_setup(|_, item| { @@ -1110,15 +1262,9 @@ pub(crate) fn wire_gallery( GalleryRow::Heading(heading) => { row_box.set_margin_top(8); row_box.set_margin_bottom(0); - let label = gtk4::Label::builder() - .label(heading) - .halign(gtk4::Align::Start) - .build(); - label.add_css_class("heading"); - label.add_css_class("gallery-day"); - row_box.append(&label); + row_box.append(§ion_heading_widget(&ui_bind, heading)); } - GalleryRow::Tiles { tiles, last } => { + GalleryRow::Tiles { tiles, last, .. } => { row_box.set_margin_top(0); // The last row of a day carries the gap to the next heading. row_box.set_margin_bottom(if *last { 4 } else { TILE_GAP }); @@ -1217,6 +1363,7 @@ pub(crate) fn wire_gallery( load_gallery(&ui_scroll, true); } sync_scrubber_position(&ui_scroll); + sync_float_heading(&ui_scroll); ui_scroll.gallery.scrubber.flash(); }); wire_scrubber(ui); @@ -1274,22 +1421,110 @@ pub(crate) fn wire_gallery( list.add_controller(zoom_keys); let ui_select = ui.clone(); - ui.gallery.select_btn.clone().connect_toggled(move |btn| { - set_selection_mode(&ui_select, btn.is_active()); - }); - let ui_trash = ui.clone(); + ui.gallery + .select_btn + .connect_clicked(move |_| set_selection_mode(&ui_select, true)); + let ui_view = ui.clone(); + ui.gallery + .view_switch + .connect_changed(move |_| sync_header(&ui_view)); + sync_header(ui); + let selection = ui.gallery.selection.clone(); + let ui_cancel = ui.clone(); + selection + .cancel + .connect_clicked(move |_| set_selection_mode(&ui_cancel, false)); + let ui_favorite = ui.clone(); + selection + .favorite + .connect_clicked(move |_| favorite_selected(&ui_favorite)); let ui_album = ui.clone(); - ui.gallery.select_album.clone().connect_clicked(move |_| { + selection.album.connect_clicked(move |_| { let uids: Vec = ui_album.gallery.selected.borrow().iter().cloned().collect(); prompt_add_to_album(&ui_album, uids); }); - ui.gallery.select_trash.clone().connect_clicked(move |_| { - delete_selected(&ui_trash); + let ui_remove = ui.clone(); + selection.remove.connect_clicked(move |_| { + let album = ui_remove.gallery.album.borrow().clone(); + if let Some(album) = album { + let uids: Vec = ui_remove + .gallery + .selected + .borrow() + .iter() + .cloned() + .collect(); + remove_from_album(&ui_remove, &album, uids); + } }); - let ui_done = ui.clone(); - select_done - .clone() - .connect_clicked(move |_| set_selection_mode(&ui_done, false)); + let ui_save = ui.clone(); + selection + .save + .connect_clicked(move |_| save_selected(&ui_save)); + let ui_trash = ui.clone(); + selection + .trash + .connect_clicked(move |_| delete_selected(&ui_trash)); + + // The grid's shape, as the page menu's check and as saved for next time. + ui.gallery.row_height.set( + ui.dirs + .load_config() + .photos_view + .row_height + .unwrap_or(ROW_DEFAULT) + .clamp(ROW_MIN, ROW_MAX), + ); + let square = ui.dirs.load_config().photos_view.square; + ui.gallery.square.set(square); + square_action.set_state(&square.to_variant()); + let ui_square = ui.clone(); + square_action.connect_activate(move |action, _| { + let square = !ui_square.gallery.square.get(); + action.set_state(&square.to_variant()); + ui_square.gallery.square.set(square); + save_photos_view(&ui_square); + relayout_gallery(&ui_square); + }); + + // Photos and videos dropped on the timeline upload into it, the empty + // timeline's status page included. + let content = ui.gallery.content.clone(); + let drop = gtk4::DropTarget::new( + gtk4::gdk::FileList::static_type(), + gtk4::gdk::DragAction::COPY, + ); + let ui_drop = ui.clone(); + drop.connect_accept(move |_, _| { + let gallery = &ui_drop.gallery; + !gallery.in_collection() + && gallery.view_switch.active() == VIEW_TIMELINE + && gallery.library.get() + && *ui_drop.mounted.borrow() + }); + let content_enter = content.clone(); + drop.connect_enter(move |_, _, _| { + content_enter.add_css_class("files-drop-active"); + gtk4::gdk::DragAction::COPY + }); + let content_leave = content.clone(); + drop.connect_leave(move |_| content_leave.remove_css_class("files-drop-active")); + let ui_dropped = ui.clone(); + let content_drop = content.clone(); + drop.connect_drop(move |_, value, _, _| { + content_drop.remove_css_class("files-drop-active"); + let Ok(files) = value.get::() else { + return false; + }; + let paths: Vec = files + .files() + .iter() + .filter_map(|file| file.path()) + .collect(); + upload_media(&ui_dropped, paths); + true + }); + content.add_controller(drop); // Filter toggles: flipping to a tab reloads the timeline filtered to that // kind. A redundant toggle to the already-current kind is a no-op. @@ -1346,88 +1581,458 @@ pub(crate) fn wire_gallery( let ui_upload = ui.clone(); ui.gallery.upload.connect_clicked(move |_| { let dialog = gtk4::FileDialog::builder() - .title(gettext("Select Photo to Upload")) + .title(gettext("Upload Photos and Videos")) + .accept_label(pgettext("verb", "Upload")) .build(); - let filter = gtk4::FileFilter::new(); - filter.set_name(Some(&gettext("Images"))); + filter.set_name(Some(&gettext("Photos and videos"))); filter.add_mime_type("image/*"); + filter.add_mime_type("video/*"); let filters = gio::ListStore::new::(); filters.append(&filter); dialog.set_filters(Some(&filters)); let ui = ui_upload.clone(); let parent_win = ui.stack.root().and_downcast::(); - dialog.open(parent_win.as_ref(), gio::Cancellable::NONE, move |res| { - if let Ok(file) = res - && let Some(path) = file.path() - { - let name = path - .file_name() - .and_then(|n| n.to_str()) - .unwrap_or("photo.jpg") - .to_string(); - let ext = path - .extension() - .and_then(|e| e.to_str()) - .unwrap_or("jpg") - .to_lowercase(); - let media_type = match ext.as_str() { - "png" => "image/png", - "gif" => "image/gif", - "webp" => "image/webp", - "tiff" | "tif" => "image/tiff", - _ => "image/jpeg", - }; - // The daemon dates the photo: by its EXIF, or by the file's - // modification time when it has none. - let capture_time = None; - - ui.busy_begin(); - let rx = spawn_request( - ui.dirs.control_socket(), - // The daemon opens the file itself: it runs on this machine, - // and a photo's bytes through line-delimited JSON is an OOM - // of both processes (see `Request::UploadPhoto`). - Request::UploadPhoto { - name, - media_type: media_type.to_string(), - source_path: path.display().to_string(), - capture_time, - }, - ); - let ui_clone = ui.clone(); - glib::spawn_future_local(async move { - let res = rx.recv().await; - ui_clone.busy_end(); - match res { - Ok(Ok(Response::Ok { message })) => { - tracing::info!("Photo uploaded: {message}"); - load_gallery(&ui_clone, false); - toast(&ui_clone, &gettext("Photo uploaded")); - } - Ok(Ok(Response::Error { message, kind })) => { - toast_failure( - &ui_clone, - &gettext("Couldn't upload photo"), - &message, - kind, - ); - } - _ => { - toast_error( - &ui_clone, - &gettext("Couldn't upload photo"), - &gettext("The Proton Drive service didn't respond."), - ); - } - } - }); - } + dialog.open_multiple(parent_win.as_ref(), gio::Cancellable::NONE, move |res| { + // An error here is the dialog being dismissed. + let Ok(files) = res else { + return; + }; + let paths: Vec = (0..files.n_items()) + .filter_map(|index| files.item(index).and_downcast::()) + .filter_map(|file| file.path()) + .collect(); + upload_media(&ui, paths); }); }); } +/// A section heading: its label, and a check that picks every photo under it. +/// The check shows on hover, and always in selection mode; picking a section +/// starts selection mode, like Ctrl+click on a tile. +fn section_heading_widget(ui: &Rc, heading: &SectionHeading) -> gtk4::Box { + let label = gtk4::Label::builder() + .label(&heading.label) + .halign(gtk4::Align::Start) + .build(); + label.add_css_class("gallery-day"); + let check = gtk4::Button::builder() + .icon_name(if heading.selected { + "checkbox-checked-symbolic" + } else { + "checkbox-symbolic" + }) + .tooltip_text(if heading.selected { + gettext("Deselect these photos") + } else { + gettext("Select these photos") + }) + .valign(gtk4::Align::Center) + .build(); + check.add_css_class("flat"); + check.add_css_class("circular"); + check.add_css_class("gallery-day-check"); + let row = gtk4::Box::new(gtk4::Orientation::Horizontal, 6); + row.add_css_class("gallery-heading"); + if heading.selecting { + row.add_css_class("selecting"); + } + row.append(&label); + row.append(&check); + let ui = ui.clone(); + let uids = heading.uids.clone(); + let selected = heading.selected; + check.connect_clicked(move |_| select_section(&ui, &uids, !selected)); + row +} + +/// Pick or unpick every photo of a section. +fn select_section(ui: &Rc, uids: &[String], pick: bool) { + set_selection_mode(ui, true); + { + let mut selected = ui.gallery.selected.borrow_mut(); + for uid in uids { + if pick { + selected.insert(uid.clone()); + } else { + selected.remove(uid); + } + } + } + *ui.gallery.select_anchor.borrow_mut() = uids.last().cloned(); + sync_selection_bar(ui); + repaint_gallery(ui); +} + +/// Float the heading of the section at the top of the timeline over the grid, +/// while the section's own heading row is scrolled away. +fn sync_float_heading(ui: &Rc) { + let list = &ui.gallery.list; + let scrolled = list.vadjustment().is_some_and(|adj| adj.value() > 1.0); + let top = scrolled + .then(|| { + let bound = ui.gallery.bound.borrow(); + bound.iter().find_map(|(position, (_, row))| { + let rect = row.compute_bounds(list)?; + (row.is_mapped() && rect.y() + rect.height() > 0.0).then_some(*position) + }) + }) + .flatten() + .and_then(|position| ui.gallery.groups.item(position)) + .and_downcast::(); + let section = top.as_ref().and_then(|boxed| { + let row = boxed.borrow::(); + // A heading row at the top already says it. + match &*row { + GalleryRow::Tiles { .. } => row.section().map(str::to_string), + GalleryRow::Memories | GalleryRow::Heading(_) => None, + } + }); + if let Some(section) = §ion { + ui.gallery.float_label.set_label(section); + } + ui.gallery.float_heading.set_reveal_child(section.is_some()); +} + +/// The photos in the loaded model with these uids. +fn photos_by_uid(ui: &Rc, uids: &HashSet) -> Vec { + let model = &ui.gallery.model; + (0..model.n_items()) + .filter_map(|index| model.item(index).and_downcast::()) + .map(|boxed| boxed.borrow::().clone()) + .filter(|photo| uids.contains(&photo.uid)) + .collect() +} + +/// Star every selected photo, or unstar them all when every one already is. +fn favorite_selected(ui: &Rc) { + let photos = photos_by_uid(ui, &ui.gallery.selected.borrow()); + let favorite = !photos.iter().all(|photo| photo.favorite); + let uids: Vec = photos + .into_iter() + .filter(|photo| photo.favorite != favorite) + .map(|photo| photo.uid) + .collect(); + if uids.is_empty() { + return; + } + let total = uids.len(); + ui.busy_begin(); + let ui = ui.clone(); + glib::spawn_future_local(async move { + let mut changed = 0; + let mut failure = None; + for uid in uids { + let rx = spawn_request( + ui.dirs.control_socket(), + Request::SetPhotoFavorite { + uid: uid.clone(), + favorite, + }, + ); + match rx.recv().await { + Ok(Ok(Response::Ok { .. })) => { + set_gallery_favorite(&ui, &uid, favorite); + changed += 1; + } + Ok(Ok(Response::Error { message, .. })) => failure = Some(message), + _ => failure = Some(gettext("The Proton Drive service didn't respond.")), + } + } + ui.busy_end(); + repaint_gallery(&ui); + sync_selection_bar(&ui); + if let Some(message) = failure { + toast_error( + &ui, + &ngettext_f( + "Couldn't change {failed} of {n} favorite", + "Couldn't change {failed} of {n} favorites", + total as u64, + &[("failed", &(total - changed).to_string())], + ), + &message, + ); + } else { + let n = changed as u64; + toast( + &ui, + &if favorite { + ngettext_f( + "Added {n} photo to Favorites", + "Added {n} photos to Favorites", + n, + &[], + ) + } else { + ngettext_f( + "Removed {n} photo from Favorites", + "Removed {n} photos from Favorites", + n, + &[], + ) + }, + ); + } + }); +} + +/// Save a copy of every selected photo into a folder the user picks, under +/// its Drive name. +fn save_selected(ui: &Rc) { + let photos = photos_by_uid(ui, &ui.gallery.selected.borrow()); + if photos.is_empty() { + return; + } + let dialog = gtk4::FileDialog::builder() + .title(gettext("Save Copies")) + .accept_label(gettext("Save Here")) + .build(); + let ui = ui.clone(); + let parent = ui_window(&ui); + dialog.select_folder(parent.as_ref(), gio::Cancellable::NONE, move |res| { + // An error here is the dialog being dismissed. + let Some(folder) = res.ok().and_then(|file| file.path()) else { + return; + }; + save_copies(&ui, photos, folder); + }); +} + +/// Fetch each photo and copy it into `folder`, one at a time so a large +/// selection does not ask the daemon for everything at once. +fn save_copies(ui: &Rc, photos: Vec, folder: PathBuf) { + let total = photos.len(); + ui.busy_begin(); + let ui = ui.clone(); + glib::spawn_future_local(async move { + let mut saved = 0; + let mut failure = None; + for photo in photos { + let rx = spawn_request( + ui.dirs.control_socket(), + Request::OpenPhoto { + uid: photo.uid.clone(), + }, + ); + let source = match rx.recv().await { + Ok(Ok(Response::FilePath { path })) => path, + Ok(Ok(Response::Error { message, .. })) => { + failure = Some(message); + continue; + } + _ => { + failure = Some(gettext("The Proton Drive service didn't respond.")); + continue; + } + }; + let name = photo.name.clone().unwrap_or_else(|| photo.uid.clone()); + let folder = folder.clone(); + let copied = + gio::spawn_blocking(move || copy_without_overwrite(&source, &folder, &name)).await; + match copied { + Ok(Ok(())) => saved += 1, + Ok(Err(e)) => failure = Some(e.to_string()), + Err(_) => failure = Some(gettext("The copy was interrupted.")), + } + } + ui.busy_end(); + match failure { + Some(message) => toast_error( + &ui, + &ngettext_f( + "Couldn't save {failed} of {n} copy", + "Couldn't save {failed} of {n} copies", + total as u64, + &[("failed", &(total - saved).to_string())], + ), + &message, + ), + None => toast( + &ui, + &ngettext_f("Saved {n} copy", "Saved {n} copies", saved as u64, &[]), + ), + } + }); +} + +/// Copy `source` into `folder` as `name`, or as "name (2)" and so on when that +/// name is taken: a copy never replaces a file that is already there. +pub(crate) fn copy_without_overwrite( + source: &str, + folder: &Path, + name: &str, +) -> std::io::Result<()> { + let name = Path::new(name).file_name().map_or_else( + || "photo".into(), + |name| name.to_string_lossy().into_owned(), + ); + let (stem, ext) = match name.rsplit_once('.') { + Some((stem, ext)) if !stem.is_empty() => (stem.to_string(), format!(".{ext}")), + _ => (name.clone(), String::new()), + }; + let mut reader = std::fs::File::open(source)?; + for n in 1.. { + let candidate = if n == 1 { + folder.join(&name) + } else { + folder.join(format!("{stem} ({n}){ext}")) + }; + match std::fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&candidate) + { + Ok(mut out) => { + std::io::copy(&mut reader, &mut out)?; + return Ok(()); + } + Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => continue, + Err(e) => return Err(e), + } + } + unreachable!("some numbered name is free") +} + +/// Upload photos and videos from this computer into the timeline, one after +/// the other, then reload it once. +pub(crate) fn upload_media(ui: &Rc, paths: Vec) { + let uploads: Vec<(PathBuf, String)> = paths + .into_iter() + .filter_map(|path| upload_media_type(&path).map(|media_type| (path, media_type))) + .collect(); + if uploads.is_empty() { + toast(ui, &gettext("Only photos and videos can go into Photos")); + return; + } + let total = uploads.len(); + ui.busy_begin(); + if total > 1 { + toast( + ui, + &ngettext_f( + "Uploading {n} item…", + "Uploading {n} items…", + total as u64, + &[], + ), + ); + } + let ui = ui.clone(); + glib::spawn_future_local(async move { + let mut uploaded = 0; + let mut failure = None; + for (path, media_type) in uploads { + let name = path + .file_name() + .map(|name| name.to_string_lossy().into_owned()) + .unwrap_or_default(); + let rx = spawn_request( + ui.dirs.control_socket(), + // The daemon opens the file itself: it runs on this machine, + // and a photo's bytes through line-delimited JSON is an OOM + // of both processes (see `Request::UploadPhoto`). It also + // dates the photo: by its EXIF, or by the file's modification + // time when it has none. + Request::UploadPhoto { + media_type, + name, + source_path: path.display().to_string(), + capture_time: None, + }, + ); + match rx.recv().await { + Ok(Ok(Response::Ok { message })) => { + tracing::info!("Photo uploaded: {message}"); + uploaded += 1; + } + Ok(Ok(Response::Error { message, kind })) => failure = Some((message, kind)), + _ => { + failure = Some(( + gettext("The Proton Drive service didn't respond."), + ErrorKind::Remote, + )) + } + } + } + ui.busy_end(); + if uploaded > 0 { + load_gallery(&ui, false); + } + match failure { + Some((message, kind)) if total == 1 => { + toast_failure(&ui, &gettext("Couldn't upload photo"), &message, kind) + } + Some((message, kind)) => toast_failure( + &ui, + &ngettext_f( + "Couldn't upload {failed} of {n} item", + "Couldn't upload {failed} of {n} items", + total as u64, + &[("failed", &(total - uploaded).to_string())], + ), + &message, + kind, + ), + None if total == 1 => toast(&ui, &gettext("Photo uploaded")), + None => toast( + &ui, + &ngettext_f("Uploaded {n} item", "Uploaded {n} items", total as u64, &[]), + ), + } + }); +} + +/// The media type Drive records for an upload, or `None` for a file that is +/// neither a photo nor a video. The desktop's MIME database decides, except +/// for a transport stream: it takes `.ts` for TypeScript, so the app's own +/// rule (a `.ts` of a recording's size is a video) goes first. +pub(crate) fn upload_media_type(path: &Path) -> Option { + let name = path.file_name()?.to_str()?; + let size = std::fs::metadata(path).ok().map(|meta| meta.len()); + let (guess, _) = gio::content_type_guess(Some(name), None); + let mime = gio::content_type_get_mime_type(&guess) + .map(|mime| mime.to_string()) + .unwrap_or_default(); + if pdfs_core::control::is_video_file_name(name, size) { + return Some(if mime.starts_with("video/") { + mime + } else { + "video/mp2t".to_string() + }); + } + if mime.starts_with("image/") { + return Some(mime); + } + pdfs_core::control::is_raw_image_name(name).then(|| "application/octet-stream".to_string()) +} + +/// Save the zoom level and the tile shape for the next run, shortly after the +/// last change. +fn save_photos_view(ui: &Rc) { + if let Some(source) = ui.gallery.zoom_save.borrow_mut().take() { + source.remove(); + } + let ui_save = ui.clone(); + let source = glib::timeout_add_local_once(Duration::from_millis(500), move || { + ui_save.gallery.zoom_save.borrow_mut().take(); + let mut config = ui_save.dirs.load_config(); + let view = PhotosView { + row_height: Some(ui_save.gallery.row_height.get()), + square: ui_save.gallery.square.get(), + }; + if config.photos_view == view { + return; + } + config.photos_view = view; + if let Err(e) = ui_save.dirs.save_config(&config) { + tracing::warn!("cannot save the Photos view: {e}"); + } + }); + *ui.gallery.zoom_save.borrow_mut() = Some(source); +} + /// One tile of the grid: the photo, and the box [`justify_rows`] sized it to. #[derive(Clone)] pub(crate) struct Tile { @@ -1443,35 +2048,130 @@ pub(crate) struct Tile { pub(crate) grouping: Grouping, } -/// Break one section's photos into rows of square tiles spanning `width`. +/// Break one section's photos into rows spanning `width`. /// -/// Squares, because a wide window and a day of a few photos do not mix with -/// rows justified to each photo's shape: a short row stays short, and portrait -/// phone shots come out as thin slivers. Every tile of a square grid is the -/// same size whatever it shows, and the thumbnail is cropped to fill it. +/// Each photo keeps its own shape (see [`plan_justified`]), so a portrait shot +/// is not cropped to a sliver of itself. Two cases stay square: the Year zoom, +/// where the tiles are too small for shape to show and a dense even sheet reads +/// better, and the "Square tiles" choice in the page menu. pub(crate) fn justify_rows(ui: &Rc, photos: &[PhotoItem], width: i32) -> Vec> { let selecting = ui.gallery.selecting.get(); let selected = ui.gallery.selected.borrow(); let target = ui.gallery.row_height.get(); let grouping = grouping_for(target); - let (columns, size) = plan_grid(width, target); - photos - .chunks(columns) + let tile = |photo: &PhotoItem, (width, height): (i32, i32)| Tile { + selecting, + selected: selecting && selected.contains(&photo.uid), + grouping, + photo: photo.clone(), + width, + height, + }; + if ui.gallery.square.get() || grouping == Grouping::Year { + let (columns, size) = plan_grid(width, target); + return photos + .chunks(columns) + .map(|row| row.iter().map(|photo| tile(photo, (size, size))).collect()) + .collect(); + } + let ratios: Vec = photos.iter().map(|photo| tile_ratio(photo.ratio)).collect(); + let mut photos = photos.iter(); + plan_justified(&ratios, width, target) + .into_iter() .map(|row| { - row.iter() - .map(|photo| Tile { - selecting, - selected: selecting && selected.contains(&photo.uid), - grouping, - photo: photo.clone(), - width: size, - height: size, - }) + row.into_iter() + .zip(photos.by_ref()) + .map(|(size, photo)| tile(photo, size)) .collect() }) .collect() } +/// The narrowest and the widest shape a tile may take, as width over height. +/// A panorama at its own shape would be a ribbon, and a screenshot of a phone +/// a thread; past these the thumbnail is cropped to fit. +pub(crate) const TILE_RATIO_MIN: f64 = 0.5; +pub(crate) const TILE_RATIO_MAX: f64 = 2.5; + +/// The shape a photo's tile takes: its own, clamped, or square while the +/// daemon has not seen a thumbnail of it yet. +pub(crate) fn tile_ratio(ratio: Option) -> f64 { + ratio + .filter(|ratio| ratio.is_finite() && *ratio > 0.0) + .unwrap_or(1.0) + .clamp(TILE_RATIO_MIN, TILE_RATIO_MAX) +} + +/// The justified layout math: tiles of the given shapes, in order, broken into +/// rows that each span `width` exactly, gaps included, at a height near +/// `target`. Returns each row's `(width, height)` sizes. +/// +/// A row takes photos until it is at least as wide as `width` at the target +/// height, then keeps or gives back its last photo, whichever leaves the row +/// height nearer the target. The last row of the section is not stretched: +/// two photos from one day stay two photos at the target height, not two +/// photos as tall as the window. +pub(crate) fn plan_justified(ratios: &[f64], width: i32, target: i32) -> Vec> { + let width = width.max(1); + let target = f64::from(target.clamp(ROW_MIN, ROW_MAX)); + let gap = f64::from(TILE_GAP); + // The height that makes `ratios` span the width exactly. + let fit = |ratios: &[f64]| { + let gaps = gap * (ratios.len() as f64 - 1.0); + (f64::from(width) - gaps).max(1.0) / ratios.iter().sum::() + }; + let mut rows = Vec::new(); + let mut start = 0; + while start < ratios.len() { + let mut end = start + 1; + while end < ratios.len() && fit(&ratios[start..end]) > target { + end += 1; + } + let full = fit(&ratios[start..end]) <= target; + // Giving the last photo back leaves the row taller than the target; + // keeping it, shorter. Whichever misses by less wins. + if full + && end - start > 1 + && fit(&ratios[start..end - 1]) - target < target - fit(&ratios[start..end]) + { + end -= 1; + } + let row = &ratios[start..end]; + rows.push(if full { + size_row(row, fit(row), Some(width)) + } else { + size_row(row, target, None) + }); + start = end; + } + rows +} + +/// Tile sizes for one row of shapes at `height`. With `span`, the widths are +/// rounded so the row, gaps included, is exactly that wide: each tile ends +/// where its share of the row ends, so no rounding error piles up at the end. +fn size_row(ratios: &[f64], height: f64, span: Option) -> Vec<(i32, i32)> { + let tile_height = (height.round() as i32).max(1); + let Some(span) = span else { + return ratios + .iter() + .map(|ratio| (((ratio * height).round() as i32).max(1), tile_height)) + .collect(); + }; + let content = f64::from(span - TILE_GAP * (ratios.len() as i32 - 1)); + let total: f64 = ratios.iter().sum(); + let mut sizes = Vec::with_capacity(ratios.len()); + let mut done = 0.0; + let mut left = 0; + for ratio in ratios { + done += ratio; + let right = (content * done / total).round() as i32; + sizes.push(((right - left).max(1), tile_height)); + left = right; + } + sizes +} + /// The layout math: how many square tiles of about `target` px fit across /// `width`, and the size that makes them span it exactly, gaps included. /// @@ -1511,8 +2211,10 @@ pub(crate) fn gallery_width(ui: &Rc) -> i32 { pub(crate) struct TileWidget { pub(crate) button: gtk4::Button, picture: gtk4::Picture, + placeholder: gtk4::Image, caption: gtk4::Label, video: gtk4::Image, + favorite: gtk4::Image, group: gtk4::Label, check: gtk4::Image, photo: Rc>>, @@ -1521,9 +2223,10 @@ pub(crate) struct TileWidget { impl TileWidget { pub(crate) fn new(ui: &Rc) -> Self { let picture = gtk4::Picture::builder() - // Every tile is square, so Cover crops the photo to fill it. - // Contain would letterbox it, and the bars would read as gaps in - // the sheet. The expands are what make the picture take the whole + // Cover fills the tile: a tile at the photo's own shape shows it + // whole, and a square tile or a clamped panorama crops it. Contain + // would letterbox it, and the bars would read as gaps in the + // sheet. The expands are what make the picture take the whole // overlay. .content_fit(gtk4::ContentFit::Cover) .can_shrink(true) @@ -1534,7 +2237,7 @@ impl TileWidget { picture.add_css_class("photo-thumb"); let placeholder = gtk4::Image::builder() - .icon_name("image-x-generic-symbolic") + .icon_name("pdfs-photos-symbolic") .pixel_size(24) .halign(gtk4::Align::Center) .valign(gtk4::Align::Center) @@ -1572,6 +2275,18 @@ impl TileWidget { .build(); group.add_css_class("photo-group-badge"); + // A favorite says so in the corner nothing else uses. + let favorite = gtk4::Image::builder() + .icon_name("starred-symbolic") + .pixel_size(14) + .halign(gtk4::Align::End) + .valign(gtk4::Align::End) + .margin_end(6) + .margin_bottom(6) + .can_target(false) + .build(); + favorite.add_css_class("photo-favorite-badge"); + let check = gtk4::Image::builder() .pixel_size(16) .halign(gtk4::Align::Start) @@ -1587,6 +2302,7 @@ impl TileWidget { overlay.add_overlay(&caption); overlay.add_overlay(&video); overlay.add_overlay(&group); + overlay.add_overlay(&favorite); overlay.add_overlay(&check); let button = gtk4::Button::builder().child(&overlay).build(); @@ -1665,8 +2381,10 @@ impl TileWidget { Self { button, picture, + placeholder, caption, video, + favorite, group, check, photo, @@ -1688,7 +2406,15 @@ impl TileWidget { // Zoomed out, the play glyph shrinks with the tile so it marks the // video without covering it. let small = tile.grouping != Grouping::Day; - self.video.set_visible(tile.photo.kind == PhotoKind::Video); + let video = tile.photo.kind == PhotoKind::Video; + self.video.set_visible(video); + self.placeholder.set_icon_name(Some(if video { + "video-x-generic-symbolic" + } else { + "pdfs-photos-symbolic" + })); + self.favorite + .set_visible(tile.photo.favorite && tile.grouping != Grouping::Year); self.video.set_pixel_size(if small { 12 } else { 28 }); set_css_class(&self.video, "photo-video-badge-small", small); @@ -1758,9 +2484,7 @@ pub(crate) fn set_selection_mode(ui: &Rc, selecting: bool) { ui.gallery.selected.borrow_mut().clear(); ui.gallery.select_anchor.borrow_mut().take(); } - if ui.gallery.select_btn.is_active() != selecting { - ui.gallery.select_btn.set_active(selecting); - } + sync_header(ui); sync_selection_bar(ui); repaint_gallery(ui); } @@ -1982,17 +2706,37 @@ fn tile_at(ui: &Rc, x: f64, y: f64) -> Option { /// Reflect the selection in the bar above the grid. fn sync_selection_bar(ui: &Rc) { + let selection = &ui.gallery.selection; let count = ui.gallery.selected.borrow().len(); - ui.gallery.select_label.set_label(&match count { + selection.title.set_title(&match count { 0 => gettext("Select photos"), // Translators: {n} is how many items are selected: files and folders in My Files, photos here. n => ngettext_f("{n} selected", "{n} selected", n as u64, &[]), }); - ui.gallery.select_trash.set_sensitive(count > 0); - ui.gallery.select_album.set_sensitive(count > 0); - ui.gallery - .select_bar - .set_reveal_child(ui.gallery.selecting.get()); + for button in [ + &selection.favorite, + &selection.album, + &selection.remove, + &selection.save, + &selection.trash, + ] { + button.set_sensitive(count > 0); + } + // Favorite stars the selection, or unstars it once every photo is one. + let all_favorite = count > 0 + && photos_by_uid(ui, &ui.gallery.selected.borrow()) + .iter() + .all(|p| p.favorite); + selection.favorite.set_icon_name(if all_favorite { + "non-starred-symbolic" + } else { + "starred-symbolic" + }); + selection.favorite.set_tooltip_text(Some(&if all_favorite { + gettext("Remove from Favorites") + } else { + gettext("Add to Favorites") + })); } /// Confirm, then move every selected photo to Proton trash. @@ -2570,6 +3314,7 @@ pub(crate) fn set_gallery_tile(ui: &Rc, tile: i32) { return; } ui.gallery.row_height.set(tile); + save_photos_view(ui); schedule_relayout(ui); } @@ -2617,12 +3362,24 @@ fn build_rows(ui: &Rc) -> Vec { if shows_memories(ui) { rows.push(GalleryRow::Memories); } + let selecting = ui.gallery.selecting.get(); for group in group_photos(&ui.gallery.model, grouping) { - rows.push(GalleryRow::Heading(group.heading)); + let uids: Vec = group.photos.iter().map(|photo| photo.uid.clone()).collect(); + let selected = selecting && { + let picked = ui.gallery.selected.borrow(); + uids.iter().all(|uid| picked.contains(uid)) + }; + rows.push(GalleryRow::Heading(SectionHeading { + label: group.heading.clone(), + uids, + selecting, + selected, + })); let grid = justify_rows(ui, &group.photos, width); let last_index = grid.len().saturating_sub(1); for (index, tiles) in grid.into_iter().enumerate() { rows.push(GalleryRow::Tiles { + section: group.heading.clone(), tiles, last: index == last_index, }); @@ -2635,7 +3392,12 @@ fn clone_row(row: &GalleryRow) -> GalleryRow { match row { GalleryRow::Memories => GalleryRow::Memories, GalleryRow::Heading(heading) => GalleryRow::Heading(heading.clone()), - GalleryRow::Tiles { tiles, last } => GalleryRow::Tiles { + GalleryRow::Tiles { + section, + tiles, + last, + } => GalleryRow::Tiles { + section: section.clone(), tiles: tiles.clone(), last: *last, }, @@ -2944,7 +3706,7 @@ fn memory_card(ui: &Rc, years_ago: u32, photos: Vec) -> gtk4::But .can_shrink(true) .build(); let placeholder = gtk4::Image::builder() - .icon_name("image-x-generic-symbolic") + .icon_name("pdfs-photos-symbolic") .pixel_size(24) .build(); placeholder.add_css_class("photo-placeholder"); @@ -3279,7 +4041,7 @@ pub(crate) fn load_gallery(ui: &Rc, append: bool) { ui.gallery.model.remove_all(); gallery_status( ui, - "image-x-generic-symbolic", + "pdfs-photos-symbolic", &gettext("Loading photos…"), &gettext("Reading your Proton Drive timeline."), false, @@ -3406,7 +4168,7 @@ pub(crate) fn load_gallery(ui: &Rc, append: bool) { if ui.gallery.favorites.get() { "starred-symbolic" } else { - "image-x-generic-symbolic" + "pdfs-photos-symbolic" }, &title, &description, @@ -3488,9 +4250,10 @@ pub(crate) fn play_external(path: &str) { #[cfg(test)] mod tests { use super::{ - Grouping, ROW_DEFAULT, ROW_MAX, ROW_MIN, ROW_STEP, TILE_GAP, active_filters, - empty_timeline_text, grouping_for, memory_years, month_index, month_range, plan_grid, - section_heading, + Grouping, ROW_DEFAULT, ROW_MAX, ROW_MIN, ROW_STEP, TILE_GAP, TILE_RATIO_MAX, + TILE_RATIO_MIN, active_filters, copy_without_overwrite, empty_timeline_text, grouping_for, + memory_years, month_index, month_range, plan_grid, plan_justified, section_heading, + tile_ratio, }; use pdfs_core::control::{PhotoItem, PhotoKind, PhotoMonth}; @@ -3529,6 +4292,90 @@ mod tests { } } + /// Every row but the last spans the width to the pixel, gaps included, + /// and no row is wider than the width. + #[test] + fn justified_rows_span_the_content_width() { + let ratios: Vec = (0..60) + .map(|i| [1.5, 0.75, 1.0, 1.78, 0.5625, 2.5, 1.33][i % 7]) + .collect(); + for width in [360, 640, 901, 1440, 2560] { + for target in [ROW_MIN, ROW_DEFAULT, ROW_MAX] { + let rows = plan_justified(&ratios, width, target); + assert_eq!(rows.iter().map(Vec::len).sum::(), ratios.len()); + for (index, row) in rows.iter().enumerate() { + let span: i32 = + row.iter().map(|(w, _)| w).sum::() + TILE_GAP * (row.len() as i32 - 1); + assert!(span <= width, "{span}px overflows {width}px"); + if index + 1 < rows.len() { + assert_eq!(span, width, "row {index} at {width}px, {target}px"); + } + let height = row[0].1; + assert!(row.iter().all(|(_, h)| *h == height), "one height per row"); + } + } + } + } + + /// A row lands near the zoom level: never more than half a tile's height + /// off, whichever way it rounds. + #[test] + fn justified_rows_stay_near_the_zoom_level() { + let ratios = vec![1.33; 40]; + for target in [ROW_MIN, ROW_DEFAULT, ROW_MAX] { + let rows = plan_justified(&ratios, 1440, target); + for row in &rows[..rows.len() - 1] { + let height = row[0].1; + assert!( + (height - target).abs() <= target / 2, + "{height}px row for a {target}px zoom" + ); + } + } + } + + /// Two photos from one day stay at the zoom level rather than being + /// stretched to fill a wide window. + #[test] + fn the_last_row_is_not_stretched() { + let rows = plan_justified(&[1.5, 0.75], 1920, ROW_DEFAULT); + assert_eq!(rows.len(), 1); + assert_eq!(rows[0], vec![(270, ROW_DEFAULT), (135, ROW_DEFAULT)]); + } + + #[test] + fn a_tile_takes_the_shape_of_its_photo_within_bounds() { + assert_eq!(tile_ratio(None), 1.0); + assert_eq!(tile_ratio(Some(f64::NAN)), 1.0); + assert_eq!(tile_ratio(Some(0.0)), 1.0); + assert_eq!(tile_ratio(Some(1.5)), 1.5); + assert_eq!(tile_ratio(Some(0.1)), TILE_RATIO_MIN); + assert_eq!(tile_ratio(Some(9.0)), TILE_RATIO_MAX); + // A portrait photo is narrower than a landscape one in the same row. + let rows = plan_justified(&[1.5, 0.75, 1.5, 0.75, 1.5], 900, ROW_DEFAULT); + assert!(rows[0][0].0 > rows[0][1].0); + } + + /// Saving copies never replaces a file: a taken name gets a number. + #[test] + fn a_saved_copy_takes_a_free_name() { + let dir = std::env::temp_dir().join(format!("pdfs-copy-test-{}", std::process::id())); + let _ = std::fs::remove_dir_all(&dir); + std::fs::create_dir_all(&dir).unwrap(); + let source = dir.join("source"); + std::fs::write(&source, b"new").unwrap(); + std::fs::write(dir.join("photo.jpg"), b"old").unwrap(); + let source = source.to_str().unwrap(); + copy_without_overwrite(source, &dir, "photo.jpg").unwrap(); + copy_without_overwrite(source, &dir, "photo.jpg").unwrap(); + copy_without_overwrite(source, &dir, "../escape").unwrap(); + assert_eq!(std::fs::read(dir.join("photo.jpg")).unwrap(), b"old"); + assert_eq!(std::fs::read(dir.join("photo (2).jpg")).unwrap(), b"new"); + assert_eq!(std::fs::read(dir.join("photo (3).jpg")).unwrap(), b"new"); + assert_eq!(std::fs::read(dir.join("escape")).unwrap(), b"new"); + std::fs::remove_dir_all(&dir).unwrap(); + } + #[test] fn zooming_in_puts_fewer_tiles_in_a_row() { assert!(plan_grid(1920, ROW_MIN).0 > plan_grid(1920, ROW_DEFAULT).0); diff --git a/crates/pdfs-gui/src/app/pages/places.rs b/crates/pdfs-gui/src/app/pages/places.rs index 4c817ae..e2bb9ed 100644 --- a/crates/pdfs-gui/src/app/pages/places.rs +++ b/crates/pdfs-gui/src/app/pages/places.rs @@ -422,9 +422,7 @@ fn open_place(ui: &Rc, place: PlaceInfo) { // As in an album: no filters, no Upload, no view switch — back leads out. ui.gallery.filters.set_visible(false); - ui.gallery.view_switch.widget().set_visible(false); - ui.gallery.upload.set_visible(false); - ui.gallery.back.set_visible(true); + sync_header(ui); ui.gallery.kind.set(None); ui.gallery.range.set(None); @@ -439,9 +437,7 @@ pub(crate) fn close_place(ui: &Rc) { return; } ui.gallery.title.set_title(&gettext("Photos")); - ui.gallery.view_switch.widget().set_visible(true); - ui.gallery.upload.set_visible(true); - ui.gallery.back.set_visible(false); + sync_header(ui); } /// Show the place grid's own status page (loading, empty, or an error). diff --git a/crates/pdfs-gui/src/app/widgets/compat.rs b/crates/pdfs-gui/src/app/widgets/compat.rs index f746660..c019ba2 100644 --- a/crates/pdfs-gui/src/app/widgets/compat.rs +++ b/crates/pdfs-gui/src/app/widgets/compat.rs @@ -10,6 +10,12 @@ use crate::*; pub(crate) struct ToggleGroup { widget: gtk4::Widget, options: Options, + /// Each option's label, kept while [`Self::set_compact`] shows the icons + /// alone. + labels: Rc>>, + /// Each option's own tooltip, as given. + tooltips: Rc<[Option]>, + compact: Rc>, } #[derive(Clone)] @@ -47,6 +53,9 @@ impl ToggleGroup { Self { widget, options: Options::Toggles(toggles), + labels: Rc::new(RefCell::new(labels_of(options))), + tooltips: tooltips_of(options), + compact: Rc::default(), } } else { let bar = gtk4::Box::new(gtk4::Orientation::Horizontal, 0); @@ -71,6 +80,9 @@ impl ToggleGroup { Self { widget: bar.upcast(), options: Options::Buttons(buttons), + labels: Rc::new(RefCell::new(labels_of(options))), + tooltips: tooltips_of(options), + compact: Rc::default(), } } } @@ -115,15 +127,69 @@ impl ToggleGroup { } pub(crate) fn set_label(&self, index: u32, label: &str) { + if let Some(stored) = self.labels.borrow_mut().get_mut(index as usize) { + *stored = label.to_string(); + } + self.show_label(index, label); + } + + /// Put an icon before each option's label, in option order. + pub(crate) fn set_icons(&self, icons: &[&str]) { + match &self.options { + Options::Toggles(toggles) => { + for (toggle, icon) in toggles.iter().zip(icons) { + toggle.set_property("icon-name", *icon); + } + } + Options::Buttons(buttons) => { + let labels = self.labels.borrow(); + for ((button, icon), label) in buttons.iter().zip(icons).zip(labels.iter()) { + let face = adw::ButtonContent::builder() + .icon_name(*icon) + .label(label.as_str()) + .build(); + button.set_child(Some(&face)); + } + } + } + } + + /// Show the icons alone, for a narrow window, with each label moved to + /// the option's tooltip; or bring the labels back. + pub(crate) fn set_compact(&self, compact: bool) { + if self.compact.replace(compact) == compact { + return; + } + let labels = self.labels.borrow().clone(); + for (index, label) in labels.iter().enumerate() { + self.show_label(index as u32, label); + } + } + + /// Show `label` on option `index`, or only in its tooltip while compact. + fn show_label(&self, index: u32, label: &str) { + let compact = self.compact.get(); + let shown = if compact { "" } else { label }; + let given = self.tooltips.get(index as usize).cloned().flatten(); + let tooltip = if compact { + Some(label.to_string()) + } else { + given + }; match &self.options { Options::Toggles(toggles) => { if let Some(toggle) = toggles.get(index as usize) { - toggle.set_property("label", label); + toggle.set_property("label", shown); + toggle.set_property("tooltip", tooltip.unwrap_or_default()); } } Options::Buttons(buttons) => { if let Some(button) = buttons.get(index as usize) { - button.set_label(label); + match button.child().and_downcast::() { + Some(face) => face.set_label(shown), + None => button.set_label(shown), + } + button.set_tooltip_text(tooltip.as_deref()); } } } @@ -271,6 +337,19 @@ fn shortcuts_dialog(groups: &[(String, Vec<(&str, String)>)]) -> adw::Dialog { .build() } +/// The labels of `(label, tooltip)` options. +fn labels_of(options: &[(&str, Option<&str>)]) -> Vec { + options.iter().map(|(label, _)| label.to_string()).collect() +} + +/// The tooltips of `(label, tooltip)` options. +fn tooltips_of(options: &[(&str, Option<&str>)]) -> Rc<[Option]> { + options + .iter() + .map(|(_, tooltip)| tooltip.map(str::to_string)) + .collect() +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/pdfs-gui/tests/icon_names.rs b/crates/pdfs-gui/tests/icon_names.rs index 5e46db8..8753565 100644 --- a/crates/pdfs-gui/tests/icon_names.rs +++ b/crates/pdfs-gui/tests/icon_names.rs @@ -52,6 +52,7 @@ const STOCK: &[&str] = &[ "image-missing-symbolic", "image-x-generic-symbolic", "list-add-symbolic", + "list-remove-symbolic", "mark-location-symbolic", "media-playback-pause-symbolic", "media-playback-start-symbolic", @@ -61,10 +62,12 @@ const STOCK: &[&str] = &[ "object-select-symbolic", "preferences-system-symbolic", "process-stop-symbolic", + "selection-mode-symbolic", "starred-symbolic", "system-search-symbolic", "text-x-generic-symbolic", "user-trash-symbolic", + "video-x-generic-symbolic", "view-grid-symbolic", "view-list-symbolic", "view-more-symbolic", diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 9a10662..be0a3b7 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -37,6 +37,30 @@ Existing folders remain device backups; older builds cannot open the upgraded da Otherwise the daemon takes a frame with ffmpeg from the start of the file, plus an MP4's index, and never downloads more than about 16 MiB of a video for it, however large the video is. **Build Thumbnails** covers videos too (B283). +- **A new layout for Photos.** + - The grid shows every photo at its own shape, in rows that fill the width (portraits + are no longer cropped to squares). **Square Tiles** in the page menu brings the even + grid back, and the Year zoom stays square. + - Timeline, Albums and Places switch in the header. The filters take one row, which + scrolls sideways in a narrow window. + - The section you are in floats over the top of the grid once its heading has scrolled + away. Headings are larger, and a check beside each one selects the whole day, month or + year. + - Selection mode works as in other GNOME apps: the header shows the count and + **Cancel**, and a bar along the bottom has these actions: + - **Add to Favorites**, or remove them when every selected photo is already one; + - **Add to Album**; + - **Remove from Album**; + - **Save Copies**, into a folder you pick, never overwriting a file; + - **Move to Trash**. + - Favorites carry a star on their tile, and a video waiting for its thumbnail shows a + video glyph. + - New icons for Photos, albums and the slideshow. + - **Upload** takes several photos and videos at once, and you can drop files onto the + timeline to upload them. + - The zoom level and the tile shape are remembered between runs. + - In the photo viewer, the details panel lies over the photo when the window is + narrow instead of squeezing it. ### Fixed diff --git a/po/de.po b/po/de.po index 1fd9f3c..1ba5634 100644 --- a/po/de.po +++ b/po/de.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: German\n" @@ -31,7 +31,7 @@ msgstr[1] "vor {n} Min." #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -70,10 +70,10 @@ msgstr "%A, %-d. %B %Y, %H:%M" msgid "My files" msgstr "Meine Dateien" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Fotos" @@ -264,7 +264,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -359,8 +360,7 @@ msgstr "Umbenennen" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "In den Papierkorb verschieben" @@ -536,7 +536,7 @@ msgstr "Nichts im aktuellen Protokoll entspricht diesem Filter." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -594,20 +594,20 @@ msgstr "Aktivität konnte nicht gelesen werden" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Unerwartete Antwort vom Proton-Drive-Dienst." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Heute" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Gestern" @@ -648,6 +648,7 @@ msgid "Resolve…" msgstr "Lösen …" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1280,7 +1281,7 @@ msgstr[1] "{n} bereits vorhanden" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1296,12 +1297,12 @@ msgid "Reading your Proton Drive albums." msgstr "Proton-Drive-Alben werden gelesen." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "Keine Fotobibliothek" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "Für dieses Proton-Konto ist Fotos nicht aktiviert." @@ -1351,11 +1352,13 @@ msgstr "Alben konnten nicht geladen werden" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1376,7 +1379,7 @@ msgstr "Der Proton-Drive-Dienst hat nicht geantwortet." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1468,7 +1471,7 @@ msgstr[0] "Ein Album für {n} Foto auswählen." msgstr[1] "Ein Album für {n} Fotos auswählen." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "Neues Album …" @@ -1550,7 +1553,7 @@ msgid "New" msgstr "Neu" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Raster" @@ -1659,7 +1662,7 @@ msgstr "Symbolgröße" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1671,8 +1674,8 @@ msgstr[1] "{n} ausgewählt" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "Verschieben in den Papierkorb fehlgeschlagen" @@ -1711,7 +1714,7 @@ msgstr[0] "{n} Element in den Papierkorb verschoben" msgstr[1] "{n} Elemente in den Papierkorb verschoben" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Rückgängig" @@ -1781,12 +1784,12 @@ msgid "Location" msgstr "Ort" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Öffnen mit …" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Abspielen" @@ -1832,7 +1835,7 @@ msgid "Versions…" msgstr "Versionen …" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Details" @@ -1983,8 +1986,10 @@ msgstr[1] "Vorschaubilder für {n} Dateien in {root} bereit" #, rust-format msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" -msgstr[0] "Vorschaubilder für {n} Datei in {root} bereit; {failed} nicht verfügbar" -msgstr[1] "Vorschaubilder für {n} Dateien in {root} bereit; {failed} nicht verfügbar" +msgstr[0] "" +"Vorschaubilder für {n} Datei in {root} bereit; {failed} nicht verfügbar" +msgstr[1] "" +"Vorschaubilder für {n} Dateien in {root} bereit; {failed} nicht verfügbar" #: crates/pdfs-gui/src/app/pages/browser.rs:1779 #, rust-format @@ -2155,6 +2160,7 @@ msgid "Uploading…" msgstr "Wird hochgeladen …" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2162,7 +2168,7 @@ msgstr[0] "{n} Element wird hochgeladen …" msgstr[1] "{n} Elemente werden hochgeladen …" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "Anzeigen" @@ -2478,7 +2484,9 @@ msgstr "Modus konnte nicht geändert werden" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "Synchronisierung von „{path}“ beenden? Die lokalen Dateien und der Ordner in Meine Dateien bleiben erhalten." +msgstr "" +"Synchronisierung von „{path}“ beenden? Die lokalen Dateien und der Ordner in " +"Meine Dateien bleiben erhalten." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2813,7 +2821,7 @@ msgstr[0] "{date}, {n} Kopie" msgstr[1] "{date}, {n} Kopien" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3674,29 +3682,29 @@ msgid "Sign Out" msgstr "Abmelden" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "{name} anzeigen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "RAW-Datei anzeigen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "Video anzeigen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "Foto anzeigen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "Proton Drive ist nicht erreichbar." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "Dieses Foto konnte nicht dargestellt werden." @@ -3779,6 +3787,7 @@ msgid "Couldn't save the copy" msgstr "Die Kopie konnte nicht gespeichert werden" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "Das Kopieren wurde unterbrochen." @@ -3793,231 +3802,317 @@ msgstr "{position} von {total}" msgid "{position} of {loaded}+" msgstr "{position} von {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Zurück (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Weiter (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Details (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Als Favorit markieren" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Diashow (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Andere Dateien dieses Fotos" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Kopie speichern …" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "In den Papierkorb verschieben (Entf)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Schließen (Esc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Auf Karte anzeigen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Details ausblenden" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "Favorit konnte nicht geändert werden" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Fotos hochladen" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Aus Google Photos importieren" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Zurück zu den Alben" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Aus Google Photos importieren …" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Hochladen" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Fotos und Videos hochladen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "Weitere Wege, Fotos hinzuzufügen" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Quadratische Kacheln" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Duplikate finden …" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "Mehr" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Auswählen" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Fotos auswählen" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Zum Album hinzufügen …" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Auswahl verlassen (Esc)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Nur Favoriten" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Nur Fotos ohne Album" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Monat" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "Alle Zeiträume" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Filter zurücksetzen" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filter" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Zeitleiste" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Alben" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Orte" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "An diesem Tag" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Karte" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Import aus Google Photos läuft …" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Auswahl verlassen (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Zu Favoriten hinzufügen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Zum Album hinzufügen …" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Aus Album entfernen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Kopien speichern …" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "In den Papierkorb verschieben …" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%OB %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "Alle" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Videos" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Foto zum Hochladen auswählen" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Fotos und Videos hochladen" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Bilder" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Fotos und Videos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Foto hochgeladen" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Auswahl dieser Fotos aufheben" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Diese Fotos auswählen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "{failed} von {n} Favorit konnte nicht geändert werden" +msgstr[1] "{failed} von {n} Favoriten konnten nicht geändert werden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "{n} Foto zu Favoriten hinzugefügt" +msgstr[1] "{n} Fotos zu Favoriten hinzugefügt" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "{n} Foto aus Favoriten entfernt" +msgstr[1] "{n} Fotos aus Favoriten entfernt" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Kopien speichern" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Hier speichern" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "{failed} von {n} Kopie konnte nicht gespeichert werden" +msgstr[1] "{failed} von {n} Kopien konnten nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "{n} Kopie gespeichert" +msgstr[1] "{n} Kopien gespeichert" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Nur Fotos und Videos können zu Fotos hinzugefügt werden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "Foto konnte nicht hochgeladen werden" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "{failed} von {n} Element konnte nicht hochgeladen werden" +msgstr[1] "{failed} von {n} Elementen konnten nicht hochgeladen werden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Foto hochgeladen" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Aus Favoriten entfernen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "Dieses Foto in den Papierkorb verschieben?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." @@ -4027,14 +4122,14 @@ msgstr[1] "" "Dieses Foto in den Papierkorb verschieben? Es ist als {n} Dateien " "gespeichert." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "{n} Foto in den Papierkorb verschieben?" msgstr[1] "{n} Fotos in den Papierkorb verschieben?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." @@ -4045,19 +4140,19 @@ msgstr[1] "" "{n} Fotos in den Papierkorb verschieben? Sie sind als {files} Dateien " "gespeichert." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "In den Papierkorb verschieben?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "Der Server hat abgelehnt." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "Einige Fotos konnten nicht in den Papierkorb verschoben werden" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -4065,7 +4160,7 @@ msgstr[0] "{n} Foto in den Papierkorb verschoben" msgstr[1] "{n} Fotos in den Papierkorb verschoben" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4073,7 +4168,7 @@ msgstr[0] "{count} Video" msgstr[1] "{count} Videos" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4081,133 +4176,133 @@ msgstr[0] "{count} RAW-Foto" msgstr[1] "{count} RAW-Fotos" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "{count} Foto" msgstr[1] "{count} Fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Unbekanntes Datum" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d. %B %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d.%m.%Y %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Unbekanntes Datum" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d. %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Jedes Foto ist in einem Album" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Den Albumfilter ausschalten, um alles zu sehen." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "Noch keine Fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "Fotos, die zu Proton Drive hochgeladen werden, erscheinen hier." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "Noch keine Favoriten" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" "Ein Foto im Betrachter oder über sein Menü als Favorit markieren, um es hier " "zu finden." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "Keine favorisierten Videos im {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "Keine favorisierten Videos" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "Keine favorisierten RAW-Dateien im {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "Keine favorisierten RAW-Dateien" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "Keine favorisierten Fotos im {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "Keine favorisierten Fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Den Favoritenfilter ausschalten, um alles zu sehen." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "Keine Videos im {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "Keine Videos" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "Keine RAW-Dateien im {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "Keine RAW-Dateien" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "Keine Fotos im {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "Keine Fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Einen anderen Filter oder Monat wählen." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4215,50 +4310,47 @@ msgstr[0] "vor {n} Jahr" msgstr[1] "vor {n} Jahren" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Favorit" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Aus Album entfernen" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Auswählen" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "In den Papierkorb verschieben …" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Zu Favoriten hinzugefügt" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Aus Favoriten entfernt" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Fotos werden geladen …" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Proton-Drive-Zeitleiste wird gelesen." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Leeres Album" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "Dieses Album enthält keine Fotos." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "Weitere Fotos konnten nicht geladen werden" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "Fotos konnten nicht geladen werden" @@ -4939,7 +5031,7 @@ msgid "Show sync status" msgstr "Synchronisierungsstatus anzeigen" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Tastenkürzel" @@ -6599,6 +6691,10 @@ msgstr "Alle" msgid "Documents" msgstr "Dokumente" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Bilder" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6661,6 +6757,9 @@ msgstr "{count} J." msgid "cannot reach the Proton Drive daemon: {error}" msgstr "Proton-Drive-Hintergrunddienst nicht erreichbar: {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Foto zum Hochladen auswählen" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" diff --git a/po/en_GB.po b/po/en_GB.po index 3ca356b..a57be2d 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\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" @@ -31,7 +31,7 @@ msgstr[1] "{n} min ago" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -70,10 +70,10 @@ msgstr "%A %-d %B %Y, %H:%M" msgid "My files" msgstr "My files" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Photos" @@ -260,7 +260,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -355,8 +356,7 @@ msgstr "Rename" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "Move to Trash" @@ -531,7 +531,7 @@ msgstr "Nothing in the recent log fits this filter." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -587,20 +587,20 @@ msgstr "Couldn't read activity" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Unexpected reply from the Proton Drive service." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Today" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Yesterday" @@ -639,6 +639,7 @@ msgid "Resolve…" msgstr "Resolve…" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1267,7 +1268,7 @@ msgstr[1] "{n} already there" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1283,12 +1284,12 @@ msgid "Reading your Proton Drive albums." msgstr "Reading your Proton Drive albums." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "No photo library" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "This Proton account doesn't have Photos enabled." @@ -1338,11 +1339,13 @@ msgstr "Couldn't load albums" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1363,7 +1366,7 @@ msgstr "The Proton Drive service didn't respond." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1455,7 +1458,7 @@ msgstr[0] "Choose an album for {n} photo." msgstr[1] "Choose an album for {n} photos." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "New Album…" @@ -1537,7 +1540,7 @@ msgid "New" msgstr "New" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Grid" @@ -1646,7 +1649,7 @@ msgstr "Icon size" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1658,8 +1661,8 @@ msgstr[1] "{n} selected" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "Couldn't move to Trash" @@ -1694,7 +1697,7 @@ msgstr[0] "Moved {n} item to Trash" msgstr[1] "Moved {n} items to Trash" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Undo" @@ -1764,12 +1767,12 @@ msgid "Location" msgstr "Location" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Open With…" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Play" @@ -1815,7 +1818,7 @@ msgid "Versions…" msgstr "Versions…" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Details" @@ -2137,6 +2140,7 @@ msgid "Uploading…" msgstr "Uploading…" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2144,7 +2148,7 @@ msgstr[0] "Uploading {n} item…" msgstr[1] "Uploading {n} items…" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "View" @@ -2452,7 +2456,9 @@ msgstr "Couldn't change mode" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "Stop syncing “{path}”? Both the local files and the folder in My files are kept." +msgstr "" +"Stop syncing “{path}”? Both the local files and the folder in My files are " +"kept." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2778,7 +2784,7 @@ msgstr[0] "{date}, {n} copy" msgstr[1] "{date}, {n} copies" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3610,29 +3616,29 @@ msgid "Sign Out" msgstr "Sign Out" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "Show {name}" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "Show the raw file" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "Show the video" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "Show the photo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "Couldn't reach Proton Drive." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "Couldn't render this photo." @@ -3715,6 +3721,7 @@ msgid "Couldn't save the copy" msgstr "Couldn't save the copy" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "The copy was interrupted." @@ -3729,264 +3736,350 @@ msgstr "{position} of {total}" msgid "{position} of {loaded}+" msgstr "{position} of {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Photo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Previous (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Next (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Details (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Favourite" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Slideshow (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Other files of this photo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Save a Copy…" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "Move to Trash (Delete)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Close (Esc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Show on map" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Hide details" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "Couldn't change the favourite" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Upload photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Import from Google Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Back to albums" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Import from Google Photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Upload" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Upload photos and videos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "More ways to add photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Square Tiles" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Find Duplicates…" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "More" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Select" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Select photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Add to Album…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Leave selection (Esc)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Only favourites" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Only photos not in an album" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Month" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "All dates" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Clear filters" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filters" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Timeline" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Albums" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Places" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "On this day" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Map" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Importing from Google Photos…" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Leave selection (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Add to Favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Add to Album…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Remove from Album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Save Copies…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "Move to Trash…" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%OB %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "All" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Videos" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "Raw" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Select Photo to Upload" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Upload Photos and Videos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Images" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Photos and videos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Photo uploaded" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Deselect these photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Select these photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "Couldn't change {failed} of {n} favourite" +msgstr[1] "Couldn't change {failed} of {n} favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "Added {n} photo to Favourites" +msgstr[1] "Added {n} photos to Favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "Removed {n} photo from Favourites" +msgstr[1] "Removed {n} photos from Favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Save Copies" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Save Here" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "Couldn't save {failed} of {n} copy" +msgstr[1] "Couldn't save {failed} of {n} copies" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "Saved {n} copy" +msgstr[1] "Saved {n} copies" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Only photos and videos can go into Photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "Couldn't upload photo" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "Couldn't upload {failed} of {n} item" +msgstr[1] "Couldn't upload {failed} of {n} items" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Photo uploaded" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Remove from Favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "Move this photo to Trash?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." msgstr[0] "Move this photo to Trash? It is stored as {n} file." msgstr[1] "Move this photo to Trash? It is stored as {n} files." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "Move {n} photo to Trash?" msgstr[1] "Move {n} photos to Trash?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." msgstr[0] "Move {n} photo to Trash? They are stored as {files} files." msgstr[1] "Move {n} photos to Trash? They are stored as {files} files." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "Move to Trash?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "The server refused." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "Some photos couldn't be moved to Trash" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -3994,7 +4087,7 @@ msgstr[0] "Moved {n} photo to Trash" msgstr[1] "Moved {n} photos to Trash" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4002,7 +4095,7 @@ msgstr[0] "{count} video" msgstr[1] "{count} videos" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4010,131 +4103,131 @@ msgstr[0] "{count} raw photo" msgstr[1] "{count} raw photos" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "{count} photo" msgstr[1] "{count} photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Unknown date" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d %B %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%Y-%m-%d %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Unknown Date" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Every photo is in an album" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Turn off the album filter to see everything." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "No photos yet" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "Photos you upload to Proton Drive appear here." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "No favourites yet" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "Star a photo in the viewer or from its menu to find it here." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "No favourite videos in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "No favourite videos" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "No favourite raw files in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "No favourite raw files" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "No favourite photos in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "No favourite photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Turn off the favourites filter to see everything." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "No videos in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "No videos" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "No raw files in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "No raw files" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "No photos in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "No photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Try another filter or month." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4142,50 +4235,47 @@ msgstr[0] "{n} year ago" msgstr[1] "{n} years ago" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Favourite" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Remove from Album" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Select" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "Move to Trash…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Added to Favourites" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Removed from Favourites" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Loading photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Reading your Proton Drive timeline." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Empty album" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "This album has no photos in it." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "Couldn't load more photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "Couldn't load photos" @@ -4844,7 +4934,7 @@ msgid "Show sync status" msgstr "Show sync status" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Keyboard Shortcuts" @@ -6475,6 +6565,10 @@ msgstr "All" msgid "Documents" msgstr "Documents" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Images" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6537,6 +6631,9 @@ msgstr "{count}y" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "cannot reach the Proton Drive daemon: {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Select Photo to Upload" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" diff --git a/po/es.po b/po/es.po index 57192b0..e045e7c 100644 --- a/po/es.po +++ b/po/es.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Spanish\n" @@ -31,7 +31,7 @@ msgstr[1] "hace {n} min" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -70,10 +70,10 @@ msgstr "%A, %-d de %B de %Y, %H:%M" msgid "My files" msgstr "Mis archivos" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Fotos" @@ -262,7 +262,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -357,8 +358,7 @@ msgstr "Renombrar" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "Mover a la papelera" @@ -533,7 +533,7 @@ msgstr "Nada del registro reciente coincide con este filtro." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -590,20 +590,20 @@ msgstr "No se pudo leer la actividad" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Respuesta inesperada del servicio de Proton Drive." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Hoy" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Ayer" @@ -644,6 +644,7 @@ msgid "Resolve…" msgstr "Resolver…" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1273,7 +1274,7 @@ msgstr[1] "{n} ya existían" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1289,12 +1290,12 @@ msgid "Reading your Proton Drive albums." msgstr "Leyendo sus álbumes de Proton Drive." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "No hay fototeca" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "Esta cuenta de Proton no tiene Fotos activado." @@ -1344,11 +1345,13 @@ msgstr "No se pudieron cargar los álbumes" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1369,7 +1372,7 @@ msgstr "El servicio de Proton Drive no respondió." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1461,7 +1464,7 @@ msgstr[0] "Elija un álbum para {n} foto." msgstr[1] "Elija un álbum para {n} fotos." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "Álbum nuevo…" @@ -1543,7 +1546,7 @@ msgid "New" msgstr "Nuevo" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Cuadrícula" @@ -1652,7 +1655,7 @@ msgstr "Tamaño de los iconos" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1664,8 +1667,8 @@ msgstr[1] "{n} seleccionados" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "No se pudo mover a la papelera" @@ -1701,7 +1704,7 @@ msgstr[0] "Se movió {n} elemento a la papelera" msgstr[1] "Se movieron {n} elementos a la papelera" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Deshacer" @@ -1771,12 +1774,12 @@ msgid "Location" msgstr "Ubicación" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Abrir con…" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Reproducir" @@ -1822,7 +1825,7 @@ msgid "Versions…" msgstr "Versiones…" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Detalles" @@ -1974,8 +1977,10 @@ msgstr[1] "Miniaturas listas para {n} archivos en {root}" #, rust-format msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" -msgstr[0] "Miniaturas listas para {n} archivo en {root}; {failed} no disponibles" -msgstr[1] "Miniaturas listas para {n} archivos en {root}; {failed} no disponibles" +msgstr[0] "" +"Miniaturas listas para {n} archivo en {root}; {failed} no disponibles" +msgstr[1] "" +"Miniaturas listas para {n} archivos en {root}; {failed} no disponibles" #: crates/pdfs-gui/src/app/pages/browser.rs:1779 #, rust-format @@ -2146,6 +2151,7 @@ msgid "Uploading…" msgstr "Subiendo…" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2153,7 +2159,7 @@ msgstr[0] "Subiendo {n} elemento…" msgstr[1] "Subiendo {n} elementos…" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "Ver" @@ -2465,7 +2471,9 @@ msgstr "No se pudo cambiar el modo" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "¿Dejar de sincronizar “{path}”? Se conservan tanto los archivos locales como la carpeta en Mis archivos." +msgstr "" +"¿Dejar de sincronizar “{path}”? Se conservan tanto los archivos locales como " +"la carpeta en Mis archivos." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2793,7 +2801,7 @@ msgstr[0] "{date}, {n} copia" msgstr[1] "{date}, {n} copias" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3649,29 +3657,29 @@ msgid "Sign Out" msgstr "Cerrar la sesión" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "Mostrar {name}" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "Mostrar el archivo RAW" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "Mostrar el vídeo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "Mostrar la foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "No se pudo contactar con Proton Drive." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "No se pudo representar esta foto." @@ -3754,6 +3762,7 @@ msgid "Couldn't save the copy" msgstr "No se pudo guardar la copia" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "Se interrumpió la copia." @@ -3768,245 +3777,331 @@ msgstr "{position} de {total}" msgid "{position} of {loaded}+" msgstr "{position} de {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Anterior (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Siguiente (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Detalles (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Marcar como favorita" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Presentación (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Otros archivos de esta foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Guardar una copia…" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "Mover a la papelera (Supr)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Cerrar (Esc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Mostrar en el mapa" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Ocultar detalles" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "No se pudo cambiar el favorito" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Subir fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Importar de Google Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Volver a los álbumes" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Importar de Google Photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Subir" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Subir fotos y vídeos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "Más formas de añadir fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Miniaturas cuadradas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Buscar duplicados…" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "Más" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Seleccionar" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Seleccionar fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Añadir al álbum…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Salir de la selección (Esc)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Solo favoritas" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Solo fotos que no están en ningún álbum" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Mes" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "Todas las fechas" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Quitar filtros" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filtros" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Cronología" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Álbumes" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Lugares" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "Tal día como hoy" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Mapa" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Importando de Google Photos…" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Salir de la selección (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Añadir a favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Añadir al álbum…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Quitar del álbum" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Guardar copias…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "Mover a la papelera…" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%OB de %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "Todo" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Vídeos" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Seleccionar la foto que subir" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Subir fotos y vídeos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Imágenes" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Fotos y vídeos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Foto subida" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Deseleccionar estas fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Seleccionar estas fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "No se pudo cambiar {failed} de {n} favorita" +msgstr[1] "No se pudieron cambiar {failed} de {n} favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "Se añadió {n} foto a favoritas" +msgstr[1] "Se añadieron {n} fotos a favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "Se quitó {n} foto de favoritas" +msgstr[1] "Se quitaron {n} fotos de favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Guardar copias" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Guardar aquí" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "No se pudo guardar {failed} de {n} copia" +msgstr[1] "No se pudieron guardar {failed} de {n} copias" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "Se guardó {n} copia" +msgstr[1] "Se guardaron {n} copias" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Solo las fotos y los vídeos pueden ir a Fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "No se pudo subir la foto" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "No se pudo subir {failed} de {n} elemento" +msgstr[1] "No se pudieron subir {failed} de {n} elementos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Foto subida" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Quitar de favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "¿Mover esta foto a la papelera?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." msgstr[0] "¿Mover esta foto a la papelera? Está guardada como {n} archivo." msgstr[1] "¿Mover esta foto a la papelera? Está guardada como {n} archivos." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "¿Mover {n} foto a la papelera?" msgstr[1] "¿Mover {n} fotos a la papelera?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." @@ -4014,19 +4109,19 @@ msgstr[0] "¿Mover {n} foto a la papelera? Está guardada como {files} archivos. msgstr[1] "" "¿Mover {n} fotos a la papelera? Están guardadas como {files} archivos." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "¿Mover a la papelera?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "El servidor lo rechazó." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "No se pudieron mover algunas fotos a la papelera" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -4034,7 +4129,7 @@ msgstr[0] "Se movió {n} foto a la papelera" msgstr[1] "Se movieron {n} fotos a la papelera" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4042,7 +4137,7 @@ msgstr[0] "{count} vídeo" msgstr[1] "{count} vídeos" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4050,133 +4145,133 @@ msgstr[0] "{count} foto RAW" msgstr[1] "{count} fotos RAW" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "{count} foto" msgstr[1] "{count} fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Fecha desconocida" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d de %B de %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Fecha desconocida" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Todas las fotos están en un álbum" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Desactive el filtro de álbumes para verlo todo." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "Todavía no hay fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "Las fotos que suba a Proton Drive aparecerán aquí." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "Todavía no hay favoritas" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" "Marque una foto como favorita en el visor o desde su menú para encontrarla " "aquí." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "No hay vídeos favoritos en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "No hay vídeos favoritos" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "No hay archivos RAW favoritos en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "No hay archivos RAW favoritos" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "No hay fotos favoritas en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "No hay fotos favoritas" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Desactive el filtro de favoritas para verlo todo." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "No hay vídeos en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "No hay vídeos" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "No hay archivos RAW en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "No hay archivos RAW" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "No hay fotos en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "No hay fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Pruebe con otro filtro u otro mes." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4184,50 +4279,47 @@ msgstr[0] "hace {n} año" msgstr[1] "hace {n} años" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Favorita" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Quitar del álbum" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Seleccionar" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "Mover a la papelera…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Añadida a favoritas" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Quitada de favoritas" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Cargando fotos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Leyendo su cronología de Proton Drive." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Álbum vacío" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "Este álbum no tiene fotos." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "No se pudieron cargar más fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "No se pudieron cargar las fotos" @@ -4900,7 +4992,7 @@ msgid "Show sync status" msgstr "Mostrar el estado de la sincronización" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Atajos del teclado" @@ -6554,6 +6646,10 @@ msgstr "Todo" msgid "Documents" msgstr "Documentos" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Imágenes" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6616,6 +6712,9 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "no se puede contactar con el demonio de Proton Drive: {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Seleccionar la foto que subir" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" diff --git a/po/fr.po b/po/fr.po index 2867ed4..717563f 100644 --- a/po/fr.po +++ b/po/fr.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: French\n" @@ -31,7 +31,7 @@ msgstr[1] "il y a {n} min" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -70,10 +70,10 @@ msgstr "%A %-d %B %Y à %H:%M" msgid "My files" msgstr "Mes fichiers" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Photos" @@ -264,7 +264,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -359,8 +360,7 @@ msgstr "Renommer" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "Mettre à la corbeille" @@ -535,7 +535,7 @@ msgstr "Rien dans le journal récent ne correspond à ce filtre." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -593,20 +593,20 @@ msgstr "Impossible de lire l’activité" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Réponse inattendue du service Proton Drive." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Aujourd’hui" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Hier" @@ -647,6 +647,7 @@ msgid "Resolve…" msgstr "Résoudre…" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1284,7 +1285,7 @@ msgstr[1] "{n} déjà présents" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1300,12 +1301,12 @@ msgid "Reading your Proton Drive albums." msgstr "Lecture de vos albums Proton Drive." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "Aucune photothèque" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "Photos n’est pas activé pour ce compte Proton." @@ -1355,11 +1356,13 @@ msgstr "Impossible de charger les albums" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1380,7 +1383,7 @@ msgstr "Le service Proton Drive n’a pas répondu." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1472,7 +1475,7 @@ msgstr[0] "Choisissez un album pour {n} photo." msgstr[1] "Choisissez un album pour {n} photos." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "Nouvel album…" @@ -1554,7 +1557,7 @@ msgid "New" msgstr "Nouveau" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Grille" @@ -1663,7 +1666,7 @@ msgstr "Taille des icônes" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1675,8 +1678,8 @@ msgstr[1] "{n} sélectionnés" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "Impossible de mettre à la corbeille" @@ -1713,7 +1716,7 @@ msgstr[0] "{n} élément mis à la corbeille" msgstr[1] "{n} éléments mis à la corbeille" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Annuler" @@ -1783,12 +1786,12 @@ msgid "Location" msgstr "Emplacement" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Ouvrir avec…" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Lire" @@ -1834,7 +1837,7 @@ msgid "Versions…" msgstr "Versions…" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Détails" @@ -1986,8 +1989,10 @@ msgstr[1] "Miniatures prêtes pour {n} fichiers dans {root}" #, rust-format msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" -msgstr[0] "Miniatures prêtes pour {n} fichier dans {root} ; indisponibles : {failed}" -msgstr[1] "Miniatures prêtes pour {n} fichiers dans {root} ; indisponibles : {failed}" +msgstr[0] "" +"Miniatures prêtes pour {n} fichier dans {root} ; indisponibles : {failed}" +msgstr[1] "" +"Miniatures prêtes pour {n} fichiers dans {root} ; indisponibles : {failed}" #: crates/pdfs-gui/src/app/pages/browser.rs:1779 #, rust-format @@ -2158,6 +2163,7 @@ msgid "Uploading…" msgstr "Téléversement…" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2165,7 +2171,7 @@ msgstr[0] "Téléversement de {n} élément…" msgstr[1] "Téléversement de {n} éléments…" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "Afficher" @@ -2477,7 +2483,9 @@ msgstr "Impossible de changer de mode" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "Arrêter la synchronisation de « {path} » ? Les fichiers locaux et le dossier dans Mes fichiers sont conservés." +msgstr "" +"Arrêter la synchronisation de « {path} » ? Les fichiers locaux et le dossier " +"dans Mes fichiers sont conservés." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2811,7 +2819,7 @@ msgstr[0] "{date}, {n} copie" msgstr[1] "{date}, {n} copies" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3676,29 +3684,29 @@ msgid "Sign Out" msgstr "Se déconnecter" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "Afficher {name}" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "Afficher le fichier RAW" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "Afficher la vidéo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "Afficher la photo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "Impossible de joindre Proton Drive." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "Impossible d’afficher cette photo." @@ -3781,6 +3789,7 @@ msgid "Couldn't save the copy" msgstr "Impossible d’enregistrer la copie" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "La copie a été interrompue." @@ -3795,231 +3804,317 @@ msgstr "{position} sur {total}" msgid "{position} of {loaded}+" msgstr "{position} sur {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Photo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Précédente (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Suivante (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Détails (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Ajouter aux favoris" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Diaporama (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Autres fichiers de cette photo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Enregistrer une copie…" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "Mettre à la corbeille (Suppr)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Fermer (Échap)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Afficher sur la carte" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Masquer les détails" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "Impossible de modifier le favori" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Téléverser des photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Importer depuis Google Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Retour aux albums" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Importer depuis Google Photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Téléverser" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Téléverser des photos et des vidéos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "Autres façons d’ajouter des photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Vignettes carrées" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Rechercher les doublons…" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "Plus" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Sélectionner" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Sélectionner des photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Ajouter à un album…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Quitter la sélection (Échap)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Uniquement les favoris" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Uniquement les photos hors album" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Mois" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "Toutes les dates" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Effacer les filtres" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filtres" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Chronologie" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Albums" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Lieux" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "Ce jour-là" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Carte" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Importation depuis Google Photos…" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Quitter la sélection (Échap)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Ajouter aux favoris" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Ajouter à un album…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Retirer de l’album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Enregistrer des copies…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "Mettre à la corbeille…" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%B %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "Tout" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Vidéos" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Sélectionner une photo à téléverser" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Téléverser des photos et des vidéos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Images" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Photos et vidéos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Photo téléversée" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Désélectionner ces photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Sélectionner ces photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "Impossible de modifier {failed} favori sur {n}" +msgstr[1] "Impossible de modifier {failed} favoris sur {n}" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "{n} photo ajoutée aux favoris" +msgstr[1] "{n} photos ajoutées aux favoris" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "{n} photo retirée des favoris" +msgstr[1] "{n} photos retirées des favoris" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Enregistrer des copies" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Enregistrer ici" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "Impossible d’enregistrer {failed} copie sur {n}" +msgstr[1] "Impossible d’enregistrer {failed} copies sur {n}" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "{n} copie enregistrée" +msgstr[1] "{n} copies enregistrées" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Seules les photos et les vidéos peuvent aller dans Photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "Impossible de téléverser la photo" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "Impossible de téléverser {failed} élément sur {n}" +msgstr[1] "Impossible de téléverser {failed} éléments sur {n}" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Photo téléversée" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Retirer des favoris" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "Mettre cette photo à la corbeille ?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." @@ -4030,14 +4125,14 @@ msgstr[1] "" "Mettre cette photo à la corbeille ? Elle est stockée sous forme de {n} " "fichiers." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "Mettre {n} photo à la corbeille ?" msgstr[1] "Mettre {n} photos à la corbeille ?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." @@ -4048,19 +4143,19 @@ msgstr[1] "" "Mettre {n} photos à la corbeille ? Elles sont stockées sous forme de {files} " "fichiers." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "Mettre à la corbeille ?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "Le serveur a refusé." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "Certaines photos n’ont pas pu être mises à la corbeille" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -4068,7 +4163,7 @@ msgstr[0] "{n} photo mise à la corbeille" msgstr[1] "{n} photos mises à la corbeille" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4076,7 +4171,7 @@ msgstr[0] "{count} vidéo" msgstr[1] "{count} vidéos" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4084,133 +4179,133 @@ msgstr[0] "{count} photo RAW" msgstr[1] "{count} photos RAW" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "{count} photo" msgstr[1] "{count} photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Date inconnue" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d %B %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Date inconnue" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Toutes les photos sont dans un album" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Désactivez le filtre des albums pour tout afficher." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "Aucune photo pour l’instant" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "Les photos que vous téléversez sur Proton Drive apparaissent ici." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "Aucun favori pour l’instant" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" "Ajoutez une photo aux favoris dans la visionneuse ou depuis son menu pour la " "retrouver ici." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "Aucune vidéo favorite en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "Aucune vidéo favorite" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "Aucun fichier RAW favori en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "Aucun fichier RAW favori" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "Aucune photo favorite en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "Aucune photo favorite" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Désactivez le filtre des favoris pour tout afficher." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "Aucune vidéo en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "Aucune vidéo" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "Aucun fichier RAW en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "Aucun fichier RAW" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "Aucune photo en {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "Aucune photo" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Essayez un autre filtre ou un autre mois." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4218,50 +4313,47 @@ msgstr[0] "il y a {n} an" msgstr[1] "il y a {n} ans" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Favori" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Retirer de l’album" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Sélectionner" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "Mettre à la corbeille…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Ajoutée aux favoris" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Retirée des favoris" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Chargement des photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Lecture de votre chronologie Proton Drive." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Album vide" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "Cet album ne contient aucune photo." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "Impossible de charger plus de photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "Impossible de charger les photos" @@ -4938,7 +5030,7 @@ msgid "Show sync status" msgstr "Afficher l’état de la synchronisation" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" @@ -6602,6 +6694,10 @@ msgstr "Tout" msgid "Documents" msgstr "Documents" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Images" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6664,6 +6760,9 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "impossible de joindre le démon Proton Drive : {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Sélectionner une photo à téléverser" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" diff --git a/po/it.po b/po/it.po index b22bd23..babaed7 100644 --- a/po/it.po +++ b/po/it.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Italian\n" @@ -31,7 +31,7 @@ msgstr[1] "{n} min fa" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -70,10 +70,10 @@ msgstr "%A %-d %B %Y, %H:%M" msgid "My files" msgstr "I miei file" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Foto" @@ -260,7 +260,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -355,8 +356,7 @@ msgstr "Rinomina" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "Sposta nel cestino" @@ -531,7 +531,7 @@ msgstr "Nessuna voce del registro recente corrisponde a questo filtro." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -589,20 +589,20 @@ msgstr "Impossibile leggere le attività" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Risposta inattesa dal servizio di Proton Drive." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Oggi" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Ieri" @@ -643,6 +643,7 @@ msgid "Resolve…" msgstr "Risolvi…" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1278,7 +1279,7 @@ msgstr[1] "{n} già presenti" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1294,12 +1295,12 @@ msgid "Reading your Proton Drive albums." msgstr "Lettura degli album di Proton Drive." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "Nessuna libreria di foto" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "Questo account Proton non ha Foto abilitato." @@ -1349,11 +1350,13 @@ msgstr "Impossibile caricare gli album" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1374,7 +1377,7 @@ msgstr "Il servizio di Proton Drive non ha risposto." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1466,7 +1469,7 @@ msgstr[0] "Scegli un album per {n} foto." msgstr[1] "Scegli un album per {n} foto." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "Nuovo album…" @@ -1548,7 +1551,7 @@ msgid "New" msgstr "Nuovo" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Griglia" @@ -1657,7 +1660,7 @@ msgstr "Dimensione icone" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1669,8 +1672,8 @@ msgstr[1] "{n} selezionati" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "Impossibile spostare nel cestino" @@ -1707,7 +1710,7 @@ msgstr[0] "{n} elemento spostato nel cestino" msgstr[1] "{n} elementi spostati nel cestino" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Annulla" @@ -1777,12 +1780,12 @@ msgid "Location" msgstr "Posizione" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Apri con…" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Riproduci" @@ -1828,7 +1831,7 @@ msgid "Versions…" msgstr "Versioni…" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Dettagli" @@ -2152,6 +2155,7 @@ msgid "Uploading…" msgstr "Caricamento…" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2159,7 +2163,7 @@ msgstr[0] "Caricamento di {n} elemento…" msgstr[1] "Caricamento di {n} elementi…" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "Visualizza" @@ -2475,7 +2479,9 @@ msgstr "Impossibile cambiare modalità" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "Interrompere la sincronizzazione di “{path}”? Sia i file locali sia la cartella in I miei file vengono mantenuti." +msgstr "" +"Interrompere la sincronizzazione di “{path}”? Sia i file locali sia la " +"cartella in I miei file vengono mantenuti." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2808,7 +2814,7 @@ msgstr[0] "{date}, {n} copia" msgstr[1] "{date}, {n} copie" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3669,29 +3675,29 @@ msgid "Sign Out" msgstr "Disconnetti" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "Mostra {name}" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "Mostra il file RAW" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "Mostra il video" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "Mostra la foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "Impossibile raggiungere Proton Drive." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "Impossibile visualizzare questa foto." @@ -3774,6 +3780,7 @@ msgid "Couldn't save the copy" msgstr "Impossibile salvare la copia" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "La copia è stata interrotta." @@ -3788,264 +3795,350 @@ msgstr "{position} di {total}" msgid "{position} of {loaded}+" msgstr "{position} di {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Precedente (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Successiva (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Dettagli (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Aggiungi ai preferiti" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Presentazione (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Altri file di questa foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Salva una copia…" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "Sposta nel cestino (Canc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Chiudi (Esc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Mostra sulla mappa" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Nascondi dettagli" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "Impossibile modificare il preferito" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Carica foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Importa da Google Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Torna agli album" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Importa da Google Photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Carica" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Carica foto e video" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "Altri modi per aggiungere foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Riquadri quadrati" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Trova duplicati…" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "Altro" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Seleziona" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Seleziona foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Aggiungi all'album…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Esci dalla selezione (Esc)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Solo i preferiti" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Solo le foto non in un album" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Mese" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "Tutte le date" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Cancella filtri" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filtri" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Cronologia" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Album" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Luoghi" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "Accadde oggi" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Mappa" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Importazione da Google Photos…" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Esci dalla selezione (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Aggiungi ai preferiti" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Aggiungi all'album…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Rimuovi dall'album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Salva copie…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "Sposta nel cestino…" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%B %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "Tutti" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Video" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Seleziona la foto da caricare" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Carica foto e video" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Immagini" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Foto e video" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Foto caricata" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Deseleziona queste foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Seleziona queste foto" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "Impossibile modificare {failed} preferito su {n}" +msgstr[1] "Impossibile modificare {failed} preferiti su {n}" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "Aggiunta {n} foto ai preferiti" +msgstr[1] "Aggiunte {n} foto ai preferiti" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "Rimossa {n} foto dai preferiti" +msgstr[1] "Rimosse {n} foto dai preferiti" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Salva copie" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Salva qui" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "Impossibile salvare {failed} copia su {n}" +msgstr[1] "Impossibile salvare {failed} copie su {n}" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "Salvata {n} copia" +msgstr[1] "Salvate {n} copie" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Solo foto e video possono andare in Foto" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "Impossibile caricare la foto" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "Impossibile caricare {failed} elemento su {n}" +msgstr[1] "Impossibile caricare {failed} elementi su {n}" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Foto caricata" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Rimuovi dai preferiti" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "Spostare questa foto nel cestino?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." msgstr[0] "Spostare questa foto nel cestino? È memorizzata come {n} file." msgstr[1] "Spostare questa foto nel cestino? È memorizzata come {n} file." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "Spostare {n} foto nel cestino?" msgstr[1] "Spostare {n} foto nel cestino?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." msgstr[0] "Spostare {n} foto nel cestino? Sono memorizzate come {files} file." msgstr[1] "Spostare {n} foto nel cestino? Sono memorizzate come {files} file." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "Spostare nel cestino?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "Il server ha rifiutato la richiesta." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "Non è stato possibile spostare alcune foto nel cestino" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -4053,7 +4146,7 @@ msgstr[0] "{n} foto spostata nel cestino" msgstr[1] "{n} foto spostate nel cestino" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4061,7 +4154,7 @@ msgstr[0] "{count} video" msgstr[1] "{count} video" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4069,133 +4162,133 @@ msgstr[0] "{count} foto RAW" msgstr[1] "{count} foto RAW" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "{count} foto" msgstr[1] "{count} foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Data sconosciuta" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d %B %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Data sconosciuta" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Ogni foto è in un album" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Disattiva il filtro degli album per vedere tutto." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "Ancora nessuna foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "Le foto caricate su Proton Drive appaiono qui." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "Ancora nessun preferito" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" "Aggiungi una foto ai preferiti nel visualizzatore o dal suo menu per " "trovarla qui." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "Nessun video preferito a {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "Nessun video preferito" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "Nessun file RAW preferito a {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "Nessun file RAW preferito" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "Nessuna foto preferita a {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "Nessuna foto preferita" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Disattiva il filtro dei preferiti per vedere tutto." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "Nessun video a {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "Nessun video" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "Nessun file RAW a {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "Nessun file RAW" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "Nessuna foto a {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "Nessuna foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Prova un altro filtro o un altro mese." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4203,50 +4296,47 @@ msgstr[0] "{n} anno fa" msgstr[1] "{n} anni fa" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Preferito" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Rimuovi dall'album" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Seleziona" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "Sposta nel cestino…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Aggiunto ai preferiti" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Rimosso dai preferiti" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Caricamento delle foto…" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Lettura della cronologia di Proton Drive." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Album vuoto" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "Questo album non contiene foto." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "Impossibile caricare altre foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "Impossibile caricare le foto" @@ -4919,7 +5009,7 @@ msgid "Show sync status" msgstr "Mostra stato della sincronizzazione" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Scorciatoie da tastiera" @@ -6578,6 +6668,10 @@ msgstr "Tutti" msgid "Documents" msgstr "Documenti" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Immagini" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6640,6 +6734,9 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "impossibile raggiungere il demone di Proton Drive: {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Seleziona la foto da caricare" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" diff --git a/po/nl.po b/po/nl.po index 9d40789..81d3209 100644 --- a/po/nl.po +++ b/po/nl.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Dutch\n" @@ -31,7 +31,7 @@ msgstr[1] "{n} min geleden" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -70,10 +70,10 @@ msgstr "%A %-d %B %Y, %H:%M" msgid "My files" msgstr "Mijn bestanden" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Foto's" @@ -261,7 +261,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -356,8 +357,7 @@ msgstr "Hernoemen" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "Naar prullenbak verplaatsen" @@ -532,7 +532,7 @@ msgstr "Niets in het recente logboek past bij dit filter." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -590,20 +590,20 @@ msgstr "Kon activiteit niet lezen" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Onverwacht antwoord van de Proton Drive-service." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Vandaag" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Gisteren" @@ -644,6 +644,7 @@ msgid "Resolve…" msgstr "Oplossen…" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1274,7 +1275,7 @@ msgstr[1] "{n} al aanwezig" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1290,12 +1291,12 @@ msgid "Reading your Proton Drive albums." msgstr "Je Proton Drive-albums worden gelezen." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "Geen fotobibliotheek" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "Dit Proton-account heeft Foto's niet ingeschakeld." @@ -1345,11 +1346,13 @@ msgstr "Kon albums niet laden" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1370,7 +1373,7 @@ msgstr "De Proton Drive-service reageerde niet." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1462,7 +1465,7 @@ msgstr[0] "Kies een album voor {n} foto." msgstr[1] "Kies een album voor {n} foto's." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "Nieuw album…" @@ -1544,7 +1547,7 @@ msgid "New" msgstr "Nieuw" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Raster" @@ -1653,7 +1656,7 @@ msgstr "Pictogramgrootte" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1665,8 +1668,8 @@ msgstr[1] "{n} geselecteerd" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "Kon niet naar prullenbak verplaatsen" @@ -1703,7 +1706,7 @@ msgstr[0] "{n} item naar prullenbak verplaatst" msgstr[1] "{n} items naar prullenbak verplaatst" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Ongedaan maken" @@ -1773,12 +1776,12 @@ msgid "Location" msgstr "Locatie" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Openen met…" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Afspelen" @@ -1824,7 +1827,7 @@ msgid "Versions…" msgstr "Versies…" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Details" @@ -1974,8 +1977,10 @@ msgstr[1] "Miniaturen klaar voor {n} bestanden in {root}" #, rust-format msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" -msgstr[0] "Miniaturen klaar voor {n} bestand in {root}; {failed} niet beschikbaar" -msgstr[1] "Miniaturen klaar voor {n} bestanden in {root}; {failed} niet beschikbaar" +msgstr[0] "" +"Miniaturen klaar voor {n} bestand in {root}; {failed} niet beschikbaar" +msgstr[1] "" +"Miniaturen klaar voor {n} bestanden in {root}; {failed} niet beschikbaar" #: crates/pdfs-gui/src/app/pages/browser.rs:1779 #, rust-format @@ -2146,6 +2151,7 @@ msgid "Uploading…" msgstr "Uploaden…" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2153,7 +2159,7 @@ msgstr[0] "{n} item uploaden…" msgstr[1] "{n} items uploaden…" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "Bekijken" @@ -2468,7 +2474,9 @@ msgstr "Kon modus niet wijzigen" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "Synchroniseren van “{path}” stoppen? Zowel de lokale bestanden als de map in Mijn bestanden blijven behouden." +msgstr "" +"Synchroniseren van “{path}” stoppen? Zowel de lokale bestanden als de map in " +"Mijn bestanden blijven behouden." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2799,7 +2807,7 @@ msgstr[0] "{date}, {n} kopie" msgstr[1] "{date}, {n} kopieën" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3655,29 +3663,29 @@ msgid "Sign Out" msgstr "Afmelden" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "{name} tonen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "Het RAW-bestand tonen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "De video tonen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "De foto tonen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "Kon Proton Drive niet bereiken." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "Kon deze foto niet weergeven." @@ -3760,6 +3768,7 @@ msgid "Couldn't save the copy" msgstr "Kon de kopie niet opslaan" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "Het kopiëren is onderbroken." @@ -3774,231 +3783,317 @@ msgstr "{position} van {total}" msgid "{position} of {loaded}+" msgstr "{position} van {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Vorige (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Volgende (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Details (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Favoriet maken" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Diavoorstelling (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Andere bestanden van deze foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Een kopie opslaan…" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "Naar prullenbak verplaatsen (Delete)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Sluiten (Esc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Tonen op kaart" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Details verbergen" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "Kon de favoriet niet wijzigen" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Foto's uploaden" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Importeren uit Google Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Terug naar albums" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Importeren uit Google Photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Uploaden" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Foto's en video's uploaden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "Meer manieren om foto's toe te voegen" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Vierkante tegels" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Duplicaten zoeken…" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "Meer" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Selecteren" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Foto's selecteren" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Aan album toevoegen…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Selectie verlaten (Esc)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Alleen favorieten" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Alleen foto's zonder album" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Maand" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "Alle datums" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Filters wissen" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filters" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Tijdlijn" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Albums" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Plaatsen" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "Op deze dag" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Kaart" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Importeren uit Google Photos…" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Selectie verlaten (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Aan favorieten toevoegen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Aan album toevoegen…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Uit album verwijderen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Kopieën opslaan…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "Naar prullenbak verplaatsen…" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%B %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "Alles" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Foto's" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Video's" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Foto selecteren om te uploaden" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Foto's en video's uploaden" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Afbeeldingen" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Foto's en video's" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Foto geüpload" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Deze foto's deselecteren" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Deze foto's selecteren" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "Kon {failed} van {n} favoriet niet wijzigen" +msgstr[1] "Kon {failed} van {n} favorieten niet wijzigen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "{n} foto aan favorieten toegevoegd" +msgstr[1] "{n} foto's aan favorieten toegevoegd" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "{n} foto uit favorieten verwijderd" +msgstr[1] "{n} foto's uit favorieten verwijderd" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Kopieën opslaan" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Hier opslaan" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "Kon {failed} van {n} kopie niet opslaan" +msgstr[1] "Kon {failed} van {n} kopieën niet opslaan" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "{n} kopie opgeslagen" +msgstr[1] "{n} kopieën opgeslagen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Alleen foto's en video's kunnen naar Foto's" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "Kon foto niet uploaden" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "Kon {failed} van {n} item niet uploaden" +msgstr[1] "Kon {failed} van {n} items niet uploaden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Foto geüpload" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Uit favorieten verwijderen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "Deze foto naar de prullenbak verplaatsen?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." @@ -4008,14 +4103,14 @@ msgstr[1] "" "Deze foto naar de prullenbak verplaatsen? Hij is opgeslagen als {n} " "bestanden." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "{n} foto naar de prullenbak verplaatsen?" msgstr[1] "{n} foto's naar de prullenbak verplaatsen?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." @@ -4026,19 +4121,19 @@ msgstr[1] "" "{n} foto's naar de prullenbak verplaatsen? Ze zijn opgeslagen als {files} " "bestanden." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "Naar prullenbak verplaatsen?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "De server weigerde." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "Sommige foto's konden niet naar de prullenbak worden verplaatst" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -4046,7 +4141,7 @@ msgstr[0] "{n} foto naar prullenbak verplaatst" msgstr[1] "{n} foto's naar prullenbak verplaatst" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4054,7 +4149,7 @@ msgstr[0] "{count} video" msgstr[1] "{count} video's" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4062,132 +4157,132 @@ msgstr[0] "{count} RAW-foto" msgstr[1] "{count} RAW-foto's" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "{count} foto" msgstr[1] "{count} foto's" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Onbekende datum" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d %B %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d-%m-%Y %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Onbekende datum" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Elke foto staat in een album" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Zet het albumfilter uit om alles te zien." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "Nog geen foto’s" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "Foto’s die je naar Proton Drive uploadt, verschijnen hier." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "Nog geen favorieten" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" "Maak een foto favoriet in de viewer of via het menu om hem hier te vinden." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "Geen favoriete video’s in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "Geen favoriete video’s" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "Geen favoriete RAW-bestanden in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "Geen favoriete RAW-bestanden" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "Geen favoriete foto’s in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "Geen favoriete foto’s" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Zet het favorietenfilter uit om alles te zien." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "Geen video’s in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "Geen video’s" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "Geen RAW-bestanden in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "Geen RAW-bestanden" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "Geen foto’s in {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "Geen foto’s" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Probeer een ander filter of een andere maand." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4195,50 +4290,47 @@ msgstr[0] "{n} jaar geleden" msgstr[1] "{n} jaar geleden" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Favoriet" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Uit album verwijderen" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Selecteren" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "Naar prullenbak verplaatsen…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Aan favorieten toegevoegd" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Uit favorieten verwijderd" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Foto's laden…" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Je Proton Drive-tijdlijn wordt gelezen." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Leeg album" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "Dit album bevat geen foto's." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "Kon niet meer foto's laden" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "Kon foto's niet laden" @@ -4912,7 +5004,7 @@ msgid "Show sync status" msgstr "Synchronisatiestatus tonen" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" @@ -6564,6 +6656,10 @@ msgstr "Alles" msgid "Documents" msgstr "Documenten" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Afbeeldingen" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6626,6 +6722,9 @@ msgstr "{count}j" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "kan de achtergronddienst van Proton Drive niet bereiken: {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Foto selecteren om te uploaden" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" diff --git a/po/pdfs.pot b/po/pdfs.pot index ef6e2a0..9396132 100644 --- a/po/pdfs.pot +++ b/po/pdfs.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: proton-drive-linux 3.7.0\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" -"POT-Creation-Date: 2026-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -34,7 +34,7 @@ msgstr[1] "" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "" @@ -60,7 +60,7 @@ msgstr "" msgid "%A, %B %-d, %Y, %H:%M" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -73,10 +73,10 @@ msgstr "" msgid "My files" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "" @@ -237,7 +237,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -332,8 +333,7 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "" @@ -497,7 +497,7 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -551,20 +551,20 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "" #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "" @@ -603,6 +603,7 @@ msgid "Resolve…" msgstr "" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1221,7 +1222,7 @@ msgstr[1] "" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1237,12 +1238,12 @@ msgid "Reading your Proton Drive albums." msgstr "" #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "" @@ -1292,11 +1293,13 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1317,7 +1320,7 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1409,7 +1412,7 @@ msgstr[0] "" msgstr[1] "" #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "" @@ -1491,7 +1494,7 @@ msgid "New" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "" @@ -1600,7 +1603,7 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1612,8 +1615,8 @@ msgstr[1] "" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "" @@ -1648,7 +1651,7 @@ msgstr[0] "" msgstr[1] "" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "" @@ -1718,12 +1721,12 @@ msgid "Location" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "" @@ -1769,7 +1772,7 @@ msgid "Versions…" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "" @@ -2091,6 +2094,7 @@ msgid "Uploading…" msgstr "" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2098,7 +2102,7 @@ msgstr[0] "" msgstr[1] "" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "" @@ -2690,7 +2694,7 @@ msgstr[0] "" msgstr[1] "" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3469,29 +3473,29 @@ msgid "Sign Out" msgstr "" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "" @@ -3574,6 +3578,7 @@ msgid "Couldn't save the copy" msgstr "" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "" @@ -3588,264 +3593,350 @@ msgstr "" msgid "{position} of {loaded}+" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -3853,7 +3944,7 @@ msgstr[0] "" msgstr[1] "" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -3861,7 +3952,7 @@ msgstr[0] "" msgstr[1] "" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -3869,131 +3960,131 @@ msgstr[0] "" msgstr[1] "" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "" msgstr[1] "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4001,50 +4092,47 @@ msgstr[0] "" msgstr[1] "" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "" @@ -4684,7 +4772,7 @@ msgid "Show sync status" msgstr "" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "" @@ -6285,6 +6373,10 @@ msgstr "" msgid "Documents" msgstr "" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" diff --git a/po/pl.po b/po/pl.po index 219e573..f015b6b 100644 --- a/po/pl.po +++ b/po/pl.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Polish\n" @@ -33,7 +33,7 @@ msgstr[2] "{n} min temu" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -72,10 +72,10 @@ msgstr "%A, %-d %B %Y, %H:%M" msgid "My files" msgstr "Moje pliki" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Zdjęcia" @@ -265,7 +265,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -360,8 +361,7 @@ msgstr "Zmień nazwę" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "Przenieś do kosza" @@ -540,7 +540,7 @@ msgstr "Nic w ostatnim dzienniku nie pasuje do tego filtru." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -601,20 +601,20 @@ msgstr "Nie można odczytać aktywności" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Nieoczekiwana odpowiedź usługi Proton Drive." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Dzisiaj" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Wczoraj" @@ -656,6 +656,7 @@ msgid "Resolve…" msgstr "Rozwiąż…" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1308,7 +1309,7 @@ msgstr[2] "Już obecne: {n}" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1325,12 +1326,12 @@ msgid "Reading your Proton Drive albums." msgstr "Odczytywanie albumów w Proton Drive." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "Brak biblioteki zdjęć" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "To konto Proton nie ma włączonych Zdjęć." @@ -1380,11 +1381,13 @@ msgstr "Nie można wczytać albumów" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1405,7 +1408,7 @@ msgstr "Usługa Proton Drive nie odpowiedziała." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1498,7 +1501,7 @@ msgstr[1] "Proszę wybrać album dla {n} zdjęć." msgstr[2] "Proszę wybrać album dla {n} zdjęć." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "Nowy album…" @@ -1584,7 +1587,7 @@ msgid "New" msgstr "Nowy" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Siatka" @@ -1694,7 +1697,7 @@ msgstr "Rozmiar ikon" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1707,8 +1710,8 @@ msgstr[2] "Zaznaczono: {n}" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "Nie można przenieść do kosza" @@ -1748,7 +1751,7 @@ msgstr[1] "Przeniesiono {n} elementy do kosza" msgstr[2] "Przeniesiono {n} elementów do kosza" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Cofnij" @@ -1823,12 +1826,12 @@ msgid "Location" msgstr "Położenie" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Otwórz za pomocą…" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Odtwórz" @@ -1874,7 +1877,7 @@ msgid "Versions…" msgstr "Wersje…" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Szczegóły" @@ -2206,6 +2209,7 @@ msgid "Uploading…" msgstr "Wysyłanie…" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2214,7 +2218,7 @@ msgstr[1] "Wysyłanie {n} elementów…" msgstr[2] "Wysyłanie {n} elementów…" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "Wyświetl" @@ -2533,7 +2537,9 @@ msgstr "Nie można zmienić trybu" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "Zatrzymać synchronizację „{path}”? Zarówno pliki lokalne, jak i katalog w Moich plikach zostaną zachowane." +msgstr "" +"Zatrzymać synchronizację „{path}”? Zarówno pliki lokalne, jak i katalog w " +"Moich plikach zostaną zachowane." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2866,7 +2872,7 @@ msgstr[1] "{date}, {n} kopie" msgstr[2] "{date}, {n} kopii" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3728,29 +3734,29 @@ msgid "Sign Out" msgstr "Wyloguj się" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "Wyświetl {name}" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "Wyświetl plik RAW" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "Wyświetl film" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "Wyświetl zdjęcie" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "Nie można połączyć się z Proton Drive." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "Nie można wyświetlić tego zdjęcia." @@ -3833,6 +3839,7 @@ msgid "Couldn't save the copy" msgstr "Nie można zapisać kopii" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "Przerwano kopiowanie." @@ -3847,231 +3854,323 @@ msgstr "{position} z {total}" msgid "{position} of {loaded}+" msgstr "{position} z {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Zdjęcie" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Poprzednie (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Następne (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Szczegóły (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Dodaj do ulubionych" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Pokaz slajdów (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Inne pliki tego zdjęcia" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Zapisz kopię…" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "Przenieś do kosza (Delete)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Zamknij (Esc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Wyświetl na mapie" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Ukryj szczegóły" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "Nie można zmienić stanu ulubionego" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Wyślij zdjęcia" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Importuj z Google Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Wróć do albumów" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Importuj z Google Photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Wyślij" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Wyślij zdjęcia i filmy" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "Więcej sposobów dodawania zdjęć" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Kwadratowe kafelki" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Znajdź duplikaty…" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "Więcej" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Zaznacz" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Zaznacz zdjęcia" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Dodaj do albumu…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Zakończ zaznaczanie (Esc)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Tylko ulubione" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Tylko zdjęcia spoza albumów" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Miesiąc" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "Wszystkie daty" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Wyczyść filtry" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filtry" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Oś czasu" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Albumy" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Miejsca" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "Tego dnia" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Mapa" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Importowanie z Google Photos…" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Zakończ zaznaczanie (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Dodaj do ulubionych" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Dodaj do albumu…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Usuń z albumu" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Zapisz kopie…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "Przenieś do kosza…" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%OB %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "Wszystko" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Zdjęcia" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Filmy" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Wybór zdjęcia do wysłania" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Wyślij zdjęcia i filmy" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Obrazy" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Zdjęcia i filmy" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Wysłano zdjęcie" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Odznacz te zdjęcia" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Zaznacz te zdjęcia" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "Nie można zmienić {failed} z {n} ulubionego" +msgstr[1] "Nie można zmienić {failed} z {n} ulubionych" +msgstr[2] "Nie można zmienić {failed} z {n} ulubionych" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "Dodano {n} zdjęcie do ulubionych" +msgstr[1] "Dodano {n} zdjęcia do ulubionych" +msgstr[2] "Dodano {n} zdjęć do ulubionych" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "Usunięto {n} zdjęcie z ulubionych" +msgstr[1] "Usunięto {n} zdjęcia z ulubionych" +msgstr[2] "Usunięto {n} zdjęć z ulubionych" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Zapisz kopie" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Zapisz tutaj" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "Nie można zapisać {failed} z {n} kopii" +msgstr[1] "Nie można zapisać {failed} z {n} kopii" +msgstr[2] "Nie można zapisać {failed} z {n} kopii" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "Zapisano {n} kopię" +msgstr[1] "Zapisano {n} kopie" +msgstr[2] "Zapisano {n} kopii" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Do Zdjęć można dodać tylko zdjęcia i filmy" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "Nie można wysłać zdjęcia" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "Nie można wysłać {failed} z {n} elementu" +msgstr[1] "Nie można wysłać {failed} z {n} elementów" +msgstr[2] "Nie można wysłać {failed} z {n} elementów" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Wysłano zdjęcie" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Usuń z ulubionych" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "Przenieść to zdjęcie do kosza?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." @@ -4079,7 +4178,7 @@ msgstr[0] "Przenieść to zdjęcie do kosza? Jest przechowywane w {n} pliku." msgstr[1] "Przenieść to zdjęcie do kosza? Jest przechowywane w {n} plikach." msgstr[2] "Przenieść to zdjęcie do kosza? Jest przechowywane w {n} plikach." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" @@ -4087,7 +4186,7 @@ msgstr[0] "Przenieść {n} zdjęcie do kosza?" msgstr[1] "Przenieść {n} zdjęcia do kosza?" msgstr[2] "Przenieść {n} zdjęć do kosza?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." @@ -4096,19 +4195,19 @@ msgstr[0] "" msgstr[1] "Przenieść {n} zdjęcia do kosza? Są przechowywane w {files} plikach." msgstr[2] "Przenieść {n} zdjęć do kosza? Są przechowywane w {files} plikach." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "Przenieść do kosza?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "Serwer odmówił." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "Nie można przenieść niektórych zdjęć do kosza" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -4117,7 +4216,7 @@ msgstr[1] "Przeniesiono {n} zdjęcia do kosza" msgstr[2] "Przeniesiono {n} zdjęć do kosza" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4126,7 +4225,7 @@ msgstr[1] "{count} filmy" msgstr[2] "{count} filmów" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4135,7 +4234,7 @@ msgstr[1] "{count} zdjęcia RAW" msgstr[2] "{count} zdjęć RAW" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" @@ -4143,125 +4242,125 @@ msgstr[0] "{count} zdjęcie" msgstr[1] "{count} zdjęcia" msgstr[2] "{count} zdjęć" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Nieznana data" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d %B %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%Y-%m-%d %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Nieznana data" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Każde zdjęcie jest w albumie" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Wyłącz filtr albumów, aby zobaczyć wszystko." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "Brak zdjęć" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "Tutaj pojawią się zdjęcia wysłane do Proton Drive." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "Brak ulubionych" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" "Oznacz zdjęcie gwiazdką w przeglądarce lub z jego menu, aby znaleźć je tutaj." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "Brak ulubionych filmów – {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "Brak ulubionych filmów" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "Brak ulubionych plików RAW – {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "Brak ulubionych plików RAW" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "Brak ulubionych zdjęć – {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "Brak ulubionych zdjęć" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Wyłącz filtr ulubionych, aby zobaczyć wszystko." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "Brak filmów – {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "Brak filmów" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "Brak plików RAW – {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "Brak plików RAW" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "Brak zdjęć – {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "Brak zdjęć" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Wybierz inny filtr lub miesiąc." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4270,50 +4369,47 @@ msgstr[1] "{n} lata temu" msgstr[2] "{n} lat temu" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Ulubione" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Usuń z albumu" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Zaznacz" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "Przenieś do kosza…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Dodano do ulubionych" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Usunięto z ulubionych" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Wczytywanie zdjęć…" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Odczytywanie osi czasu Proton Drive." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Pusty album" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "Ten album nie zawiera żadnych zdjęć." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "Nie można wczytać więcej zdjęć" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "Nie można wczytać zdjęć" @@ -4996,7 +5092,7 @@ msgid "Show sync status" msgstr "Wyświetl stan synchronizacji" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Skróty klawiszowe" @@ -6679,6 +6775,10 @@ msgstr "Wszystko" msgid "Documents" msgstr "Dokumenty" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Obrazy" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6741,6 +6841,9 @@ msgstr "{count} r." msgid "cannot reach the Proton Drive daemon: {error}" msgstr "nie można połączyć się z usługą Proton Drive: {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Wybór zdjęcia do wysłania" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" diff --git a/po/pt_BR.po b/po/pt_BR.po index f575cd9..1f73e4a 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -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-11-14 01:56+0100\n" +"POT-Creation-Date: 2026-11-14 02:34+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: Portuguese (Brazil)\n" @@ -31,7 +31,7 @@ msgstr[1] "há {n} min" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:2772 +#: crates/pdfs-gui/src/app/pages/photos.rs:3533 msgid "%H:%M" msgstr "%H:%M" @@ -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:860 +#: crates/pdfs-gui/src/app/main.rs:864 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 #: crates/pdfs-gui/src/app/pages/browser.rs:454 #: crates/pdfs-gui/src/app/pages/browser.rs:833 @@ -70,10 +70,10 @@ msgstr "%A, %-d de %B de %Y, %H:%M" msgid "My files" msgstr "Meus arquivos" -#: crates/pdfs-gui/src/app/main.rs:863 crates/pdfs-gui/src/app/main.rs:1532 -#: crates/pdfs-gui/src/app/pages/albums.rs:638 -#: crates/pdfs-gui/src/app/pages/photos.rs:845 -#: crates/pdfs-gui/src/app/pages/places.rs:441 +#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/pages/albums.rs:636 +#: crates/pdfs-gui/src/app/pages/photos.rs:898 +#: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Fotos" @@ -260,7 +260,8 @@ msgstr "" #: crates/pdfs-gui/src/app/pages/login.rs:480 #: crates/pdfs-gui/src/app/pages/login.rs:594 #: crates/pdfs-gui/src/app/pages/login.rs:640 -#: crates/pdfs-gui/src/app/pages/photos.rs:2056 +#: crates/pdfs-gui/src/app/pages/photos.rs:971 +#: crates/pdfs-gui/src/app/pages/photos.rs:2799 #: crates/pdfs-gui/src/app/pages/shared.rs:943 #: crates/pdfs-gui/src/app/pages/shared.rs:1024 #: crates/pdfs-gui/src/app/pages/shared.rs:1065 @@ -355,8 +356,7 @@ msgstr "Renomear" #: crates/pdfs-gui/src/app/pages/browser.rs:357 #: crates/pdfs-gui/src/app/pages/browser.rs:924 #: crates/pdfs-gui/src/app/pages/browser.rs:959 -#: crates/pdfs-gui/src/app/pages/photos.rs:586 -#: crates/pdfs-gui/src/app/pages/photos.rs:2057 +#: crates/pdfs-gui/src/app/pages/photos.rs:2800 #: crates/pdfs-gui/src/app/widgets/details.rs:164 msgid "Move to Trash" msgstr "Mover para a lixeira" @@ -531,7 +531,7 @@ msgstr "Nada no registro recente corresponde a este filtro." #: crates/pdfs-gui/src/app/pages/locations.rs:190 #: crates/pdfs-gui/src/app/pages/locations.rs:726 #: crates/pdfs-gui/src/app/pages/login.rs:97 -#: crates/pdfs-gui/src/app/pages/photos.rs:468 +#: crates/pdfs-gui/src/app/pages/photos.rs:530 #: crates/pdfs-gui/src/app/pages/shared.rs:183 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:94 #: crates/pdfs-gui/src/app/pages/trash.rs:53 crates/pdfs-gui/src/hud/mod.rs:240 @@ -589,20 +589,20 @@ msgstr "Não foi possível ler a atividade" #: crates/pdfs-gui/src/app/pages/activity.rs:472 #: crates/pdfs-gui/src/app/pages/browser.rs:2844 #: crates/pdfs-gui/src/app/pages/browser.rs:3026 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:281 -#: crates/pdfs-gui/src/app/pages/photos.rs:3442 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4203 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:384 #: crates/pdfs-gui/src/app/pages/trash.rs:315 msgid "Unexpected reply from the Proton Drive service." msgstr "Resposta inesperada do serviço do Proton Drive." #: crates/pdfs-gui/src/app/pages/activity.rs:632 -#: crates/pdfs-gui/src/app/pages/photos.rs:2728 +#: crates/pdfs-gui/src/app/pages/photos.rs:3489 msgid "Today" msgstr "Hoje" #: crates/pdfs-gui/src/app/pages/activity.rs:635 -#: crates/pdfs-gui/src/app/pages/photos.rs:2733 +#: crates/pdfs-gui/src/app/pages/photos.rs:3494 msgid "Yesterday" msgstr "Ontem" @@ -643,6 +643,7 @@ msgid "Resolve…" msgstr "Resolver…" #: crates/pdfs-gui/src/app/pages/activity.rs:963 +#: crates/pdfs-gui/src/app/pages/photos.rs:1980 #, rust-format msgid "Uploaded {n} item" msgid_plural "Uploaded {n} items" @@ -1275,7 +1276,7 @@ msgstr[1] "{n} já existiam" #: crates/pdfs-gui/src/app/pages/activity_text.rs:512 #: crates/pdfs-gui/src/app/pages/albums.rs:107 -#: crates/pdfs-gui/src/app/pages/albums.rs:694 +#: crates/pdfs-gui/src/app/pages/albums.rs:690 #, rust-format msgid "{n} album" msgid_plural "{n} albums" @@ -1291,12 +1292,12 @@ msgid "Reading your Proton Drive albums." msgstr "Lendo seus álbuns do Proton Drive." #: crates/pdfs-gui/src/app/pages/albums.rs:60 -#: crates/pdfs-gui/src/app/pages/photos.rs:3355 +#: crates/pdfs-gui/src/app/pages/photos.rs:4116 msgid "No photo library" msgstr "Nenhuma biblioteca de fotos" #: crates/pdfs-gui/src/app/pages/albums.rs:61 -#: crates/pdfs-gui/src/app/pages/photos.rs:3356 +#: crates/pdfs-gui/src/app/pages/photos.rs:4117 msgid "This Proton account doesn't have Photos enabled." msgstr "Esta conta Proton não tem o Fotos ativado." @@ -1346,11 +1347,13 @@ msgstr "Não foi possível carregar os álbuns" #: crates/pdfs-gui/src/app/pages/locations.rs:1570 #: crates/pdfs-gui/src/app/pages/locations.rs:1677 #: crates/pdfs-gui/src/app/pages/locations.rs:1697 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1504 -#: crates/pdfs-gui/src/app/pages/photos.rs:1421 -#: crates/pdfs-gui/src/app/pages/photos.rs:2141 -#: crates/pdfs-gui/src/app/pages/photos.rs:3255 -#: crates/pdfs-gui/src/app/pages/photos.rs:3448 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1516 +#: crates/pdfs-gui/src/app/pages/photos.rs:1739 +#: crates/pdfs-gui/src/app/pages/photos.rs:1825 +#: crates/pdfs-gui/src/app/pages/photos.rs:1952 +#: crates/pdfs-gui/src/app/pages/photos.rs:2884 +#: crates/pdfs-gui/src/app/pages/photos.rs:4016 +#: crates/pdfs-gui/src/app/pages/photos.rs:4209 #: crates/pdfs-gui/src/app/pages/places.rs:105 #: crates/pdfs-gui/src/app/pages/shared.rs:701 #: crates/pdfs-gui/src/app/pages/shared.rs:1003 @@ -1371,7 +1374,7 @@ msgstr "O serviço do Proton Drive não respondeu." #: crates/pdfs-gui/src/app/pages/albums.rs:206 #: crates/pdfs-gui/src/app/pages/browser.rs:854 #: crates/pdfs-gui/src/app/pages/devices.rs:535 -#: crates/pdfs-gui/src/app/pages/photos.rs:3191 +#: crates/pdfs-gui/src/app/pages/photos.rs:3952 #: crates/pdfs-gui/src/app/pages/shared.rs:536 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:476 #: crates/pdfs-gui/src/app/widgets/details.rs:157 @@ -1463,7 +1466,7 @@ msgstr[0] "Escolha um álbum para {n} foto." msgstr[1] "Escolha um álbum para {n} fotos." #: crates/pdfs-gui/src/app/pages/albums.rs:429 -#: crates/pdfs-gui/src/app/pages/photos.rs:756 +#: crates/pdfs-gui/src/app/pages/photos.rs:807 msgid "New Album…" msgstr "Novo álbum…" @@ -1545,7 +1548,7 @@ msgid "New" msgstr "Novo" #: crates/pdfs-gui/src/app/pages/browser.rs:196 -#: crates/pdfs-gui/src/app/pages/photos.rs:796 +#: crates/pdfs-gui/src/app/pages/photos.rs:847 msgctxt "layout" msgid "Grid" msgstr "Grade" @@ -1654,7 +1657,7 @@ msgstr "Tamanho dos ícones" #: crates/pdfs-gui/src/app/pages/browser.rs:539 #: crates/pdfs-gui/src/app/pages/browser.rs:952 #: crates/pdfs-gui/src/app/pages/devices.rs:544 -#: crates/pdfs-gui/src/app/pages/photos.rs:1989 +#: crates/pdfs-gui/src/app/pages/photos.rs:2713 #: crates/pdfs-gui/src/app/pages/shared.rs:560 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:509 #: crates/pdfs-gui/src/app/pages/trash.rs:222 @@ -1666,8 +1669,8 @@ msgstr[1] "{n} selecionados" #: crates/pdfs-gui/src/app/pages/browser.rs:571 #: crates/pdfs-gui/src/app/pages/browser.rs:607 -#: crates/pdfs-gui/src/app/pages/photos.rs:2134 -#: crates/pdfs-gui/src/app/pages/photos.rs:2140 +#: crates/pdfs-gui/src/app/pages/photos.rs:2877 +#: crates/pdfs-gui/src/app/pages/photos.rs:2883 msgid "Couldn't move to Trash" msgstr "Não foi possível mover para a lixeira" @@ -1702,7 +1705,7 @@ msgstr[0] "{n} item movido para a lixeira" msgstr[1] "{n} itens movidos para a lixeira" #: crates/pdfs-gui/src/app/pages/browser.rs:625 -#: crates/pdfs-gui/src/app/pages/photos.rs:2127 +#: crates/pdfs-gui/src/app/pages/photos.rs:2870 msgid "Undo" msgstr "Desfazer" @@ -1772,12 +1775,12 @@ msgid "Location" msgstr "Local" #: crates/pdfs-gui/src/app/pages/browser.rs:864 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1137 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1140 msgid "Open With…" msgstr "Abrir com…" #: crates/pdfs-gui/src/app/pages/browser.rs:871 -#: crates/pdfs-gui/src/app/pages/photos.rs:3189 +#: crates/pdfs-gui/src/app/pages/photos.rs:3950 msgctxt "verb" msgid "Play" msgstr "Reproduzir" @@ -1823,7 +1826,7 @@ msgid "Versions…" msgstr "Versões…" #: crates/pdfs-gui/src/app/pages/browser.rs:920 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1172 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1175 msgid "Details" msgstr "Detalhes" @@ -1974,8 +1977,10 @@ msgstr[1] "Miniaturas prontas para {n} arquivos em {root}" #, rust-format msgid "Thumbnails ready for {n} file in {root}; {failed} unavailable" msgid_plural "Thumbnails ready for {n} files in {root}; {failed} unavailable" -msgstr[0] "Miniaturas prontas para {n} arquivo em {root}; {failed} indisponíveis" -msgstr[1] "Miniaturas prontas para {n} arquivos em {root}; {failed} indisponíveis" +msgstr[0] "" +"Miniaturas prontas para {n} arquivo em {root}; {failed} indisponíveis" +msgstr[1] "" +"Miniaturas prontas para {n} arquivos em {root}; {failed} indisponíveis" #: crates/pdfs-gui/src/app/pages/browser.rs:1779 #, rust-format @@ -2146,6 +2151,7 @@ msgid "Uploading…" msgstr "Enviando…" #: crates/pdfs-gui/src/app/pages/browser.rs:2638 +#: crates/pdfs-gui/src/app/pages/photos.rs:1914 #, rust-format msgid "Uploading {n} item…" msgid_plural "Uploading {n} items…" @@ -2153,7 +2159,7 @@ msgstr[0] "Enviando {n} item…" msgstr[1] "Enviando {n} itens…" #: crates/pdfs-gui/src/app/pages/browser.rs:2641 -#: crates/pdfs-gui/src/app/pages/photos.rs:829 +#: crates/pdfs-gui/src/app/pages/photos.rs:880 msgctxt "verb" msgid "View" msgstr "Ver" @@ -2465,7 +2471,9 @@ msgstr "Não foi possível alterar o modo" msgid "" "Stop syncing “{path}”? Both the local files and the folder in My files are " "kept." -msgstr "Parar de sincronizar “{path}”? Tanto os arquivos locais quanto a pasta em Meus arquivos são mantidos." +msgstr "" +"Parar de sincronizar “{path}”? Tanto os arquivos locais quanto a pasta em " +"Meus arquivos são mantidos." #: crates/pdfs-gui/src/app/pages/devices.rs:965 #, rust-format @@ -2796,7 +2804,7 @@ msgstr[0] "{date}, {n} cópia" msgstr[1] "{date}, {n} cópias" #: crates/pdfs-gui/src/app/pages/duplicates.rs:328 -#: crates/pdfs-gui/src/app/pages/photos.rs:2978 +#: crates/pdfs-gui/src/app/pages/photos.rs:3739 #, rust-format msgid "{date}, {n} photo" msgid_plural "{date}, {n} photos" @@ -3648,29 +3656,29 @@ msgid "Sign Out" msgstr "Sair" #. Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:194 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:196 #, rust-format msgid "Show {name}" msgstr "Mostrar {name}" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:197 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 msgid "Show the raw file" msgstr "Mostrar o arquivo RAW" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:198 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:200 msgid "Show the video" msgstr "Mostrar o vídeo" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:199 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:201 msgid "Show the photo" msgstr "Mostrar a foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:282 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:284 msgid "Couldn't reach Proton Drive." msgstr "Não foi possível acessar o Proton Drive." -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:304 -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:332 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:306 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:334 msgid "Couldn't render this photo." msgstr "Não foi possível renderizar esta foto." @@ -3753,6 +3761,7 @@ msgid "Couldn't save the copy" msgstr "Não foi possível salvar a cópia" #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:840 +#: crates/pdfs-gui/src/app/pages/photos.rs:1836 msgid "The copy was interrupted." msgstr "A cópia foi interrompida." @@ -3767,231 +3776,317 @@ msgstr "{position} de {total}" msgid "{position} of {loaded}+" msgstr "{position} de {loaded}+" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1008 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1010 msgid "Photo" msgstr "Foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1055 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1058 msgid "Previous (←)" msgstr "Anterior (←)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1069 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1072 msgid "Next (→)" msgstr "Próxima (→)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1107 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1110 msgid "Details (i)" msgstr "Detalhes (i)" #. Translators: tooltip of the star button that marks a photo as a favorite. -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1116 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1119 msgctxt "verb" msgid "Favorite" msgstr "Favoritar" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1124 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1127 msgid "Slideshow (F5)" msgstr "Apresentação de slides (F5)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1132 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 msgid "Other files of this photo" msgstr "Outros arquivos desta foto" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1135 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 msgid "Save a Copy…" msgstr "Salvar uma cópia…" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1136 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1139 msgid "Move to Trash (Delete)" msgstr "Mover para a lixeira (Delete)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1138 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1141 msgid "Close (Esc)" msgstr "Fechar (Esc)" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1162 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1165 msgid "Show on map" msgstr "Mostrar no mapa" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1180 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1183 msgid "Hide details" msgstr "Ocultar detalhes" -#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1509 -#: crates/pdfs-gui/src/app/pages/photos.rs:3250 -#: crates/pdfs-gui/src/app/pages/photos.rs:3254 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1521 +#: crates/pdfs-gui/src/app/pages/photos.rs:4011 +#: crates/pdfs-gui/src/app/pages/photos.rs:4015 msgid "Couldn't change the favorite" msgstr "Não foi possível alterar o favorito" -#: crates/pdfs-gui/src/app/pages/photos.rs:478 -#: crates/pdfs-gui/src/app/pages/photos.rs:548 +#: crates/pdfs-gui/src/app/pages/photos.rs:540 msgid "Upload photos" msgstr "Enviar fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:483 +#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/takeout.rs:287 msgid "Import from Google Photos" msgstr "Importar do Google Photos" -#: crates/pdfs-gui/src/app/pages/photos.rs:524 +#: crates/pdfs-gui/src/app/pages/photos.rs:586 msgid "Back to albums" msgstr "Voltar aos álbuns" -#: crates/pdfs-gui/src/app/pages/photos.rs:537 +#: crates/pdfs-gui/src/app/pages/photos.rs:599 msgid "Import from Google Photos…" msgstr "Importar do Google Photos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:543 +#: crates/pdfs-gui/src/app/pages/photos.rs:603 +#: crates/pdfs-gui/src/app/pages/photos.rs:1050 +#: crates/pdfs-gui/src/app/pages/photos.rs:1584 msgctxt "verb" msgid "Upload" msgstr "Enviar" -#: crates/pdfs-gui/src/app/pages/photos.rs:549 +#: crates/pdfs-gui/src/app/pages/photos.rs:609 +msgid "Upload photos and videos" +msgstr "Enviar fotos e vídeos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:610 msgid "More ways to add photos" msgstr "Mais formas de adicionar fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:558 +#: crates/pdfs-gui/src/app/pages/photos.rs:621 +msgid "Square Tiles" +msgstr "Blocos quadrados" + +#: crates/pdfs-gui/src/app/pages/photos.rs:625 msgid "Find Duplicates…" msgstr "Encontrar duplicatas…" #. Translators: tooltip of a button that opens a menu of further actions. -#: crates/pdfs-gui/src/app/pages/photos.rs:563 +#: crates/pdfs-gui/src/app/pages/photos.rs:634 #: crates/pdfs-gui/src/app/widgets/menu.rs:133 msgid "More" msgstr "Mais" -#: crates/pdfs-gui/src/app/pages/photos.rs:572 -#: crates/pdfs-gui/src/app/pages/photos.rs:3201 -msgctxt "verb" -msgid "Select" -msgstr "Selecionar" - -#: crates/pdfs-gui/src/app/pages/photos.rs:573 -#: crates/pdfs-gui/src/app/pages/photos.rs:581 -#: crates/pdfs-gui/src/app/pages/photos.rs:1987 +#: crates/pdfs-gui/src/app/pages/photos.rs:644 +#: crates/pdfs-gui/src/app/pages/photos.rs:968 +#: crates/pdfs-gui/src/app/pages/photos.rs:2711 msgid "Select photos" msgstr "Selecionar fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:592 -#: crates/pdfs-gui/src/app/pages/photos.rs:3207 -msgid "Add to Album…" -msgstr "Adicionar ao álbum…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:598 -msgid "Leave selection (Esc)" -msgstr "Sair da seleção (Esc)" - -#: crates/pdfs-gui/src/app/pages/photos.rs:627 +#: crates/pdfs-gui/src/app/pages/photos.rs:662 msgid "Only favorites" msgstr "Somente favoritos" -#: crates/pdfs-gui/src/app/pages/photos.rs:630 +#: crates/pdfs-gui/src/app/pages/photos.rs:665 msgid "Only photos not in an album" msgstr "Somente fotos fora de álbuns" -#: crates/pdfs-gui/src/app/pages/photos.rs:635 +#: crates/pdfs-gui/src/app/pages/photos.rs:670 msgid "Month" msgstr "Mês" -#: crates/pdfs-gui/src/app/pages/photos.rs:636 -#: crates/pdfs-gui/src/app/pages/photos.rs:978 +#: crates/pdfs-gui/src/app/pages/photos.rs:671 +#: crates/pdfs-gui/src/app/pages/photos.rs:1130 msgid "All dates" msgstr "Todas as datas" -#: crates/pdfs-gui/src/app/pages/photos.rs:645 +#: crates/pdfs-gui/src/app/pages/photos.rs:680 msgid "Clear filters" msgstr "Limpar filtros" -#: crates/pdfs-gui/src/app/pages/photos.rs:662 +#: crates/pdfs-gui/src/app/pages/photos.rs:697 msgid "Filters" msgstr "Filtros" -#: crates/pdfs-gui/src/app/pages/photos.rs:685 +#: crates/pdfs-gui/src/app/pages/photos.rs:721 msgid "Timeline" msgstr "Linha do tempo" -#: crates/pdfs-gui/src/app/pages/photos.rs:686 +#: crates/pdfs-gui/src/app/pages/photos.rs:722 msgid "Albums" msgstr "Álbuns" -#: crates/pdfs-gui/src/app/pages/photos.rs:687 +#: crates/pdfs-gui/src/app/pages/photos.rs:723 msgid "Places" msgstr "Lugares" -#: crates/pdfs-gui/src/app/pages/photos.rs:701 +#: crates/pdfs-gui/src/app/pages/photos.rs:739 msgid "On this day" msgstr "Neste dia" -#: crates/pdfs-gui/src/app/pages/photos.rs:797 +#: crates/pdfs-gui/src/app/pages/photos.rs:848 msgctxt "layout" msgid "Map" msgstr "Mapa" -#: crates/pdfs-gui/src/app/pages/photos.rs:828 +#: crates/pdfs-gui/src/app/pages/photos.rs:879 msgid "Importing from Google Photos…" msgstr "Importando do Google Photos…" +#: crates/pdfs-gui/src/app/pages/photos.rs:972 +msgid "Leave selection (Esc)" +msgstr "Sair da seleção (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:986 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +msgid "Add to Favorites" +msgstr "Adicionar aos favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:987 +#: crates/pdfs-gui/src/app/pages/photos.rs:3968 +msgid "Add to Album…" +msgstr "Adicionar ao álbum…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:988 +#: crates/pdfs-gui/src/app/pages/photos.rs:3974 +msgid "Remove from Album" +msgstr "Remover do álbum" + +#: crates/pdfs-gui/src/app/pages/photos.rs:990 +msgid "Save Copies…" +msgstr "Salvar cópias…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:991 +#: crates/pdfs-gui/src/app/pages/photos.rs:3980 +msgid "Move to Trash…" +msgstr "Mover para a lixeira…" + #. Translators: strftime format for a month on its own, such as "June 2024". %OB is the month name in its standalone (nominative) form; use %B if your language has no separate form. -#: crates/pdfs-gui/src/app/pages/photos.rs:926 +#: crates/pdfs-gui/src/app/pages/photos.rs:1078 msgid "%OB %Y" msgstr "%B de %Y" #. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. -#: crates/pdfs-gui/src/app/pages/photos.rs:985 +#: crates/pdfs-gui/src/app/pages/photos.rs:1137 #, rust-format msgid "{month} ({count})" msgstr "{month} ({count})" #. Translators: a Photos filter tab that shows photos, videos and raw files together. -#: crates/pdfs-gui/src/app/pages/photos.rs:1035 +#: crates/pdfs-gui/src/app/pages/photos.rs:1187 msgctxt "photo filter" msgid "All" msgstr "Tudo" -#: crates/pdfs-gui/src/app/pages/photos.rs:1036 +#: crates/pdfs-gui/src/app/pages/photos.rs:1188 msgctxt "photo filter" msgid "Photos" msgstr "Fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1037 +#: crates/pdfs-gui/src/app/pages/photos.rs:1189 msgctxt "photo filter" msgid "Videos" msgstr "Vídeos" #. Translators: a Photos filter tab for raw camera files. -#: crates/pdfs-gui/src/app/pages/photos.rs:1039 +#: crates/pdfs-gui/src/app/pages/photos.rs:1191 msgctxt "photo filter" msgid "Raw" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:1349 -msgid "Select Photo to Upload" -msgstr "Selecione a foto a enviar" +#: crates/pdfs-gui/src/app/pages/photos.rs:1583 +msgid "Upload Photos and Videos" +msgstr "Enviar fotos e vídeos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1353 -#: crates/pdfs-gui/src/prompt.rs:67 -msgid "Images" -msgstr "Imagens" +#: crates/pdfs-gui/src/app/pages/photos.rs:1587 +msgid "Photos and videos" +msgstr "Fotos e vídeos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1407 -msgid "Photo uploaded" -msgstr "Foto enviada" +#: crates/pdfs-gui/src/app/pages/photos.rs:1626 +msgid "Deselect these photos" +msgstr "Desmarcar estas fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:1412 -#: crates/pdfs-gui/src/app/pages/photos.rs:1420 +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +msgid "Select these photos" +msgstr "Selecionar estas fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1749 +#, rust-format +msgid "Couldn't change {failed} of {n} favorite" +msgid_plural "Couldn't change {failed} of {n} favorites" +msgstr[0] "Não foi possível alterar {failed} de {n} favorito" +msgstr[1] "Não foi possível alterar {failed} de {n} favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1762 +#, rust-format +msgid "Added {n} photo to Favorites" +msgid_plural "Added {n} photos to Favorites" +msgstr[0] "{n} foto adicionada aos favoritos" +msgstr[1] "{n} fotos adicionadas aos favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1769 +#, rust-format +msgid "Removed {n} photo from Favorites" +msgid_plural "Removed {n} photos from Favorites" +msgstr[0] "{n} foto removida dos favoritos" +msgstr[1] "{n} fotos removidas dos favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1788 +msgid "Save Copies" +msgstr "Salvar cópias" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1789 +msgid "Save Here" +msgstr "Salvar aqui" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1844 +#, rust-format +msgid "Couldn't save {failed} of {n} copy" +msgid_plural "Couldn't save {failed} of {n} copies" +msgstr[0] "Não foi possível salvar {failed} de {n} cópia" +msgstr[1] "Não foi possível salvar {failed} de {n} cópias" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1853 +#, rust-format +msgid "Saved {n} copy" +msgid_plural "Saved {n} copies" +msgstr[0] "{n} cópia salva" +msgstr[1] "{n} cópias salvas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1905 +msgid "Only photos and videos can go into Photos" +msgstr "Somente fotos e vídeos podem ir para Fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1964 msgid "Couldn't upload photo" msgstr "Não foi possível enviar a foto" +#: crates/pdfs-gui/src/app/pages/photos.rs:1969 +#, rust-format +msgid "Couldn't upload {failed} of {n} item" +msgid_plural "Couldn't upload {failed} of {n} items" +msgstr[0] "Não foi possível enviar {failed} de {n} item" +msgstr[1] "Não foi possível enviar {failed} de {n} itens" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1977 +msgid "Photo uploaded" +msgstr "Foto enviada" + #. Translators: badge on a photo tile whose shot includes a raw camera file. -#: crates/pdfs-gui/src/app/pages/photos.rs:1705 +#: crates/pdfs-gui/src/app/pages/photos.rs:2430 msgid "RAW" msgstr "RAW" -#: crates/pdfs-gui/src/app/pages/photos.rs:2031 +#: crates/pdfs-gui/src/app/pages/photos.rs:2735 +msgid "Remove from Favorites" +msgstr "Remover dos favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2774 msgid "Move this photo to Trash?" msgstr "Mover esta foto para a lixeira?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2033 +#: crates/pdfs-gui/src/app/pages/photos.rs:2776 #, rust-format msgid "Move this photo to Trash? It is stored as {n} file." msgid_plural "Move this photo to Trash? It is stored as {n} files." @@ -3999,14 +4094,14 @@ msgstr[0] "Mover esta foto para a lixeira? Ela está armazenada em {n} arquivo." msgstr[1] "" "Mover esta foto para a lixeira? Ela está armazenada em {n} arquivos." -#: crates/pdfs-gui/src/app/pages/photos.rs:2039 +#: crates/pdfs-gui/src/app/pages/photos.rs:2782 #, rust-format msgid "Move {n} photo to Trash?" msgid_plural "Move {n} photos to Trash?" msgstr[0] "Mover {n} foto para a lixeira?" msgstr[1] "Mover {n} fotos para a lixeira?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2046 +#: crates/pdfs-gui/src/app/pages/photos.rs:2789 #, rust-format msgid "Move {n} photo to Trash? They are stored as {files} files." msgid_plural "Move {n} photos to Trash? They are stored as {files} files." @@ -4015,19 +4110,19 @@ msgstr[0] "" msgstr[1] "" "Mover {n} fotos para a lixeira? Elas estão armazenadas em {files} arquivos." -#: crates/pdfs-gui/src/app/pages/photos.rs:2053 +#: crates/pdfs-gui/src/app/pages/photos.rs:2796 msgid "Move to Trash?" msgstr "Mover para a lixeira?" -#: crates/pdfs-gui/src/app/pages/photos.rs:2110 +#: crates/pdfs-gui/src/app/pages/photos.rs:2853 msgid "The server refused." msgstr "O servidor recusou." -#: crates/pdfs-gui/src/app/pages/photos.rs:2113 +#: crates/pdfs-gui/src/app/pages/photos.rs:2856 msgid "Some photos couldn't be moved to Trash" msgstr "Algumas fotos não puderam ser movidas para a lixeira" -#: crates/pdfs-gui/src/app/pages/photos.rs:2122 +#: crates/pdfs-gui/src/app/pages/photos.rs:2865 #, rust-format msgid "Moved {n} photo to Trash" msgid_plural "Moved {n} photos to Trash" @@ -4035,7 +4130,7 @@ msgstr[0] "{n} foto movida para a lixeira" msgstr[1] "{n} fotos movidas para a lixeira" #. Translators: the Photos page subtitle, such as "12 videos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2682 +#: crates/pdfs-gui/src/app/pages/photos.rs:3443 #, rust-format msgid "{count} video" msgid_plural "{count} videos" @@ -4043,7 +4138,7 @@ msgstr[0] "{count} vídeo" msgstr[1] "{count} vídeos" #. Translators: the Photos page subtitle, such as "12 raw photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2684 +#: crates/pdfs-gui/src/app/pages/photos.rs:3445 #, rust-format msgid "{count} raw photo" msgid_plural "{count} raw photos" @@ -4051,133 +4146,133 @@ msgstr[0] "{count} foto RAW" msgstr[1] "{count} fotos RAW" #. Translators: the Photos page subtitle, such as "1,204 photos". -#: crates/pdfs-gui/src/app/pages/photos.rs:2686 +#: crates/pdfs-gui/src/app/pages/photos.rs:3447 #, rust-format msgid "{count} photo" msgid_plural "{count} photos" msgstr[0] "{count} foto" msgstr[1] "{count} fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:2714 -#: crates/pdfs-gui/src/app/pages/photos.rs:2740 +#: crates/pdfs-gui/src/app/pages/photos.rs:3475 +#: crates/pdfs-gui/src/app/pages/photos.rs:3501 msgid "Unknown date" msgstr "Data desconhecida" #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". -#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: crates/pdfs-gui/src/app/pages/photos.rs:3498 msgid "%-d %B %Y" msgstr "%-d de %B de %Y" #. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". -#: crates/pdfs-gui/src/app/pages/photos.rs:2758 +#: crates/pdfs-gui/src/app/pages/photos.rs:3519 msgid "%Y-%m-%d %H:%M:%S" msgstr "%d/%m/%Y %H:%M:%S" -#: crates/pdfs-gui/src/app/pages/photos.rs:2762 -#: crates/pdfs-gui/src/app/pages/photos.rs:2764 +#: crates/pdfs-gui/src/app/pages/photos.rs:3523 +#: crates/pdfs-gui/src/app/pages/photos.rs:3525 msgid "Unknown Date" msgstr "Data desconhecida" #. Translators: strftime format for the day a photo was taken, shown on its tile when the timeline is grouped by month or year, such as "3 Jun". -#: crates/pdfs-gui/src/app/pages/photos.rs:2782 +#: crates/pdfs-gui/src/app/pages/photos.rs:3543 msgid "%-d %b" msgstr "%-d de %b" -#: crates/pdfs-gui/src/app/pages/photos.rs:2804 +#: crates/pdfs-gui/src/app/pages/photos.rs:3565 msgid "Every photo is in an album" msgstr "Todas as fotos estão em um álbum" -#: crates/pdfs-gui/src/app/pages/photos.rs:2805 +#: crates/pdfs-gui/src/app/pages/photos.rs:3566 msgid "Turn off the album filter to see everything." msgstr "Desative o filtro de álbuns para ver tudo." -#: crates/pdfs-gui/src/app/pages/photos.rs:2810 +#: crates/pdfs-gui/src/app/pages/photos.rs:3571 msgid "No photos yet" msgstr "Nenhuma foto ainda" -#: crates/pdfs-gui/src/app/pages/photos.rs:2811 +#: crates/pdfs-gui/src/app/pages/photos.rs:3572 msgid "Photos you upload to Proton Drive appear here." msgstr "As fotos enviadas para o Proton Drive aparecem aqui." -#: crates/pdfs-gui/src/app/pages/photos.rs:2814 +#: crates/pdfs-gui/src/app/pages/photos.rs:3575 msgid "No favorites yet" msgstr "Nenhuma favorita ainda" -#: crates/pdfs-gui/src/app/pages/photos.rs:2815 +#: crates/pdfs-gui/src/app/pages/photos.rs:3576 msgid "Star a photo in the viewer or from its menu to find it here." msgstr "" "Marque uma foto como favorita no visualizador ou pelo menu dela para " "encontrá-la aqui." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2820 +#: crates/pdfs-gui/src/app/pages/photos.rs:3581 #, rust-format msgid "No favorite videos in {month}" msgstr "Nenhum vídeo favorito em {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2821 +#: crates/pdfs-gui/src/app/pages/photos.rs:3582 msgid "No favorite videos" msgstr "Nenhum vídeo favorito" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2823 +#: crates/pdfs-gui/src/app/pages/photos.rs:3584 #, rust-format msgid "No favorite raw files in {month}" msgstr "Nenhum arquivo RAW favorito em {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2824 +#: crates/pdfs-gui/src/app/pages/photos.rs:3585 msgid "No favorite raw files" msgstr "Nenhum arquivo RAW favorito" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2826 +#: crates/pdfs-gui/src/app/pages/photos.rs:3587 #, rust-format msgid "No favorite photos in {month}" msgstr "Nenhuma foto favorita em {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2827 +#: crates/pdfs-gui/src/app/pages/photos.rs:3588 msgid "No favorite photos" msgstr "Nenhuma foto favorita" -#: crates/pdfs-gui/src/app/pages/photos.rs:2829 +#: crates/pdfs-gui/src/app/pages/photos.rs:3590 msgid "Turn off the favorites filter to see everything." msgstr "Desative o filtro de favoritas para ver tudo." #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2834 +#: crates/pdfs-gui/src/app/pages/photos.rs:3595 #, rust-format msgid "No videos in {month}" msgstr "Nenhum vídeo em {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2835 +#: crates/pdfs-gui/src/app/pages/photos.rs:3596 msgid "No videos" msgstr "Nenhum vídeo" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2837 +#: crates/pdfs-gui/src/app/pages/photos.rs:3598 #, rust-format msgid "No raw files in {month}" msgstr "Nenhum arquivo RAW em {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2838 +#: crates/pdfs-gui/src/app/pages/photos.rs:3599 msgid "No raw files" msgstr "Nenhum arquivo RAW" #. Translators: {month} is a month and year, such as "June 2024". -#: crates/pdfs-gui/src/app/pages/photos.rs:2840 +#: crates/pdfs-gui/src/app/pages/photos.rs:3601 #, rust-format msgid "No photos in {month}" msgstr "Nenhuma foto em {month}" -#: crates/pdfs-gui/src/app/pages/photos.rs:2841 +#: crates/pdfs-gui/src/app/pages/photos.rs:3602 msgid "No photos" msgstr "Nenhuma foto" -#: crates/pdfs-gui/src/app/pages/photos.rs:2843 +#: crates/pdfs-gui/src/app/pages/photos.rs:3604 msgid "Try another filter or month." msgstr "Tente outro filtro ou outro mês." -#: crates/pdfs-gui/src/app/pages/photos.rs:2953 +#: crates/pdfs-gui/src/app/pages/photos.rs:3714 #, rust-format msgid "{n} year ago" msgid_plural "{n} years ago" @@ -4185,50 +4280,47 @@ msgstr[0] "há {n} ano" msgstr[1] "há {n} anos" #. Translators: a check item in a photo's menu, on while the photo is a favorite. -#: crates/pdfs-gui/src/app/pages/photos.rs:3196 +#: crates/pdfs-gui/src/app/pages/photos.rs:3957 msgctxt "state" msgid "Favorite" msgstr "Favorita" -#: crates/pdfs-gui/src/app/pages/photos.rs:3213 -msgid "Remove from Album" -msgstr "Remover do álbum" +#: crates/pdfs-gui/src/app/pages/photos.rs:3962 +msgctxt "verb" +msgid "Select" +msgstr "Selecionar" -#: crates/pdfs-gui/src/app/pages/photos.rs:3219 -msgid "Move to Trash…" -msgstr "Mover para a lixeira…" - -#: crates/pdfs-gui/src/app/pages/photos.rs:3243 +#: crates/pdfs-gui/src/app/pages/photos.rs:4004 msgid "Added to Favorites" msgstr "Adicionada aos favoritos" -#: crates/pdfs-gui/src/app/pages/photos.rs:3245 +#: crates/pdfs-gui/src/app/pages/photos.rs:4006 msgid "Removed from Favorites" msgstr "Removida dos favoritos" -#: crates/pdfs-gui/src/app/pages/photos.rs:3283 +#: crates/pdfs-gui/src/app/pages/photos.rs:4044 msgid "Loading photos…" msgstr "Carregando fotos…" -#: crates/pdfs-gui/src/app/pages/photos.rs:3284 +#: crates/pdfs-gui/src/app/pages/photos.rs:4045 msgid "Reading your Proton Drive timeline." msgstr "Lendo sua linha do tempo do Proton Drive." -#: crates/pdfs-gui/src/app/pages/photos.rs:3386 +#: crates/pdfs-gui/src/app/pages/photos.rs:4147 msgid "Empty album" msgstr "Álbum vazio" -#: crates/pdfs-gui/src/app/pages/photos.rs:3387 +#: crates/pdfs-gui/src/app/pages/photos.rs:4148 msgid "This album has no photos in it." msgstr "Este álbum não tem fotos." -#: crates/pdfs-gui/src/app/pages/photos.rs:3429 -#: crates/pdfs-gui/src/app/pages/photos.rs:3447 +#: crates/pdfs-gui/src/app/pages/photos.rs:4190 +#: crates/pdfs-gui/src/app/pages/photos.rs:4208 msgid "Couldn't load more photos" msgstr "Não foi possível carregar mais fotos" -#: crates/pdfs-gui/src/app/pages/photos.rs:3434 -#: crates/pdfs-gui/src/app/pages/photos.rs:3441 +#: crates/pdfs-gui/src/app/pages/photos.rs:4195 +#: crates/pdfs-gui/src/app/pages/photos.rs:4202 msgid "Couldn't load photos" msgstr "Não foi possível carregar as fotos" @@ -4897,7 +4989,7 @@ msgid "Show sync status" msgstr "Mostrar status da sincronização" #: crates/pdfs-gui/src/app/pages/status.rs:408 -#: crates/pdfs-gui/src/app/widgets/compat.rs:262 +#: crates/pdfs-gui/src/app/widgets/compat.rs:328 msgid "Keyboard Shortcuts" msgstr "Atalhos de teclado" @@ -6551,6 +6643,10 @@ msgstr "Tudo" msgid "Documents" msgstr "Documentos" +#: crates/pdfs-gui/src/prompt.rs:67 +msgid "Images" +msgstr "Imagens" + #. Translators: a filter chip for audio and video files. #: crates/pdfs-gui/src/prompt.rs:69 msgid "Media" @@ -6613,6 +6709,9 @@ msgstr "{count} a" msgid "cannot reach the Proton Drive daemon: {error}" msgstr "não foi possível acessar o daemon do Proton Drive: {error}" +#~ msgid "Select Photo to Upload" +#~ msgstr "Selecione a foto a enviar" + #, rust-format #~ msgid "{n} image" #~ msgid_plural "{n} images" From e571f22d5db956b4d8ef95a457abc6901a2879ae Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Sat, 14 Nov 2026 02:48:29 +0100 Subject: [PATCH 3/4] feat(gui,core): larger icon sizes in My files The icon grid's size slider stops at 256 px instead of 144 px, which is big enough to tell photos apart by their thumbnail. Thumbnails are 512 px, so they stay sharp at that size on a 2x screen. Names may wrap wider on the larger tiles. Ctrl+plus, Ctrl+minus and Ctrl+0 step and reset the size while the grid is shown, as they do in Photos. The size is saved in the config as files_view.icon_size once the slider rests; configs without it keep the 72 px default. --- crates/pdfs-core/src/config.rs | 7 + crates/pdfs-gui/resources/style.css | 2 +- crates/pdfs-gui/src/app/main.rs | 19 + crates/pdfs-gui/src/app/pages/browser.rs | 49 +- crates/pdfs-gui/src/app/widgets/file_list.rs | 2 +- docs/CHANGELOG.md | 3 + po/de.po | 774 +++++++++---------- po/en_GB.po | 774 +++++++++---------- po/es.po | 774 +++++++++---------- po/fr.po | 774 +++++++++---------- po/it.po | 774 +++++++++---------- po/nl.po | 774 +++++++++---------- po/pdfs.pot | 774 +++++++++---------- po/pl.po | 774 +++++++++---------- po/pt_BR.po | 774 +++++++++---------- 15 files changed, 3561 insertions(+), 3487 deletions(-) diff --git a/crates/pdfs-core/src/config.rs b/crates/pdfs-core/src/config.rs index 4064fcc..df8ad87 100644 --- a/crates/pdfs-core/src/config.rs +++ b/crates/pdfs-core/src/config.rs @@ -224,6 +224,10 @@ pub struct FilesView { pub descending: bool, /// Folders ahead of files, whatever the sort. pub folders_first: bool, + /// The icon grid's thumbnail edge in logical pixels. `None` means the + /// app's default. + #[serde(skip_serializing_if = "Option::is_none")] + pub icon_size: Option, } impl Default for FilesView { @@ -233,6 +237,7 @@ impl Default for FilesView { sort: FileSort::Name, descending: false, folders_first: true, + icon_size: None, } } } @@ -777,6 +782,7 @@ mod tests { sort: FileSort::Modified, descending: true, folders_first: false, + icon_size: Some(192), }, photos_view: PhotosView { row_height: Some(240), @@ -856,6 +862,7 @@ mod tests { let partial: FilesView = serde_json::from_str(r#"{"sort":"size"}"#).unwrap(); assert_eq!(partial.sort, FileSort::Size); assert!(partial.folders_first); + assert_eq!(partial.icon_size, None); } #[test] diff --git a/crates/pdfs-gui/resources/style.css b/crates/pdfs-gui/resources/style.css index af7b2f2..16ade45 100644 --- a/crates/pdfs-gui/resources/style.css +++ b/crates/pdfs-gui/resources/style.css @@ -53,7 +53,7 @@ button.sidebar-account { padding: 4px 8px; font-weight: normal; } /* The folder on screen, last in the breadcrumb trail: a flat button's side * padding, so the "›" before it is spaced like the ones between buttons. */ .crumb-current { padding: 0 10px; } -scale.browser-status-meter trough { min-width: 104px; min-height: 6px; } +scale.browser-status-meter trough { min-width: 140px; min-height: 6px; } .bulk-bar { padding: 6px 8px; border-radius: 12px; background: color-mix(in srgb, var(--accent-bg-color) 12%, transparent); } .dropzone { border: 2px dashed alpha(currentColor, 0.25); border-radius: 16px; padding: 28px 18px; transition: background 160ms ease, border-color 160ms ease; } .dropzone-active { border-color: var(--accent-bg-color); background: color-mix(in srgb, var(--accent-bg-color) 10%, transparent); } diff --git a/crates/pdfs-gui/src/app/main.rs b/crates/pdfs-gui/src/app/main.rs index a416ee4..1678368 100644 --- a/crates/pdfs-gui/src/app/main.rs +++ b/crates/pdfs-gui/src/app/main.rs @@ -488,6 +488,7 @@ fn build_window(app: &adw::Application) { empty_actions: browser_widgets.empty_actions.clone(), summary: browser_widgets.summary.clone(), zoom: browser_widgets.zoom.clone(), + zoom_save: RefCell::new(None), }, details: DetailsState { details: browser_widgets.details, @@ -1523,6 +1524,9 @@ fn show_shortcuts(window: &adw::ApplicationWindow) { ("Left Right", gettext_noop("Back / forward")), ("Up", gettext_noop("Parent folder")), ("1 2", gettext_noop("Grid / list")), + ("plus", gettext_noop("Larger thumbnails")), + ("minus", gettext_noop("Smaller thumbnails")), + ("0", gettext_noop("Reset thumbnail size")), ("F2", gettext_noop("Rename")), ("Delete", gettext_noop("Move to Trash")), ("Escape", gettext_noop("Clear the selection")), @@ -1588,6 +1592,21 @@ fn install_shortcuts(ui: &Rc, window: &adw::ApplicationWindow) { ui.browser.search.grab_focus(); } gtk4::gdk::Key::n | gtk4::gdk::Key::N if ctrl && on_browser => prompt_new_folder(&ui), + gtk4::gdk::Key::plus | gtk4::gdk::Key::equal | gtk4::gdk::Key::KP_Add + if ctrl && on_browser && !ui.browser.files.shows_list() => + { + zoom_files(&ui, 1) + } + gtk4::gdk::Key::minus | gtk4::gdk::Key::KP_Subtract + if ctrl && on_browser && !ui.browser.files.shows_list() => + { + zoom_files(&ui, -1) + } + gtk4::gdk::Key::_0 | gtk4::gdk::Key::KP_0 + if ctrl && on_browser && !ui.browser.files.shows_list() => + { + zoom_files(&ui, 0) + } gtk4::gdk::Key::_1 | gtk4::gdk::Key::_2 if ctrl && on_browser => set_files_view( &ui, FilesView { diff --git a/crates/pdfs-gui/src/app/pages/browser.rs b/crates/pdfs-gui/src/app/pages/browser.rs index 59ded50..2932916 100644 --- a/crates/pdfs-gui/src/app/pages/browser.rs +++ b/crates/pdfs-gui/src/app/pages/browser.rs @@ -77,6 +77,8 @@ pub(crate) struct BrowserState { /// zoom value, and Proton account storage usage. pub(crate) summary: gtk4::Label, pub(crate) zoom: gtk4::Scale, + /// Saves the zoom once the slider rests, not on every step. + pub(crate) zoom_save: RefCell>, } /// Idle pause after the last keystroke before a search query is sent, so typing @@ -87,9 +89,11 @@ pub(crate) const SEARCH_DEBOUNCE: Duration = Duration::from_millis(250); pub(crate) const SEARCH_LIMIT: usize = 200; /// Browser grid thumbnail size controlled by the bottom zoom slider. The -/// default preserves the former fixed 72 px presentation. +/// default preserves the former fixed 72 px presentation. The largest size is +/// big enough to tell photos apart by their thumbnail, and thumbnails are +/// 512 px, so they stay sharp up to it on a 2× screen. pub(crate) const GRID_THUMB_MIN: i32 = 48; -pub(crate) const GRID_THUMB_MAX: i32 = 144; +pub(crate) const GRID_THUMB_MAX: i32 = 256; pub(crate) const GRID_THUMB_DEFAULT: i32 = 72; pub(crate) const GRID_THUMB_STEP: i32 = 8; @@ -801,6 +805,7 @@ pub(crate) fn wire_browser(ui: &Rc) { &[], ))); ui_zoom.browser.files.set_thumbnail_size(size); + save_icon_size(&ui_zoom, size); }); files @@ -1306,6 +1311,11 @@ pub(crate) fn wire_browser_actions(ui: &Rc, build_thumbnails: >k4::Button) let view = ui.dirs.load_config().files_view; ui.browser.view.set(view); + if let Some(size) = view.icon_size { + ui.browser + .zoom + .set_value(f64::from(size.clamp(GRID_THUMB_MIN, GRID_THUMB_MAX))); + } let layout = gio::SimpleAction::new_stateful( "view", Some(glib::VariantTy::STRING), @@ -1407,6 +1417,41 @@ pub(crate) fn wire_browser_actions(ui: &Rc, build_thumbnails: >k4::Button) ui.browser.content.add_controller(drop); } +/// Remember the grid's icon size, once the slider has rested for a moment. +fn save_icon_size(ui: &Rc, size: i32) { + let mut view = ui.browser.view.get(); + if view.icon_size == Some(size) { + return; + } + view.icon_size = Some(size); + ui.browser.view.set(view); + if let Some(source) = ui.browser.zoom_save.borrow_mut().take() { + source.remove(); + } + let ui_save = ui.clone(); + let source = glib::timeout_add_local_once(Duration::from_millis(500), move || { + ui_save.browser.zoom_save.borrow_mut().take(); + let mut config = ui_save.dirs.load_config(); + config.files_view.icon_size = ui_save.browser.view.get().icon_size; + if let Err(e) = ui_save.dirs.save_config(&config) { + tracing::warn!("cannot save the icon size: {e}"); + } + }); + *ui.browser.zoom_save.borrow_mut() = Some(source); +} + +/// Step the grid's icon size by `steps` slider notches; `0` resets it. +pub(crate) fn zoom_files(ui: &Rc, steps: i32) { + let zoom = &ui.browser.zoom; + let size = if steps == 0 { + GRID_THUMB_DEFAULT + } else { + (zoom.value().round() as i32 + steps * GRID_THUMB_STEP) + .clamp(GRID_THUMB_MIN, GRID_THUMB_MAX) + }; + zoom.set_value(f64::from(size)); +} + fn layout_name(view: FilesView) -> &'static str { if view.list { "list" } else { "grid" } } diff --git a/crates/pdfs-gui/src/app/widgets/file_list.rs b/crates/pdfs-gui/src/app/widgets/file_list.rs index dac98cf..06d2d46 100644 --- a/crates/pdfs-gui/src/app/widgets/file_list.rs +++ b/crates/pdfs-gui/src/app/widgets/file_list.rs @@ -478,7 +478,7 @@ pub(crate) fn text_column( fn resize_grid_tile(thumbnail: >k4::Overlay, label: >k4::Label, size: i32) { resize_file_thumbnail(thumbnail, size, grid_fallback_size(size)); - let name_width = (size / 6 + 1).clamp(8, 24); + let name_width = (size / 6 + 1).clamp(8, 40); label.set_width_chars(name_width); label.set_max_width_chars(name_width); } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index be0a3b7..53aec14 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -61,6 +61,9 @@ Existing folders remain device backups; older builds cannot open the upgraded da - The zoom level and the tile shape are remembered between runs. - In the photo viewer, the details panel lies over the photo when the window is narrow instead of squeezing it. +- **Larger icons in My files.** The icon size slider goes up to 256 px, big enough to + tell photos apart by their thumbnail. Ctrl+plus, Ctrl+minus and Ctrl+0 change it from + the keyboard, and the size is remembered between runs. ### Fixed diff --git a/po/de.po b/po/de.po index 1ba5634..e72ce10 100644 --- a/po/de.po +++ b/po/de.po @@ -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-11-14 02:34+0100\n" +"POT-Creation-Date: 2026-11-14 02:47+0100\n" "PO-Revision-Date: 2026-09-23 12:00+0200\n" "Last-Translator: Proton Drive for Linux contributors\n" "Language-Team: German\n" @@ -31,7 +31,7 @@ msgstr[1] "vor {n} Min." #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:3533 +#: crates/pdfs-gui/src/app/pages/photos.rs:3534 msgid "%H:%M" msgstr "%H:%M" @@ -57,87 +57,87 @@ 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:864 +#: crates/pdfs-gui/src/app/main.rs:865 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 -#: crates/pdfs-gui/src/app/pages/browser.rs:454 -#: crates/pdfs-gui/src/app/pages/browser.rs:833 -#: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2168 -#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/browser.rs:458 +#: crates/pdfs-gui/src/app/pages/browser.rs:838 +#: crates/pdfs-gui/src/app/pages/browser.rs:1254 +#: crates/pdfs-gui/src/app/pages/browser.rs:2213 +#: crates/pdfs-gui/src/app/pages/browser.rs:2292 #: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" msgstr "Meine Dateien" -#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/main.rs:866 crates/pdfs-gui/src/app/main.rs:1536 #: crates/pdfs-gui/src/app/pages/albums.rs:636 #: crates/pdfs-gui/src/app/pages/photos.rs:898 #: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "Fotos" -#: crates/pdfs-gui/src/app/main.rs:868 +#: crates/pdfs-gui/src/app/main.rs:869 #: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:484 msgid "Shared with me" msgstr "Mit mir geteilt" -#: crates/pdfs-gui/src/app/main.rs:873 +#: crates/pdfs-gui/src/app/main.rs:874 #: 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:876 +#: crates/pdfs-gui/src/app/main.rs:877 #: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:493 msgid "Computers" msgstr "Computer" -#: crates/pdfs-gui/src/app/main.rs:877 +#: crates/pdfs-gui/src/app/main.rs:878 #: 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:879 +#: crates/pdfs-gui/src/app/main.rs:880 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:1229 +#: crates/pdfs-gui/src/app/main.rs:1230 #: crates/pdfs-gui/src/app/pages/takeout.rs:714 #, rust-format msgid "{what}: {detail}" msgstr "{what}: {detail}" -#: crates/pdfs-gui/src/app/main.rs:1252 +#: crates/pdfs-gui/src/app/main.rs:1253 msgid "You're offline" msgstr "Keine Internetverbindung" -#: crates/pdfs-gui/src/app/main.rs:1253 +#: crates/pdfs-gui/src/app/main.rs:1254 msgid "That's not there any more" msgstr "Das ist nicht mehr vorhanden" -#: crates/pdfs-gui/src/app/main.rs:1254 +#: crates/pdfs-gui/src/app/main.rs:1255 msgid "You don't have access to that" msgstr "Kein Zugriff darauf" -#: crates/pdfs-gui/src/app/main.rs:1255 +#: crates/pdfs-gui/src/app/main.rs:1256 msgid "Something changed this first" msgstr "Etwas anderes hat dies zuerst geändert" -#: crates/pdfs-gui/src/app/main.rs:1256 +#: crates/pdfs-gui/src/app/main.rs:1257 msgid "Your Proton Drive is full" msgstr "Das Proton Drive ist voll" -#: crates/pdfs-gui/src/app/main.rs:1343 +#: crates/pdfs-gui/src/app/main.rs:1344 msgid "Proton Drive for Linux" msgstr "Proton Drive for Linux" -#: crates/pdfs-gui/src/app/main.rs:1351 +#: crates/pdfs-gui/src/app/main.rs:1352 msgid "" "Files-on-demand Proton Drive for the Linux desktop.\n" "\n" @@ -149,23 +149,23 @@ msgstr "" "Inoffizieller Client – nicht mit Proton AG verbunden, von Proton AG " "unterstützt oder befürwortet." -#: crates/pdfs-gui/src/app/main.rs:1356 +#: crates/pdfs-gui/src/app/main.rs:1357 msgid "Source Code" msgstr "Quellcode" -#: crates/pdfs-gui/src/app/main.rs:1360 +#: crates/pdfs-gui/src/app/main.rs:1361 msgid "Proton Terms of Service" msgstr "Nutzungsbedingungen von Proton" -#: crates/pdfs-gui/src/app/main.rs:1364 +#: crates/pdfs-gui/src/app/main.rs:1365 msgid "Proton Privacy Policy" msgstr "Datenschutzerklärung von Proton" -#: crates/pdfs-gui/src/app/main.rs:1369 +#: crates/pdfs-gui/src/app/main.rs:1370 msgid "Disclaimer" msgstr "Haftungsausschluss" -#: crates/pdfs-gui/src/app/main.rs:1373 +#: crates/pdfs-gui/src/app/main.rs:1374 msgid "" "This is an unofficial, community-built client. It is not affiliated with, " "endorsed by, or supported by Proton AG.\n" @@ -190,7 +190,7 @@ msgstr "" "bereitgestellt. Daten, deren Verlust nicht hinnehmbar ist, sollten " "zusätzlich gesichert werden." -#: crates/pdfs-gui/src/app/main.rs:1381 +#: crates/pdfs-gui/src/app/main.rs:1382 msgid "" "Places are named with data from GeoNames, licensed under GeoNames, lizenziert unter CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -210,7 +210,7 @@ msgstr "" "href=\"https://www.naturalearthdata.com/\">Natural Earth gezeichnet, die " "gemeinfrei sind." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the GeoNames, licensed under GeoNames, licensed under CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -207,7 +207,7 @@ msgstr "" "\">Natural Earth land outlines and country borders, which are in the " "public domain." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the GeoNames, licensed under GeoNames, con licencia CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -208,7 +208,7 @@ msgstr "" "fronteras de países de Natural " "Earth, que son de dominio público." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the GeoNames, licensed under GeoNames, sous licence CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -209,7 +209,7 @@ msgstr "" "frontières des pays de Natural " "Earth, qui sont dans le domaine public." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the GeoNames, licensed under GeoNames, con licenza CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -207,7 +207,7 @@ msgstr "" "confini nazionali di Natural " "Earth, che sono di pubblico dominio." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the GeoNames, licensed under GeoNames, gelicentieerd onder CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -208,7 +208,7 @@ msgstr "" "href=\"https://www.naturalearthdata.com/\">Natural Earth, die in het " "publieke domein vallen." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the \n" "Language-Team: LANGUAGE \n" @@ -34,7 +34,7 @@ msgstr[1] "" #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #: crates/pdfs-gui/src/app/dates.rs:44 #: crates/pdfs-gui/src/app/pages/activity.rs:840 -#: crates/pdfs-gui/src/app/pages/photos.rs:3533 +#: crates/pdfs-gui/src/app/pages/photos.rs:3534 msgid "%H:%M" msgstr "" @@ -60,87 +60,87 @@ msgstr "" msgid "%A, %B %-d, %Y, %H:%M" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:864 +#: crates/pdfs-gui/src/app/main.rs:865 #: crates/pdfs-gui/src/app/pages/activity_text.rs:543 -#: crates/pdfs-gui/src/app/pages/browser.rs:454 -#: crates/pdfs-gui/src/app/pages/browser.rs:833 -#: crates/pdfs-gui/src/app/pages/browser.rs:1249 -#: crates/pdfs-gui/src/app/pages/browser.rs:2168 -#: crates/pdfs-gui/src/app/pages/browser.rs:2247 +#: crates/pdfs-gui/src/app/pages/browser.rs:458 +#: crates/pdfs-gui/src/app/pages/browser.rs:838 +#: crates/pdfs-gui/src/app/pages/browser.rs:1254 +#: crates/pdfs-gui/src/app/pages/browser.rs:2213 +#: crates/pdfs-gui/src/app/pages/browser.rs:2292 #: crates/pdfs-gui/src/app/pages/locations.rs:1721 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:252 #: crates/pdfs-gui/src/app/pages/trash.rs:191 crates/pdfs-gui/src/prompt.rs:171 msgid "My files" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:865 crates/pdfs-gui/src/app/main.rs:1532 +#: crates/pdfs-gui/src/app/main.rs:866 crates/pdfs-gui/src/app/main.rs:1536 #: crates/pdfs-gui/src/app/pages/albums.rs:636 #: crates/pdfs-gui/src/app/pages/photos.rs:898 #: crates/pdfs-gui/src/app/pages/places.rs:439 msgid "Photos" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:868 +#: crates/pdfs-gui/src/app/main.rs:869 #: crates/pdfs-gui/src/app/pages/shared.rs:168 #: crates/pdfs-gui/src/app/pages/shared.rs:484 msgid "Shared with me" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:873 +#: crates/pdfs-gui/src/app/main.rs:874 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:120 msgid "Shared by me" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:876 +#: crates/pdfs-gui/src/app/main.rs:877 #: crates/pdfs-gui/src/app/pages/devices.rs:140 #: crates/pdfs-gui/src/app/pages/devices.rs:493 msgid "Computers" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:877 +#: crates/pdfs-gui/src/app/main.rs:878 #: 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:879 +#: crates/pdfs-gui/src/app/main.rs:880 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:1229 +#: crates/pdfs-gui/src/app/main.rs:1230 #: crates/pdfs-gui/src/app/pages/takeout.rs:714 #, rust-format msgid "{what}: {detail}" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1252 +#: crates/pdfs-gui/src/app/main.rs:1253 msgid "You're offline" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1253 +#: crates/pdfs-gui/src/app/main.rs:1254 msgid "That's not there any more" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1254 +#: crates/pdfs-gui/src/app/main.rs:1255 msgid "You don't have access to that" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1255 +#: crates/pdfs-gui/src/app/main.rs:1256 msgid "Something changed this first" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1256 +#: crates/pdfs-gui/src/app/main.rs:1257 msgid "Your Proton Drive is full" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1343 +#: crates/pdfs-gui/src/app/main.rs:1344 msgid "Proton Drive for Linux" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1351 +#: crates/pdfs-gui/src/app/main.rs:1352 msgid "" "Files-on-demand Proton Drive for the Linux desktop.\n" "\n" @@ -148,23 +148,23 @@ msgid "" "AG." msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1356 +#: crates/pdfs-gui/src/app/main.rs:1357 msgid "Source Code" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1360 +#: crates/pdfs-gui/src/app/main.rs:1361 msgid "Proton Terms of Service" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1364 +#: crates/pdfs-gui/src/app/main.rs:1365 msgid "Proton Privacy Policy" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1369 +#: crates/pdfs-gui/src/app/main.rs:1370 msgid "Disclaimer" msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1373 +#: crates/pdfs-gui/src/app/main.rs:1374 msgid "" "This is an unofficial, community-built client. It is not affiliated with, " "endorsed by, or supported by Proton AG.\n" @@ -177,21 +177,21 @@ msgid "" "of any data you cannot afford to lose." msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1381 +#: crates/pdfs-gui/src/app/main.rs:1382 msgid "" "Places are named with data from GeoNames, licensed under CC BY 4.0." msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " "public domain." msgstr "" -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the GeoNames, licensed under GeoNames udostępnionych na licencji CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -211,7 +211,7 @@ msgstr "" "www.naturalearthdata.com/\">Natural Earth, które należą do domeny " "publicznej." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the GeoNames, licensed under GeoNames, licenciados sob CC BY 4.0." -#: crates/pdfs-gui/src/app/main.rs:1389 +#: crates/pdfs-gui/src/app/main.rs:1390 msgid "" "The places map is drawn from Natural Earth land outlines and country borders, which are in the " @@ -207,7 +207,7 @@ msgstr "" "fronteiras de países do Natural Earth, que são de domínio público." -#: crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/main.rs:1398 msgid "" "The street map, when turned on, comes from OpenFreeMap in the Date: Sat, 14 Nov 2026 02:49:41 +0100 Subject: [PATCH 4/4] feat(gui): Ctrl+scroll changes the icon size in My files Scrolling with Ctrl held over the icon grid steps the icon size, as it does in Photos. Touchpad deltas add up to a whole notch before each step, so a small swipe does not jump through every size. --- crates/pdfs-gui/src/app/pages/browser.rs | 27 ++++++++++++++++++++++++ docs/CHANGELOG.md | 4 ++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/crates/pdfs-gui/src/app/pages/browser.rs b/crates/pdfs-gui/src/app/pages/browser.rs index 2932916..a3d46a0 100644 --- a/crates/pdfs-gui/src/app/pages/browser.rs +++ b/crates/pdfs-gui/src/app/pages/browser.rs @@ -807,6 +807,33 @@ pub(crate) fn wire_browser(ui: &Rc) { ui_zoom.browser.files.set_thumbnail_size(size); save_icon_size(&ui_zoom, size); }); + // Ctrl+scroll steps the icon size, as in Photos. Capture phase so the + // scrolled window does not scroll the grid as well. A touchpad sends many + // small deltas, so they add up to a whole notch before each step. + if let Some(grid_scroll) = files.views.child_by_name("grid") { + let wheel = gtk4::EventControllerScroll::new(gtk4::EventControllerScrollFlags::VERTICAL); + wheel.set_propagation_phase(gtk4::PropagationPhase::Capture); + let ui_wheel = ui.clone(); + let pending = Cell::new(0.0_f64); + wheel.connect_scroll(move |controller, _dx, dy| { + if !controller + .current_event_state() + .contains(gtk4::gdk::ModifierType::CONTROL_MASK) + { + pending.set(0.0); + return glib::Propagation::Proceed; + } + let total = pending.get() + dy; + let steps = total.trunc(); + pending.set(total - steps); + if steps != 0.0 { + // Scrolling up (negative dy) makes the icons bigger. + zoom_files(&ui_wheel, -(steps as i32)); + } + glib::Propagation::Stop + }); + grid_scroll.add_controller(wheel); + } files .column_view diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 53aec14..018fbd8 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -62,8 +62,8 @@ Existing folders remain device backups; older builds cannot open the upgraded da - In the photo viewer, the details panel lies over the photo when the window is narrow instead of squeezing it. - **Larger icons in My files.** The icon size slider goes up to 256 px, big enough to - tell photos apart by their thumbnail. Ctrl+plus, Ctrl+minus and Ctrl+0 change it from - the keyboard, and the size is remembered between runs. + tell photos apart by their thumbnail. Ctrl+scroll, Ctrl+plus, Ctrl+minus and Ctrl+0 + change it too, and the size is remembered between runs. ### Fixed