feat(gui): one Filters popover for the photos timeline

Favorites, "not in an album" and the month move from separate pills and a
dropdown into a Filters popover next to the kind tabs. The kind tabs stay
in the row because their counts are worth a glance. The button carries a
badge with the number of active filters, kind included, and the popover
has a "Clear filters" action that resets everything in one reload.

Flipping a filter while a page was still loading used to drop the reload,
leaving the timeline answering the old filter. The request is now queued
and the stale page is discarded.
This commit is contained in:
nvrl committed 2026-09-28 02:12:59 +02:00
1 parent 2f14c1688f
commit 2757977fd6
14 files changed
+1910 -1676

No files matched your search

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<!-- "Filters": a funnel, wide at the top and narrowing to a short spout.
No stock icon theme ships one under a standard name. -->
<path fill="#222222" d="M 1.5,2 H 14.5 L 9.5,8.5 V 13.5 L 6.5,15 V 8.5 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 309 B

@@ -7,6 +7,7 @@
<file preprocess="xml-stripblanks">scalable/actions/pdfs-build-thumbnails-symbolic.svg</file> <file preprocess="xml-stripblanks">scalable/actions/pdfs-build-thumbnails-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/pdfs-folder-upload-symbolic.svg</file> <file preprocess="xml-stripblanks">scalable/actions/pdfs-folder-upload-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/pdfs-upload-symbolic.svg</file> <file preprocess="xml-stripblanks">scalable/actions/pdfs-upload-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/pdfs-filter-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/pdfs-offline-symbolic.svg</file> <file preprocess="xml-stripblanks">scalable/actions/pdfs-offline-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/pdfs-online-only-symbolic.svg</file> <file preprocess="xml-stripblanks">scalable/actions/pdfs-online-only-symbolic.svg</file>
<!-- The app icon, from the one file packaging installs, so the in-app brand <!-- The app icon, from the one file packaging installs, so the in-app brand
+3
View File
@@ -86,3 +86,6 @@ progressbar.browser-status-meter trough, progressbar.browser-status-meter progre
/* Shared with Me: what a share lets me do, as a tinted pill beside the name. */ /* 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); } .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); }
/* Photos: how many timeline filters are on, as a small badge on the Filters button. */
.filter-count { min-width: 18px; padding: 0 5px; border-radius: 999px; font-size: 0.8em; font-weight: 700; color: var(--accent-fg-color); background-color: var(--accent-bg-color); }
+6 -2
View File
@@ -560,16 +560,20 @@ fn build_window(app: &adw::Application) {
tabs: gallery_widgets.tabs.clone(), tabs: gallery_widgets.tabs.clone(),
counts: Cell::new(None), counts: Cell::new(None),
dates: gallery_widgets.dates.clone(), dates: gallery_widgets.dates.clone(),
filter_btn: gallery_widgets.filter_btn.clone(),
filter_count: gallery_widgets.filter_count.clone(),
clear_filters: gallery_widgets.clear_filters.clone(),
date_ranges: RefCell::new(vec![None]), date_ranges: RefCell::new(vec![None]),
range: Cell::new(None), range: Cell::new(None),
favorites_btn: gallery_widgets.favorites_btn.clone(), favorites_row: gallery_widgets.favorites_row.clone(),
favorites: Cell::new(false), favorites: Cell::new(false),
not_in_album_btn: gallery_widgets.not_in_album_btn.clone(), not_in_album_row: gallery_widgets.not_in_album_row.clone(),
not_in_album: Cell::new(false), not_in_album: Cell::new(false),
memories: gallery_widgets.memories.clone(), memories: gallery_widgets.memories.clone(),
memory_cards: gallery_widgets.memory_cards.clone(), memory_cards: gallery_widgets.memory_cards.clone(),
has_memories: Cell::new(false), has_memories: Cell::new(false),
date_suppress: Cell::new(false), date_suppress: Cell::new(false),
reload_pending: Cell::new(false),
loading: Cell::new(false), loading: Cell::new(false),
has_more: Cell::new(false), has_more: Cell::new(false),
page_waiters: RefCell::new(Vec::new()), page_waiters: RefCell::new(Vec::new()),
+154 -48
View File
@@ -87,21 +87,27 @@ pub(crate) struct GalleryState {
/// carried them, so the subtitle can say how big the library *is* rather /// carried them, so the subtitle can say how big the library *is* rather
/// than how much of it has been paged in. /// than how much of it has been paged in.
pub(crate) counts: Cell<Option<(usize, usize, usize)>>, pub(crate) counts: Cell<Option<(usize, usize, usize)>>,
/// The date-jump dropdown ("All dates" then a month per timeline entry), and /// The Filters button, the count badge on it, and the popover's "Clear
/// the `[from, to)` window each of its rows selects (index-aligned; `None` is /// filters" button.
/// "All dates"). Selecting a row loads that month via [`load_gallery`]. pub(crate) filter_btn: gtk4::MenuButton,
pub(crate) dates: gtk4::DropDown, pub(crate) filter_count: gtk4::Label,
pub(crate) clear_filters: gtk4::Button,
/// The month row of the Filters popover ("All dates" then a month per
/// timeline entry), and the `[from, to)` window each of its rows selects
/// (index-aligned; `None` is "All dates"). Selecting a row loads that month
/// via [`load_gallery`].
pub(crate) dates: adw::ComboRow,
pub(crate) date_ranges: RefCell<Vec<Option<(i64, i64)>>>, pub(crate) date_ranges: RefCell<Vec<Option<(i64, i64)>>>,
/// The capture-time window the timeline is currently filtered to, or `None` /// The capture-time window the timeline is currently filtered to, or `None`
/// for the whole span. Read by [`load_gallery`], set by the date dropdown. /// for the whole span. Read by [`load_gallery`], set by the date dropdown.
pub(crate) range: Cell<Option<(i64, i64)>>, pub(crate) range: Cell<Option<(i64, i64)>>,
/// The favorites toggle, and whether it is on. When on, the timeline is /// The favorites switch, and whether it is on. When on, the timeline is
/// restricted to photos carrying Proton's `Favorite` tag. /// restricted to photos carrying Proton's `Favorite` tag.
pub(crate) favorites_btn: gtk4::ToggleButton, pub(crate) favorites_row: adw::SwitchRow,
pub(crate) favorites: Cell<bool>, pub(crate) favorites: Cell<bool>,
/// The album filter toggle, and whether it is on. When on, the timeline is /// The album filter switch, and whether it is on. When on, the timeline is
/// restricted to photos no album of ours holds yet. /// restricted to photos no album of ours holds yet.
pub(crate) not_in_album_btn: gtk4::ToggleButton, pub(crate) not_in_album_row: adw::SwitchRow,
pub(crate) not_in_album: Cell<bool>, pub(crate) not_in_album: Cell<bool>,
/// The "On this day" strip above the timeline, the box holding its cards, /// The "On this day" strip above the timeline, the box holding its cards,
/// and whether there is anything to show in it. /// and whether there is anything to show in it.
@@ -111,6 +117,8 @@ pub(crate) struct GalleryState {
/// Set while the date dropdown is being repopulated, so resetting its model /// Set while the date dropdown is being repopulated, so resetting its model
/// doesn't fire the selection handler and kick off a spurious reload. /// doesn't fire the selection handler and kick off a spurious reload.
pub(crate) date_suppress: Cell<bool>, pub(crate) date_suppress: Cell<bool>,
/// A fresh load was asked for while a page was still loading.
pub(crate) reload_pending: Cell<bool>,
/// True while a timeline page is in flight, so the scroll-to-the-end paging /// True while a timeline page is in flight, so the scroll-to-the-end paging
/// can't fire a second request for the page already coming. /// can't fire a second request for the page already coming.
pub(crate) loading: Cell<bool>, pub(crate) loading: Cell<bool>,
@@ -383,13 +391,16 @@ pub(crate) struct GalleryWidgets {
/// The All / Photos / Videos / Raw filter toggles, in that order (index maps /// The All / Photos / Videos / Raw filter toggles, in that order (index maps
/// to [`kind_for_tab`]). /// to [`kind_for_tab`]).
pub(crate) tabs: [gtk4::ToggleButton; 4], pub(crate) tabs: [gtk4::ToggleButton; 4],
pub(crate) favorites_btn: gtk4::ToggleButton, pub(crate) favorites_row: adw::SwitchRow,
pub(crate) not_in_album_btn: gtk4::ToggleButton, pub(crate) not_in_album_row: adw::SwitchRow,
/// The "On this day" strip and the box its cards go into. /// The "On this day" strip and the box its cards go into.
pub(crate) memories: gtk4::Revealer, pub(crate) memories: gtk4::Revealer,
pub(crate) memory_cards: gtk4::Box, pub(crate) memory_cards: gtk4::Box,
/// The date-jump dropdown, populated with the timeline's months. /// The month row of the Filters popover, populated with the timeline's months.
pub(crate) dates: gtk4::DropDown, pub(crate) dates: adw::ComboRow,
pub(crate) filter_btn: gtk4::MenuButton,
pub(crate) filter_count: gtk4::Label,
pub(crate) clear_filters: gtk4::Button,
} }
/// The Photos page: a [`gtk4::ListView`] of day sections, each a heading over /// The Photos page: a [`gtk4::ListView`] of day sections, each a heading over
@@ -598,40 +609,62 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) {
tab_group.append(btn); tab_group.append(btn);
} }
// Favorites: a filter, not a tab — it cuts across Photos / Videos / Raw, so // Favorites, "not in an album" and the month: the filters that cut across
// it stays outside the segmented control rather than becoming a fifth option // the kind tabs, together in one popover so the row stays short. The tabs
// that would silently drop the kind the user picked. // stay out in the open because their counts are worth a glance.
let favorites_btn = gtk4::ToggleButton::builder() let favorites_row = adw::SwitchRow::builder()
.icon_name("starred-symbolic") .title(gettext("Only favorites"))
.tooltip_text(gettext("Show only favorites"))
.build(); .build();
favorites_btn.add_css_class("pill"); let not_in_album_row = adw::SwitchRow::builder()
.title(gettext("Only photos not in an album"))
// Not in an album: a filter like favorites, for filing what is left.
let not_in_album_btn = gtk4::ToggleButton::builder()
.icon_name("view-grid-symbolic")
.tooltip_text(gettext("Show only photos not in an album"))
.build(); .build();
not_in_album_btn.add_css_class("pill"); // "All dates" plus a row per month, filled in once the timeline's months are
// known (see [`refresh_photo_months`]).
let dates = adw::ComboRow::builder()
.title(gettext("Month"))
.model(&gtk4::StringList::new(&[gettext("All dates").as_str()]))
.build();
let filter_list = gtk4::ListBox::new();
filter_list.set_selection_mode(gtk4::SelectionMode::None);
filter_list.add_css_class("boxed-list");
filter_list.append(&favorites_row);
filter_list.append(&not_in_album_row);
filter_list.append(&dates);
let clear_filters = gtk4::Button::builder()
.label(gettext("Clear filters"))
.halign(gtk4::Align::End)
.sensitive(false)
.build();
clear_filters.add_css_class("flat");
let filter_panel = gtk4::Box::new(gtk4::Orientation::Vertical, 12);
filter_panel.set_width_request(340);
filter_panel.append(&filter_list);
filter_panel.append(&clear_filters);
let filter_popover = gtk4::Popover::builder().child(&filter_panel).build();
// Date jump: "All dates" plus a row per month, filled in once the timeline's // The Filters button, with a badge counting the active filters, kind
// months are known (see [`refresh_photo_months`]). Pushed to the far end of // included, so a filtered timeline is never mistaken for the whole one.
// the filter row, opposite the kind toggles. let filter_count = gtk4::Label::builder().visible(false).build();
let dates = gtk4::DropDown::from_strings(&[gettext("All dates").as_str()]); filter_count.add_css_class("filter-count");
dates.add_css_class("pill"); let filter_face = gtk4::Box::new(gtk4::Orientation::Horizontal, 6);
dates.set_tooltip_text(Some(&gettext("Jump to a month"))); filter_face.append(&gtk4::Image::from_icon_name("pdfs-filter-symbolic"));
filter_face.append(&gtk4::Label::new(Some(&gettext("Filters"))));
filter_face.append(&filter_count);
let filter_btn = gtk4::MenuButton::builder()
.child(&filter_face)
.popover(&filter_popover)
.build();
filter_btn.add_css_class("pill");
// The kind toggles and the date jump travel together: they filter the // 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. // timeline, and neither applies to the album grid or to an open album.
let filters = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); let filters = gtk4::Box::new(gtk4::Orientation::Horizontal, 8);
filters.set_hexpand(true); filters.set_hexpand(true);
filters.append(&tab_group); filters.append(&tab_group);
filters.append(&favorites_btn);
filters.append(&not_in_album_btn);
let spacer = gtk4::Box::new(gtk4::Orientation::Horizontal, 0); let spacer = gtk4::Box::new(gtk4::Orientation::Horizontal, 0);
spacer.set_hexpand(true); spacer.set_hexpand(true);
filters.append(&spacer); filters.append(&spacer);
filters.append(&dates); filters.append(&filter_btn);
// The page's two views, as one segmented control under the title: the // 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 // timeline, and the albums. This is navigation, not a filter — which is why
@@ -789,11 +822,14 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) {
select_album, select_album,
select_done, select_done,
tabs, tabs,
favorites_btn, favorites_row,
not_in_album_btn, not_in_album_row,
memories, memories,
memory_cards, memory_cards,
dates, dates,
filter_btn,
filter_count,
clear_filters,
albums, albums,
albums_stack, albums_stack,
albums_status, albums_status,
@@ -837,6 +873,34 @@ pub(crate) fn month_label(year: i32, month: i32) -> String {
.unwrap_or_else(|_| format!("{year}-{month:02}")) .unwrap_or_else(|_| format!("{year}-{month:02}"))
} }
/// How many timeline filters are on: the kind, favorites, "not in an album"
/// and the month each count once.
pub(crate) fn active_filters(
kind: Option<PhotoKind>,
favorites: bool,
not_in_album: bool,
range: Option<(i64, i64)>,
) -> usize {
[kind.is_some(), favorites, not_in_album, range.is_some()]
.into_iter()
.filter(|on| *on)
.count()
}
/// Show the active filter count on the Filters button, and offer "Clear
/// filters" only when there is something to clear.
fn sync_filter_badge(ui: &Rc<Ui>) {
let n = active_filters(
ui.gallery.kind.get(),
ui.gallery.favorites.get(),
ui.gallery.not_in_album.get(),
ui.gallery.range.get(),
);
ui.gallery.filter_count.set_label(&n.to_string());
ui.gallery.filter_count.set_visible(n > 0);
ui.gallery.clear_filters.set_sensitive(n > 0);
}
/// Rebuild the date-jump dropdown for the active kind: ask the daemon which /// Rebuild the date-jump dropdown for the active kind: ask the daemon which
/// months the timeline spans and turn them into "Month YYYY (count)" rows, each /// months the timeline spans and turn them into "Month YYYY (count)" rows, each
/// remembering the window it jumps to. Resets the selection to "All dates" — the /// remembering the window it jumps to. Resets the selection to "All dates" — the
@@ -1155,8 +1219,8 @@ pub(crate) fn wire_gallery(
// Independent of the kind tabs and the date jump, both of which keep their // Independent of the kind tabs and the date jump, both of which keep their
// current value across the toggle. // current value across the toggle.
let ui_fav = ui.clone(); let ui_fav = ui.clone();
ui.gallery.favorites_btn.connect_toggled(move |btn| { ui.gallery.favorites_row.connect_active_notify(move |row| {
let on = btn.is_active(); let on = row.is_active();
if ui_fav.gallery.favorites.get() == on { if ui_fav.gallery.favorites.get() == on {
return; return;
} }
@@ -1166,13 +1230,34 @@ pub(crate) fn wire_gallery(
// Not in an album: the same kind of filter, and just as independent. // Not in an album: the same kind of filter, and just as independent.
let ui_unfiled = ui.clone(); let ui_unfiled = ui.clone();
ui.gallery.not_in_album_btn.connect_toggled(move |btn| { ui.gallery
let on = btn.is_active(); .not_in_album_row
if ui_unfiled.gallery.not_in_album.get() == on { .connect_active_notify(move |row| {
return; let on = row.is_active();
} if ui_unfiled.gallery.not_in_album.get() == on {
ui_unfiled.gallery.not_in_album.set(on); return;
load_gallery(&ui_unfiled, false); }
ui_unfiled.gallery.not_in_album.set(on);
load_gallery(&ui_unfiled, false);
});
// Clear filters: back to the whole timeline in one reload. The state goes
// first, so each widget's handler finds nothing to change and stays quiet.
let ui_clear = ui.clone();
ui.gallery.clear_filters.connect_clicked(move |_| {
let gallery = &ui_clear.gallery;
gallery.kind.set(None);
gallery.favorites.set(false);
gallery.not_in_album.set(false);
gallery.range.set(None);
gallery.tabs[0].set_active(true);
gallery.favorites_row.set_active(false);
gallery.not_in_album_row.set_active(false);
gallery.date_suppress.set(true);
gallery.dates.set_selected(0);
gallery.date_suppress.set(false);
gallery.filter_btn.popdown();
load_gallery(&ui_clear, false);
}); });
// Date jump: selecting a month loads that window; "All dates" (row 0) clears // Date jump: selecting a month loads that window; "All dates" (row 0) clears
@@ -3070,7 +3155,13 @@ fn set_photo_favorite(ui: &Rc<Ui>, uid: String, favorite: bool) {
} }
pub(crate) fn load_gallery(ui: &Rc<Ui>, append: bool) { pub(crate) fn load_gallery(ui: &Rc<Ui>, append: bool) {
sync_filter_badge(ui);
if ui.gallery.loading.get() { if ui.gallery.loading.get() {
// A filter flipped while a page is on its way: that page answers the
// old question, so fetch again once it lands. More pages can wait.
if !append {
ui.gallery.reload_pending.set(true);
}
return; return;
} }
// An open album pages itself instead of the timeline; everything downstream — // An open album pages itself instead of the timeline; everything downstream —
@@ -3129,6 +3220,10 @@ pub(crate) fn load_gallery(ui: &Rc<Ui>, append: bool) {
ui.gallery.loading.set(false); ui.gallery.loading.set(false);
ui.gallery.pager.set_visible(false); ui.gallery.pager.set_visible(false);
ui.gallery.pager.set_spinning(false); ui.gallery.pager.set_spinning(false);
if ui.gallery.reload_pending.take() {
load_gallery(&ui, false);
return;
}
// Whoever waited on this page runs once the reply below has put it in // Whoever waited on this page runs once the reply below has put it in
// the model, whichever way that goes. // the model, whichever way that goes.
let waiters = std::mem::take(&mut *ui.gallery.page_waiters.borrow_mut()); let waiters = std::mem::take(&mut *ui.gallery.page_waiters.borrow_mut());
@@ -3301,8 +3396,9 @@ pub(crate) fn play_external(path: &str) {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::{ use super::{
Grouping, ROW_DEFAULT, ROW_MAX, ROW_MIN, ROW_STEP, TILE_GAP, empty_timeline_text, Grouping, ROW_DEFAULT, ROW_MAX, ROW_MIN, ROW_STEP, TILE_GAP, active_filters,
grouping_for, memory_years, month_index, month_range, plan_grid, section_heading, empty_timeline_text, grouping_for, memory_years, month_index, month_range, plan_grid,
section_heading,
}; };
use pdfs_core::control::{PhotoItem, PhotoKind, PhotoMonth}; use pdfs_core::control::{PhotoItem, PhotoKind, PhotoMonth};
@@ -3376,6 +3472,16 @@ mod tests {
); );
} }
#[test]
fn the_filter_badge_counts_each_active_filter_once() {
assert_eq!(active_filters(None, false, false, None), 0);
assert_eq!(active_filters(Some(PhotoKind::Raw), false, false, None), 1);
assert_eq!(
active_filters(Some(PhotoKind::Video), true, true, Some((0, 1))),
4
);
}
/// The strip shows the nearest year first, with each year's newest photo /// The strip shows the nearest year first, with each year's newest photo
/// as its cover, and never this year's own photos. /// as its cover, and never this year's own photos.
#[test] #[test]
+194 -181
View File
File diff suppressed because it is too large. Load diff
+194 -181
View File
File diff suppressed because it is too large. Load diff
+194 -181
View File
File diff suppressed because it is too large. Load diff
+194 -181
View File
File diff suppressed because it is too large. Load diff
+194 -181
View File
File diff suppressed because it is too large. Load diff
+194 -181
View File
File diff suppressed because it is too large. Load diff
+189 -178
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: proton-drive-linux 2.2.2\n" "Project-Id-Version: proton-drive-linux 2.2.2\n"
"Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/narrrl/proton-drive-linux/issues\n"
"POT-Creation-Date: 2026-09-28 00:50+0200\n" "POT-Creation-Date: 2026-09-28 01:00+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,99 +18,99 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: crates/pdfs-gui/src/app/main.rs:840 #: crates/pdfs-gui/src/app/main.rs:844
#: crates/pdfs-gui/src/app/pages/locations.rs:1133 #: crates/pdfs-gui/src/app/pages/locations.rs:1133
#: crates/pdfs-gui/src/prompt.rs:169 #: crates/pdfs-gui/src/prompt.rs:169
msgid "My files" msgid "My files"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:843 crates/pdfs-gui/src/app/main.rs:1456 #: crates/pdfs-gui/src/app/main.rs:847 crates/pdfs-gui/src/app/main.rs:1460
#: crates/pdfs-gui/src/app/pages/albums.rs:633 #: crates/pdfs-gui/src/app/pages/albums.rs:633
#: crates/pdfs-gui/src/app/pages/photos.rs:756 #: crates/pdfs-gui/src/app/pages/photos.rs:789
msgid "Photos" msgid "Photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:848 #: crates/pdfs-gui/src/app/main.rs:852
msgid "Shared with me" msgid "Shared with me"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:853 #: crates/pdfs-gui/src/app/main.rs:857
msgid "Shared by me" msgid "Shared by me"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:856 #: crates/pdfs-gui/src/app/main.rs:860
#: crates/pdfs-gui/src/app/pages/devices.rs:109 #: crates/pdfs-gui/src/app/pages/devices.rs:109
msgid "Computers" msgid "Computers"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:857 #: crates/pdfs-gui/src/app/main.rs:861
#: crates/pdfs-gui/src/app/pages/trash.rs:106 #: crates/pdfs-gui/src/app/pages/trash.rs:106
msgid "Trash" msgid "Trash"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:861 #: crates/pdfs-gui/src/app/main.rs:865
msgid "Sync" msgid "Sync"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:866 #: crates/pdfs-gui/src/app/main.rs:870
#: crates/pdfs-gui/src/app/pages/activity.rs:153 #: crates/pdfs-gui/src/app/pages/activity.rs:153
msgid "Activity" msgid "Activity"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1012 #: crates/pdfs-gui/src/app/main.rs:1016
msgid "Refresh (F5)" msgid "Refresh (F5)"
msgstr "" msgstr ""
#. Translators: a failed action's toast. {what} says what failed, such as #. Translators: a failed action's toast. {what} says what failed, such as
#. "Couldn't rename"; {detail} is the reason, usually untranslated text #. "Couldn't rename"; {detail} is the reason, usually untranslated text
#. from the mount service. #. from the mount service.
#: crates/pdfs-gui/src/app/main.rs:1186 #: crates/pdfs-gui/src/app/main.rs:1190
#, rust-format #, rust-format
msgid "{what}: {detail}" msgid "{what}: {detail}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1205 #: crates/pdfs-gui/src/app/main.rs:1209
msgid "You're offline" msgid "You're offline"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1206 #: crates/pdfs-gui/src/app/main.rs:1210
msgid "That's not there any more" msgid "That's not there any more"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1207 #: crates/pdfs-gui/src/app/main.rs:1211
msgid "You don't have access to that" msgid "You don't have access to that"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1208 #: crates/pdfs-gui/src/app/main.rs:1212
msgid "Something changed this first" msgid "Something changed this first"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1209 #: crates/pdfs-gui/src/app/main.rs:1213
msgid "Your Proton Drive is full" msgid "Your Proton Drive is full"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1250 crates/pdfs-gui/src/app/main.rs:1438 #: crates/pdfs-gui/src/app/main.rs:1254 crates/pdfs-gui/src/app/main.rs:1442
#: crates/pdfs-gui/src/app/pages/status.rs:353 #: crates/pdfs-gui/src/app/pages/status.rs:353
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1251 crates/pdfs-gui/src/app/main.rs:1495 #: crates/pdfs-gui/src/app/main.rs:1255 crates/pdfs-gui/src/app/main.rs:1499
msgid "Keyboard Shortcuts" msgid "Keyboard Shortcuts"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1253 #: crates/pdfs-gui/src/app/main.rs:1257
msgid "About Proton Drive for Linux" msgid "About Proton Drive for Linux"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1258 #: crates/pdfs-gui/src/app/main.rs:1262
msgid "Main menu" msgid "Main menu"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1304 #: crates/pdfs-gui/src/app/main.rs:1308
msgid "Proton Drive for Linux" msgid "Proton Drive for Linux"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1312 #: crates/pdfs-gui/src/app/main.rs:1316
msgid "" msgid ""
"Files-on-demand Proton Drive for the Linux desktop.\n" "Files-on-demand Proton Drive for the Linux desktop.\n"
"\n" "\n"
@@ -118,23 +118,23 @@ msgid ""
"AG." "AG."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1317 #: crates/pdfs-gui/src/app/main.rs:1321
msgid "Source Code" msgid "Source Code"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1321 #: crates/pdfs-gui/src/app/main.rs:1325
msgid "Proton Terms of Service" msgid "Proton Terms of Service"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1325 #: crates/pdfs-gui/src/app/main.rs:1329
msgid "Proton Privacy Policy" msgid "Proton Privacy Policy"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1330 #: crates/pdfs-gui/src/app/main.rs:1334
msgid "Disclaimer" msgid "Disclaimer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1334 #: crates/pdfs-gui/src/app/main.rs:1338
msgid "" msgid ""
"This is an unofficial, community-built client. It is not affiliated with, " "This is an unofficial, community-built client. It is not affiliated with, "
"endorsed by, or supported by Proton AG.\n" "endorsed by, or supported by Proton AG.\n"
@@ -149,21 +149,21 @@ msgstr ""
#. Translators: replace with your name(s) and email address(es), one #. Translators: replace with your name(s) and email address(es), one
#. per line, to be credited in the About dialog. #. per line, to be credited in the About dialog.
#: crates/pdfs-gui/src/app/main.rs:1345 #: crates/pdfs-gui/src/app/main.rs:1349
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1376 #: crates/pdfs-gui/src/app/main.rs:1380
msgid "Stop Proton Drive?" msgid "Stop Proton Drive?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1377 #: crates/pdfs-gui/src/app/main.rs:1381
msgid "" msgid ""
"The drive unmounts and nothing syncs until you connect again. Proton Drive " "The drive unmounts and nothing syncs until you connect again. Proton Drive "
"starts again at your next login." "starts again at your next login."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1379 crates/pdfs-gui/src/app/main.rs:1652 #: crates/pdfs-gui/src/app/main.rs:1383 crates/pdfs-gui/src/app/main.rs:1656
#: crates/pdfs-gui/src/app/pages/albums.rs:242 #: crates/pdfs-gui/src/app/pages/albums.rs:242
#: crates/pdfs-gui/src/app/pages/albums.rs:423 #: crates/pdfs-gui/src/app/pages/albums.rs:423
#: crates/pdfs-gui/src/app/pages/browser.rs:2273 #: crates/pdfs-gui/src/app/pages/browser.rs:2273
@@ -177,7 +177,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:670 #: crates/pdfs-gui/src/app/pages/locations.rs:670
#: crates/pdfs-gui/src/app/pages/locations.rs:1050 #: crates/pdfs-gui/src/app/pages/locations.rs:1050
#: crates/pdfs-gui/src/app/pages/login.rs:312 #: crates/pdfs-gui/src/app/pages/login.rs:312
#: crates/pdfs-gui/src/app/pages/photos.rs:1854 #: crates/pdfs-gui/src/app/pages/photos.rs:1939
#: crates/pdfs-gui/src/app/pages/shared.rs:717 #: crates/pdfs-gui/src/app/pages/shared.rs:717
#: crates/pdfs-gui/src/app/pages/shared.rs:748 #: crates/pdfs-gui/src/app/pages/shared.rs:748
#: crates/pdfs-gui/src/app/pages/shared.rs:789 #: crates/pdfs-gui/src/app/pages/shared.rs:789
@@ -191,67 +191,67 @@ msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1380 #: crates/pdfs-gui/src/app/main.rs:1384
msgctxt "verb" msgctxt "verb"
msgid "Stop" msgid "Stop"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1397 #: crates/pdfs-gui/src/app/main.rs:1401
msgid "Couldn't stop Proton Drive" msgid "Couldn't stop Proton Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1398 #: crates/pdfs-gui/src/app/main.rs:1402
msgid "The mount service did not stop." msgid "The mount service did not stop."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1434 #: crates/pdfs-gui/src/app/main.rs:1438
#: crates/pdfs-gui/src/app/pages/status.rs:226 #: crates/pdfs-gui/src/app/pages/status.rs:226
msgid "General" msgid "General"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1436 #: crates/pdfs-gui/src/app/main.rs:1440
#: crates/pdfs-gui/src/app/pages/browser.rs:270 #: crates/pdfs-gui/src/app/pages/browser.rs:270
msgid "Search Drive" msgid "Search Drive"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1437 #: crates/pdfs-gui/src/app/main.rs:1441
#: crates/pdfs-gui/src/app/pages/browser.rs:1363 #: crates/pdfs-gui/src/app/pages/browser.rs:1363
msgid "Refresh" msgid "Refresh"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1439 #: crates/pdfs-gui/src/app/main.rs:1443
msgid "Keyboard shortcuts" msgid "Keyboard shortcuts"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1443 #: crates/pdfs-gui/src/app/main.rs:1447
msgid "Files" msgid "Files"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1445 #: crates/pdfs-gui/src/app/main.rs:1449
#: crates/pdfs-gui/src/app/pages/browser.rs:319 #: crates/pdfs-gui/src/app/pages/browser.rs:319
#: crates/pdfs-gui/src/app/pages/browser.rs:2586 #: crates/pdfs-gui/src/app/pages/browser.rs:2586
msgid "New folder" msgid "New folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1446 #: crates/pdfs-gui/src/app/main.rs:1450
#: crates/pdfs-gui/src/app/pages/browser.rs:315 #: crates/pdfs-gui/src/app/pages/browser.rs:315
msgid "Upload files" msgid "Upload files"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1447 #: crates/pdfs-gui/src/app/main.rs:1451
msgid "Back / forward" msgid "Back / forward"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1448 #: crates/pdfs-gui/src/app/main.rs:1452
#: crates/pdfs-gui/src/app/pages/browser.rs:2320 #: crates/pdfs-gui/src/app/pages/browser.rs:2320
msgid "Parent folder" msgid "Parent folder"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1449 #: crates/pdfs-gui/src/app/main.rs:1453
msgid "Grid / list" msgid "Grid / list"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1450 #: crates/pdfs-gui/src/app/main.rs:1454
#: crates/pdfs-gui/src/app/pages/albums.rs:297 #: crates/pdfs-gui/src/app/pages/albums.rs:297
#: crates/pdfs-gui/src/app/pages/browser.rs:2252 #: crates/pdfs-gui/src/app/pages/browser.rs:2252
#: crates/pdfs-gui/src/app/pages/browser.rs:2274 #: crates/pdfs-gui/src/app/pages/browser.rs:2274
@@ -260,63 +260,63 @@ msgstr ""
msgid "Rename" msgid "Rename"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1451 crates/pdfs-gui/src/app/main.rs:1471 #: crates/pdfs-gui/src/app/main.rs:1455 crates/pdfs-gui/src/app/main.rs:1475
#: crates/pdfs-gui/src/app/pages/browser.rs:414 #: crates/pdfs-gui/src/app/pages/browser.rs:414
#: crates/pdfs-gui/src/app/pages/browser.rs:1306 #: crates/pdfs-gui/src/app/pages/browser.rs:1306
#: crates/pdfs-gui/src/app/pages/browser.rs:1338 #: crates/pdfs-gui/src/app/pages/browser.rs:1338
#: crates/pdfs-gui/src/app/pages/duplicates.rs:24 #: crates/pdfs-gui/src/app/pages/duplicates.rs:24
#: crates/pdfs-gui/src/app/pages/photos.rs:550 #: crates/pdfs-gui/src/app/pages/photos.rs:561
#: crates/pdfs-gui/src/app/pages/photos.rs:1851 #: crates/pdfs-gui/src/app/pages/photos.rs:1936
#: crates/pdfs-gui/src/app/pages/photos.rs:1855 #: crates/pdfs-gui/src/app/pages/photos.rs:1940
#: crates/pdfs-gui/src/app/widgets/details.rs:162 #: crates/pdfs-gui/src/app/widgets/details.rs:162
msgid "Move to Trash" msgid "Move to Trash"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1452 #: crates/pdfs-gui/src/app/main.rs:1456
msgid "Clear the selection" msgid "Clear the selection"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1458 #: crates/pdfs-gui/src/app/main.rs:1462
msgid "Larger thumbnails" msgid "Larger thumbnails"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1459 #: crates/pdfs-gui/src/app/main.rs:1463
msgid "Smaller thumbnails" msgid "Smaller thumbnails"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1460 #: crates/pdfs-gui/src/app/main.rs:1464
msgid "Reset thumbnail size" msgid "Reset thumbnail size"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1461 #: crates/pdfs-gui/src/app/main.rs:1465
msgid "Select all" msgid "Select all"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1465 #: crates/pdfs-gui/src/app/main.rs:1469
msgid "Photo Viewer" msgid "Photo Viewer"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1467 #: crates/pdfs-gui/src/app/main.rs:1471
msgid "Previous / next photo" msgid "Previous / next photo"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1468 #: crates/pdfs-gui/src/app/main.rs:1472
msgid "First / last photo" msgid "First / last photo"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1469 #: crates/pdfs-gui/src/app/main.rs:1473
msgid "Show details" msgid "Show details"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1470 #: crates/pdfs-gui/src/app/main.rs:1474
msgid "Fullscreen" msgid "Fullscreen"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1472 #: crates/pdfs-gui/src/app/main.rs:1476
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/main.rs:1575 #: crates/pdfs-gui/src/app/main.rs:1579
msgid "Select a single item to rename it" msgid "Select a single item to rename it"
msgstr "" msgstr ""
@@ -353,7 +353,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:306 #: crates/pdfs-gui/src/app/pages/browser.rs:306
#: crates/pdfs-gui/src/app/pages/devices.rs:84 #: crates/pdfs-gui/src/app/pages/devices.rs:84
#: crates/pdfs-gui/src/app/pages/locations.rs:134 #: crates/pdfs-gui/src/app/pages/locations.rs:134
#: crates/pdfs-gui/src/app/pages/photos.rs:418 #: crates/pdfs-gui/src/app/pages/photos.rs:429
#: crates/pdfs-gui/src/app/pages/shared.rs:83 #: crates/pdfs-gui/src/app/pages/shared.rs:83
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:38 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:38
#: crates/pdfs-gui/src/app/pages/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 #: crates/pdfs-gui/src/app/pages/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593
@@ -389,7 +389,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:2880 #: crates/pdfs-gui/src/app/pages/browser.rs:2880
#: crates/pdfs-gui/src/app/pages/browser.rs:3066 #: crates/pdfs-gui/src/app/pages/browser.rs:3066
#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:310 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:310
#: crates/pdfs-gui/src/app/pages/photos.rs:3235 #: crates/pdfs-gui/src/app/pages/photos.rs:3330
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139
#: crates/pdfs-gui/src/app/pages/trash.rs:320 #: crates/pdfs-gui/src/app/pages/trash.rs:320
msgid "Unexpected reply from the mount service." msgid "Unexpected reply from the mount service."
@@ -401,7 +401,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:2914 #: crates/pdfs-gui/src/app/pages/browser.rs:2914
#: crates/pdfs-gui/src/app/pages/devices.rs:209 #: crates/pdfs-gui/src/app/pages/devices.rs:209
#: crates/pdfs-gui/src/app/pages/locations.rs:844 #: crates/pdfs-gui/src/app/pages/locations.rs:844
#: crates/pdfs-gui/src/app/pages/photos.rs:3269 #: crates/pdfs-gui/src/app/pages/photos.rs:3364
#: crates/pdfs-gui/src/app/pages/shared.rs:523 #: crates/pdfs-gui/src/app/pages/shared.rs:523
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:156 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:156
#: crates/pdfs-gui/src/app/pages/status.rs:1301 #: crates/pdfs-gui/src/app/pages/status.rs:1301
@@ -413,7 +413,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:2915 #: crates/pdfs-gui/src/app/pages/browser.rs:2915
#: crates/pdfs-gui/src/app/pages/devices.rs:210 #: crates/pdfs-gui/src/app/pages/devices.rs:210
#: crates/pdfs-gui/src/app/pages/locations.rs:845 #: crates/pdfs-gui/src/app/pages/locations.rs:845
#: crates/pdfs-gui/src/app/pages/photos.rs:3270 #: crates/pdfs-gui/src/app/pages/photos.rs:3365
#: crates/pdfs-gui/src/app/pages/shared.rs:524 #: crates/pdfs-gui/src/app/pages/shared.rs:524
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:157 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:157
#: crates/pdfs-gui/src/app/pages/trash.rs:336 #: crates/pdfs-gui/src/app/pages/trash.rs:336
@@ -425,7 +425,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:2924 #: crates/pdfs-gui/src/app/pages/browser.rs:2924
#: crates/pdfs-gui/src/app/pages/devices.rs:218 #: crates/pdfs-gui/src/app/pages/devices.rs:218
#: crates/pdfs-gui/src/app/pages/locations.rs:853 #: crates/pdfs-gui/src/app/pages/locations.rs:853
#: crates/pdfs-gui/src/app/pages/photos.rs:3278 #: crates/pdfs-gui/src/app/pages/photos.rs:3373
#: crates/pdfs-gui/src/app/pages/shared.rs:532 #: crates/pdfs-gui/src/app/pages/shared.rs:532
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:165 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:165
#: crates/pdfs-gui/src/app/pages/status.rs:305 #: crates/pdfs-gui/src/app/pages/status.rs:305
@@ -438,7 +438,7 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:2925 #: crates/pdfs-gui/src/app/pages/browser.rs:2925
#: crates/pdfs-gui/src/app/pages/devices.rs:219 #: crates/pdfs-gui/src/app/pages/devices.rs:219
#: crates/pdfs-gui/src/app/pages/locations.rs:854 #: crates/pdfs-gui/src/app/pages/locations.rs:854
#: crates/pdfs-gui/src/app/pages/photos.rs:3279 #: crates/pdfs-gui/src/app/pages/photos.rs:3374
#: crates/pdfs-gui/src/app/pages/shared.rs:533 #: crates/pdfs-gui/src/app/pages/shared.rs:533
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:166 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:166
#: crates/pdfs-gui/src/app/pages/trash.rs:345 #: crates/pdfs-gui/src/app/pages/trash.rs:345
@@ -446,12 +446,12 @@ msgid "Waiting for the Proton Drive mount service to come up."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/activity.rs:419 #: crates/pdfs-gui/src/app/pages/activity.rs:419
#: crates/pdfs-gui/src/app/pages/photos.rs:2522 #: crates/pdfs-gui/src/app/pages/photos.rs:2607
msgid "Today" msgid "Today"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/activity.rs:422 #: crates/pdfs-gui/src/app/pages/activity.rs:422
#: crates/pdfs-gui/src/app/pages/photos.rs:2527 #: crates/pdfs-gui/src/app/pages/photos.rs:2612
msgid "Yesterday" msgid "Yesterday"
msgstr "" msgstr ""
@@ -504,7 +504,7 @@ msgstr ""
#. Translators: strftime format for the time of day in the activity feed, such as "14:05". #. Translators: strftime format for the time of day in the activity feed, such as "14:05".
#. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". #. Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05".
#: crates/pdfs-gui/src/app/pages/activity.rs:580 #: crates/pdfs-gui/src/app/pages/activity.rs:580
#: crates/pdfs-gui/src/app/pages/photos.rs:2566 #: crates/pdfs-gui/src/app/pages/photos.rs:2651
msgid "%H:%M" msgid "%H:%M"
msgstr "" msgstr ""
@@ -610,12 +610,12 @@ msgid "Reading your Proton Drive albums."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:59 #: crates/pdfs-gui/src/app/pages/albums.rs:59
#: crates/pdfs-gui/src/app/pages/photos.rs:3148 #: crates/pdfs-gui/src/app/pages/photos.rs:3243
msgid "No photo library" msgid "No photo library"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/albums.rs:60 #: crates/pdfs-gui/src/app/pages/albums.rs:60
#: crates/pdfs-gui/src/app/pages/photos.rs:3149 #: crates/pdfs-gui/src/app/pages/photos.rs:3244
msgid "This Proton account doesn't have Photos enabled." msgid "This Proton account doesn't have Photos enabled."
msgstr "" msgstr ""
@@ -648,7 +648,7 @@ msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/albums.rs:205 #: crates/pdfs-gui/src/app/pages/albums.rs:205
#: crates/pdfs-gui/src/app/pages/browser.rs:1246 #: crates/pdfs-gui/src/app/pages/browser.rs:1246
#: crates/pdfs-gui/src/app/pages/photos.rs:3002 #: crates/pdfs-gui/src/app/pages/photos.rs:3087
#: crates/pdfs-gui/src/app/pages/shared.rs:384 #: crates/pdfs-gui/src/app/pages/shared.rs:384
#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:244 #: crates/pdfs-gui/src/app/pages/shared_by_me.rs:244
#: crates/pdfs-gui/src/app/widgets/details.rs:155 #: crates/pdfs-gui/src/app/widgets/details.rs:155
@@ -715,10 +715,10 @@ msgstr ""
#: crates/pdfs-gui/src/app/pages/locations.rs:1090 #: crates/pdfs-gui/src/app/pages/locations.rs:1090
#: crates/pdfs-gui/src/app/pages/locations.rs:1109 #: crates/pdfs-gui/src/app/pages/locations.rs:1109
#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1424 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1424
#: crates/pdfs-gui/src/app/pages/photos.rs:1284 #: crates/pdfs-gui/src/app/pages/photos.rs:1369
#: crates/pdfs-gui/src/app/pages/photos.rs:1939 #: crates/pdfs-gui/src/app/pages/photos.rs:2024
#: crates/pdfs-gui/src/app/pages/photos.rs:3066 #: crates/pdfs-gui/src/app/pages/photos.rs:3151
#: crates/pdfs-gui/src/app/pages/photos.rs:3241 #: crates/pdfs-gui/src/app/pages/photos.rs:3336
#: crates/pdfs-gui/src/app/pages/shared.rs:510 #: crates/pdfs-gui/src/app/pages/shared.rs:510
#: crates/pdfs-gui/src/app/pages/shared.rs:838 #: crates/pdfs-gui/src/app/pages/shared.rs:838
#: crates/pdfs-gui/src/app/pages/status.rs:672 #: crates/pdfs-gui/src/app/pages/status.rs:672
@@ -782,7 +782,7 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/albums.rs:424 #: crates/pdfs-gui/src/app/pages/albums.rs:424
#: crates/pdfs-gui/src/app/pages/photos.rs:722 #: crates/pdfs-gui/src/app/pages/photos.rs:755
msgid "New Album…" msgid "New Album…"
msgstr "" msgstr ""
@@ -973,7 +973,7 @@ msgstr ""
#. Translators: {n} is how many items are selected: files and folders in My Files, photos here. #. Translators: {n} is how many items are selected: files and folders in My Files, photos here.
#: crates/pdfs-gui/src/app/pages/browser.rs:638 #: crates/pdfs-gui/src/app/pages/browser.rs:638
#: crates/pdfs-gui/src/app/pages/browser.rs:1331 #: crates/pdfs-gui/src/app/pages/browser.rs:1331
#: crates/pdfs-gui/src/app/pages/photos.rs:1787 #: crates/pdfs-gui/src/app/pages/photos.rs:1872
#, rust-format #, rust-format
msgid "{n} selected" msgid "{n} selected"
msgid_plural "{n} selected" msgid_plural "{n} selected"
@@ -982,8 +982,8 @@ msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/browser.rs:674 #: crates/pdfs-gui/src/app/pages/browser.rs:674
#: crates/pdfs-gui/src/app/pages/browser.rs:709 #: crates/pdfs-gui/src/app/pages/browser.rs:709
#: crates/pdfs-gui/src/app/pages/photos.rs:1932 #: crates/pdfs-gui/src/app/pages/photos.rs:2017
#: crates/pdfs-gui/src/app/pages/photos.rs:1938 #: crates/pdfs-gui/src/app/pages/photos.rs:2023
msgid "Couldn't move to Trash" msgid "Couldn't move to Trash"
msgstr "" msgstr ""
@@ -1017,7 +1017,7 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/browser.rs:727 #: crates/pdfs-gui/src/app/pages/browser.rs:727
#: crates/pdfs-gui/src/app/pages/photos.rs:1925 #: crates/pdfs-gui/src/app/pages/photos.rs:2010
msgid "Undo" msgid "Undo"
msgstr "" msgstr ""
@@ -1074,7 +1074,7 @@ msgid "Open With…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/browser.rs:1263 #: crates/pdfs-gui/src/app/pages/browser.rs:1263
#: crates/pdfs-gui/src/app/pages/photos.rs:3000 #: crates/pdfs-gui/src/app/pages/photos.rs:3085
msgctxt "verb" msgctxt "verb"
msgid "Play" msgid "Play"
msgstr "" msgstr ""
@@ -1367,7 +1367,7 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/browser.rs:2696 #: crates/pdfs-gui/src/app/pages/browser.rs:2696
#: crates/pdfs-gui/src/app/pages/photos.rs:740 #: crates/pdfs-gui/src/app/pages/photos.rs:773
msgctxt "verb" msgctxt "verb"
msgid "View" msgid "View"
msgstr "" msgstr ""
@@ -2505,177 +2505,188 @@ msgid "Hide details"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1429 #: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1429
#: crates/pdfs-gui/src/app/pages/photos.rs:3061 #: crates/pdfs-gui/src/app/pages/photos.rs:3146
#: crates/pdfs-gui/src/app/pages/photos.rs:3065 #: crates/pdfs-gui/src/app/pages/photos.rs:3150
msgid "Couldn't change the favorite" msgid "Couldn't change the favorite"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:428 #: crates/pdfs-gui/src/app/pages/photos.rs:439
#: crates/pdfs-gui/src/app/pages/photos.rs:508 #: crates/pdfs-gui/src/app/pages/photos.rs:519
msgid "Upload photos" msgid "Upload photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:433 #: crates/pdfs-gui/src/app/pages/photos.rs:444
#: crates/pdfs-gui/src/app/pages/takeout.rs:287 #: crates/pdfs-gui/src/app/pages/takeout.rs:287
msgid "Import from Google Photos" msgid "Import from Google Photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:473 #: crates/pdfs-gui/src/app/pages/photos.rs:484
#: crates/pdfs-gui/src/app/pages/photos.rs:622
msgid "Jump to a month" msgid "Jump to a month"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:492 #: crates/pdfs-gui/src/app/pages/photos.rs:503
msgid "Back to albums" msgid "Back to albums"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:504 #: crates/pdfs-gui/src/app/pages/photos.rs:515
msgctxt "verb" msgctxt "verb"
msgid "Upload" msgid "Upload"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:517 #: crates/pdfs-gui/src/app/pages/photos.rs:528
msgid "Import a Google Photos Takeout export" msgid "Import a Google Photos Takeout export"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:527 #: crates/pdfs-gui/src/app/pages/photos.rs:538
msgid "Find duplicates" msgid "Find duplicates"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:536 #: crates/pdfs-gui/src/app/pages/photos.rs:547
#: crates/pdfs-gui/src/app/pages/photos.rs:545 #: crates/pdfs-gui/src/app/pages/photos.rs:556
#: crates/pdfs-gui/src/app/pages/photos.rs:1785 #: crates/pdfs-gui/src/app/pages/photos.rs:1870
msgid "Select photos" msgid "Select photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:556 #: crates/pdfs-gui/src/app/pages/photos.rs:567
#: crates/pdfs-gui/src/app/pages/photos.rs:3018 #: crates/pdfs-gui/src/app/pages/photos.rs:3103
msgid "Add to Album…" msgid "Add to Album…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:562 #: crates/pdfs-gui/src/app/pages/photos.rs:573
msgid "Leave selection (Esc)" msgid "Leave selection (Esc)"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:606 #: crates/pdfs-gui/src/app/pages/photos.rs:616
msgid "Show only favorites" msgid "Only favorites"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:613 #: crates/pdfs-gui/src/app/pages/photos.rs:619
msgid "Show only photos not in an album" msgid "Only photos not in an album"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:620 #: crates/pdfs-gui/src/app/pages/photos.rs:624
#: crates/pdfs-gui/src/app/pages/photos.rs:857 msgid "Month"
msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:625
#: crates/pdfs-gui/src/app/pages/photos.rs:921
msgid "All dates" msgid "All dates"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:641 #: crates/pdfs-gui/src/app/pages/photos.rs:634
msgid "Clear filters"
msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:651
msgid "Filters"
msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:674
msgid "Timeline" msgid "Timeline"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:645 #: crates/pdfs-gui/src/app/pages/photos.rs:678
msgid "Albums" msgid "Albums"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:664 #: crates/pdfs-gui/src/app/pages/photos.rs:697
msgid "On this day" msgid "On this day"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:739 #: crates/pdfs-gui/src/app/pages/photos.rs:772
msgid "Importing from Google Photos…" msgid "Importing from Google Photos…"
msgstr "" 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. #. 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:833 #: crates/pdfs-gui/src/app/pages/photos.rs:869
msgid "%OB %Y" msgid "%OB %Y"
msgstr "" msgstr ""
#. Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. #. 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:864 #: crates/pdfs-gui/src/app/pages/photos.rs:928
#, rust-format #, rust-format
msgid "{month} ({count})" msgid "{month} ({count})"
msgstr "" msgstr ""
#. Translators: a Photos filter tab that shows photos, videos and raw files together. #. Translators: a Photos filter tab that shows photos, videos and raw files together.
#: crates/pdfs-gui/src/app/pages/photos.rs:901 #: crates/pdfs-gui/src/app/pages/photos.rs:965
msgctxt "photo filter" msgctxt "photo filter"
msgid "All" msgid "All"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:902 #: crates/pdfs-gui/src/app/pages/photos.rs:966
msgctxt "photo filter" msgctxt "photo filter"
msgid "Photos" msgid "Photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:903 #: crates/pdfs-gui/src/app/pages/photos.rs:967
msgctxt "photo filter" msgctxt "photo filter"
msgid "Videos" msgid "Videos"
msgstr "" msgstr ""
#. Translators: a Photos filter tab for raw camera files. #. Translators: a Photos filter tab for raw camera files.
#: crates/pdfs-gui/src/app/pages/photos.rs:905 #: crates/pdfs-gui/src/app/pages/photos.rs:969
msgctxt "photo filter" msgctxt "photo filter"
msgid "Raw" msgid "Raw"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1210 #: crates/pdfs-gui/src/app/pages/photos.rs:1295
msgid "Select Photo to Upload" msgid "Select Photo to Upload"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1214 #: crates/pdfs-gui/src/app/pages/photos.rs:1299
#: crates/pdfs-gui/src/prompt.rs:60 #: crates/pdfs-gui/src/prompt.rs:60
msgid "Images" msgid "Images"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1270 #: crates/pdfs-gui/src/app/pages/photos.rs:1355
msgid "Photo uploaded" msgid "Photo uploaded"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1275 #: crates/pdfs-gui/src/app/pages/photos.rs:1360
#: crates/pdfs-gui/src/app/pages/photos.rs:1283 #: crates/pdfs-gui/src/app/pages/photos.rs:1368
msgid "Couldn't upload photo" msgid "Couldn't upload photo"
msgstr "" msgstr ""
#. Translators: badge on a photo tile whose shot includes a raw camera file. #. Translators: badge on a photo tile whose shot includes a raw camera file.
#: crates/pdfs-gui/src/app/pages/photos.rs:1444 #: crates/pdfs-gui/src/app/pages/photos.rs:1529
msgid "RAW" msgid "RAW"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1829 #: crates/pdfs-gui/src/app/pages/photos.rs:1914
msgid "Move this photo to Trash?" msgid "Move this photo to Trash?"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1831 #: crates/pdfs-gui/src/app/pages/photos.rs:1916
#, rust-format #, rust-format
msgid "Move this photo to Trash? It is stored as {n} file." 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." msgid_plural "Move this photo to Trash? It is stored as {n} files."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1837 #: crates/pdfs-gui/src/app/pages/photos.rs:1922
#, rust-format #, rust-format
msgid "Move {n} photo to Trash?" msgid "Move {n} photo to Trash?"
msgid_plural "Move {n} photos to Trash?" msgid_plural "Move {n} photos to Trash?"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1844 #: crates/pdfs-gui/src/app/pages/photos.rs:1929
#, rust-format #, rust-format
msgid "Move {n} photo to Trash? They are stored as {files} files." 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." msgid_plural "Move {n} photos to Trash? They are stored as {files} files."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1908 #: crates/pdfs-gui/src/app/pages/photos.rs:1993
msgid "The server refused." msgid "The server refused."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1911 #: crates/pdfs-gui/src/app/pages/photos.rs:1996
msgid "Some photos couldn't be moved to Trash" msgid "Some photos couldn't be moved to Trash"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:1920 #: crates/pdfs-gui/src/app/pages/photos.rs:2005
#, rust-format #, rust-format
msgid "Moved {n} photo to Trash" msgid "Moved {n} photo to Trash"
msgid_plural "Moved {n} photos to Trash" msgid_plural "Moved {n} photos to Trash"
@@ -2683,7 +2694,7 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. Translators: the Photos page subtitle, such as "12 videos". #. Translators: the Photos page subtitle, such as "12 videos".
#: crates/pdfs-gui/src/app/pages/photos.rs:2476 #: crates/pdfs-gui/src/app/pages/photos.rs:2561
#, rust-format #, rust-format
msgid "{count} video" msgid "{count} video"
msgid_plural "{count} videos" msgid_plural "{count} videos"
@@ -2691,7 +2702,7 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. Translators: the Photos page subtitle, such as "12 raw photos". #. Translators: the Photos page subtitle, such as "12 raw photos".
#: crates/pdfs-gui/src/app/pages/photos.rs:2478 #: crates/pdfs-gui/src/app/pages/photos.rs:2563
#, rust-format #, rust-format
msgid "{count} raw photo" msgid "{count} raw photo"
msgid_plural "{count} raw photos" msgid_plural "{count} raw photos"
@@ -2699,138 +2710,138 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. Translators: the Photos page subtitle, such as "1,204 photos". #. Translators: the Photos page subtitle, such as "1,204 photos".
#: crates/pdfs-gui/src/app/pages/photos.rs:2480 #: crates/pdfs-gui/src/app/pages/photos.rs:2565
#, rust-format #, rust-format
msgid "{count} photo" msgid "{count} photo"
msgid_plural "{count} photos" msgid_plural "{count} photos"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2508 #: crates/pdfs-gui/src/app/pages/photos.rs:2593
#: crates/pdfs-gui/src/app/pages/photos.rs:2534 #: crates/pdfs-gui/src/app/pages/photos.rs:2619
msgid "Unknown date" msgid "Unknown date"
msgstr "" msgstr ""
#. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". #. Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026".
#: crates/pdfs-gui/src/app/pages/photos.rs:2531 #: crates/pdfs-gui/src/app/pages/photos.rs:2616
msgid "%-d %B %Y" msgid "%-d %B %Y"
msgstr "" msgstr ""
#. Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". #. 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:2552 #: crates/pdfs-gui/src/app/pages/photos.rs:2637
msgid "%Y-%m-%d %H:%M:%S" msgid "%Y-%m-%d %H:%M:%S"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2556 #: crates/pdfs-gui/src/app/pages/photos.rs:2641
#: crates/pdfs-gui/src/app/pages/photos.rs:2558 #: crates/pdfs-gui/src/app/pages/photos.rs:2643
msgid "Unknown Date" msgid "Unknown Date"
msgstr "" 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". #. 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:2576 #: crates/pdfs-gui/src/app/pages/photos.rs:2661
msgid "%-d %b" msgid "%-d %b"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2598 #: crates/pdfs-gui/src/app/pages/photos.rs:2683
msgid "Every photo is in an album" msgid "Every photo is in an album"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2599 #: crates/pdfs-gui/src/app/pages/photos.rs:2684
msgid "Turn off the album filter to see everything." msgid "Turn off the album filter to see everything."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2604 #: crates/pdfs-gui/src/app/pages/photos.rs:2689
msgid "No photos yet" msgid "No photos yet"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2605 #: crates/pdfs-gui/src/app/pages/photos.rs:2690
msgid "Photos you upload to Proton Drive appear here." msgid "Photos you upload to Proton Drive appear here."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2608 #: crates/pdfs-gui/src/app/pages/photos.rs:2693
msgid "No favorites yet" msgid "No favorites yet"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2609 #: crates/pdfs-gui/src/app/pages/photos.rs:2694
msgid "Star a photo in the viewer or from its menu to find it here." msgid "Star a photo in the viewer or from its menu to find it here."
msgstr "" msgstr ""
#. Translators: {month} is a month and year, such as "June 2024". #. Translators: {month} is a month and year, such as "June 2024".
#: crates/pdfs-gui/src/app/pages/photos.rs:2614 #: crates/pdfs-gui/src/app/pages/photos.rs:2699
#, rust-format #, rust-format
msgid "No favorite videos in {month}" msgid "No favorite videos in {month}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2615 #: crates/pdfs-gui/src/app/pages/photos.rs:2700
msgid "No favorite videos" msgid "No favorite videos"
msgstr "" msgstr ""
#. Translators: {month} is a month and year, such as "June 2024". #. Translators: {month} is a month and year, such as "June 2024".
#: crates/pdfs-gui/src/app/pages/photos.rs:2617 #: crates/pdfs-gui/src/app/pages/photos.rs:2702
#, rust-format #, rust-format
msgid "No favorite raw files in {month}" msgid "No favorite raw files in {month}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2618 #: crates/pdfs-gui/src/app/pages/photos.rs:2703
msgid "No favorite raw files" msgid "No favorite raw files"
msgstr "" msgstr ""
#. Translators: {month} is a month and year, such as "June 2024". #. Translators: {month} is a month and year, such as "June 2024".
#: crates/pdfs-gui/src/app/pages/photos.rs:2620 #: crates/pdfs-gui/src/app/pages/photos.rs:2705
#, rust-format #, rust-format
msgid "No favorite photos in {month}" msgid "No favorite photos in {month}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2621 #: crates/pdfs-gui/src/app/pages/photos.rs:2706
msgid "No favorite photos" msgid "No favorite photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2623 #: crates/pdfs-gui/src/app/pages/photos.rs:2708
msgid "Turn off the favorites filter to see everything." msgid "Turn off the favorites filter to see everything."
msgstr "" msgstr ""
#. Translators: {month} is a month and year, such as "June 2024". #. Translators: {month} is a month and year, such as "June 2024".
#: crates/pdfs-gui/src/app/pages/photos.rs:2628 #: crates/pdfs-gui/src/app/pages/photos.rs:2713
#, rust-format #, rust-format
msgid "No videos in {month}" msgid "No videos in {month}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2629 #: crates/pdfs-gui/src/app/pages/photos.rs:2714
msgid "No videos" msgid "No videos"
msgstr "" msgstr ""
#. Translators: {month} is a month and year, such as "June 2024". #. Translators: {month} is a month and year, such as "June 2024".
#: crates/pdfs-gui/src/app/pages/photos.rs:2631 #: crates/pdfs-gui/src/app/pages/photos.rs:2716
#, rust-format #, rust-format
msgid "No raw files in {month}" msgid "No raw files in {month}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2632 #: crates/pdfs-gui/src/app/pages/photos.rs:2717
msgid "No raw files" msgid "No raw files"
msgstr "" msgstr ""
#. Translators: {month} is a month and year, such as "June 2024". #. Translators: {month} is a month and year, such as "June 2024".
#: crates/pdfs-gui/src/app/pages/photos.rs:2634 #: crates/pdfs-gui/src/app/pages/photos.rs:2719
#, rust-format #, rust-format
msgid "No photos in {month}" msgid "No photos in {month}"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2635 #: crates/pdfs-gui/src/app/pages/photos.rs:2720
msgid "No photos" msgid "No photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2637 #: crates/pdfs-gui/src/app/pages/photos.rs:2722
msgid "Try another filter or month." msgid "Try another filter or month."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2753 #: crates/pdfs-gui/src/app/pages/photos.rs:2838
#, rust-format #, rust-format
msgid "{n} year ago" msgid "{n} year ago"
msgid_plural "{n} years ago" msgid_plural "{n} years ago"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: crates/pdfs-gui/src/app/pages/photos.rs:2778 #: crates/pdfs-gui/src/app/pages/photos.rs:2863
#, rust-format #, rust-format
msgid "{date}, {n} photo" msgid "{date}, {n} photo"
msgid_plural "{date}, {n} photos" msgid_plural "{date}, {n} photos"
@@ -2838,55 +2849,55 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. Translators: a check item in a photo's menu, on while the photo is a favorite. #. Translators: a check item in a photo's menu, on while the photo is a favorite.
#: crates/pdfs-gui/src/app/pages/photos.rs:3007 #: crates/pdfs-gui/src/app/pages/photos.rs:3092
msgctxt "state" msgctxt "state"
msgid "Favorite" msgid "Favorite"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3012 #: crates/pdfs-gui/src/app/pages/photos.rs:3097
msgctxt "verb" msgctxt "verb"
msgid "Select" msgid "Select"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3024 #: crates/pdfs-gui/src/app/pages/photos.rs:3109
msgid "Remove from Album" msgid "Remove from Album"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3030 #: crates/pdfs-gui/src/app/pages/photos.rs:3115
msgid "Move to Trash…" msgid "Move to Trash…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3054 #: crates/pdfs-gui/src/app/pages/photos.rs:3139
msgid "Added to Favorites" msgid "Added to Favorites"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3056 #: crates/pdfs-gui/src/app/pages/photos.rs:3141
msgid "Removed from Favorites" msgid "Removed from Favorites"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3085 #: crates/pdfs-gui/src/app/pages/photos.rs:3176
msgid "Loading photos…" msgid "Loading photos…"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3086 #: crates/pdfs-gui/src/app/pages/photos.rs:3177
msgid "Reading your Proton Drive timeline." msgid "Reading your Proton Drive timeline."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3179 #: crates/pdfs-gui/src/app/pages/photos.rs:3274
msgid "Empty album" msgid "Empty album"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3180 #: crates/pdfs-gui/src/app/pages/photos.rs:3275
msgid "This album has no photos in it." msgid "This album has no photos in it."
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3222 #: crates/pdfs-gui/src/app/pages/photos.rs:3317
#: crates/pdfs-gui/src/app/pages/photos.rs:3240 #: crates/pdfs-gui/src/app/pages/photos.rs:3335
msgid "Couldn't load more photos" msgid "Couldn't load more photos"
msgstr "" msgstr ""
#: crates/pdfs-gui/src/app/pages/photos.rs:3227 #: crates/pdfs-gui/src/app/pages/photos.rs:3322
#: crates/pdfs-gui/src/app/pages/photos.rs:3234 #: crates/pdfs-gui/src/app/pages/photos.rs:3329
msgid "Couldn't load photos" msgid "Couldn't load photos"
msgstr "" msgstr ""
+194 -181
View File
File diff suppressed because it is too large. Load diff
+194 -181
View File
File diff suppressed because it is too large. Load diff