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"