From 1c50797772b2f1e19e04db69fc6b8b83f9862cf2 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Sat, 14 Nov 2026 02:40:38 +0100 Subject: [PATCH] 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"