diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1e157ff..5352a79 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,6 +31,7 @@ jobs: libsecret-1-dev \ libdbus-1-dev \ desktop-file-utils \ + gettext \ rpm - name: Set up Rust @@ -84,6 +85,7 @@ jobs: cp target/release/pdfs-tray dist/binaries/ cp target/release/pdfs-app dist/binaries/ cp target/release/pdfs-prompt dist/binaries/ + po/build.sh dist/binaries/locale # Create tarball tar -czf proton-drive-linux-${{ env.VERSION }}-x86_64.tar.gz -C dist/binaries . @@ -110,6 +112,7 @@ jobs: cp packaging/io.narl.proton-drive-linux.svg deb/usr/share/icons/hicolor/scalable/apps/ cp packaging/proton-drive.service deb/usr/lib/systemd/user/ cp LICENSE deb/usr/share/licenses/proton-drive-linux/ + po/build.sh deb/usr/share/locale # Calculate Installed-Size in KB for the control file INSTALLED_SIZE=$(du -sk deb | cut -f1) diff --git a/Cargo.lock b/Cargo.lock index edf76a3..1d16262 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -467,6 +467,12 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -1814,6 +1820,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gettext-rs" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5857dc1b7f0fee86961de833f434e29494d72af102ce5355738c0664222bdf" +dependencies = [ + "gettext-sys", + "locale_config", +] + +[[package]] +name = "gettext-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9" +dependencies = [ + "cc", + "temp-dir", +] + [[package]] name = "ghash" version = "0.5.1" @@ -2829,6 +2855,19 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" +[[package]] +name = "locale_config" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" +dependencies = [ + "lazy_static", + "objc", + "objc-foundation", + "regex", + "winapi", +] + [[package]] name = "lock_api" version = "0.4.14" @@ -2868,6 +2907,15 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "matchers" version = "0.2.0" @@ -3189,6 +3237,35 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "ocb3" version = "0.1.0" @@ -3435,6 +3512,7 @@ version = "2.0.0" dependencies = [ "anyhow", "async-channel", + "gettext-rs", "gtk4", "kamadak-exif", "ksni", @@ -4055,6 +4133,18 @@ dependencies = [ "syn 3.0.5", ] +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + [[package]] name = "regex-automata" version = "0.4.18" @@ -4796,6 +4886,12 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" +[[package]] +name = "temp-dir" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" + [[package]] name = "tempfile" version = "3.27.0" diff --git a/README.md b/README.md index 13a0c98..c304494 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ pdfs-app # the desktop app - [Prerequisites](#prerequisites) · [Building](#building-from-source) · [Packages](#installation--packages) · [Releases](#automated-releases-cicd) **Documentation:** [Architecture](docs/ARCHITECTURE.md) · [Testing](docs/TESTING.md) · -[Recovery](docs/RECOVERY.md) · [Development](docs/DEVELOPMENT.md) · +[Recovery](docs/RECOVERY.md) · [Development](docs/DEVELOPMENT.md) · [Translating](docs/TRANSLATING.md) · [Known issues](docs/BUGS.md) · [Changelog](docs/CHANGELOG.md) · [Contributing](CONTRIBUTING.md) · [Security policy](SECURITY.md) @@ -499,6 +499,10 @@ Bug reports, packaging fixes, and patches are welcome — see [CONTRIBUTING.md]( the workflow and the quality gates CI enforces, and [SECURITY.md](SECURITY.md) for reporting a vulnerability privately. +The app, tray and search prompt are available in English, German, Spanish, French, Italian, Dutch, +Polish and Brazilian Portuguese. [docs/TRANSLATING.md](docs/TRANSLATING.md) explains how to improve +a translation or add a language. + ## License Released under the [MIT License](LICENSE). diff --git a/crates/pdfs-core/src/config.rs b/crates/pdfs-core/src/config.rs index 26a582f..39c4c37 100644 --- a/crates/pdfs-core/src/config.rs +++ b/crates/pdfs-core/src/config.rs @@ -142,6 +142,11 @@ pub struct AppConfig { /// back on. Defaulted for configs predating the field. #[serde(default)] pub tray_hidden: bool, + /// Language for the desktop app, tray and search prompt, as a gettext code + /// such as `de` or `pt_BR`. `None` means "follow the system locale". + /// Defaulted for configs predating the field. + #[serde(default)] + pub language: Option, } /// The My Files page's view choices, remembered between runs. @@ -214,6 +219,7 @@ impl Default for AppConfig { proton_accent: None, files_view: FilesView::default(), tray_hidden: false, + language: None, } } } @@ -568,6 +574,7 @@ mod tests { folders_first: false, }, tray_hidden: true, + language: Some("de".to_string()), }; let json = serde_json::to_string(&config).unwrap(); let decoded: AppConfig = serde_json::from_str(&json).unwrap(); @@ -575,6 +582,7 @@ mod tests { assert_eq!(decoded.user_agent, "test-agent/1.0"); assert_eq!(decoded.proton_accent, Some(true)); assert!(decoded.tray_hidden); + assert_eq!(decoded.language.as_deref(), Some("de")); assert_eq!(decoded.upload_limit, Some(500_000)); assert_eq!(decoded.download_limit, None); assert_eq!(decoded.files_view, config.files_view); @@ -661,6 +669,10 @@ mod tests { let decoded: AppConfig = serde_json::from_str(json).unwrap(); assert!(decoded.ignore_patterns.is_none()); assert!(!decoded.tray_hidden, "an old config keeps the tray icon"); + assert!( + decoded.language.is_none(), + "an old config follows the system" + ); assert_eq!( decoded.resolved_ignore_patterns().len(), DEFAULT_IGNORE_PATTERNS.len(), diff --git a/crates/pdfs-gui/Cargo.toml b/crates/pdfs-gui/Cargo.toml index 656f917..b53dedd 100644 --- a/crates/pdfs-gui/Cargo.toml +++ b/crates/pdfs-gui/Cargo.toml @@ -35,3 +35,5 @@ adw = { package = "libadwaita", version = "0.9", features = ["v1_5"] } async-channel = "2" exif = { version = "0.6", package = "kamadak-exif" } webkit6 = "0.6" +# The system libintl (glibc) rather than a bundled gettext build. +gettext-rs = { version = "0.7", features = ["gettext-system"] } diff --git a/crates/pdfs-gui/src/app/main.rs b/crates/pdfs-gui/src/app/main.rs index b08e062..558198f 100644 --- a/crates/pdfs-gui/src/app/main.rs +++ b/crates/pdfs-gui/src/app/main.rs @@ -1,5 +1,7 @@ #[path = "../activation.rs"] pub(crate) mod activation; +#[path = "../i18n.rs"] +pub(crate) mod i18n; pub(crate) mod pages; pub(crate) mod widgets; @@ -23,6 +25,8 @@ use widgets::share_dialog::*; use widgets::thumbnails::*; use widgets::versions_dialog::*; +pub(crate) use i18n::{gettext, gettext_f, gettext_noop, ngettext_f, pgettext}; + use std::cell::{Cell, RefCell}; use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; @@ -52,8 +56,7 @@ use pdfs_core::control::{ DirEntry, ErrorKind, ImportSummary, InvitationInfo, JobItem, PendingOpInfo, PhotoItem, PhotoKind, PhotoMonth, PublicLinkInfo, RefreshScope, Request, Response, RestorableFolder, RestoreItem, RevisionInfo, SearchHit, ShareEntry, ShareEntryKind, SharedItem, SyncFolderInfo, - SyncPhase, SyncProgress, ThumbnailBuildStatus, TransferDirection, TransferItem, - pending_summary, send, + SyncPhase, SyncProgress, ThumbnailBuildStatus, TransferDirection, TransferItem, send, }; use pdfs_core::mounts::{MountAccess, MountKind, MountMode, MountSpec}; @@ -195,6 +198,7 @@ fn main() -> glib::ExitCode { tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()), ) .init(); + i18n::init(); // The tray launches the app with arguments ("--page locations", // "--confirm-stop"), which a running instance must receive too. @@ -444,6 +448,7 @@ fn build_window(app: &adw::Application) { mountpoint_row: main_widgets.mountpoint_row.clone(), accent_row: main_widgets.accent_row.clone(), tray_row: main_widgets.tray_row.clone(), + language_row: main_widgets.language_row.clone(), settings_suppress: Cell::new(false), budget_source: RefCell::new(None), limit_source: RefCell::new(None), @@ -819,14 +824,35 @@ fn build_window(app: &adw::Application) { /// come first; the rows from [`SIDEBAR_SYNC_SECTION`] on are about this computer's /// sync, set off by a separator. const DESTINATIONS: [(&str, &str, &str); 8] = [ - ("browser", "My files", "folder-symbolic"), - ("gallery", "Photos", "image-x-generic-symbolic"), - ("shared", "Shared with me", "system-users-symbolic"), - ("sharedbyme", "Shared by me", "emblem-shared-symbolic"), - ("devices", "Computers", "computer-symbolic"), - ("trash", "Trash", "user-trash-symbolic"), - ("locations", "Sync", "emblem-synchronizing-symbolic"), - ("activity", "Activity", "document-open-recent-symbolic"), + ("browser", gettext_noop("My files"), "folder-symbolic"), + ( + "gallery", + gettext_noop("Photos"), + "image-x-generic-symbolic", + ), + ( + "shared", + gettext_noop("Shared with me"), + "system-users-symbolic", + ), + ( + "sharedbyme", + gettext_noop("Shared by me"), + "emblem-shared-symbolic", + ), + ("devices", gettext_noop("Computers"), "computer-symbolic"), + ("trash", gettext_noop("Trash"), "user-trash-symbolic"), + // Translators: sidebar entry for the page listing this computer's synced folders. + ( + "locations", + gettext_noop("Sync"), + "emblem-synchronizing-symbolic", + ), + ( + "activity", + gettext_noop("Activity"), + "document-open-recent-symbolic", + ), ]; /// Index of the first row in the sidebar's sync section. @@ -842,7 +868,7 @@ fn build_sidebar(footer: >k4::Box) -> (adw::NavigationPage, gtk4::ListBox) { for (_, label, icon) in DESTINATIONS { let row_box = gtk4::Box::new(gtk4::Orientation::Horizontal, 12); row_box.append(>k4::Image::from_icon_name(icon)); - row_box.append(>k4::Label::new(Some(label))); + row_box.append(>k4::Label::new(Some(&gettext(label)))); let row = gtk4::ListBoxRow::builder().child(&row_box).build(); list.append(&row); } @@ -970,7 +996,7 @@ fn page_fresh(loaded_at: &Cell>) -> bool { fn refresh_button() -> gtk4::Button { let button = gtk4::Button::builder() .icon_name("view-refresh-symbolic") - .tooltip_text("Refresh (F5)") + .tooltip_text(gettext("Refresh (F5)")) .valign(gtk4::Align::Center) .build(); button.add_css_class("flat"); @@ -1110,12 +1136,6 @@ fn sync_sidebar(ui: &Rc) { } } -/// "1 item" / "5 items": a count with the noun form that agrees with it, so -/// no user-facing string has to fall back to "item(s)". -fn count_noun(n: usize, one: &str, many: &str) -> String { - format!("{n} {}", if n == 1 { one } else { many }) -} - /// Show a transient toast. Non-blocking by design: an action's outcome is /// reported without stealing focus or forcing a click, so the user can keep /// working while a slow upload lands. @@ -1147,7 +1167,10 @@ fn toast_error(ui: &Rc, what: &str, detail: &str) { let message = if detail.is_empty() { what.to_string() } else { - format!("{what}: {detail}") + // Translators: a failed action's toast. {what} says what failed, such as + // "Couldn't rename"; {detail} is the reason, usually untranslated text + // from the mount service. + gettext_f("{what}: {detail}", &[("what", what), ("detail", detail)]) }; tracing::warn!("{message}"); let toast = adw::Toast::builder().title(&message).timeout(6).build(); @@ -1166,15 +1189,34 @@ fn toast_error(ui: &Rc, what: &str, detail: &str) { /// used where the class carries no better wording than the caller already has. fn error_headline(kind: ErrorKind, fallback: &str) -> &str { match kind { - ErrorKind::Offline => "You're offline", - ErrorKind::NotFound => "That's not there any more", - ErrorKind::Denied => "You don't have access to that", - ErrorKind::Conflict => "Something changed this first", - ErrorKind::Quota => "Your Proton Drive is full", + ErrorKind::Offline => static_gettext(gettext_noop("You're offline")), + ErrorKind::NotFound => static_gettext(gettext_noop("That's not there any more")), + ErrorKind::Denied => static_gettext(gettext_noop("You don't have access to that")), + ErrorKind::Conflict => static_gettext(gettext_noop("Something changed this first")), + ErrorKind::Quota => static_gettext(gettext_noop("Your Proton Drive is full")), ErrorKind::Invalid | ErrorKind::Remote | ErrorKind::Internal => fallback, } } +thread_local! { + /// Translations handed out by [`static_gettext`], one per msgid. + static STATIC_TRANSLATIONS: RefCell> = + RefCell::new(HashMap::new()); +} + +/// [`gettext`] for a helper that has to return `&'static str`. The language is +/// fixed for the life of the process, so each msgid is translated once and the +/// result kept; the set of msgids is a handful of literals, so the kept strings +/// are bounded. +fn static_gettext(msgid: &'static str) -> &'static str { + STATIC_TRANSLATIONS.with(|cache| { + *cache + .borrow_mut() + .entry(msgid) + .or_insert_with(|| Box::leak(gettext(msgid).into_boxed_str())) + }) +} + /// Report a failed request, letting its class pick the wording. /// /// Prefer this to [`toast_error`] anywhere a [`Response::Error`] is being shown: @@ -1192,12 +1234,15 @@ fn toast_failure(ui: &Rc, what: &str, message: &str, kind: ErrorKind) { /// belong on any one page. fn build_primary_menu() -> gtk4::MenuButton { let menu = gio::Menu::new(); - menu.append(Some("Preferences"), Some("win.preferences")); - menu.append(Some("Keyboard Shortcuts"), Some("win.shortcuts")); - menu.append(Some("About Proton Drive for Linux"), Some("win.about")); + menu.append(Some(&gettext("Preferences")), Some("win.preferences")); + menu.append(Some(&gettext("Keyboard Shortcuts")), Some("win.shortcuts")); + menu.append( + Some(&gettext("About Proton Drive for Linux")), + Some("win.about"), + ); gtk4::MenuButton::builder() .icon_name("open-menu-symbolic") - .tooltip_text("Main menu") + .tooltip_text(gettext("Main menu")) .primary(true) .menu_model(&menu) .build() @@ -1243,20 +1288,23 @@ fn install_window_actions(ui: &Rc, window: &adw::ApplicationWindow) { let ui_about = ui.clone(); about.connect_activate(move |_, _| { let dialog = adw::AboutDialog::builder() - .application_name("Proton Drive for Linux") + .application_name(gettext("Proton Drive for Linux")) .application_icon("io.narl.proton-drive-linux") .version(pdfs_core::config::APP_VERSION) .developer_name("Nils Pukropp") .website("https://github.com/narrrl/proton-drive-linux") .issue_url("https://github.com/narrrl/proton-drive-linux/issues") .license_type(gtk4::License::MitX11) - .comments( - "Files-on-demand Proton Drive for the Linux desktop.\n\n\ - Unofficial client — not affiliated with, endorsed by, or supported by Proton AG.", - ) + .comments(gettext("Files-on-demand Proton Drive for the Linux desktop.\n\nUnofficial client — not affiliated with, endorsed by, or supported by Proton AG.")) .debug_info(debug_info(&ui_about)) .debug_info_filename("proton-drive-linux-debug.txt") .build(); + // Translators: replace with your name(s) and email address(es), one + // per line, to be credited in the About dialog. + let credits = gettext("translator-credits"); + if credits != "translator-credits" { + dialog.set_translator_credits(&credits); + } dialog.present(Some(&win)); }); window.add_action(&about); @@ -1284,14 +1332,11 @@ fn install_launch_actions(ui: &Rc, app: &adw::Application, window: &adw::App let ui_stop = ui.clone(); confirm_stop.connect_activate(move |_, _| { let dialog = adw::AlertDialog::builder() - .heading("Stop Proton Drive?") - .body( - "The drive unmounts and nothing syncs until you connect again. \ - Proton Drive starts again at your next login.", - ) + .heading(gettext("Stop Proton Drive?")) + .body(gettext("The drive unmounts and nothing syncs until you connect again. Proton Drive starts again at your next login.")) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("stop", "Stop"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("stop", &pgettext("verb", "Stop")); dialog.set_response_appearance("stop", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -1308,8 +1353,8 @@ fn install_launch_actions(ui: &Rc, app: &adw::Application, window: &adw::App } else { toast_error( &ui, - "Couldn't stop Proton Drive", - "The mount service did not stop.", + &gettext("Couldn't stop Proton Drive"), + &gettext("The mount service did not stop."), ); } }); @@ -1345,53 +1390,55 @@ fn debug_info(ui: &Rc) -> String { fn show_shortcuts(window: &adw::ApplicationWindow) { const GROUPS: [(&str, &[(&str, &str)]); 4] = [ ( - "General", + gettext_noop("General"), &[ - ("f", "Search Drive"), - ("F5", "Refresh"), - ("comma", "Preferences"), - ("question", "Keyboard shortcuts"), + ("f", gettext_noop("Search Drive")), + ("F5", gettext_noop("Refresh")), + ("comma", gettext_noop("Preferences")), + ("question", gettext_noop("Keyboard shortcuts")), ], ), ( - "Files", + gettext_noop("Files"), &[ - ("n", "New folder"), - ("u", "Upload files"), - ("Left Right", "Back / forward"), - ("Up", "Parent folder"), - ("1 2", "Grid / list"), - ("F2", "Rename"), - ("Delete", "Move to Trash"), - ("Escape", "Clear the selection"), + ("n", gettext_noop("New folder")), + ("u", gettext_noop("Upload files")), + ("Left Right", gettext_noop("Back / forward")), + ("Up", gettext_noop("Parent folder")), + ("1 2", gettext_noop("Grid / list")), + ("F2", gettext_noop("Rename")), + ("Delete", gettext_noop("Move to Trash")), + ("Escape", gettext_noop("Clear the selection")), ], ), ( - "Photos", + gettext_noop("Photos"), &[ - ("plus", "Larger thumbnails"), - ("minus", "Smaller thumbnails"), - ("0", "Reset thumbnail size"), - ("a", "Select all"), + ("plus", gettext_noop("Larger thumbnails")), + ("minus", gettext_noop("Smaller thumbnails")), + ("0", gettext_noop("Reset thumbnail size")), + ("a", gettext_noop("Select all")), ], ), ( - "Photo Viewer", + gettext_noop("Photo Viewer"), &[ - ("Left Right", "Previous / next photo"), - ("Home End", "First / last photo"), - ("i", "Show details"), - ("f", "Fullscreen"), - ("Delete", "Move to Trash"), - ("Escape", "Close"), + ("Left Right", gettext_noop("Previous / next photo")), + ("Home End", gettext_noop("First / last photo")), + ("i", gettext_noop("Show details")), + ("f", gettext_noop("Fullscreen")), + ("Delete", gettext_noop("Move to Trash")), + ("Escape", gettext_noop("Close")), ], ), ]; let page = adw::PreferencesPage::new(); for (title, keys) in GROUPS { - let group = adw::PreferencesGroup::builder().title(title).build(); + let group = adw::PreferencesGroup::builder() + .title(gettext(title)) + .build(); for (accel, action) in keys { - let row = adw::ActionRow::builder().title(*action).build(); + let row = adw::ActionRow::builder().title(gettext(action)).build(); row.add_suffix( >k4::ShortcutLabel::builder() .accelerator(*accel) @@ -1404,7 +1451,7 @@ fn show_shortcuts(window: &adw::ApplicationWindow) { } let dialog = adw::Dialog::builder() - .title("Keyboard Shortcuts") + .title(gettext("Keyboard Shortcuts")) .content_width(460) .content_height(620) .child(&{ @@ -1484,7 +1531,7 @@ fn install_shortcuts(ui: &Rc, window: &adw::ApplicationWindow) { // Renaming is one name at a time; saying so beats a key that // silently does nothing with several items highlighted. if selected_entries(&ui).len() > 1 { - toast(&ui, "Select a single item to rename it"); + toast(&ui, &gettext("Select a single item to rename it")); } else if let Some(entry) = selected_entry(&ui) { prompt_rename(&ui, &entry); } @@ -1561,7 +1608,7 @@ fn confirm_destructive( .heading(heading) .body(body) .build(); - dialog.add_response("cancel", "Cancel"); + dialog.add_response("cancel", &gettext("Cancel")); dialog.add_response("confirm", action); dialog.set_response_appearance("confirm", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); @@ -1608,23 +1655,15 @@ pub(crate) fn open_named_path(path: &str, name: &str) { pdfs_core::opener::open_default_named(Path::new(path), name, false); } -/// Format a byte count as a short binary-unit string (e.g. `1.2 GiB`). +/// Format a byte count as a short binary-unit string (e.g. `1.2 GiB`, or +/// `512 bytes` below one KiB). +/// +/// GLib does the formatting, so the units, the plural of "bytes" and the +/// decimal separator follow the user's language from GLib's own catalog. GLib +/// separates number and unit with a no-break space; it is turned back into a +/// plain space so the text matches what the rest of the UI builds around it. fn human_bytes(bytes: u64) -> String { - const UNITS: [&str; 5] = ["B", "KiB", "MiB", "GiB", "TiB"]; - if bytes == 0 { - return "0 B".into(); - } - let mut value = bytes as f64; - let mut unit = 0; - while value >= 1024.0 && unit < UNITS.len() - 1 { - value /= 1024.0; - unit += 1; - } - if unit == 0 { - format!("{bytes} B") - } else { - format!("{value:.1} {}", UNITS[unit]) - } + glib::format_size_full(bytes, glib::FormatSizeFlags::IEC_UNITS).replace('\u{a0}', " ") } #[cfg(test)] diff --git a/crates/pdfs-gui/src/app/pages/activity.rs b/crates/pdfs-gui/src/app/pages/activity.rs index 7391eaa..809d82b 100644 --- a/crates/pdfs-gui/src/app/pages/activity.rs +++ b/crates/pdfs-gui/src/app/pages/activity.rs @@ -56,13 +56,13 @@ impl ActivityFilter { ActivityFilter::Problems, ]; - fn label(self) -> &'static str { + fn label(self) -> String { match self { - ActivityFilter::All => "All", - ActivityFilter::Transfers => "Transfers", - ActivityFilter::Changes => "Changes", - ActivityFilter::Sharing => "Sharing", - ActivityFilter::Problems => "Problems", + ActivityFilter::All => pgettext("activity filter", "All"), + ActivityFilter::Transfers => pgettext("activity filter", "Transfers"), + ActivityFilter::Changes => pgettext("activity filter", "Changes"), + ActivityFilter::Sharing => pgettext("activity filter", "Sharing"), + ActivityFilter::Problems => pgettext("activity filter", "Problems"), } } @@ -95,7 +95,7 @@ pub(crate) fn build_activity_page() -> (gtk4::Widget, ActivityWidgets) { bar.set_halign(gtk4::Align::Start); let mut filters: Vec<(ActivityFilter, gtk4::ToggleButton)> = Vec::new(); for filter in ActivityFilter::ALL { - let button = gtk4::ToggleButton::with_label(filter.label()); + let button = gtk4::ToggleButton::with_label(&filter.label()); if let Some((_, first)) = filters.first() { button.set_group(Some(first)); } else { @@ -106,7 +106,7 @@ pub(crate) fn build_activity_page() -> (gtk4::Widget, ActivityWidgets) { } let attention = adw::PreferencesGroup::builder() - .title("Needs attention") + .title(gettext("Needs attention")) .visible(false) .build(); let days = gtk4::Box::new(gtk4::Orientation::Vertical, 24); @@ -131,7 +131,7 @@ pub(crate) fn build_activity_page() -> (gtk4::Widget, ActivityWidgets) { .build(); let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -150,7 +150,7 @@ pub(crate) fn build_activity_page() -> (gtk4::Widget, ActivityWidgets) { content.add_named(&scroll, Some("list")); content.add_named(&status, Some("status")); - let (frame, header, _) = page_frame("Activity", &content); + let (frame, header, _) = page_frame(&gettext("Activity"), &content); header.pack_end(&refresh); ( @@ -245,8 +245,8 @@ pub(crate) fn load_activity(ui: &Rc) { activity_status( ui, "document-open-recent-symbolic", - "Loading…", - "Reading recent activity.", + &gettext("Loading…"), + &gettext("Reading recent activity."), false, ); ui.busy_begin(); @@ -264,15 +264,15 @@ pub(crate) fn load_activity(ui: &Rc) { Ok(Ok(Response::Error { message, .. })) => activity_status( &ui, "dialog-warning-symbolic", - "Couldn't read activity", + &gettext("Couldn't read activity"), &message, false, ), Ok(Ok(_)) => activity_status( &ui, "dialog-warning-symbolic", - "Couldn't read activity", - "Unexpected reply from the mount service.", + &gettext("Couldn't read activity"), + &gettext("Unexpected reply from the mount service."), false, ), Ok(Err(_)) | Err(_) => activity_unreachable(&ui), @@ -286,8 +286,8 @@ pub(crate) fn activity_unreachable(ui: &Rc) { activity_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; @@ -295,8 +295,8 @@ pub(crate) fn activity_unreachable(ui: &Rc) { activity_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); @@ -416,19 +416,23 @@ pub(crate) fn collapse_feed(items: &[ActivityEntry]) -> Vec> { pub(crate) fn day_label(at: &glib::DateTime, now: &glib::DateTime) -> String { let today = now.ymd(); if at.ymd() == today { - return "Today".to_string(); + return gettext("Today"); } if now.add_days(-1).is_ok_and(|y| y.ymd() == at.ymd()) { - return "Yesterday".to_string(); + return gettext("Yesterday"); } let format = if now.difference(at).as_seconds() < 6 * 86_400 { - "%A" + "%A".to_string() } else if at.year() == now.year() { - "%A, %B %-d" + // Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". + gettext("%A, %B %-d") } else { - "%B %-d, %Y" + // Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". + gettext("%B %-d, %Y") }; - at.format(format).map(|s| s.to_string()).unwrap_or_default() + at.format(&format) + .map(|s| s.to_string()) + .unwrap_or_default() } /// Rebuild the page from the kept feed and conflict list, unless it already @@ -447,8 +451,8 @@ pub(crate) fn paint_activity(ui: &Rc) { activity_status( ui, "document-open-recent-symbolic", - "Nothing yet", - "Uploads, moves, shares and other changes appear here as they happen.", + &gettext("Nothing yet"), + &gettext("Uploads, moves, shares and other changes appear here as they happen."), false, ); return; @@ -461,12 +465,12 @@ pub(crate) fn paint_activity(ui: &Rc) { state.attention.remove(&row); } state.attention.set_visible(!open.is_empty()); - state.attention.set_description(Some(&match open.len() { - 1 => "A file was changed in two places at once. Choose which version to keep.".to_string(), - n => { - format!("{n} files were changed in two places at once. Choose which versions to keep.") - } - })); + state.attention.set_description(Some(&ngettext_f( + "A file was changed in two places at once. Choose which version to keep.", + "{n} files were changed in two places at once. Choose which versions to keep.", + open.len() as u64, + &[], + ))); let mut attention_rows = state.attention_rows.borrow_mut(); for conflict in open { let row = conflict_row(ui, conflict); @@ -485,8 +489,8 @@ pub(crate) fn paint_activity(ui: &Rc) { if rows.is_empty() { let empty = adw::StatusPage::builder() .icon_name("edit-find-symbolic") - .title("No matching activity") - .description("Nothing in the recent log fits this filter.") + .title(gettext("No matching activity")) + .description(gettext("Nothing in the recent log fits this filter.")) .build(); empty.add_css_class("compact"); state.days.append(&empty); @@ -519,11 +523,7 @@ fn feed_row( open: &[ConflictInfo], ) -> adw::ActionRow { let a = row.entry; - let title = match a.kind { - // The target of an empty is a count, not a name to lead with a verb. - ActivityKind::EmptyTrash => format!("Emptied Trash ({})", a.target), - kind => format!("{} {}", activity_verb(kind), a.target), - }; + let title = activity_title(a.kind, &a.target); // A logged conflict names the copy; it is still open while the daemon // still lists a copy by that name. let pending = (a.kind == ActivityKind::Conflict) @@ -538,14 +538,17 @@ fn feed_row( subtitle.push(capitalize(&a.detail)); } if row.count > 1 { - subtitle.push(format!( - "{} times since {}", - row.count, - activity_time(row.first) + let since = activity_time(row.first); + // Translators: {time} is a date and time such as "Sep 21, 14:05". + subtitle.push(ngettext_f( + "{n} time since {time}", + "{n} times since {time}", + row.count as u64, + &[("time", &since)], )); } if resolved { - subtitle.push("Resolved".to_string()); + subtitle.push(pgettext("state", "Resolved")); } let widget = adw::ActionRow::builder() .title(title) @@ -573,8 +576,10 @@ fn feed_row( } widget.add_prefix(&icon); + // Translators: strftime format for the time of day in the activity feed, such as "14:05". + let time_format = gettext("%H:%M"); let time = gtk4::Label::new(Some( - &at.and_then(|at| at.format("%H:%M").ok()) + &at.and_then(|at| at.format(&time_format).ok()) .map(|s| s.to_string()) .unwrap_or_default(), )); @@ -587,7 +592,7 @@ fn feed_row( if let Some(conflict) = pending { let resolve = gtk4::Button::builder() - .label("Resolve…") + .label(gettext("Resolve…")) .valign(gtk4::Align::Center) .build(); let ui = ui.clone(); @@ -598,23 +603,40 @@ fn feed_row( widget } -/// A human verb for an activity kind, used as the row title's lead word. -pub(crate) fn activity_verb(kind: ActivityKind) -> &'static str { +/// The row title for an activity: what happened to `target`, as one sentence +/// per kind so translators can place the name where their language needs it. +pub(crate) fn activity_title(kind: ActivityKind, target: &str) -> String { + let args = [("name", target)]; match kind { - ActivityKind::Upload => "Uploaded", - ActivityKind::Download => "Downloaded", - ActivityKind::Sync => "Synced", - ActivityKind::Rename => "Renamed", - ActivityKind::Move => "Moved", - ActivityKind::CreateFolder => "Created folder", - ActivityKind::Trash => "Trashed", - ActivityKind::Restore => "Restored", - ActivityKind::DeleteForever => "Deleted", - ActivityKind::EmptyTrash => "Emptied Trash", - ActivityKind::Share => "Shared", - ActivityKind::PublicLink => "Created a link to", - ActivityKind::Unshare => "Unshared", - ActivityKind::Conflict => "Conflict", + // Translators: {name} is a file or folder name. + ActivityKind::Upload => gettext_f("Uploaded {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::Download => gettext_f("Downloaded {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::Sync => gettext_f("Synced {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::Rename => gettext_f("Renamed {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::Move => gettext_f("Moved {name}", &args), + // Translators: {name} is a folder name. + ActivityKind::CreateFolder => gettext_f("Created folder {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::Trash => gettext_f("Trashed {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::Restore => gettext_f("Restored {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::DeleteForever => gettext_f("Deleted {name}", &args), + // The target of an empty is a count, not a name to lead with a verb. + // Translators: {count} is the number of items removed from the Trash. + ActivityKind::EmptyTrash => gettext_f("Emptied Trash ({count})", &[("count", target)]), + // Translators: {name} is a file or folder name. + ActivityKind::Share => gettext_f("Shared {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::PublicLink => gettext_f("Created a link to {name}", &args), + // Translators: {name} is a file or folder name. + ActivityKind::Unshare => gettext_f("Unshared {name}", &args), + // Translators: {name} is the name of the conflict copy. + ActivityKind::Conflict => gettext_f("Conflict {name}", &args), } } @@ -639,7 +661,8 @@ pub(crate) fn activity_icon(kind: ActivityKind) -> &'static str { /// Format an epoch-seconds timestamp for the Activity feed, in local time. pub(crate) fn activity_time(secs: i64) -> String { glib::DateTime::from_unix_local(secs) - .and_then(|dt| dt.format("%b %-d, %H:%M")) + // Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". + .and_then(|dt| dt.format(&gettext("%b %-d, %H:%M"))) .map(|s| s.to_string()) .unwrap_or_default() } diff --git a/crates/pdfs-gui/src/app/pages/albums.rs b/crates/pdfs-gui/src/app/pages/albums.rs index 6bef465..4649d85 100644 --- a/crates/pdfs-gui/src/app/pages/albums.rs +++ b/crates/pdfs-gui/src/app/pages/albums.rs @@ -40,8 +40,8 @@ pub(crate) fn load_albums(ui: &Rc) { albums_status( ui, "view-grid-symbolic", - "Loading albums…", - "Reading your Proton Drive albums.", + &gettext("Loading albums…"), + &gettext("Reading your Proton Drive albums."), ); } @@ -56,33 +56,33 @@ pub(crate) fn load_albums(ui: &Rc) { })) => albums_status( &ui, "image-missing-symbolic", - "No photo library", - "This Proton account doesn't have Photos enabled.", + &gettext("No photo library"), + &gettext("This Proton account doesn't have Photos enabled."), ), Ok(Ok(Response::Albums { items, .. })) if items.is_empty() => albums_status( &ui, "view-grid-symbolic", - "No albums", - "Create one with New Album, or in Proton Photos.", + &gettext("No albums"), + &gettext("Create one with New Album, or in Proton Photos."), ), Ok(Ok(Response::Albums { items, .. })) => { fill_albums(&ui, &items); ui.gallery.albums_stack.set_visible_child_name("grid"); } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't load albums", &message, kind); + toast_failure(&ui, &gettext("Couldn't load albums"), &message, kind); albums_status( &ui, "dialog-warning-symbolic", - "Couldn't load albums", + &gettext("Couldn't load albums"), &message, ); } Ok(Ok(_)) | Ok(Err(_)) | Err(_) => albums_status( &ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service didn't respond.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service didn't respond."), ), } }); @@ -102,9 +102,12 @@ fn fill_albums(ui: &Rc, albums: &[AlbumInfo]) { } *ui.gallery.album_list.borrow_mut() = albums.to_vec(); if ui.gallery.album.borrow().is_none() { - ui.gallery - .title - .set_subtitle(&count_noun(albums.len(), "album", "albums")); + ui.gallery.title.set_subtitle(&ngettext_f( + "{n} album", + "{n} albums", + albums.len() as u64, + &[], + )); } for album in albums { ui.gallery.albums.append(&album_card(ui, album)); @@ -199,14 +202,18 @@ fn album_card(ui: &Rc, album: &AlbumInfo) -> gtk4::Button { fn show_album_menu(ui: &Rc, album: &AlbumInfo, anchor: >k4::Widget, x: f64, y: f64) { let mut menu = ActionMenu::new(); let (ui_c, album_c) = (ui.clone(), album.clone()); - menu.item("Open", move || open_album(&ui_c, album_c.clone())); + menu.item(&pgettext("verb", "Open"), move || { + open_album(&ui_c, album_c.clone()) + }); if !album.shared { menu.section(); let (ui_c, album_c) = (ui.clone(), album.clone()); - menu.item("Rename…", move || prompt_rename_album(&ui_c, &album_c)); + menu.item(&gettext("Rename…"), move || { + prompt_rename_album(&ui_c, &album_c) + }); menu.section(); let (ui_c, album_c) = (ui.clone(), album.clone()); - menu.item("Delete Album…", move || { + menu.item(&gettext("Delete Album…"), move || { confirm_delete_album(&ui_c, &album_c) }); } @@ -226,13 +233,13 @@ fn prompt_album_name( let dialog = adw::AlertDialog::builder().heading(heading).build(); let group = adw::PreferencesGroup::new(); let row = adw::EntryRow::builder() - .title("Album name") + .title(gettext("Album name")) .activates_default(true) .build(); row.set_text(current); group.add(&row); dialog.set_extra_child(Some(&group)); - dialog.add_response("cancel", "Cancel"); + dialog.add_response("cancel", &gettext("Cancel")); dialog.add_response("ok", action); dialog.set_response_appearance("ok", adw::ResponseAppearance::Suggested); dialog.set_response_enabled("ok", !current.trim().is_empty()); @@ -254,7 +261,8 @@ fn prompt_album_name( /// Ask for a name and create an album, then add `photos` to it, if any. pub(crate) fn prompt_new_album(ui: &Rc, photos: Vec) { let ui_c = ui.clone(); - prompt_album_name(ui, "New Album", "Create", "", move |name| { + let (heading, action) = (gettext("New Album"), gettext("Create")); + prompt_album_name(ui, &heading, &action, "", move |name| { let rx = spawn_request(ui_c.dirs.control_socket(), Request::CreateAlbum { name }); let ui = ui_c.clone(); let photos = photos.clone(); @@ -265,19 +273,19 @@ pub(crate) fn prompt_new_album(ui: &Rc, photos: Vec) { match reply { Ok(Ok(Response::AlbumCreated { uid })) => { if photos.is_empty() { - toast(&ui, "Album created"); + toast(&ui, &gettext("Album created")); reload_album_grid(&ui); } else { add_to_album(&ui, uid, photos); } } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't create the album", &message, kind) + toast_failure(&ui, &gettext("Couldn't create the album"), &message, kind) } _ => toast_error( &ui, - "Couldn't create the album", - "The mount service didn't respond.", + &gettext("Couldn't create the album"), + &gettext("The mount service didn't respond."), ), } }); @@ -286,15 +294,16 @@ pub(crate) fn prompt_new_album(ui: &Rc, photos: Vec) { fn prompt_rename_album(ui: &Rc, album: &AlbumInfo) { let (ui_c, uid) = (ui.clone(), album.uid.clone()); - prompt_album_name(ui, "Rename Album", "Rename", &album.name, move |name| { + let (heading, action) = (gettext("Rename Album"), gettext("Rename")); + prompt_album_name(ui, &heading, &action, &album.name, move |name| { run_album_request( &ui_c, Request::RenameAlbum { uid: uid.clone(), name, }, - "Album renamed", - "Couldn't rename the album", + gettext("Album renamed"), + gettext("Couldn't rename the album"), ); }); } @@ -304,12 +313,13 @@ fn confirm_delete_album(ui: &Rc, album: &AlbumInfo) { let (ui_c, uid) = (ui.clone(), album.uid.clone()); confirm_destructive( &win, - "Delete Album?", - &format!( - "“{}” is deleted. Its photos stay in your timeline.", - album.name + &gettext("Delete Album?"), + // Translators: {name} is the album's name. + &gettext_f( + "“{name}” is deleted. Its photos stay in your timeline.", + &[("name", &album.name)], ), - "Delete", + &gettext("Delete"), move || { run_album_request( &ui_c, @@ -317,15 +327,15 @@ fn confirm_delete_album(ui: &Rc, album: &AlbumInfo) { uid: uid.clone(), delete_photos: false, }, - "Album deleted", - "Couldn't delete the album", + gettext("Album deleted"), + gettext("Couldn't delete the album"), ) }, ); } /// Send an album rename or delete and refresh the grid once it lands. -fn run_album_request(ui: &Rc, request: Request, done: &'static str, failed: &'static str) { +fn run_album_request(ui: &Rc, request: Request, done: String, failed: String) { let rx = spawn_request(ui.dirs.control_socket(), request); let ui = ui.clone(); ui.busy_begin(); @@ -334,11 +344,13 @@ fn run_album_request(ui: &Rc, request: Request, done: &'static str, failed: ui.busy_end(); match reply { Ok(Ok(Response::Ok { .. })) => { - toast(&ui, done); + toast(&ui, &done); reload_album_grid(&ui); } - Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, failed, &message, kind), - _ => toast_error(&ui, failed, "The mount service didn't respond."), + Ok(Ok(Response::Error { message, kind })) => { + toast_failure(&ui, &failed, &message, kind) + } + _ => toast_error(&ui, &failed, &gettext("The mount service didn't respond.")), } }); } @@ -360,14 +372,14 @@ pub(crate) fn prompt_add_to_album(ui: &Rc, photos: Vec) { items.into_iter().filter(|album| !album.shared).collect() } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't load albums", &message, kind); + toast_failure(&ui, &gettext("Couldn't load albums"), &message, kind); return; } _ => { toast_error( &ui, - "Couldn't load albums", - "The mount service didn't respond.", + &gettext("Couldn't load albums"), + &gettext("The mount service didn't respond."), ); return; } @@ -396,15 +408,20 @@ pub(crate) fn prompt_add_to_album(ui: &Rc, photos: Vec) { .child(&list) .build(); let dialog = adw::AlertDialog::builder() - .heading("Add to Album") + .heading(gettext("Add to Album")) .body(match photos.len() { - 1 => "Choose an album for this photo.".to_string(), - n => format!("Choose an album for {n} photos."), + 1 => gettext("Choose an album for this photo."), + n => ngettext_f( + "Choose an album for {n} photo.", + "Choose an album for {n} photos.", + n as u64, + &[], + ), }) .extra_child(&scroll) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("new", "New Album…"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("new", &gettext("New Album…")); dialog.set_close_response("cancel"); let (ui_c, dialog_c, photos_c) = (ui.clone(), dialog.clone(), photos.clone()); @@ -435,25 +452,31 @@ fn add_to_album(ui: &Rc, album: String, photos: Vec) { match reply { Ok(Ok(Response::AlbumChanged { changed, failed })) => { if let Some(failure) = failed.first() { - toast_error(&ui, "Some photos couldn't be added", &failure.message); + toast_error( + &ui, + &gettext("Some photos couldn't be added"), + &failure.message, + ); } else { toast( &ui, - &format!( - "Added {} to the album", - count_noun(changed.len(), "photo", "photos") + &ngettext_f( + "Added {n} photo to the album", + "Added {n} photos to the album", + changed.len() as u64, + &[], ), ); } reload_album_grid(&ui); } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't add to the album", &message, kind) + toast_failure(&ui, &gettext("Couldn't add to the album"), &message, kind) } _ => toast_error( &ui, - "Couldn't add to the album", - "The mount service didn't respond.", + &gettext("Couldn't add to the album"), + &gettext("The mount service didn't respond."), ), } }); @@ -487,7 +510,7 @@ pub(crate) fn remove_from_album(ui: &Rc, album: &AlbumInfo, photos: Vec, album: &AlbumInfo, photos: Vec { restore_photos(&ui, removed); - toast_failure(&ui, "Couldn't remove from the album", &message, kind) + toast_failure( + &ui, + &gettext("Couldn't remove from the album"), + &message, + kind, + ) } _ => { restore_photos(&ui, removed); toast_error( &ui, - "Couldn't remove from the album", - "The mount service didn't respond.", + &gettext("Couldn't remove from the album"), + &gettext("The mount service didn't respond."), ) } } @@ -527,14 +557,16 @@ pub(crate) fn remove_from_album(ui: &Rc, album: &AlbumInfo, photos: Vec String { - let photos = match album.photo_count { - 1 => "1 photo".to_string(), - n => format!("{n} photos"), - }; + let count = album.photo_count as u64; if album.shared { - format!("{photos} · shared with me") + ngettext_f( + "{n} photo · shared with me", + "{n} photos · shared with me", + count, + &[], + ) } else { - photos + ngettext_f("{n} photo", "{n} photos", count, &[]) } } @@ -588,7 +620,7 @@ pub(crate) fn close_album(ui: &Rc) { if ui.gallery.album.borrow_mut().take().is_none() { return; } - ui.gallery.title.set_title("Photos"); + ui.gallery.title.set_title(&gettext("Photos")); ui.gallery.view_switch.set_visible(true); ui.gallery.upload.set_visible(true); ui.gallery.back.set_visible(false); @@ -638,9 +670,11 @@ pub(crate) fn wire_albums(ui: &Rc) { ui.gallery.back.clone().connect_clicked(move |_| { show_album_grid(&ui_back); let count = ui_back.gallery.album_list.borrow().len(); - ui_back - .gallery - .title - .set_subtitle(&count_noun(count, "album", "albums")); + ui_back.gallery.title.set_subtitle(&ngettext_f( + "{n} album", + "{n} albums", + count as u64, + &[], + )); }); } diff --git a/crates/pdfs-gui/src/app/pages/browser.rs b/crates/pdfs-gui/src/app/pages/browser.rs index f0f8dad..c453bab 100644 --- a/crates/pdfs-gui/src/app/pages/browser.rs +++ b/crates/pdfs-gui/src/app/pages/browser.rs @@ -165,14 +165,14 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { let back = gtk4::Button::builder() .icon_name("go-previous-symbolic") - .tooltip_text("Back (Alt+Left)") + .tooltip_text(gettext("Back (Alt+Left)")) .valign(gtk4::Align::Center) .action_name("files.back") .build(); back.add_css_class("flat"); let forward = gtk4::Button::builder() .icon_name("go-next-symbolic") - .tooltip_text("Forward (Alt+Right)") + .tooltip_text(gettext("Forward (Alt+Right)")) .valign(gtk4::Align::Center) .action_name("files.forward") .build(); @@ -196,14 +196,18 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // Everything that makes something new here, in one menu: three bare icons // side by side read as a toolbar puzzle. let new_menu = gio::Menu::new(); - new_menu.append(Some("New Folder"), Some("files.new-folder")); + new_menu.append(Some(&gettext("New Folder")), Some("files.new-folder")); let uploads = gio::Menu::new(); - uploads.append(Some("Upload Files…"), Some("files.upload")); - uploads.append(Some("Upload Folder…"), Some("files.upload-folder")); + uploads.append(Some(&gettext("Upload Files…")), Some("files.upload")); + uploads.append( + Some(&gettext("Upload Folder…")), + Some("files.upload-folder"), + ); new_menu.append_section(None, &uploads); let new_button = gtk4::MenuButton::builder() .icon_name("list-add-symbolic") - .tooltip_text("New") + // Translators: tooltip of the menu button that creates a folder or uploads files. + .tooltip_text(pgettext("create", "New")) .menu_model(&new_menu) .valign(gtk4::Align::Center) .build(); @@ -212,22 +216,25 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // Grid or list on a click; the order lives in the arrow's menu. let view_menu = gio::Menu::new(); let layouts = gio::Menu::new(); - layouts.append(Some("Grid"), Some("files.view::grid")); - layouts.append(Some("List"), Some("files.view::list")); + layouts.append(Some(&pgettext("layout", "Grid")), Some("files.view::grid")); + layouts.append(Some(&pgettext("layout", "List")), Some("files.view::list")); view_menu.append_section(None, &layouts); let sorts = gio::Menu::new(); - sorts.append(Some("Name"), Some("files.sort::name")); - sorts.append(Some("Size"), Some("files.sort::size")); - sorts.append(Some("Last Modified"), Some("files.sort::modified")); - view_menu.append_section(Some("Sort By"), &sorts); + sorts.append(Some(&pgettext("column", "Name")), Some("files.sort::name")); + sorts.append(Some(&pgettext("column", "Size")), Some("files.sort::size")); + sorts.append( + Some(&gettext("Last Modified")), + Some("files.sort::modified"), + ); + view_menu.append_section(Some(&gettext("Sort By")), &sorts); let order = gio::Menu::new(); - order.append(Some("Reversed Order"), Some("files.descending")); - order.append(Some("Folders First"), Some("files.folders-first")); + order.append(Some(&gettext("Reversed Order")), Some("files.descending")); + order.append(Some(&gettext("Folders First")), Some("files.folders-first")); view_menu.append_section(None, &order); let view_button = adw::SplitButton::builder() .icon_name("view-list-symbolic") - .tooltip_text("Show as list (Ctrl+2)") - .dropdown_tooltip("Sort and view options") + .tooltip_text(gettext("Show as list (Ctrl+2)")) + .dropdown_tooltip(gettext("Sort and view options")) .menu_model(&view_menu) .valign(gtk4::Align::Center) .action_name("files.toggle-view") @@ -235,11 +242,17 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // What applies to the folder on screen rather than to a selection. let folder_menu = gio::Menu::new(); - folder_menu.append(Some("Open in File Manager"), Some("files.open-folder")); - folder_menu.append(Some("Build Thumbnails"), Some("files.build-thumbnails")); + folder_menu.append( + Some(&gettext("Open in File Manager")), + Some("files.open-folder"), + ); + folder_menu.append( + Some(&gettext("Build Thumbnails")), + Some("files.build-thumbnails"), + ); let folder_button = gtk4::MenuButton::builder() .icon_name("view-more-symbolic") - .tooltip_text("Folder actions") + .tooltip_text(gettext("Folder actions")) .menu_model(&folder_menu) .valign(gtk4::Align::Center) .build(); @@ -248,13 +261,13 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // shows while one runs. let build_thumbnails = gtk4::Button::builder() .icon_name("process-stop-symbolic") - .tooltip_text("Cancel thumbnail build") + .tooltip_text(gettext("Cancel thumbnail build")) .valign(gtk4::Align::Center) .build(); build_thumbnails.add_css_class("flat"); let search = gtk4::SearchEntry::builder() - .placeholder_text("Search Drive") + .placeholder_text(gettext("Search Drive")) .valign(gtk4::Align::Center) .build(); search.set_width_chars(18); @@ -262,7 +275,7 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // folder" is everywhere. let search_scope = gtk4::ToggleButton::builder() .icon_name("folder-symbolic") - .tooltip_text("Search this folder only") + .tooltip_text(gettext("Search this folder only")) .valign(gtk4::Align::Center) .visible(false) .build(); @@ -290,7 +303,7 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // Empty / loading / error surface, shown in place of the views. let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -298,10 +311,12 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { retry.set_visible(false); // The empty-folder state's way out. `StatusPage` takes one child, so Retry // and these share a box; each is shown only for the state it belongs to. - let empty_upload = gtk4::Button::builder().label("Upload files").build(); + let empty_upload = gtk4::Button::builder() + .label(gettext("Upload files")) + .build(); empty_upload.add_css_class("pill"); empty_upload.add_css_class("suggested-action"); - let empty_new_folder = gtk4::Button::builder().label("New folder").build(); + let empty_new_folder = gtk4::Button::builder().label(gettext("New folder")).build(); empty_new_folder.add_css_class("pill"); let empty_actions = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); empty_actions.set_halign(gtk4::Align::Center); @@ -381,28 +396,28 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // instead of making the whole view jump when a second entry is selected. let bulk_label = gtk4::Label::builder().hexpand(true).xalign(0.0).build(); let bulk_pin = gtk4::Button::builder() - .label("Make available offline") + .label(gettext("Make available offline")) .valign(gtk4::Align::Center) .build(); bulk_pin.add_css_class("flat"); let bulk_unpin = gtk4::Button::builder() - .label("Make online only") + .label(gettext("Make online only")) .valign(gtk4::Align::Center) .build(); bulk_unpin.add_css_class("flat"); let bulk_move = gtk4::Button::builder() - .label("Move to…") + .label(gettext("Move to…")) .valign(gtk4::Align::Center) .build(); bulk_move.add_css_class("flat"); let bulk_trash = gtk4::Button::builder() - .label("Move to Trash") + .label(gettext("Move to Trash")) .valign(gtk4::Align::Center) .build(); bulk_trash.add_css_class("destructive-action"); let bulk_clear = gtk4::Button::builder() .icon_name("window-close-symbolic") - .tooltip_text("Clear selection (Esc)") + .tooltip_text(gettext("Clear selection (Esc)")) .valign(gtk4::Align::Center) .build(); bulk_clear.add_css_class("flat"); @@ -425,13 +440,14 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { // "Zoom:", its slider, then capacity information. Both visible troughs use // the same CSS dimensions. let summary = gtk4::Label::builder() - .label("Loading…") + .label(gettext("Loading…")) .halign(gtk4::Align::Start) .valign(gtk4::Align::Center) .ellipsize(gtk4::pango::EllipsizeMode::End) .hexpand(true) .build(); - let zoom_label = gtk4::Label::new(Some("Zoom:")); + // Translators: label in front of the icon-size slider in the status bar. + let zoom_label = gtk4::Label::new(Some(&gettext("Zoom:"))); zoom_label.set_valign(gtk4::Align::Center); let zoom = gtk4::Scale::with_range( gtk4::Orientation::Horizontal, @@ -442,20 +458,25 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { zoom.set_value(f64::from(GRID_THUMB_DEFAULT)); zoom.set_draw_value(false); zoom.set_valign(gtk4::Align::Center); - zoom.set_tooltip_text(Some("Size: 72 pixels")); + zoom.set_tooltip_text(Some(&ngettext_f( + "Size: {n} pixel", + "Size: {n} pixels", + GRID_THUMB_DEFAULT as u64, + &[], + ))); zoom.add_css_class("browser-status-meter"); let quota = gtk4::ProgressBar::new(); quota.set_hexpand(false); quota.set_valign(gtk4::Align::Center); - quota.set_tooltip_text(Some("Proton account storage")); + quota.set_tooltip_text(Some(&gettext("Proton account storage"))); quota.add_css_class("browser-status-meter"); let quota_text = gtk4::Label::builder() - .label("Loading…") + .label(gettext("Loading…")) .halign(gtk4::Align::Start) .valign(gtk4::Align::Center) .margin_end(6) - .tooltip_text("Proton account storage") + .tooltip_text(gettext("Proton account storage")) .build(); let quota_box = gtk4::Box::new(gtk4::Orientation::Horizontal, 4); quota_box.set_valign(gtk4::Align::Center); @@ -507,7 +528,7 @@ pub(crate) fn build_browser_page() -> (gtk4::Widget, BrowserWidgets) { page.append(>k4::Separator::new(gtk4::Orientation::Horizontal)); page.append(&status_bar); - let (frame, header, _) = page_frame("My Files", &page); + let (frame, header, _) = page_frame(&gettext("My Files"), &page); header.pack_start(&new_button); header.pack_end(&folder_button); header.pack_end(&refresh); @@ -613,9 +634,12 @@ pub(crate) fn sync_bulk_bar(ui: &Rc) { let any_pinned = entries.iter().any(|e| e.pinned); let any_unpinned = entries.iter().any(|e| !e.pinned); let mounted = *ui.mounted.borrow(); - ui.browser - .bulk_label - .set_label(&format!("{} selected", entries.len())); + ui.browser.bulk_label.set_label(&ngettext_f( + "{n} selected", + "{n} selected", + entries.len() as u64, + &[], + )); ui.browser.bulk_trash.set_sensitive(mounted); ui.browser .bulk_pin @@ -647,8 +671,8 @@ pub(crate) fn run_bulk_delete(ui: &Rc, entries: Vec) { if !*ui.mounted.borrow() { toast_error( ui, - "Couldn't move to Trash", - "Proton Drive isn't connected.", + &gettext("Couldn't move to Trash"), + &gettext("Proton Drive isn't connected."), ); return; } @@ -675,22 +699,32 @@ pub(crate) fn run_bulk_delete(ui: &Rc, entries: Vec) { failure.get_or_insert(message); } _ => { - failure.get_or_insert_with(|| "The mount service didn't respond.".to_string()); + failure.get_or_insert_with(|| gettext("The mount service didn't respond.")); } } } ui.busy_end(); reload_listing(&ui); match (trashed.len(), failure) { - (0, Some(message)) => toast_error(&ui, "Couldn't move to Trash", &message), + (0, Some(message)) => toast_error(&ui, &gettext("Couldn't move to Trash"), &message), (0, None) => {} (n, failure) => { let message = match (failure, &single) { - (Some(_), _) => format!("Moved {n} items to Trash — some couldn't be moved"), - (None, Some(name)) => format!("Moved “{name}” to Trash"), - (None, None) => format!("Moved {n} items to Trash"), + (Some(_), _) => ngettext_f( + "Moved {n} item to Trash — some couldn't be moved", + "Moved {n} items to Trash — some couldn't be moved", + n as u64, + &[], + ), + (None, Some(name)) => gettext_f("Moved “{name}” to Trash", &[("name", name)]), + (None, None) => ngettext_f( + "Moved {n} item to Trash", + "Moved {n} items to Trash", + n as u64, + &[], + ), }; - toast_action(&ui, &message, "Undo", move |ui| { + toast_action(&ui, &message, &gettext("Undo"), move |ui| { restore_uids(ui, trashed.clone(), n); }); } @@ -704,11 +738,16 @@ pub(crate) fn restore_uids(ui: &Rc, uids: Vec, count: usize) { ui, Request::Restore { uids }, if count == 1 { - "Restored from Trash".to_string() + gettext("Restored from Trash") } else { - format!("Restored {count} items from Trash") + ngettext_f( + "Restored {n} item from Trash", + "Restored {n} items from Trash", + count as u64, + &[], + ) }, - "Couldn't restore from Trash", + gettext_noop("Couldn't restore from Trash"), ); } @@ -744,21 +783,33 @@ pub(crate) fn run_bulk_pin(ui: &Rc, entries: Vec, pin: bool) { failure.get_or_insert(message); } _ => { - failure.get_or_insert_with(|| "The mount service didn't respond.".to_string()); + failure.get_or_insert_with(|| gettext("The mount service didn't respond.")); } } } ui.busy_end(); load_browser(&ui); match (done, failure) { - (0, Some(message)) => toast_error(&ui, "Couldn't change offline state", &message), + (0, Some(message)) => { + toast_error(&ui, &gettext("Couldn't change offline state"), &message) + } (0, None) => {} (n, _) => toast( &ui, &if pin { - format!("{n} files are now available offline") + ngettext_f( + "{n} file is now available offline", + "{n} files are now available offline", + n as u64, + &[], + ) } else { - format!("{n} files are now online only") + ngettext_f( + "{n} file is now online only", + "{n} files are now online only", + n as u64, + &[], + ) }, ), } @@ -828,7 +879,12 @@ pub(crate) fn wire_browser(ui: &Rc, grid: >k4::GridView, column_view: >k let grid_zoom = grid.clone(); zoom.connect_value_changed(move |scale| { let size = (scale.value().round() as i32).clamp(GRID_THUMB_MIN, GRID_THUMB_MAX); - scale.set_tooltip_text(Some(&format!("Size: {size} pixels"))); + scale.set_tooltip_text(Some(&ngettext_f( + "Size: {n} pixel", + "Size: {n} pixels", + size as u64, + &[], + ))); if ui_zoom.browser.grid_thumbnail_size.replace(size) == size { return; } @@ -930,16 +986,18 @@ pub(crate) fn wire_browser(ui: &Rc, grid: >k4::GridView, column_view: >k // Column list: Name (icon + label, right-clickable), Size, Modified. column_view.append_column(&name_column(ui)); - column_view.append_column(&text_column("Size", |e| { + column_view.append_column(&text_column(&pgettext("column", "Size"), |e| { if e.is_dir { "—".to_string() } else { human_bytes(e.size) } })); - column_view.append_column(&text_column("Modified", |e| format_modified(e.modified))); + column_view.append_column(&text_column(&pgettext("column", "Modified"), |e| { + format_modified(e.modified) + })); // Search hits come from anywhere in the Drive; this says where. - let location = text_column(LOCATION_COLUMN, |e| hit_location(&e.path)); + let location = text_column(&gettext(LOCATION_COLUMN), |e| hit_location(&e.path)); location.set_visible(false); column_view.append_column(&location); @@ -1017,18 +1075,19 @@ pub(crate) fn name_column(ui: &Rc) -> gtk4::ColumnViewColumn { apply_badge(&badge, &entry); } }); - let column = gtk4::ColumnViewColumn::new(Some("Name"), Some(factory)); + let column = gtk4::ColumnViewColumn::new(Some(&pgettext("column", "Name")), Some(factory)); column.set_expand(true); column } -const LOCATION_COLUMN: &str = "Location"; +/// Title of the search-hit folder column, also how the column is found again. +const LOCATION_COLUMN: &str = gettext_noop("Location"); /// The folder holding a search hit, as a mountpoint-relative path. fn hit_location(path: &str) -> String { match path.rsplit_once('/') { Some((parent, _)) => parent.to_string(), - None => "My Files".to_string(), + None => gettext("My Files"), } } @@ -1038,7 +1097,7 @@ fn show_location_column(ui: &Rc, visible: bool) { for column in (0..columns.n_items()) .filter_map(|i| columns.item(i).and_downcast::()) { - if column.title().as_deref() == Some(LOCATION_COLUMN) { + if column.title().as_deref() == Some(gettext(LOCATION_COLUMN).as_str()) { column.set_visible(visible); } } @@ -1184,7 +1243,7 @@ pub(crate) fn popup_keyboard_context_menu(ui: &Rc) { pub(crate) fn entry_context_menu(ui: &Rc, entry: &DirEntry) -> ActionMenu { let mut menu = ActionMenu::new(); let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Open", move || { + menu.item(&pgettext("verb", "Open"), move || { // Open always means "download a local copy and hand off", even for a // media file — `activate_entry` would otherwise stream it. if is_streamable_media_entry(&entry_c) { @@ -1194,45 +1253,59 @@ pub(crate) fn entry_context_menu(ui: &Rc, entry: &DirEntry) -> ActionMenu { } }); let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Open With…", move || open_entry_with(&ui_c, &entry_c)); + menu.item(&gettext("Open With…"), move || { + open_entry_with(&ui_c, &entry_c) + }); // Play streams from the mount, no download; Open above still fetches a // local copy for anyone who wants one. if is_streamable_media_entry(entry) { let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Play", move || stream_entry(&ui_c, &entry_c)); + menu.item(&pgettext("verb", "Play"), move || { + stream_entry(&ui_c, &entry_c) + }); } menu.section(); if !entry.is_dir { let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.toggle("Available offline", entry.pinned, move |_| { + menu.toggle(&gettext("Available offline"), entry.pinned, move |_| { toggle_pin(&ui_c, &entry_c) }); menu.section(); } let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Share…", move || open_share_dialog(&ui_c, &entry_c)); + menu.item(&gettext("Share…"), move || { + open_share_dialog(&ui_c, &entry_c) + }); let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Copy Link", move || copy_entry_link(&ui_c, &entry_c)); + menu.item(&gettext("Copy Link"), move || { + copy_entry_link(&ui_c, &entry_c) + }); menu.section(); let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Rename…", move || prompt_rename(&ui_c, &entry_c)); + menu.item(&gettext("Rename…"), move || { + prompt_rename(&ui_c, &entry_c) + }); let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Move To…", move || { + menu.item(&gettext("Move To…"), move || { prompt_move(&ui_c, vec![entry_c.clone()]) }); if !entry.is_dir { let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Versions…", move || open_versions_dialog(&ui_c, &entry_c)); + menu.item(&gettext("Versions…"), move || { + open_versions_dialog(&ui_c, &entry_c) + }); } let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Details", move || open_details(&ui_c, &entry_c)); + menu.item(&gettext("Details"), move || open_details(&ui_c, &entry_c)); menu.section(); let (ui_c, entry_c) = (ui.clone(), entry.clone()); - menu.item("Move to Trash", move || trash_entry(&ui_c, &entry_c)); + menu.item(&gettext("Move to Trash"), move || { + trash_entry(&ui_c, &entry_c) + }); menu } @@ -1246,16 +1319,23 @@ pub(crate) fn bulk_context_menu(ui: &Rc, entries: Vec) -> ActionMe if entries.iter().all(|e| !e.is_dir) { let (ui_c, batch) = (ui.clone(), entries.clone()); let all_pinned = entries.iter().all(|e| e.pinned); - menu.toggle("Available offline", all_pinned, move |pin| { + menu.toggle(&gettext("Available offline"), all_pinned, move |pin| { run_bulk_pin(&ui_c, batch.clone(), pin) }); } let (ui_c, batch) = (ui.clone(), entries.clone()); - menu.item("Move To…", move || prompt_move(&ui_c, batch.clone())); - menu.labelled_section(&format!("{} selected", entries.len())); + menu.item(&gettext("Move To…"), move || { + prompt_move(&ui_c, batch.clone()) + }); + menu.labelled_section(&ngettext_f( + "{n} selected", + "{n} selected", + entries.len() as u64, + &[], + )); let ui_c = ui.clone(); - menu.item("Move to Trash", move || { + menu.item(&gettext("Move to Trash"), move || { trash_entries(&ui_c, entries.clone()) }); menu @@ -1270,19 +1350,19 @@ pub(crate) fn background_context_menu(ui: &Rc) -> ActionMenu { }; let mounted = *ui.mounted.borrow(); if mounted && ui.browser.search.text().is_empty() { - menu.item("New Folder…", run("new-folder")); - menu.item("Upload Files…", run("upload")); - menu.item("Upload Folder…", run("upload-folder")); + menu.item(&gettext("New Folder…"), run("new-folder")); + menu.item(&gettext("Upload Files…"), run("upload")); + menu.item(&gettext("Upload Folder…"), run("upload-folder")); menu.section(); } let ui_c = ui.clone(); - menu.item("Select All", move || { + menu.item(&gettext("Select All"), move || { active_selection(&ui_c).select_all(); }); let ui_c = ui.clone(); - menu.item("Refresh", move || reload_listing(&ui_c)); + menu.item(&gettext("Refresh"), move || reload_listing(&ui_c)); if mounted { - menu.item("Open in File Manager", run("open-folder")); + menu.item(&gettext("Open in File Manager"), run("open-folder")); } menu } @@ -1295,8 +1375,8 @@ pub(crate) fn open_entry_with(ui: &Rc, entry: &DirEntry) { let Some(path) = mounted_target_rel(&mountpoint, &rel) else { toast_error( ui, - "Couldn't open file", - "Open With needs the Proton Drive folder to be mounted.", + &gettext("Couldn't open file"), + &gettext("Open With needs the Proton Drive folder to be mounted."), ); return; }; @@ -1310,7 +1390,7 @@ pub(crate) fn open_entry_with(ui: &Rc, entry: &DirEntry) { if let Err(e) = result && !e.matches(gtk4::DialogError::Dismissed) { - toast_error(&ui, "Couldn't open file", &e.to_string()); + toast_error(&ui, &gettext("Couldn't open file"), &e.to_string()); } }, ); @@ -1338,16 +1418,16 @@ pub(crate) fn copy_entry_link(ui: &Rc, entry: &DirEntry) { .. })) => { ui.stack.clipboard().set_text(&url); - toast(&ui, "Link copied"); + toast(&ui, &gettext("Link copied")); } Ok(Ok(Response::Share { .. })) => open_share_dialog(&ui, &entry), Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't copy link", &message, kind) + toast_failure(&ui, &gettext("Couldn't copy link"), &message, kind) } _ => toast_error( &ui, - "Couldn't copy link", - "The mount service didn't respond.", + &gettext("Couldn't copy link"), + &gettext("The mount service didn't respond."), ), } }); @@ -1378,12 +1458,15 @@ pub(crate) fn stream_entry(ui: &Rc, entry: &DirEntry) { let Some(path) = abs.to_str() else { toast_error( ui, - "Couldn't play media", - "The file path isn't valid UTF-8.", + &gettext("Couldn't play media"), + &gettext("The file path isn't valid UTF-8."), ); return; }; - toast(ui, &format!("Streaming “{}”…", entry.name)); + toast( + ui, + &gettext_f("Streaming “{name}”…", &[("name", &entry.name)]), + ); play_external(path); } @@ -1447,12 +1530,12 @@ pub(crate) fn download_and_open(ui: &Rc, entry: &DirEntry) { // against the Drive name the user clicked, not that path. Ok(Ok(Response::FilePath { path })) => open_named_path(&path, &name), Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't open file", &message, kind) + toast_failure(&ui, &gettext("Couldn't open file"), &message, kind) } _ => toast_error( &ui, - "Couldn't open file", - "The mount service didn't respond.", + &gettext("Couldn't open file"), + &gettext("The mount service didn't respond."), ), } }); @@ -1474,7 +1557,12 @@ pub(crate) fn toggle_pin(ui: &Rc, entry: &DirEntry) { glib::spawn_future_local(async move { match rx.recv().await { Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't change offline state", &message, kind); + toast_failure( + &ui, + &gettext("Couldn't change offline state"), + &message, + kind, + ); // The details switch may be showing the state we failed to reach. load_browser(&ui); } @@ -1483,17 +1571,17 @@ pub(crate) fn toggle_pin(ui: &Rc, entry: &DirEntry) { toast( &ui, &if pinned { - format!("“{name}” is now online only") + gettext_f("“{name}” is now online only", &[("name", &name)]) } else { - format!("“{name}” is now available offline") + gettext_f("“{name}” is now available offline", &[("name", &name)]) }, ); } _ => { toast_error( &ui, - "Couldn't change offline state", - "The mount service didn't respond.", + &gettext("Couldn't change offline state"), + &gettext("The mount service didn't respond."), ); load_browser(&ui); } @@ -1712,7 +1800,7 @@ pub(crate) fn set_files_view(ui: &Rc, view: FilesView) { let mut config = ui.dirs.load_config(); config.files_view = view; if let Err(e) = ui.dirs.save_config(&config) { - toast_error(ui, "Couldn't save the view", &e.to_string()); + toast_error(ui, &gettext("Couldn't save the view"), &e.to_string()); } if (old.sort, old.descending, old.folders_first) != (view.sort, view.descending, view.folders_first) @@ -1734,10 +1822,10 @@ fn apply_files_view(ui: &Rc, view: FilesView) { } else { "view-list-symbolic" }); - ui.browser.view_button.set_tooltip_text(Some(if view.list { - "Show as grid (Ctrl+1)" + ui.browser.view_button.set_tooltip_text(Some(&if view.list { + gettext("Show as grid (Ctrl+1)") } else { - "Show as list (Ctrl+2)" + gettext("Show as list (Ctrl+2)") })); let actions = &ui.browser.actions; for (name, state) in [ @@ -1868,7 +1956,7 @@ fn open_current_folder(ui: &Rc) { let dir = mounted_path(&mountpoint, &path); let uri = gio::File::for_path(&dir).uri(); if let Err(e) = gio::AppInfo::launch_default_for_uri(&uri, gio::AppLaunchContext::NONE) { - toast_error(ui, "Couldn't open the folder", &e.to_string()); + toast_error(ui, &gettext("Couldn't open the folder"), &e.to_string()); } } @@ -1881,8 +1969,8 @@ fn start_thumbnail_build(ui: &Rc) { if !*ui.mounted.borrow() { toast_error( ui, - "Couldn't build thumbnails", - "Proton Drive isn't connected.", + &gettext("Couldn't build thumbnails"), + &gettext("Proton Drive isn't connected."), ); return; } @@ -1896,7 +1984,7 @@ fn start_thumbnail_build(ui: &Rc) { ui.browser.thumbnail_progress.set_fraction(0.0); ui.browser .thumbnail_status - .set_label("Starting thumbnail build…"); + .set_label(&gettext("Starting thumbnail build…")); let path = ui.browser.path.borrow().clone(); let rx = spawn_request( @@ -1912,12 +2000,12 @@ fn start_thumbnail_build(ui: &Rc) { } Ok(Ok(Response::Error { message, kind })) => { thumbnail_build_failed(&ui); - toast_failure(&ui, "Couldn't build thumbnails", &message, kind); + toast_failure(&ui, &gettext("Couldn't build thumbnails"), &message, kind); } _ => { - let message = "The mount service didn't respond."; + let message = gettext("The mount service didn't respond."); thumbnail_build_failed(&ui); - toast_error(&ui, "Couldn't build thumbnails", message); + toast_error(&ui, &gettext("Couldn't build thumbnails"), &message); } } }); @@ -1930,7 +2018,7 @@ fn cancel_thumbnail_build(ui: &Rc) { ui.browser.build_thumbnails.set_sensitive(false); ui.browser .thumbnail_status - .set_label("Stopping thumbnail build…"); + .set_label(&gettext("Stopping thumbnail build…")); let rx = spawn_request(ui.dirs.control_socket(), Request::CancelThumbnailBuild); let ui = ui.clone(); glib::spawn_future_local(async move { @@ -1941,14 +2029,19 @@ fn cancel_thumbnail_build(ui: &Rc) { Ok(Ok(Response::ThumbnailBuild { .. })) => schedule_thumbnail_build_poll(&ui), Ok(Ok(Response::Error { message, kind })) => { thumbnail_cancel_failed(&ui); - toast_failure(&ui, "Couldn't cancel thumbnail build", &message, kind); + toast_failure( + &ui, + &gettext("Couldn't cancel thumbnail build"), + &message, + kind, + ); } _ => { thumbnail_cancel_failed(&ui); toast_error( &ui, - "Couldn't cancel thumbnail build", - "The mount service didn't respond.", + &gettext("Couldn't cancel thumbnail build"), + &gettext("The mount service didn't respond."), ); } } @@ -1978,14 +2071,14 @@ fn schedule_thumbnail_build_poll(ui: &Rc) { } Ok(Ok(Response::Error { message, .. })) => { thumbnail_build_failed(&ui_result); - toast_error(&ui_result, "Thumbnail build stopped", &message); + toast_error(&ui_result, &gettext("Thumbnail build stopped"), &message); } _ => { thumbnail_build_failed(&ui_result); toast_error( &ui_result, - "Thumbnail build stopped", - "The mount service stopped reporting thumbnail progress.", + &gettext("Thumbnail build stopped"), + &gettext("The mount service stopped reporting thumbnail progress."), ); } } @@ -2005,9 +2098,12 @@ fn repaint_thumbnail_build(ui: &Rc, status: &ThumbnailBuildStatus) { }; let text = if status.scanning { ui.browser.thumbnail_progress.pulse(); - format!( - "Scanning {root}… {} folders, {} images", - status.folders_scanned, status.images_found + let folders = ngettext_f("{n} folder", "{n} folders", status.folders_scanned, &[]); + let images = ngettext_f("{n} image", "{n} images", status.images_found, &[]); + // Translators: {root} is a folder path or "Proton Drive"; {folders} and {images} are counts such as "3 folders" and "12 images". + gettext_f( + "Scanning {root}… {folders}, {images}", + &[("root", root), ("folders", &folders), ("images", &images)], ) } else if status.running { let fraction = if status.images_found == 0 { @@ -2018,22 +2114,41 @@ fn repaint_thumbnail_build(ui: &Rc, status: &ThumbnailBuildStatus) { ui.browser .thumbnail_progress .set_fraction(fraction.clamp(0.0, 1.0)); - format!( - "Building thumbnails in {root}… {} of {}", - status.completed, status.images_found + // Translators: {root} is a folder path or "Proton Drive"; {done} and {total} are image counts. + gettext_f( + "Building thumbnails in {root}… {done} of {total}", + &[ + ("root", root), + ("done", &status.completed.to_string()), + ("total", &status.images_found.to_string()), + ], ) } else { ui.browser.thumbnail_progress.set_fraction(1.0); let available = status.completed.saturating_sub(status.failed); match status.failed { - 0 => format!("Thumbnails ready for {available} images in {root}"), - failed => { - format!("Thumbnails ready for {available} images in {root}; {failed} unavailable") - } + // Translators: {root} is a folder path or "Proton Drive". + 0 => ngettext_f( + "Thumbnails ready for {n} image in {root}", + "Thumbnails ready for {n} images in {root}", + available, + &[("root", root)], + ), + // Translators: {root} is a folder path or "Proton Drive"; {failed} is how many images could not get a thumbnail. + failed => ngettext_f( + "Thumbnails ready for {n} image in {root}; {failed} unavailable", + "Thumbnails ready for {n} images in {root}; {failed} unavailable", + available, + &[("root", root), ("failed", &failed.to_string())], + ), } }; let text = match status.message.as_deref() { - Some(message) => format!("{text}. {message}"), + // Translators: {status} is the thumbnail build progress; {message} is a problem the mount service reported. + Some(message) => gettext_f( + "{status}. {message}", + &[("status", &text), ("message", message)], + ), None => text, }; ui.browser.thumbnail_status.set_label(&text); @@ -2087,9 +2202,13 @@ fn thumbnail_build_failed(ui: &Rc) { /// confirm with a toast, or report the daemon's error in one. `done` is the /// past-tense confirmation ("Renamed to “x”"); `failed` names the attempt /// ("Couldn't rename"). +/// +/// `failed` is an untranslated msgid: callers mark it with [`gettext_noop`] and +/// it is translated here. pub(crate) fn run_mutation(ui: &Rc, req: Request, done: String, failed: &'static str) { + let failed = gettext(failed); if !*ui.mounted.borrow() { - toast_error(ui, failed, "Proton Drive isn't connected."); + toast_error(ui, &failed, &gettext("Proton Drive isn't connected.")); return; } ui.busy_begin(); @@ -2105,8 +2224,10 @@ pub(crate) fn run_mutation(ui: &Rc, req: Request, done: String, failed: &'st reload_listing(&ui); toast(&ui, &done); } - Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, failed, &message, kind), - _ => toast_error(&ui, failed, "The mount service didn't respond."), + Ok(Ok(Response::Error { message, kind })) => { + toast_failure(&ui, &failed, &message, kind) + } + _ => toast_error(&ui, &failed, &gettext("The mount service didn't respond.")), } }); } @@ -2127,10 +2248,12 @@ pub(crate) fn prompt_rename(ui: &Rc, entry: &DirEntry) { let parent = ui_window(ui); let rel = entry_rel(ui, entry); let original = entry.name.clone(); - let dialog = adw::AlertDialog::builder().heading("Rename").build(); + let dialog = adw::AlertDialog::builder() + .heading(gettext("Rename")) + .build(); let group = adw::PreferencesGroup::new(); let row = adw::EntryRow::builder() - .title("New name") + .title(gettext("New name")) .activates_default(true) .build(); row.set_text(&original); @@ -2147,8 +2270,8 @@ pub(crate) fn prompt_rename(ui: &Rc, entry: &DirEntry) { row_focus.grab_focus(); row_focus.select_region(0, stem); }); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("confirm", "Rename"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("confirm", &gettext("Rename")); dialog.set_response_appearance("confirm", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("confirm")); dialog.set_close_response("cancel"); @@ -2162,7 +2285,7 @@ pub(crate) fn prompt_rename(ui: &Rc, entry: &DirEntry) { if new_name.is_empty() || new_name == original { return; } - let done = format!("Renamed to “{new_name}”"); + let done = gettext_f("Renamed to “{name}”", &[("name", &new_name)]); run_mutation( &ui, Request::Rename { @@ -2170,7 +2293,7 @@ pub(crate) fn prompt_rename(ui: &Rc, entry: &DirEntry) { new_name, }, done, - "Couldn't rename", + gettext_noop("Couldn't rename"), ); }); dialog.present(parent.as_ref()); @@ -2184,17 +2307,17 @@ pub(crate) fn prompt_move(ui: &Rc, entries: Vec) { } let sources: Vec = entries.iter().map(|e| entry_rel(ui, e)).collect(); let heading = match entries.as_slice() { - [one] => format!("Move “{}”", one.name), - many => format!("Move {}", count_noun(many.len(), "item", "items")), + [one] => gettext_f("Move “{name}”", &[("name", &one.name)]), + many => ngettext_f("Move {n} item", "Move {n} items", many.len() as u64, &[]), }; let dialog = adw::AlertDialog::builder() .heading(heading) - .body("Choose the folder to move into.") + .body(gettext("Choose the folder to move into.")) .build(); let up = gtk4::Button::builder() .icon_name("go-up-symbolic") - .tooltip_text("Parent folder") + .tooltip_text(gettext("Parent folder")) .build(); up.add_css_class("flat"); let location = gtk4::Label::builder() @@ -2219,8 +2342,8 @@ pub(crate) fn prompt_move(ui: &Rc, entries: Vec) { body.append(&bar); body.append(&scroll); dialog.set_extra_child(Some(&body)); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("move", "Move Here"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("move", &gettext("Move Here")); dialog.set_response_appearance("move", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("move")); dialog.set_close_response("cancel"); @@ -2286,7 +2409,7 @@ impl MovePicker { while let Some(row) = self.list.first_child() { self.list.remove(&row); } - self.list.append(&picker_note("Loading…")); + self.list.append(&picker_note(&gettext("Loading…"))); let rx = spawn_request( self.ui.dirs.control_socket(), Request::ListDir { @@ -2305,7 +2428,7 @@ impl MovePicker { let Ok(Ok(Response::Entries { entries })) = result else { picker .list - .append(&picker_note("Couldn't read this folder.")); + .append(&picker_note(&gettext("Couldn't read this folder."))); return; }; let mut folders: Vec = entries.into_iter().filter(|e| e.is_dir).collect(); @@ -2333,7 +2456,9 @@ impl MovePicker { shown += 1; } if shown == 0 { - picker.list.append(&picker_note("No folders here.")); + picker + .list + .append(&picker_note(&gettext("No folders here."))); } }); } @@ -2372,7 +2497,11 @@ pub(crate) fn move_target_allowed(sources: &[String], target: &str) -> bool { /// once for the lot. pub(crate) fn run_bulk_move(ui: &Rc, sources: Vec, target: String) { if !*ui.mounted.borrow() { - toast_error(ui, "Couldn't move", "Proton Drive isn't connected."); + toast_error( + ui, + &gettext("Couldn't move"), + &gettext("Proton Drive isn't connected."), + ); return; } let socket = ui.dirs.control_socket(); @@ -2398,7 +2527,7 @@ pub(crate) fn run_bulk_move(ui: &Rc, sources: Vec, target: String) { _ => { failure.get_or_insert_with(|| { ( - "The mount service didn't respond.".to_string(), + gettext("The mount service didn't respond."), ErrorKind::Internal, ) }); @@ -2408,22 +2537,38 @@ pub(crate) fn run_bulk_move(ui: &Rc, sources: Vec, target: String) { ui.busy_end(); reload_listing(&ui); let place = match target.rsplit('/').next() { - Some(name) if !name.is_empty() => format!("“{name}”"), + // Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". + Some(name) if !name.is_empty() => gettext_f("“{name}”", &[("name", name)]), _ => "Proton Drive".to_string(), }; match (done, failure) { - (0, Some((message, kind))) => toast_failure(&ui, "Couldn't move", &message, kind), + (0, Some((message, kind))) => { + toast_failure(&ui, &gettext("Couldn't move"), &message, kind) + } (0, None) => {} (n, Some((message, _))) => toast_error( &ui, - &format!( - "Moved {} to {place}, but not all", - count_noun(n, "item", "items") + // Translators: {place} is a quoted folder name or "Proton Drive". + &ngettext_f( + "Moved {n} item to {place}, but not all", + "Moved {n} items to {place}, but not all", + n as u64, + &[("place", &place)], ), &message, ), - (1, None) => toast(&ui, &format!("Moved to {place}")), - (n, None) => toast(&ui, &format!("Moved {n} items to {place}")), + // Translators: {place} is a quoted folder name or "Proton Drive". + (1, None) => toast(&ui, &gettext_f("Moved to {place}", &[("place", &place)])), + (n, None) => toast( + &ui, + // Translators: {place} is a quoted folder name or "Proton Drive". + &ngettext_f( + "Moved {n} item to {place}", + "Moved {n} items to {place}", + n as u64, + &[("place", &place)], + ), + ), } }); } @@ -2438,18 +2583,18 @@ pub(crate) fn prompt_new_folder(ui: &Rc) { let win = ui_window(ui); let parent = ui.browser.path.borrow().clone(); let dialog = adw::AlertDialog::builder() - .heading("New folder") - .body("Create a folder in the current directory.") + .heading(gettext("New folder")) + .body(gettext("Create a folder in the current directory.")) .build(); let group = adw::PreferencesGroup::new(); let row = adw::EntryRow::builder() - .title("Folder name") + .title(gettext("Folder name")) .activates_default(true) .build(); group.add(&row); dialog.set_extra_child(Some(&group)); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("confirm", "Create"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("confirm", &gettext("Create")); dialog.set_response_appearance("confirm", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("confirm")); dialog.set_close_response("cancel"); @@ -2463,7 +2608,7 @@ pub(crate) fn prompt_new_folder(ui: &Rc) { if name.is_empty() { return; } - let done = format!("Created “{name}”"); + let done = gettext_f("Created “{name}”", &[("name", &name)]); run_mutation( &ui, Request::CreateFolder { @@ -2471,7 +2616,7 @@ pub(crate) fn prompt_new_folder(ui: &Rc) { name, }, done, - "Couldn't create folder", + gettext_noop("Couldn't create folder"), ); }); dialog.present(win.as_ref()); @@ -2482,7 +2627,9 @@ pub(crate) fn prompt_new_folder(ui: &Rc) { /// the GUI — even a large multi-file selection. pub(crate) fn prompt_upload(ui: &Rc) { let win = ui_window(ui); - let dialog = gtk4::FileDialog::builder().title("Upload Files").build(); + let dialog = gtk4::FileDialog::builder() + .title(gettext("Upload Files")) + .build(); let ui = ui.clone(); dialog.open_multiple(win.as_ref(), gio::Cancellable::NONE, move |res| { let Ok(files) = res else { return }; @@ -2501,7 +2648,9 @@ pub(crate) fn prompt_upload(ui: &Rc) { /// browser directory. The daemon recreates the directory structure remotely. pub(crate) fn prompt_upload_folder(ui: &Rc) { let win = ui_window(ui); - let dialog = gtk4::FileDialog::builder().title("Upload Folder").build(); + let dialog = gtk4::FileDialog::builder() + .title(gettext("Upload Folder")) + .build(); let ui = ui.clone(); dialog.select_folder(win.as_ref(), gio::Cancellable::NONE, move |res| { let Ok(folder) = res else { return }; @@ -2521,7 +2670,11 @@ pub(crate) fn start_upload(ui: &Rc, sources: Vec) { return; } if !*ui.mounted.borrow() { - toast_error(ui, "Couldn't upload", "Proton Drive isn't connected."); + toast_error( + ui, + &gettext("Couldn't upload"), + &gettext("Proton Drive isn't connected."), + ); return; } let parent = ui.browser.path.borrow().clone(); @@ -2535,19 +2688,23 @@ pub(crate) fn start_upload(ui: &Rc, sources: Vec) { match rx.recv().await { Ok(Ok(Response::Ok { .. })) => { let what = if n == 1 { - "Uploading…".to_string() + gettext("Uploading…") } else { - format!("Uploading {n} items…") + ngettext_f("Uploading {n} item…", "Uploading {n} items…", n as u64, &[]) }; // Progress lives on the Sync page; say where. - toast_action(&ui, &what, "View", |ui| { + toast_action(&ui, &what, &pgettext("verb", "View"), |ui| { ui.stack.set_visible_child_name("locations") }); } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't upload", &message, kind) + toast_failure(&ui, &gettext("Couldn't upload"), &message, kind) } - _ => toast_error(&ui, "Couldn't upload", "The mount service didn't respond."), + _ => toast_error( + &ui, + &gettext("Couldn't upload"), + &gettext("The mount service didn't respond."), + ), } }); } @@ -2625,7 +2782,7 @@ pub(crate) fn attach_drop(ui: &Rc, item: >k4::ListItem, anchor: >k4::Box if src == dest_path || dest_path.starts_with(&format!("{src}/")) { return false; } - let done = format!("Moved into “{}”", dest.name); + let done = gettext_f("Moved into “{name}”", &[("name", &dest.name)]); run_mutation( &ui, Request::Move { @@ -2633,7 +2790,7 @@ pub(crate) fn attach_drop(ui: &Rc, item: >k4::ListItem, anchor: >k4::Box new_parent: dest_path, }, done, - "Couldn't move", + gettext_noop("Couldn't move"), ); true }); @@ -2670,7 +2827,8 @@ pub(crate) fn icon_base_for(entry: &DirEntry) -> &'static str { pub(crate) fn format_modified(secs: i64) -> String { match glib::DateTime::from_unix_local(secs) { Ok(dt) => dt - .format("%-d %b %Y") + // Translators: strftime format for a modification date, such as "23 Sep 2026". + .format(&gettext("%-d %b %Y")) .map(|s| s.to_string()) .unwrap_or_default(), Err(_) => String::new(), @@ -2686,7 +2844,7 @@ pub(crate) fn load_browser(ui: &Rc) { repaint_crumb(ui, &path); sync_history_actions(ui); sync_search_scope(ui); - ui.browser.summary.set_label("Loading…"); + ui.browser.summary.set_label(&gettext("Loading…")); // Drop the previous folder's rows up front: a slow reply must not leave stale // entries visible, where clicking one would open with a wrong relative path. @@ -2694,8 +2852,8 @@ pub(crate) fn load_browser(ui: &Rc) { browser_status( ui, "folder-symbolic", - "Loading…", - "Reading this folder.", + &gettext("Loading…"), + &gettext("Reading this folder."), false, ); @@ -2719,7 +2877,7 @@ pub(crate) fn load_browser(ui: &Rc) { Ok(Ok(Response::Error { message, kind })) => browser_failed(&ui, &message, kind), Ok(Ok(_)) => browser_failed( &ui, - "Unexpected reply from the mount service.", + &gettext("Unexpected reply from the mount service."), ErrorKind::Internal, ), Ok(Err(_)) | Err(_) => browser_unreachable(&ui), @@ -2732,11 +2890,11 @@ pub(crate) fn load_browser(ui: &Rc) { /// (which restarts the service) wouldn't help and isn't offered. pub(crate) fn browser_failed(ui: &Rc, message: &str, kind: ErrorKind) { ui.browser.model.remove_all(); - ui.browser.summary.set_label("Folder unavailable"); + ui.browser.summary.set_label(&gettext("Folder unavailable")); browser_status( ui, "dialog-warning-symbolic", - error_headline(kind, "Couldn't open this folder"), + error_headline(kind, &gettext("Couldn't open this folder")), message, // Offer Retry only where repeating the request could actually work. // A folder that is gone stays gone however many times it is asked for. @@ -2749,22 +2907,22 @@ pub(crate) fn browser_failed(ui: &Rc, message: &str, kind: ErrorKind) { /// once the systemd mount comes up but a real failure stays visible. pub(crate) fn browser_unreachable(ui: &Rc) { if service::is_failed() || !service::is_active() { - ui.browser.summary.set_label("Not connected"); + ui.browser.summary.set_label(&gettext("Not connected")); browser_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; } - ui.browser.summary.set_label("Connecting…"); + ui.browser.summary.set_label(&gettext("Connecting…")); browser_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); @@ -2795,8 +2953,8 @@ pub(crate) fn repaint_browser(ui: &Rc, entries: &[DirEntry]) { browser_status( ui, "folder-open-symbolic", - "This folder is empty", - "Drop files here, or upload a file or create a folder to get started.", + &gettext("This folder is empty"), + &gettext("Drop files here, or upload a file or create a folder to get started."), false, ); ui.browser.empty_actions.set_visible(true); @@ -2836,10 +2994,10 @@ pub(crate) fn wire_search(ui: &Rc) { }); let ui_s = ui.clone(); ui.browser.search_scope.connect_toggled(move |scope| { - scope.set_tooltip_text(Some(if scope.is_active() { - "Search everywhere" + scope.set_tooltip_text(Some(&if scope.is_active() { + gettext("Search everywhere") } else { - "Search this folder only" + gettext("Search this folder only") })); let query = ui_s.browser.search.text().trim().to_string(); if !query.is_empty() { @@ -2869,12 +3027,12 @@ pub(crate) fn run_search(ui: &Rc, query: &str) { let generation = ui.browser.load_generation.get().wrapping_add(1); ui.browser.load_generation.set(generation); ui.browser.model.remove_all(); - ui.browser.summary.set_label("Searching…"); + ui.browser.summary.set_label(&gettext("Searching…")); browser_status( ui, "system-search-symbolic", - "Searching…", - &format!("Looking for “{query}”."), + &gettext("Searching…"), + &gettext_f("Looking for “{query}”.", &[("query", query)]), false, ); @@ -2905,7 +3063,7 @@ pub(crate) fn run_search(ui: &Rc, query: &str) { Ok(Ok(Response::Error { message, kind })) => browser_failed(&ui, &message, kind), Ok(Ok(_)) => browser_failed( &ui, - "Unexpected reply from the mount service.", + &gettext("Unexpected reply from the mount service."), ErrorKind::Internal, ), Ok(Err(_)) | Err(_) => browser_unreachable(&ui), @@ -2930,16 +3088,23 @@ pub(crate) fn repaint_search(ui: &Rc, hits: &[SearchHit]) { ui.browser .summary .set_label(&if hits.len() >= SEARCH_LIMIT { - format!("{counts} — showing the first {SEARCH_LIMIT} search results") + // Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". + ngettext_f( + "{summary} — showing the first {n} search result", + "{summary} — showing the first {n} search results", + SEARCH_LIMIT as u64, + &[("summary", &counts)], + ) } else { - format!("{counts} — search results") + // Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". + gettext_f("{summary} — search results", &[("summary", &counts)]) }); if hits.is_empty() { browser_status( ui, "system-search-symbolic", - "No matches", - "No files or folders match that search.", + &gettext("No matches"), + &gettext("No files or folders match that search."), false, ); return; @@ -2970,15 +3135,29 @@ pub(crate) fn repaint_search(ui: &Rc, hits: &[SearchHit]) { } fn listing_summary(files: usize, folders: usize, file_bytes: u64) -> String { - let file_word = if files == 1 { "file" } else { "files" }; - let folder_word = if folders == 1 { "folder" } else { "folders" }; + let folder_count = ngettext_f("{n} folder", "{n} folders", folders as u64, &[]); + let file_count = ngettext_f("{n} file", "{n} files", files as u64, &[]); + let size = human_bytes(file_bytes); match (folders, files) { - (0, 0) => "0 folders, 0 files".to_string(), - (_, 0) => format!("{folders} {folder_word}"), - (0, _) => format!("{files} {file_word} ({})", human_bytes(file_bytes)), - _ => format!( - "{folders} {folder_word}, {files} {file_word} ({})", - human_bytes(file_bytes) + (1.., 0) => folder_count, + // Translators: {files} is a count such as "3 files"; {size} is their total size such as "4.2 MB". + (0, 1..) => gettext_f( + "{files} ({size})", + &[("files", &file_count), ("size", &size)], + ), + // Translators: {folders} and {files} are counts such as "2 folders" and "0 files". + (0, 0) => gettext_f( + "{folders}, {files}", + &[("folders", &folder_count), ("files", &file_count)], + ), + // Translators: {folders} and {files} are counts such as "1 folder" and "3 files"; {size} is the files' total size such as "4.2 MB". + _ => gettext_f( + "{folders}, {files} ({size})", + &[ + ("folders", &folder_count), + ("files", &file_count), + ("size", &size), + ], ), } } diff --git a/crates/pdfs-gui/src/app/pages/devices.rs b/crates/pdfs-gui/src/app/pages/devices.rs index ec481b7..f3bb6c2 100644 --- a/crates/pdfs-gui/src/app/pages/devices.rs +++ b/crates/pdfs-gui/src/app/pages/devices.rs @@ -52,23 +52,23 @@ pub(crate) fn build_devices_page() -> (gtk4::Widget, DevicesWidgets) { // themselves are local paths, so they live on the Sync page; keeping a // second copy of that list here would be two places to change the same mode. let sync_group = adw::PreferencesGroup::builder() - .title("This computer") - .description("The computer this machine backs up as.") + .title(gettext("This computer")) + .description(gettext("The computer this machine backs up as.")) .build(); // Rename control for *this* machine's device, in the section header. The // current device is filtered out of "Other computers", so this is the only // place it can be renamed; insensitive until the device list identifies it. let rename_this = gtk4::Button::builder() .icon_name("document-edit-symbolic") - .tooltip_text("Rename this computer") + .tooltip_text(gettext("Rename this computer")) .valign(gtk4::Align::Center) .sensitive(false) .build(); rename_this.add_css_class("flat"); sync_group.set_header_suffix(Some(&rename_this)); let group = adw::PreferencesGroup::builder() - .title("Other computers") - .description("Other computers backing up to this account.") + .title(gettext("Other computers")) + .description(gettext("Other computers backing up to this account.")) .build(); let groups = gtk4::Box::new(gtk4::Orientation::Vertical, 18); @@ -81,7 +81,7 @@ pub(crate) fn build_devices_page() -> (gtk4::Widget, DevicesWidgets) { .build(); let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -106,7 +106,7 @@ pub(crate) fn build_devices_page() -> (gtk4::Widget, DevicesWidgets) { inner.set_margin_start(18); inner.set_margin_end(18); inner.append(&content); - let (frame, header, _) = page_frame("Computers", &inner); + let (frame, header, _) = page_frame(&gettext("Computers"), &inner); header.pack_end(&refresh); ( @@ -158,8 +158,8 @@ pub(crate) fn load_devices(ui: &Rc) { devices_status( ui, "computer-symbolic", - "Loading…", - "Reading your computers.", + &gettext("Loading…"), + &gettext("Reading your computers."), false, ); ui.busy_begin(); @@ -206,8 +206,8 @@ pub(crate) fn devices_unreachable(ui: &Rc) { devices_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; @@ -215,8 +215,8 @@ pub(crate) fn devices_unreachable(ui: &Rc) { devices_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); @@ -249,11 +249,19 @@ pub(crate) fn repaint_devices(ui: &Rc, devices: &[DeviceInfo]) { *ui.devices.this_device.borrow_mut() = Some((me.uid.clone(), me.name.clone())); ui.devices .sync_group - .set_description(Some(&format!("Backing up as “{}”.", me.name))); + // Translators: {name} is the name of this computer's device. + .set_description(Some(&gettext_f( + "Backing up as “{name}”.", + &[("name", &me.name)], + ))); ui.devices.rename_this.set_sensitive(true); ui.devices .rename_this - .set_tooltip_text(Some(&format!("Rename this computer ({})", me.name))); + // Translators: {name} is the name of this computer's device. + .set_tooltip_text(Some(&gettext_f( + "Rename this computer ({name})", + &[("name", &me.name)], + ))); } None => { *ui.devices.this_device.borrow_mut() = None; @@ -263,8 +271,8 @@ pub(crate) fn repaint_devices(ui: &Rc, devices: &[DeviceInfo]) { let others: Vec<&DeviceInfo> = devices.iter().filter(|d| !d.this_device).collect(); if others.is_empty() { let row = adw::ActionRow::builder() - .title("No other computers") - .subtitle("Desktop apps syncing to this account appear here.") + .title(gettext("No other computers")) + .subtitle(gettext("Desktop apps syncing to this account appear here.")) .build(); row.add_prefix(>k4::Image::from_icon_name("computer-symbolic")); ui.devices.group.add(&row); @@ -288,21 +296,21 @@ pub(crate) fn repaint_devices(ui: &Rc, devices: &[DeviceInfo]) { let (ui_rs, uid_rs, name_rs) = (ui.clone(), dev.uid.clone(), dev.name.clone()); row.add_suffix(&more_menu_button(vec![ ( - "Restore to This Computer…", + &gettext("Restore to This Computer…"), Box::new(move || { prompt_restore_folders(&ui_rs, Some((uid_rs.clone(), name_rs.clone()))) }), ), ( - "Rename…", + &gettext("Rename…"), Box::new(move || prompt_rename_device(&ui_ren, &uid_ren, &name_ren)), ), ( - "Use This Computer's Identity…", + &gettext("Use This Computer's Identity…"), Box::new(move || prompt_adopt_device(&ui_ad, &uid_ad, &name_ad)), ), ( - "Remove Computer…", + &gettext("Remove Computer…"), Box::new(move || prompt_remove_device(&ui_rm, &uid_rm, &name_rm)), ), ])); @@ -317,10 +325,19 @@ pub(crate) fn repaint_devices(ui: &Rc, devices: &[DeviceInfo]) { /// "never" is the fact that tells the user this computer isn't backing anything up. pub(crate) fn device_subtitle(dev: &DeviceInfo) -> String { match dev.last_sync { - Some(secs) if secs > 0 => { - format!("{} · last synced {}", dev.device_type, activity_time(secs)) - } - _ => format!("{} · never synced", dev.device_type), + // Translators: {platform} is the device's platform (such as "Linux"), {time} a date and time. + Some(secs) if secs > 0 => gettext_f( + "{platform} · last synced {time}", + &[ + ("platform", &dev.device_type), + ("time", &activity_time(secs)), + ], + ), + // Translators: {platform} is the device's platform, such as "Linux". + _ => gettext_f( + "{platform} · never synced", + &[("platform", &dev.device_type)], + ), } } @@ -335,13 +352,13 @@ pub(crate) fn repaint_this_computer(ui: &Rc, folders: &[SyncFolderInfo]) { ui.devices.sync_group.remove(&row); } let row = adw::ActionRow::builder() - .title("This computer") + .title(gettext("This computer")) .subtitle(this_computer_subtitle(folders)) .build(); row.add_prefix(>k4::Image::from_icon_name("computer-symbolic")); let manage = gtk4::Button::builder() - .label("Open Sync") - .tooltip_text("Manage this computer's folders and mountpoint") + .label(gettext("Open Sync")) + .tooltip_text(gettext("Manage this computer's folders and mountpoint")) .valign(gtk4::Align::Center) .build(); manage.add_css_class("flat"); @@ -350,7 +367,7 @@ pub(crate) fn repaint_this_computer(ui: &Rc, folders: &[SyncFolderInfo]) { row.add_suffix(&manage); let ui_rs = ui.clone(); row.add_suffix(&more_menu_button(vec![( - "Restore Folders…", + &gettext("Restore Folders…"), Box::new(move || prompt_restore_folders(&ui_rs, None)), )])); ui.devices.sync_group.add(&row); @@ -361,30 +378,41 @@ pub(crate) fn repaint_this_computer(ui: &Rc, folders: &[SyncFolderInfo]) { /// attention — the one fact worth surfacing away from the folder list itself. pub(crate) fn this_computer_subtitle(folders: &[SyncFolderInfo]) -> String { if folders.is_empty() { - return "No folders backed up yet — add one on the Sync page.".to_string(); + return gettext("No folders backed up yet — add one on the Sync page."); } - let count = match folders.len() { - 1 => "1 folder backed up".to_string(), - n => format!("{n} folders backed up"), - }; + let count = ngettext_f( + "{n} folder backed up", + "{n} folders backed up", + folders.len() as u64, + &[], + ); let attention = folders .iter() .filter(|f| f.state == "error" || f.state == "conflict") .count(); match attention { - 0 => format!("{count} · manage them on the Sync page"), - 1 => format!("{count} · 1 needs attention"), - n => format!("{count} · {n} need attention"), + // Translators: {folders} is "N folders backed up". + 0 => gettext_f( + "{folders} · manage them on the Sync page", + &[("folders", &count)], + ), + // Translators: {folders} is "N folders backed up"; {n} counts the folders with a problem. + n => ngettext_f( + "{folders} · {n} needs attention", + "{folders} · {n} need attention", + n as u64, + &[("folders", &count)], + ), } } /// Human label for a synced folder's `state` column. -pub(crate) fn sync_state_label(state: &str) -> &str { +pub(crate) fn sync_state_label(state: &str) -> String { match state { - "syncing" => "syncing…", - "error" => "sync error", - "conflict" => "needs attention", - _ => "up to date", + "syncing" => gettext("syncing…"), + "error" => gettext("sync error"), + "conflict" => gettext("needs attention"), + _ => gettext("up to date"), } } @@ -396,18 +424,30 @@ pub(crate) fn sync_progress_label(p: &SyncProgress) -> String { match p.phase { // Before the first pass finishes there is no estimate, so the count would // be "checked 12 of 12" — worse than saying nothing. - SyncPhase::Scanning if p.total == 0 => "checking for changes…".to_string(), - SyncPhase::Scanning => format!( - "checking for changes — {} of {}", - p.done, - p.total.max(p.done) + SyncPhase::Scanning if p.total == 0 => gettext("checking for changes…"), + // Translators: {done} and {total} count folders and files checked so far. + SyncPhase::Scanning => gettext_f( + "checking for changes — {done} of {total}", + &[ + ("done", &p.done.to_string()), + ("total", &p.total.max(p.done).to_string()), + ], ), SyncPhase::Applying => { - let count = format!("{} of {}", p.done + 1, p.total.max(p.done + 1)); + let done = (p.done + 1).to_string(); + let total = p.total.max(p.done + 1).to_string(); if p.current.is_empty() { - format!("syncing {count}") + // Translators: {done} and {total} count the changes applied so far. + gettext_f( + "syncing {done} of {total}", + &[("done", &done), ("total", &total)], + ) } else { - format!("syncing {} — {count}", p.current) + // Translators: {file} is the path being synced; {done} and {total} count the changes applied so far. + gettext_f( + "syncing {file} — {done} of {total}", + &[("file", &p.current), ("done", &done), ("total", &total)], + ) } } } @@ -417,7 +457,7 @@ pub(crate) fn sync_progress_label(p: &SyncProgress) -> String { pub(crate) fn prompt_add_sync_folder(ui: &Rc) { let win = ui_window(ui); let dialog = gtk4::FileDialog::builder() - .title("Add Folder to Sync") + .title(gettext("Add Folder to Sync")) .build(); let ui = ui.clone(); dialog.select_folder(win.as_ref(), gio::Cancellable::NONE, move |res| { @@ -441,15 +481,15 @@ pub(crate) fn prompt_add_sync_folder(ui: &Rc) { // or too late (row flashes in). Instead let the periodic // `refresh_locations` tick pick the row up whenever it // actually lands, which is what keeps a running pass live too. - toast(&ui, "Syncing folder…"); + toast(&ui, &gettext("Syncing folder…")); } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't add folder", &message, kind) + toast_failure(&ui, &gettext("Couldn't add folder"), &message, kind) } _ => toast_error( &ui, - "Couldn't add folder", - "The mount service didn't respond.", + &gettext("Couldn't add folder"), + &gettext("The mount service didn't respond."), ), } }); @@ -480,13 +520,16 @@ pub(crate) fn prompt_restore_folders(ui: &Rc, device: Option<(String, String Ok(Ok(Response::RestorableFolders { items })) => { show_restore_picker(&ui, items, device) } - Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't list folders to restore", &message, kind) - } + Ok(Ok(Response::Error { message, kind })) => toast_failure( + &ui, + &gettext("Couldn't list folders to restore"), + &message, + kind, + ), _ => toast_error( &ui, - "Couldn't list folders to restore", - "The mount service didn't respond.", + &gettext("Couldn't list folders to restore"), + &gettext("The mount service didn't respond."), ), } }); @@ -510,9 +553,9 @@ fn show_restore_picker( } let group = adw::PreferencesGroup::builder() - .description( + .description(gettext( "Tick the folders to sync to this machine, and adjust where each one should live.", - ) + )) .build(); // Held so the response handler can read back what the user ticked and typed. let mut controls: Vec<(String, String, gtk4::CheckButton, adw::EntryRow)> = Vec::new(); @@ -534,14 +577,14 @@ fn show_restore_picker( .child(&group) .build(); let dialog = adw::AlertDialog::builder() - .heading("Restore folders") + .heading(gettext("Restore folders")) .body(restore_picker_body( device.as_ref().map(|(_, n)| n.as_str()), )) .extra_child(&scroll) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("restore", "Restore"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("restore", &gettext("Restore")); dialog.set_response_appearance("restore", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("restore")); dialog.set_close_response("cancel"); @@ -574,8 +617,8 @@ fn show_restore_picker( }, None => Request::RestoreSyncFolders { items }, }, - "Restoring folders…", - "Couldn't restore folders", + &gettext("Restoring folders…"), + &gettext("Couldn't restore folders"), ); }); dialog.present(win.as_ref()); @@ -584,19 +627,24 @@ fn show_restore_picker( /// The restore picker's body: whose backup the folders come from. pub(crate) fn restore_picker_body(device: Option<&str>) -> String { match device { - Some(name) => format!( - "These folders are backed up from “{name}”. Restored folders keep syncing with \ - that computer's copy." + // Translators: {name} is the name of another computer. + Some(name) => gettext_f( + "These folders are backed up from “{name}”. Restored folders keep syncing with that computer's copy.", + &[("name", name)], ), - None => "These folders are backed up under this computer in Proton Drive.".to_string(), + None => gettext("These folders are backed up under this computer in Proton Drive."), } } /// The toast when every folder of a device is already synced here. pub(crate) fn nothing_to_restore(device: Option<&str>) -> String { match device { - Some(name) => format!("Nothing to restore — “{name}”'s folders are all synced here."), - None => "Nothing to restore — this computer's folders are all synced here.".to_string(), + // Translators: {name} is the name of another computer. + Some(name) => gettext_f( + "Nothing to restore — “{name}”'s folders are all synced here.", + &[("name", name)], + ), + None => gettext("Nothing to restore — this computer's folders are all synced here."), } } @@ -619,19 +667,19 @@ pub(crate) fn set_sync_folder_mode(ui: &Rc, id: i64, mode: &'static str) { // pass, hence "will". Ok(Ok(Response::Ok { .. })) => toast( &ui, - if mode == "ondemand" { - "Folder will switch to on-demand" + &if mode == "ondemand" { + gettext("Folder will switch to on-demand") } else { - "Folder will download and stay synced" + gettext("Folder will download and stay synced") }, ), Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't change mode", &message, kind) + toast_failure(&ui, &gettext("Couldn't change mode"), &message, kind) } _ => toast_error( &ui, - "Couldn't change mode", - "The mount service didn't respond.", + &gettext("Couldn't change mode"), + &gettext("The mount service didn't respond."), ), } reload_sync_pages(&ui); @@ -660,36 +708,36 @@ pub(crate) fn prompt_remove_sync_folder(ui: &Rc, id: i64, path: &str, ondema // nasty surprise if the dialog claimed the local files were safe, and is // recoverable only by turning On-demand off *first* and letting it download. let body = if ondemand { - format!( - "Stop syncing “{path}”?\n\nThis folder is on-demand: its files live in Proton \ - Drive, not on this disk, so the folder will be empty once it is unmounted. To \ - keep a local copy, cancel, turn off On-demand, and wait for the download to \ - finish before removing it." + // Translators: {path} is a local folder path. + gettext_f( + "Stop syncing “{path}”?\n\nThis folder is on-demand: its files live in Proton Drive, not on this disk, so the folder will be empty once it is unmounted. To keep a local copy, cancel, turn off On-demand, and wait for the download to finish before removing it.", + &[("path", path)], ) } else { - format!( - "Stop syncing “{path}”?\n\nThe local files stay on this disk and simply stop \ - being synced. Choose whether to also delete the copy in Proton Drive." + // Translators: {path} is a local folder path. + gettext_f( + "Stop syncing “{path}”?\n\nThe local files stay on this disk and simply stop being synced. Choose whether to also delete the copy in Proton Drive.", + &[("path", path)], ) }; let dialog = adw::AlertDialog::builder() - .heading("Stop syncing folder") + .heading(gettext("Stop syncing folder")) .body(body) .build(); let group = adw::PreferencesGroup::new(); let delete_remote = adw::SwitchRow::builder() - .title("Also delete from Proton Drive") + .title(gettext("Also delete from Proton Drive")) .subtitle(if ondemand { - "Deletes the only copy of these files." + gettext("Deletes the only copy of these files.") } else { - "The local copy is unaffected." + gettext("The local copy is unaffected.") }) .active(false) .build(); group.add(&delete_remote); dialog.set_extra_child(Some(&group)); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("remove", "Stop Syncing"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("remove", &gettext("Stop Syncing")); dialog.set_response_appearance("remove", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -702,8 +750,8 @@ pub(crate) fn prompt_remove_sync_folder(ui: &Rc, id: i64, path: &str, ondema id, delete_remote: delete_remote.is_active(), }, - "Stopped syncing folder", - "Couldn't stop syncing the folder", + &gettext("Stopped syncing folder"), + &gettext("Couldn't stop syncing the folder"), ); } }); @@ -714,19 +762,20 @@ pub(crate) fn prompt_remove_sync_folder(ui: &Rc, id: i64, path: &str, ondema pub(crate) fn prompt_rename_device(ui: &Rc, uid: &str, current: &str) { let win = ui_window(ui); let dialog = adw::AlertDialog::builder() - .heading("Rename Computer") - .body(format!("Rename “{current}”.")) + .heading(gettext("Rename Computer")) + // Translators: {name} is the computer's current name. + .body(gettext_f("Rename “{name}”.", &[("name", current)])) .build(); let group = adw::PreferencesGroup::new(); let row = adw::EntryRow::builder() - .title("New name") + .title(gettext("New name")) .activates_default(true) .build(); row.set_text(current); group.add(&row); dialog.set_extra_child(Some(&group)); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("rename", "Rename"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("rename", &gettext("Rename")); dialog.set_response_appearance("rename", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("rename")); dialog.set_close_response("cancel"); @@ -738,7 +787,11 @@ pub(crate) fn prompt_rename_device(ui: &Rc, uid: &str, current: &str) { } let name = row.text().trim().to_string(); if name.is_empty() { - toast_error(&ui, "Couldn't rename the computer", "A name is required."); + toast_error( + &ui, + &gettext("Couldn't rename the computer"), + &gettext("A name is required."), + ); return; } run_devices_mutation( @@ -747,8 +800,8 @@ pub(crate) fn prompt_rename_device(ui: &Rc, uid: &str, current: &str) { uid: uid.clone(), name, }, - "Computer renamed", - "Couldn't rename the computer", + &gettext("Computer renamed"), + &gettext("Couldn't rename the computer"), ); }); dialog.present(win.as_ref()); @@ -759,21 +812,22 @@ pub(crate) fn prompt_rename_device(ui: &Rc, uid: &str, current: &str) { pub(crate) fn prompt_remove_device(ui: &Rc, uid: &str, name: &str) { let win = ui_window(ui); let confirm = adw::EntryRow::builder() - .title(format!("Type “{name}” to confirm")) + // Translators: {name} is the computer's name, which the user must type. + .title(gettext_f("Type “{name}” to confirm", &[("name", name)])) .build(); let group = adw::PreferencesGroup::new(); group.add(&confirm); let dialog = adw::AlertDialog::builder() - .heading("Remove Computer") - .body(format!( - "Remove “{name}” from this account?\n\nEverything it backed up to Proton Drive is \ - deleted along with it. The files on that computer itself are not touched — but \ - this cannot be undone from here." + .heading(gettext("Remove Computer")) + // Translators: {name} is the name of the computer being removed. + .body(gettext_f( + "Remove “{name}” from this account?\n\nEverything it backed up to Proton Drive is deleted along with it. The files on that computer itself are not touched — but this cannot be undone from here.", + &[("name", name)], )) .extra_child(&group) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("remove", "Remove"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("remove", &gettext("Remove")); dialog.set_response_appearance("remove", adw::ResponseAppearance::Destructive); dialog.set_response_enabled("remove", false); dialog.set_default_response(Some("cancel")); @@ -790,8 +844,8 @@ pub(crate) fn prompt_remove_device(ui: &Rc, uid: &str, name: &str) { run_devices_mutation( &ui, Request::DeleteDevice { uid: uid.clone() }, - "Computer removed", - "Couldn't remove the computer", + &gettext("Computer removed"), + &gettext("Couldn't remove the computer"), ); } }); @@ -808,16 +862,15 @@ pub(crate) fn prompt_remove_device(ui: &Rc, uid: &str, name: &str) { pub(crate) fn prompt_adopt_device(ui: &Rc, uid: &str, name: &str) { let win = ui_window(ui); let dialog = adw::AlertDialog::builder() - .heading("Use this computer's identity") - .body(format!( - "Treat this machine as “{name}”?\n\nNew synced folders are created under that \ - computer in Proton Drive, and this machine keeps that identity even if its hostname \ - changes. Folders already synced here are not moved.\n\nUse “Restore folders” \ - afterwards to bring back what “{name}” was syncing." + .heading(gettext("Use this computer's identity")) + // Translators: {name} is the name of the other computer whose identity is adopted. + .body(gettext_f( + "Treat this machine as “{name}”?\n\nNew synced folders are created under that computer in Proton Drive, and this machine keeps that identity even if its hostname changes. Folders already synced here are not moved.\n\nUse “Restore folders” afterwards to bring back what “{name}” was syncing.", + &[("name", name)], )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("adopt", "Use identity"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("adopt", &gettext("Use identity")); dialog.set_response_appearance("adopt", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -830,8 +883,8 @@ pub(crate) fn prompt_adopt_device(ui: &Rc, uid: &str, name: &str) { Request::AdoptDevice { uid: Some(uid.clone()), }, - "Identity adopted", - "Couldn't adopt that computer", + &gettext("Identity adopted"), + &gettext("Couldn't adopt that computer"), ); } }); @@ -839,16 +892,12 @@ pub(crate) fn prompt_adopt_device(ui: &Rc, uid: &str, name: &str) { } /// Run a mutation raised from Computers or Locations and reload the page on success. -pub(crate) fn run_devices_mutation( - ui: &Rc, - req: Request, - done: &'static str, - failed: &'static str, -) { +pub(crate) fn run_devices_mutation(ui: &Rc, req: Request, done: &str, failed: &str) { ui.busy_begin(); let rx = spawn_request(ui.dirs.control_socket(), req); let ui = ui.clone(); let done = done.to_string(); + let failed = failed.to_string(); glib::spawn_future_local(async move { let result = rx.recv().await; ui.busy_end(); @@ -857,8 +906,10 @@ pub(crate) fn run_devices_mutation( reload_sync_pages(&ui); toast(&ui, &done); } - Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, failed, &message, kind), - _ => toast_error(&ui, failed, "The mount service didn't respond."), + Ok(Ok(Response::Error { message, kind })) => { + toast_failure(&ui, &failed, &message, kind) + } + _ => toast_error(&ui, &failed, &gettext("The mount service didn't respond.")), } }); } diff --git a/crates/pdfs-gui/src/app/pages/locations.rs b/crates/pdfs-gui/src/app/pages/locations.rs index a73f642..10ea8ff 100644 --- a/crates/pdfs-gui/src/app/pages/locations.rs +++ b/crates/pdfs-gui/src/app/pages/locations.rs @@ -86,22 +86,23 @@ pub(crate) fn build_locations_page() -> (gtk4::Widget, LocationsWidgets) { let add_folder = gtk4::Button::builder() .child( &adw::ButtonContent::builder() - .label("Add Folder") + .label(gettext("Add Folder")) .icon_name("list-add-symbolic") .build(), ) - .tooltip_text("Back a local folder up to this computer's Proton Drive device") + .tooltip_text(gettext( + "Back a local folder up to this computer's Proton Drive device", + )) .build(); let refresh = refresh_button(); let transfers_group = build_transfers_group(); let (card, card_icon, card_row, pause) = build_sync_card(); let (queue_group, retry_all) = build_queue_group(); let conflicts_group = adw::PreferencesGroup::builder() - .title("Conflicts") - .description( - "Files changed in two places at once. Both versions were kept; choose which \ - one stays.", - ) + .title(gettext("Conflicts")) + .description(gettext( + "Files changed in two places at once. Both versions were kept; choose which one stays.", + )) .visible(false) .build(); @@ -109,12 +110,8 @@ pub(crate) fn build_locations_page() -> (gtk4::Widget, LocationsWidgets) { // on-demand switch removes the local copy, which is not a thing to discover // after the fact. let group = adw::PreferencesGroup::builder() - .title("On this computer") - .description( - "Where Proton Drive lives on this machine. Synced folders keep a full copy on \ - this disk; on-demand folders keep the files in Proton Drive only and fetch \ - them as you open them.", - ) + .title(gettext("On this computer")) + .description(gettext("Where Proton Drive lives on this machine. Synced folders keep a full copy on this disk; on-demand folders keep the files in Proton Drive only and fetch them as you open them.")) .build(); let groups = gtk4::Box::new(gtk4::Orientation::Vertical, 18); @@ -134,7 +131,7 @@ pub(crate) fn build_locations_page() -> (gtk4::Widget, LocationsWidgets) { .build(); let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -142,7 +139,7 @@ pub(crate) fn build_locations_page() -> (gtk4::Widget, LocationsWidgets) { retry.set_visible(false); let status = adw::StatusPage::builder() .icon_name("drive-harddisk-symbolic") - .title("Loading…") + .title(gettext("Loading…")) .child(&retry) .build(); // A bare `StatusPage` asks for more width than a half-screen window has, and @@ -165,7 +162,7 @@ pub(crate) fn build_locations_page() -> (gtk4::Widget, LocationsWidgets) { page.set_margin_start(18); page.set_margin_end(18); page.append(&content); - let (frame, header, _) = page_frame("Sync", &page); + let (frame, header, _) = page_frame(&pgettext("page", "Sync"), &page); header.pack_start(&add_folder); header.pack_end(&refresh); @@ -219,24 +216,29 @@ fn build_sync_card() -> ( .build(); icon.add_css_class("sidebar-status"); let menu = gio::Menu::new(); - menu.append(Some("Pause for 1 Hour"), Some("sync.pause-for(int64 3600)")); menu.append( - Some("Pause for 8 Hours"), + Some(&gettext("Pause for 1 Hour")), + Some("sync.pause-for(int64 3600)"), + ); + menu.append( + Some(&gettext("Pause for 8 Hours")), Some("sync.pause-for(int64 28800)"), ); menu.append( - Some("Pause for 24 Hours"), + Some(&gettext("Pause for 24 Hours")), Some("sync.pause-for(int64 86400)"), ); let pause = adw::SplitButton::builder() - .label("Pause") + .label(pgettext("verb", "Pause")) .menu_model(&menu) .valign(gtk4::Align::Center) - .tooltip_text("Stop uploading until you resume. Files still open as usual.") - .dropdown_tooltip("Pause for a while") + .tooltip_text(gettext( + "Stop uploading until you resume. Files still open as usual.", + )) + .dropdown_tooltip(gettext("Pause for a while")) .build(); let row = adw::ActionRow::builder() - .title("Checking…") + .title(gettext("Checking…")) .title_lines(1) .subtitle_lines(2) .build(); @@ -269,12 +271,15 @@ pub(crate) fn paint_sync_card( card.row.set_title(title); card.row.set_subtitle(detail.unwrap_or_default()); card.paused.set(paused); - card.pause - .set_label(if paused { "Resume" } else { "Pause" }); - card.pause.set_tooltip_text(Some(if paused { - "Upload everything that waited while sync was paused" + card.pause.set_label(&if paused { + pgettext("verb", "Resume") } else { - "Stop uploading until you resume. Files still open as usual." + pgettext("verb", "Pause") + }); + card.pause.set_tooltip_text(Some(&if paused { + gettext("Upload everything that waited while sync was paused") + } else { + gettext("Stop uploading until you resume. Files still open as usual.") })); if paused { card.pause.add_css_class("suggested-action"); @@ -320,21 +325,21 @@ fn set_sync_paused(ui: &Rc, paused: bool, until: Option) { let ui = ui.clone(); glib::spawn_future_local(async move { let what = if paused { - "Couldn't pause sync" + gettext("Couldn't pause sync") } else { - "Couldn't resume sync" + gettext("Couldn't resume sync") }; match rx.recv().await { Ok(Ok(Response::Ok { .. })) => toast( &ui, - match (paused, until) { - (false, _) => "Sync resumed", - (true, None) => "Sync paused until you resume", - (true, Some(_)) => "Sync paused", + &match (paused, until) { + (false, _) => gettext("Sync resumed"), + (true, None) => gettext("Sync paused until you resume"), + (true, Some(_)) => gettext("Sync paused"), }, ), - Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, what, &message, kind), - _ => toast_error(&ui, what, "The mount service didn't respond."), + Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, &what, &message, kind), + _ => toast_error(&ui, &what, &gettext("The mount service didn't respond.")), } ui.locations.card.pause.set_sensitive(true); refresh_status(&ui); @@ -344,15 +349,17 @@ fn set_sync_paused(ui: &Rc, paused: bool, until: Option) { /// The queue list, hidden while nothing waits. fn build_queue_group() -> (adw::PreferencesGroup, gtk4::Button) { let retry_all = gtk4::Button::builder() - .label("Retry All") + .label(gettext("Retry All")) .valign(gtk4::Align::Center) - .tooltip_text("Try every failed change again now") + .tooltip_text(gettext("Try every failed change again now")) .visible(false) .build(); retry_all.add_css_class("flat"); let group = adw::PreferencesGroup::builder() - .title("Waiting to Upload") - .description("Changes made on this computer that are not on Proton Drive yet.") + .title(gettext("Waiting to Upload")) + .description(gettext( + "Changes made on this computer that are not on Proton Drive yet.", + )) .header_suffix(&retry_all) .visible(false) .build(); @@ -406,13 +413,11 @@ fn repaint_queue(ui: &Rc, items: &[PendingOpInfo]) { .set_visible(items.iter().any(|op| op.attempts > 0 && !op.parked)); let hidden = items.len().saturating_sub(QUEUE_ROWS_SHOWN); queue.group.set_description(Some(&if hidden > 0 { - format!( - "Changes made on this computer that are not on Proton Drive yet. \ - Showing the first {QUEUE_ROWS_SHOWN} of {}.", - items.len() - ) + let shown = QUEUE_ROWS_SHOWN.to_string(); + // Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. + ngettext_f("Changes made on this computer that are not on Proton Drive yet. Showing the first {shown} of {n}.", "Changes made on this computer that are not on Proton Drive yet. Showing the first {shown} of {n}.", items.len() as u64, &[("shown", &shown)]) } else { - "Changes made on this computer that are not on Proton Drive yet.".to_string() + gettext("Changes made on this computer that are not on Proton Drive yet.") })); let now = glib::DateTime::now_utc() .map(|now| now.to_unix()) @@ -427,26 +432,36 @@ fn repaint_queue(ui: &Rc, items: &[PendingOpInfo]) { fn queue_row(ui: &Rc, op: &PendingOpInfo, now: i64) -> adw::ActionRow { let (icon, action) = match op.kind.as_str() { - "revision" => ("pdfs-upload-symbolic", "Upload changes"), - "create" => ("pdfs-upload-symbolic", "Upload new file"), - "mkdir" => ("folder-new-symbolic", "Create folder"), - "rename" => ("document-edit-symbolic", "Rename or move"), - "trash" => ("user-trash-symbolic", "Move to trash"), - _ => ("emblem-synchronizing-symbolic", "Change"), + "revision" => ("pdfs-upload-symbolic", gettext("Upload changes")), + "create" => ("pdfs-upload-symbolic", gettext("Upload new file")), + "mkdir" => ("folder-new-symbolic", gettext("Create folder")), + "rename" => ("document-edit-symbolic", gettext("Rename or move")), + "trash" => ("user-trash-symbolic", gettext("Move to trash")), + // Translators: a queued change of an unknown kind. + _ => ("emblem-synchronizing-symbolic", pgettext("noun", "Change")), }; let state = match (op.parked, op.next_attempt_at) { - (true, _) => "waiting for the app writing it to finish".to_string(), + (true, _) => gettext("waiting for the app writing it to finish"), (false, Some(at)) if at > now && op.attempts > 0 => { - format!("retrying {}", clock_time(at)) + // Translators: {time} is when the next attempt happens, such as "14:30". + gettext_f("retrying {time}", &[("time", &clock_time(at))]) } - (false, _) if ui.locations.card.paused.get() => "waiting for sync to resume".to_string(), - (false, _) => "up next".to_string(), + (false, _) if ui.locations.card.paused.get() => gettext("waiting for sync to resume"), + (false, _) => gettext("up next"), }; - let mut subtitle = format!("{action} · {state}"); + // Translators: a queued change's kind and its state, such as "Upload changes · up next". + let mut subtitle = gettext_f( + "{action} · {state}", + &[("action", &action), ("state", &state)], + ); if let Some(error) = &op.last_error { - subtitle.push_str(&format!( - "\nFailed {}: {error}", - count_noun(op.attempts.max(0) as usize, "time", "times") + subtitle.push('\n'); + // Translators: {n} is how many attempts failed, {error} the last error message. + subtitle.push_str(&ngettext_f( + "Failed {n} time: {error}", + "Failed {n} times: {error}", + op.attempts.max(0) as u64, + &[("error", error)], )); } let row = adw::ActionRow::builder() @@ -469,7 +484,7 @@ fn queue_row(ui: &Rc, op: &PendingOpInfo, now: i64) -> adw::ActionRow { if waiting { let retry = gtk4::Button::builder() .icon_name("view-refresh-symbolic") - .tooltip_text("Retry now") + .tooltip_text(gettext("Retry now")) .valign(gtk4::Align::Center) .build(); retry.add_css_class("flat"); @@ -488,14 +503,18 @@ fn retry_queued(ui: &Rc, id: Option) { glib::spawn_future_local(async move { match rx.recv().await { Ok(Ok(Response::Ok { .. })) => { - toast(&ui, "Retrying now…"); + toast(&ui, &gettext("Retrying now…")); ui.locations.queue.painted.borrow_mut().clear(); refresh_queue(&ui); } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't retry", &message, kind) + toast_failure(&ui, &gettext("Couldn't retry"), &message, kind) } - _ => toast_error(&ui, "Couldn't retry", "The mount service didn't respond."), + _ => toast_error( + &ui, + &gettext("Couldn't retry"), + &gettext("The mount service didn't respond."), + ), } }); } @@ -565,20 +584,27 @@ fn repaint_conflicts(ui: &Rc, items: &[ConflictInfo]) { /// "12.3 MB, changed at 14:30": one side of a conflict. fn conflict_side(size: u64, modified: i64) -> String { - format!( - "{}, changed {}", - glib::format_size(size), - clock_time(modified) + // Translators: one side of a conflict; {size} is a file size such as "12.3 MB", {time} when it was changed, such as "14:30". + gettext_f( + "{size}, changed {time}", + &[ + ("size", &glib::format_size(size)), + ("time", &clock_time(modified)), + ], ) } pub(crate) fn conflict_row(ui: &Rc, conflict: &ConflictInfo) -> adw::ActionRow { let verdict = if !conflict.original_exists { - "The original is gone; only this copy is left".to_string() + gettext("The original is gone; only this copy is left") } else if conflict.identical { - "Same content as the original".to_string() + gettext("Same content as the original") } else { - format!("Differs from {}", file_name(&conflict.original_path)) + // Translators: {name} is the original file's name. + gettext_f( + "Differs from {name}", + &[("name", file_name(&conflict.original_path))], + ) }; let row = adw::ActionRow::builder() .title(glib::markup_escape_text(&conflict.path).as_str()) @@ -608,36 +634,45 @@ pub(crate) fn prompt_resolve_conflict(ui: &Rc, conflict: &ConflictInfo) { let copy_name = file_name(&conflict.path).to_string(); let original_name = file_name(&conflict.original_path).to_string(); let body = match (conflict.original_size, conflict.original_modified) { - (Some(size), Some(modified)) if conflict.original_exists => format!( - "“{original_name}” was changed here and elsewhere at the same time.\n\n\ - Original: {}\nCopy: {}\n\n\ - Whatever is not kept goes to Trash, where it can be restored.", - conflict_side(size, modified), - conflict_side(conflict.size, conflict.modified), - ), - _ => format!( - "The original “{original_name}” no longer exists; only the copy is left \ - ({}).\n\nKeep the copy to give it the original name back.", - conflict_side(conflict.size, conflict.modified), - ), + (Some(size), Some(modified)) if conflict.original_exists => { + let original = conflict_side(size, modified); + let copy = conflict_side(conflict.size, conflict.modified); + // Translators: {name} is the file name; {original} and {copy} each read like "12.3 MB, changed 14:30". + gettext_f( + "“{name}” was changed here and elsewhere at the same time.\n\nOriginal: {original}\nCopy: {copy}\n\nWhatever is not kept goes to Trash, where it can be restored.", + &[ + ("name", &original_name), + ("original", &original), + ("copy", ©), + ], + ) + } + _ => { + let copy = conflict_side(conflict.size, conflict.modified); + // Translators: {name} is the file name; {copy} reads like "12.3 MB, changed 14:30". + gettext_f( + "The original “{name}” no longer exists; only the copy is left ({copy}).\n\nKeep the copy to give it the original name back.", + &[("name", &original_name), ("copy", ©)], + ) + } }; let dialog = adw::AlertDialog::builder() - .heading("Resolve conflict") + .heading(gettext("Resolve conflict")) .body(body) .build(); let group = adw::PreferencesGroup::new(); let name_row = adw::EntryRow::builder() - .title("Name for the copy, if keeping both") + .title(gettext("Name for the copy, if keeping both")) .build(); name_row.set_text(©_name); group.add(&name_row); dialog.set_extra_child(Some(&group)); - dialog.add_response("cancel", "Cancel"); + dialog.add_response("cancel", &gettext("Cancel")); if conflict.original_exists { - dialog.add_response("original", "Keep Original"); - dialog.add_response("both", "Keep Both"); + dialog.add_response("original", &gettext("Keep Original")); + dialog.add_response("both", &gettext("Keep Both")); } - dialog.add_response("copy", "Keep Copy"); + dialog.add_response("copy", &gettext("Keep Copy")); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); // Keeping both is a rename, so it needs a name that is neither side's. @@ -692,13 +727,16 @@ fn resolve_conflict(ui: &Rc, path: String, keep: ConflictKeep) { refresh_conflicts(&ui, true); refresh_activity_conflicts(&ui, true); } - Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't resolve the conflict", &message, kind) - } + Ok(Ok(Response::Error { message, kind })) => toast_failure( + &ui, + &gettext("Couldn't resolve the conflict"), + &message, + kind, + ), _ => toast_error( &ui, - "Couldn't resolve the conflict", - "The mount service didn't respond.", + &gettext("Couldn't resolve the conflict"), + &gettext("The mount service didn't respond."), ), } }); @@ -737,8 +775,8 @@ pub(crate) fn load_locations(ui: &Rc) { locations_status( ui, "drive-harddisk-symbolic", - "Loading…", - "Reading this computer's Proton Drive locations.", + &gettext("Loading…"), + &gettext("Reading this computer's Proton Drive locations."), false, ); ui.busy_begin(); @@ -759,7 +797,7 @@ pub(crate) fn load_locations(ui: &Rc) { locations_status( &ui, "dialog-warning-symbolic", - "Unavailable", + &gettext("Unavailable"), &message, true, ); @@ -803,8 +841,8 @@ pub(crate) fn locations_unreachable(ui: &Rc) { locations_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; @@ -812,8 +850,8 @@ pub(crate) fn locations_unreachable(ui: &Rc) { locations_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); @@ -830,8 +868,10 @@ pub(crate) fn repaint_locations(ui: &Rc, items: &[MountSpec]) { } if items.is_empty() { let row = adw::ActionRow::builder() - .title("No locations") - .subtitle("The mount service hasn't reported a mountpoint yet.") + .title(gettext("No locations")) + .subtitle(gettext( + "The mount service hasn't reported a mountpoint yet.", + )) .build(); row.add_prefix(>k4::Image::from_icon_name("drive-harddisk-symbolic")); ui.locations.group.add(&row); @@ -855,7 +895,7 @@ pub(crate) fn repaint_locations(ui: &Rc, items: &[MountSpec]) { // visible; saying so on the row is cheaper than letting the user find out // from a save dialog. if spec.access == MountAccess::Ro { - let badge = gtk4::Label::new(Some("Read-only")); + let badge = gtk4::Label::new(Some(&gettext("Read-only"))); badge.add_css_class("dim-label"); badge.add_css_class("caption"); badge.set_valign(gtk4::Align::Center); @@ -887,7 +927,7 @@ pub(crate) fn repaint_locations(ui: &Rc, items: &[MountSpec]) { let open = gtk4::Button::builder() .icon_name("folder-open-symbolic") - .tooltip_text("Open this folder") + .tooltip_text(gettext("Open this folder")) .valign(gtk4::Align::Center) .build(); open.add_css_class("flat"); @@ -906,8 +946,10 @@ pub(crate) fn repaint_locations(ui: &Rc, items: &[MountSpec]) { /// [`prompt_mountpoint`] dialog. fn add_my_files_controls(ui: &Rc, row: &adw::ActionRow) { let change = gtk4::Button::builder() - .label("Change") - .tooltip_text("Choose a different folder for the Proton Drive mount") + .label(pgettext("verb", "Change")) + .tooltip_text(gettext( + "Choose a different folder for the Proton Drive mount", + )) .valign(gtk4::Align::Center) .build(); change.add_css_class("flat"); @@ -923,9 +965,12 @@ fn add_device_controls(ui: &Rc, row: &adw::ActionRow, spec: &MountSpec, id: let (icon, tooltip) = match spec.paused { true => ( "media-playback-start-symbolic", - "Resume syncing this folder", + gettext("Resume syncing this folder"), + ), + false => ( + "media-playback-pause-symbolic", + gettext("Pause syncing this folder"), ), - false => ("media-playback-pause-symbolic", "Pause syncing this folder"), }; let pause = gtk4::Button::builder() .icon_name(icon) @@ -942,7 +987,7 @@ fn add_device_controls(ui: &Rc, row: &adw::ActionRow, spec: &MountSpec, id: if spec.mode != MountMode::OnDemand && !spec.paused { let sync_now = gtk4::Button::builder() .icon_name("view-refresh-symbolic") - .tooltip_text("Sync this folder now") + .tooltip_text(gettext("Sync this folder now")) .valign(gtk4::Align::Center) .build(); sync_now.add_css_class("flat"); @@ -957,11 +1002,7 @@ fn add_device_controls(ui: &Rc, row: &adw::ActionRow, spec: &MountSpec, id: // a spurious request. let target = spec.pending_mode.unwrap_or(spec.mode); let ondemand = gtk4::Switch::builder() - .tooltip_text( - "On-demand: free this disk by keeping the files in Proton Drive only, \ - fetching each as you open it. Turn off to download them back and keep a \ - full local copy.", - ) + .tooltip_text(gettext("On-demand: free this disk by keeping the files in Proton Drive only, fetching each as you open it. Turn off to download them back and keep a full local copy.")) .valign(gtk4::Align::Center) .active(target == MountMode::OnDemand) // The daemon refuses a mode switch on a paused folder. @@ -985,7 +1026,7 @@ fn add_device_controls(ui: &Rc, row: &adw::ActionRow, spec: &MountSpec, id: let remove = gtk4::Button::builder() .icon_name("media-playback-stop-symbolic") - .tooltip_text("Stop syncing this folder") + .tooltip_text(gettext("Stop syncing this folder")) .valign(gtk4::Align::Center) .build(); remove.add_css_class("flat"); @@ -1002,14 +1043,12 @@ fn add_device_controls(ui: &Rc, row: &adw::ActionRow, spec: &MountSpec, id: /// space by removing the local copies, which is not something to do by accident. fn confirm_ondemand(ui: &Rc, id: i64, path: &str) { let dialog = adw::AlertDialog::builder() - .heading("Make Folder On-Demand?") - .body(format!( - "Files in {path} will be removed from this computer and kept in Proton \ - Drive only. Each file downloads again when you open it." - )) + .heading(gettext("Make Folder On-Demand?")) + // Translators: {path} is a local folder path. + .body(gettext_f("Files in {path} will be removed from this computer and kept in Proton Drive only. Each file downloads again when you open it.", &[("path", path)])) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("ondemand", "Make On-Demand"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("ondemand", &gettext("Make On-Demand")); dialog.set_response_appearance("ondemand", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -1034,19 +1073,21 @@ fn set_folder_paused(ui: &Rc, id: i64, paused: bool) { let ui = ui.clone(); glib::spawn_future_local(async move { let failed = match paused { - true => "Couldn't pause the folder", - false => "Couldn't resume the folder", + true => gettext("Couldn't pause the folder"), + false => gettext("Couldn't resume the folder"), }; match rx.recv().await { Ok(Ok(Response::Ok { .. })) => toast( &ui, - match paused { - true => "Folder paused", - false => "Folder resumed", + &match paused { + true => gettext("Folder paused"), + false => gettext("Folder resumed"), }, ), - Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, failed, &message, kind), - _ => toast_error(&ui, failed, "The mount service didn't respond."), + Ok(Ok(Response::Error { message, kind })) => { + toast_failure(&ui, &failed, &message, kind) + } + _ => toast_error(&ui, &failed, &gettext("The mount service didn't respond.")), } refresh_locations(&ui); }); @@ -1058,11 +1099,15 @@ fn sync_folder_now(ui: &Rc, id: i64) { let ui = ui.clone(); glib::spawn_future_local(async move { match rx.recv().await { - Ok(Ok(Response::Ok { .. })) => toast(&ui, "Syncing folder…"), + Ok(Ok(Response::Ok { .. })) => toast(&ui, &gettext("Syncing folder…")), Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't sync", &message, kind) + toast_failure(&ui, &gettext("Couldn't sync"), &message, kind) } - _ => toast_error(&ui, "Couldn't sync", "The mount service didn't respond."), + _ => toast_error( + &ui, + &gettext("Couldn't sync"), + &gettext("The mount service didn't respond."), + ), } }); } @@ -1085,21 +1130,23 @@ pub(crate) fn location_icon(kind: &MountKind) -> &'static str { pub(crate) fn location_subtitle(spec: &MountSpec) -> String { let mut parts: Vec = Vec::new(); match &spec.kind { - MountKind::MyFiles => parts.push("My files".to_string()), - MountKind::Shared { .. } => parts.push("Shared folder".to_string()), + MountKind::MyFiles => parts.push(gettext("My files")), + MountKind::Shared { .. } => parts.push(gettext("Shared folder")), MountKind::Device { .. } => match (spec.pending_mode, spec.mode) { - (Some(MountMode::OnDemand), _) => parts.push("Going on-demand".to_string()), - (Some(MountMode::Mirror), _) => parts.push("Switching to synced".to_string()), + (Some(MountMode::OnDemand), _) => parts.push(gettext("Going on-demand")), + (Some(MountMode::Mirror), _) => parts.push(gettext("Switching to synced")), (Some(MountMode::Unknown) | None, MountMode::OnDemand) => { - parts.push("On-demand".to_string()) + // Translators: a folder mode: files are kept online and fetched when opened. + parts.push(pgettext("folder mode", "On-demand")) } - (Some(MountMode::Unknown) | None, _) => parts.push("Synced".to_string()), + // Translators: a folder mode: a full copy is kept on this computer. + (Some(MountMode::Unknown) | None, _) => parts.push(pgettext("folder mode", "Synced")), }, } if matches!(spec.kind, MountKind::Device { .. }) { parts.push(match &spec.progress { Some(p) => sync_progress_label(p), - None if spec.paused => "paused".to_string(), + None if spec.paused => pgettext("state", "paused"), None => sync_state_label(&spec.state).to_string(), }); } @@ -1109,7 +1156,7 @@ pub(crate) fn location_subtitle(spec: &MountSpec) -> String { || spec.mode == MountMode::OnDemand || spec.pending_mode == Some(MountMode::OnDemand); if expects_session && !spec.mounted { - parts.push("not mounted".to_string()); + parts.push(gettext("not mounted")); } parts.join(" · ") } diff --git a/crates/pdfs-gui/src/app/pages/login.rs b/crates/pdfs-gui/src/app/pages/login.rs index 7180c0a..cc5b7ad 100644 --- a/crates/pdfs-gui/src/app/pages/login.rs +++ b/crates/pdfs-gui/src/app/pages/login.rs @@ -21,19 +21,23 @@ const RESET_PASSWORD_URL: &str = "https://account.proton.me/reset-password"; /// only when the account actually requires it. pub(crate) fn build_login_page() -> (gtk4::Widget, LoginState) { let group = adw::PreferencesGroup::builder() - .title("Sign in to Proton") - .description("Use your Proton account to connect Drive.") + .title(gettext("Sign in to Proton")) + .description(gettext("Use your Proton account to connect Drive.")) .build(); - let email = adw::EntryRow::builder().title("Email or username").build(); - let password = adw::PasswordEntryRow::builder().title("Password").build(); + let email = adw::EntryRow::builder() + .title(gettext("Email or username")) + .build(); + let password = adw::PasswordEntryRow::builder() + .title(gettext("Password")) + .build(); group.add(&email); group.add(&password); let login_spinner = gtk4::Spinner::builder().visible(false).build(); let button_content = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); button_content.append(&login_spinner); - button_content.append(>k4::Label::new(Some("Sign in"))); + button_content.append(>k4::Label::new(Some(&gettext("Sign in")))); let login_button = gtk4::Button::builder() .child(&button_content) .halign(gtk4::Align::Center) @@ -68,10 +72,13 @@ pub(crate) fn build_login_page() -> (gtk4::Widget, LoginState) { inner.append(&login_status); let links = gtk4::Box::new(gtk4::Orientation::Horizontal, 0); links.set_halign(gtk4::Align::Center); - links.append(>k4::LinkButton::with_label(SIGNUP_URL, "Create account")); + links.append(>k4::LinkButton::with_label( + SIGNUP_URL, + &gettext("Create account"), + )); links.append(>k4::LinkButton::with_label( RESET_PASSWORD_URL, - "Forgot password?", + &gettext("Forgot password?"), )); inner.append(&links); @@ -115,12 +122,12 @@ pub(crate) fn wire_login(ui: &Rc) { if username.is_empty() || password.is_empty() { ui.login .login_status - .set_text("Enter your email and password."); + .set_text(&gettext("Enter your email and password.")); return; } set_signing_in(&ui, true); - ui.login.login_status.set_text("Signing in…"); + ui.login.login_status.set_text(&gettext("Signing in…")); let (rx, totp_req_rx, hv_req_rx) = spawn_login(username, password); // Surface the 2FA dialog only if the SDK actually asks for a code (i.e. @@ -145,7 +152,7 @@ pub(crate) fn wire_login(ui: &Rc) { ui_hv .login .login_status - .set_text("Complete the verification to continue…"); + .set_text(&gettext("Complete the verification to continue…")); prompt_human_verification(&ui_hv, &url, token_tx); } }); @@ -155,7 +162,7 @@ pub(crate) fn wire_login(ui: &Rc) { let result = rx .recv() .await - .unwrap_or_else(|_| Err("login cancelled".into())); + .unwrap_or_else(|_| Err(gettext("login cancelled"))); set_signing_in(&ui, false); match result { Ok(()) => { @@ -189,28 +196,28 @@ pub(crate) fn login_error_message(error: &pdfs_core::Error) -> String { use pdfs_core::proton_sdk::ProtonError; match error { pdfs_core::Error::Proton(ProtonError::Api(api)) if api.http_status == 429 => { - "Too many sign-in attempts. Wait a few minutes and try again.".to_string() + gettext("Too many sign-in attempts. Wait a few minutes and try again.") } pdfs_core::Error::Proton(ProtonError::Api(api)) if !api.message.is_empty() => { api.message.clone() } pdfs_core::Error::Proton(ProtonError::Transport(_)) => { - "Couldn't reach Proton. Check your internet connection and try again.".to_string() - } - pdfs_core::Error::Keyring(_) => { - "Signed in, but the session couldn't be saved to the system keyring. Make sure a \ - keyring (GNOME Keyring or KWallet) is running and unlocked." - .to_string() + gettext("Couldn't reach Proton. Check your internet connection and try again.") } + pdfs_core::Error::Keyring(_) => gettext( + "Signed in, but the session couldn't be saved to the system keyring. Make sure a keyring (GNOME Keyring or KWallet) is running and unlocked.", + ), pdfs_core::Error::Other(message) if message.contains("two-factor") => { - "Sign-in cancelled: no two-factor code was entered.".to_string() + gettext("Sign-in cancelled: no two-factor code was entered.") } - pdfs_core::Error::Other(message) if message.contains("verification") => { - "Sign-in cancelled: the verification wasn't completed. Sign in again to get a new \ - one." - .to_string() + pdfs_core::Error::Other(message) if message.contains("verification") => gettext( + "Sign-in cancelled: the verification wasn't completed. Sign in again to get a new one.", + ), + other => { + let error = other.to_string(); + // Translators: {error} is an error message, usually in English. + gettext_f("Sign-in failed: {error}", &[("error", &error)]) } - other => format!("Sign-in failed: {other}"), } } @@ -289,20 +296,22 @@ pub(crate) fn spawn_login( /// the worker reads as a cancelled login. pub(crate) fn prompt_2fa(ui: &Rc, code_tx: std::sync::mpsc::Sender) { let dialog = adw::AlertDialog::builder() - .heading("Two-factor authentication") - .body("Enter the code from your authenticator app, or one of your recovery codes.") + .heading(gettext("Two-factor authentication")) + .body(gettext( + "Enter the code from your authenticator app, or one of your recovery codes.", + )) .build(); let group = adw::PreferencesGroup::new(); let entry = adw::EntryRow::builder() - .title("Authentication code") + .title(gettext("Authentication code")) .activates_default(true) .build(); group.add(&entry); dialog.set_extra_child(Some(&group)); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("confirm", "Confirm"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("confirm", &gettext("Confirm")); dialog.set_response_appearance("confirm", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("confirm")); dialog.set_close_response("cancel"); @@ -330,10 +339,11 @@ pub(crate) fn sign_out(ui: &Rc) { let ui = ui.clone(); confirm_destructive( &window, - "Sign Out?", - "Proton Drive will disconnect and stop syncing until you sign in again. \ - Files already on this computer stay where they are.", - "Sign Out", + &gettext("Sign Out?"), + &gettext( + "Proton Drive will disconnect and stop syncing until you sign in again. Files already on this computer stay where they are.", + ), + &gettext("Sign Out"), move || { service::disable_stop(); if let Err(e) = auth::logout() { diff --git a/crates/pdfs-gui/src/app/pages/photo_viewer.rs b/crates/pdfs-gui/src/app/pages/photo_viewer.rs index 279b356..b02fd01 100644 --- a/crates/pdfs-gui/src/app/pages/photo_viewer.rs +++ b/crates/pdfs-gui/src/app/pages/photo_viewer.rs @@ -81,9 +81,10 @@ pub(crate) struct Viewer { /// label/value pairs for the details panel. #[derive(Default)] pub(crate) struct ExifInfo { - /// `("Camera", "Apple iPhone 15")` and friends; empty when the file has no - /// EXIF at all, which is normal for screenshots and re-encoded images. - pub(crate) fields: Vec<(&'static str, String)>, + /// `("Camera", "Apple iPhone 15")` and friends, the label already + /// translated; empty when the file has no EXIF at all, which is normal for + /// screenshots and re-encoded images. + pub(crate) fields: Vec<(String, String)>, /// Decimal degrees, if the photo is geotagged. pub(crate) coords: Option<(f64, f64)>, } @@ -146,7 +147,7 @@ fn load_photo_group(ui: &Rc, viewer: &Rc, uid: &str) { if let Some(next) = next_group_member(&items, &uid) { viewer .group_btn - .set_tooltip_text(Some(&format!("Show {}", member_label(next)))); + .set_tooltip_text(Some(&member_tooltip(next))); } *viewer.group.borrow_mut() = items; viewer.group_btn.set_visible(true); @@ -173,6 +174,21 @@ pub(crate) fn member_label(item: &PhotoItem) -> String { } } +/// The group switch's tooltip, naming the file it will show next. +fn member_tooltip(item: &PhotoItem) -> String { + match item.name.as_deref() { + Some(name) if !name.is_empty() => { + // Translators: tooltip of the button that switches to another file of the same photo; {name} is a file name. + gettext_f("Show {name}", &[("name", &member_label(item))]) + } + _ => match item.kind { + PhotoKind::Raw => gettext("Show the raw file"), + PhotoKind::Video => gettext("Show the video"), + PhotoKind::Photo => gettext("Show the photo"), + }, + } +} + /// The gallery's entry for `uid`, or the shot member it names when the group /// switch has left the timeline's own photo (a RAW is not in the timeline). fn viewer_item(ui: &Rc, viewer: &Rc, uid: &str) -> Option { @@ -269,12 +285,12 @@ pub(crate) fn load_photo(ui: &Rc, viewer: &Rc, uid: String) { } Err(e) => { tracing::error!("Failed to load texture for {path}: {e}"); - fail("Couldn't render this photo."); + fail(&gettext("Couldn't render this photo.")); } }, Ok(Ok(Response::Error { message, .. })) => fail(&message), - Ok(Ok(_)) => fail("Unexpected reply from the mount service."), - Ok(Err(_)) | Err(_) => fail("Couldn't reach Proton Drive."), + Ok(Ok(_)) => fail(&gettext("Unexpected reply from the mount service.")), + Ok(Err(_)) | Err(_) => fail(&gettext("Couldn't reach Proton Drive.")), } }); } @@ -326,7 +342,7 @@ pub(crate) fn clear_info(viewer: &Rc) { viewer.info_rows.remove(&row); } let label = gtk4::Label::builder() - .label("Reading photo details…") + .label(gettext("Reading photo details…")) .halign(gtk4::Align::Start) .build(); label.add_css_class("dim-label"); @@ -340,15 +356,16 @@ pub(crate) fn show_info(viewer: &Rc, path: &str, info: ExifInfo) { viewer.info_rows.remove(&row); } - let mut fields: Vec<(&str, String)> = Vec::new(); + let mut fields: Vec<(String, String)> = Vec::new(); if let Ok(meta) = std::fs::metadata(path) { - fields.push(("Size", human_bytes(meta.len()))); + // Translators: label of a photo's file size in the details panel. + fields.push((pgettext("property", "Size"), human_bytes(meta.len()))); } - fields.extend(info.fields.iter().map(|(k, v)| (*k, v.clone()))); + fields.extend(info.fields); if fields.is_empty() { let label = gtk4::Label::builder() - .label("This photo carries no metadata.") + .label(gettext("This photo carries no metadata.")) .halign(gtk4::Align::Start) .wrap(true) .build(); @@ -360,7 +377,7 @@ pub(crate) fn show_info(viewer: &Rc, path: &str, info: ExifInfo) { group.add_css_class("boxed-list"); for (label, value) in fields { let row = adw::ActionRow::builder() - .title(label) + .title(label.as_str()) .subtitle(value) .subtitle_selectable(true) .build(); @@ -378,7 +395,7 @@ pub(crate) fn show_info(viewer: &Rc, path: &str, info: ExifInfo) { /// disk. Anything missing is simply left out — phone screenshots and re-encoded /// images legitimately carry no EXIF at all. pub(crate) fn read_exif(path: &str) -> ExifInfo { - let mut fields: Vec<(&'static str, String)> = Vec::new(); + let mut fields: Vec<(String, String)> = Vec::new(); let mut coords = None; let reader = match std::fs::File::open(path) { @@ -405,12 +422,15 @@ pub(crate) fn read_exif(path: &str) -> ExifInfo { if let Some(size) = field(exif::Tag::PixelXDimension) .zip(field(exif::Tag::PixelYDimension)) - .map(|(w, h)| format!("{w} × {h}")) + // Translators: a photo's pixel dimensions, such as "4032 × 3024". + .map(|(w, h)| gettext_f("{width} × {height}", &[("width", &w), ("height", &h)])) { - fields.push(("Dimensions", size)); + // Translators: label of a photo's pixel dimensions in the details panel. + fields.push((gettext("Dimensions"), size)); } if let Some(taken) = field(exif::Tag::DateTimeOriginal) { - fields.push(("Taken", taken)); + // Translators: label of when a photo was taken, in the details panel. + fields.push((pgettext("photo property", "Taken"), taken)); } let camera = [exif::Tag::Make, exif::Tag::Model] @@ -419,10 +439,12 @@ pub(crate) fn read_exif(path: &str) -> ExifInfo { .collect::>() .join(" "); if !camera.is_empty() { - fields.push(("Camera", camera)); + // Translators: label of the camera model in a photo's details panel. + fields.push((gettext("Camera"), camera)); } if let Some(lens) = field(exif::Tag::LensModel) { - fields.push(("Lens", lens)); + // Translators: label of the lens model in a photo's details panel. + fields.push((gettext("Lens"), lens)); } let exposure: Vec = [ @@ -435,13 +457,22 @@ pub(crate) fn read_exif(path: &str) -> ExifInfo { .filter_map(|tag| field(*tag)) .collect(); if !exposure.is_empty() { - fields.push(("Exposure", exposure.join(" · "))); + // Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. + fields.push((gettext("Exposure"), exposure.join(" · "))); } if let Some(lat) = gps_degrees(&reader, exif::Tag::GPSLatitude, exif::Tag::GPSLatitudeRef) && let Some(lon) = gps_degrees(&reader, exif::Tag::GPSLongitude, exif::Tag::GPSLongitudeRef) { - fields.push(("Location", format!("{lat:.5}, {lon:.5}"))); + let (lat_text, lon_text) = (format!("{lat:.5}"), format!("{lon:.5}")); + // Translators: label of where a photo was taken, in the details panel. + let label = pgettext("photo property", "Location"); + // Translators: GPS coordinates in decimal degrees, such as "52.52000, 13.40500". + let value = gettext_f( + "{latitude}, {longitude}", + &[("latitude", &lat_text), ("longitude", &lon_text)], + ); + fields.push((label, value)); coords = Some((lat, lon)); } @@ -605,7 +636,7 @@ fn hide_chrome(viewer: &Rc) { /// Copy the photo on screen to where the user picks, under its Drive name. pub(crate) fn save_photo_to_disk(ui: &Rc, window: >k4::Window, source: &str, name: &str) { let dialog = gtk4::FileDialog::builder() - .title("Save a Copy") + .title(gettext("Save a Copy")) .initial_name(name) .build(); let source = source.to_string(); @@ -625,10 +656,15 @@ pub(crate) fn save_photo_to_disk(ui: &Rc, window: >k4::Window, source: &st || dest.display().to_string(), |name| name.to_string_lossy().into_owned(), ); - toast(&ui, &format!("Saved “{saved}”")); + // Translators: {name} is the saved file's name. + toast(&ui, &gettext_f("Saved “{name}”", &[("name", &saved)])); } - Ok(Err(e)) => toast_error(&ui, "Couldn't save the copy", &e.to_string()), - Err(_) => toast_error(&ui, "Couldn't save the copy", "The copy was interrupted."), + Ok(Err(e)) => toast_error(&ui, &gettext("Couldn't save the copy"), &e.to_string()), + Err(_) => toast_error( + &ui, + &gettext("Couldn't save the copy"), + &gettext("The copy was interrupted."), + ), } }); }); @@ -749,9 +785,21 @@ fn gallery_total(ui: &Rc) -> Option { pub(crate) fn position_label(index: u32, loaded: u32, more: bool, total: Option) -> String { let (at, loaded) = (index as usize + 1, loaded as usize); match total { - _ if !more => format!("{} of {}", thousands(at), thousands(loaded)), - Some(total) if total > loaded => format!("{} of {}", thousands(at), thousands(total)), - _ => format!("{} of {}+", thousands(at), thousands(loaded)), + // Translators: the lightbox counter, such as "12 of 340"; {position} is the photo's place, {total} how many there are. + _ if !more => gettext_f( + "{position} of {total}", + &[("position", &thousands(at)), ("total", &thousands(loaded))], + ), + // Translators: the lightbox counter, such as "12 of 340"; {position} is the photo's place, {total} how many there are. + Some(total) if total > loaded => gettext_f( + "{position} of {total}", + &[("position", &thousands(at)), ("total", &thousands(total))], + ), + // Translators: the lightbox counter while more photos are still loading, such as "12 of 200+"; {loaded} is how many are loaded so far. + _ => gettext_f( + "{position} of {loaded}+", + &[("position", &thousands(at)), ("loaded", &thousands(loaded))], + ), } } @@ -777,7 +825,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let parent = ui.stack.root().and_downcast::().unwrap(); let window = gtk4::Window::builder() - .title("Photo") + .title(gettext("Photo")) .modal(true) .transient_for(&parent) .default_width(1100) @@ -824,7 +872,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let prev_btn = gtk4::Button::builder() .icon_name("go-previous-symbolic") - .tooltip_text("Previous (←)") + .tooltip_text(gettext("Previous (←)")) .build(); prev_btn.add_css_class("circular"); prev_btn.add_css_class("flat"); @@ -838,7 +886,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let next_btn = gtk4::Button::builder() .icon_name("go-next-symbolic") - .tooltip_text("Next (→)") + .tooltip_text(gettext("Next (→)")) .build(); next_btn.add_css_class("circular"); next_btn.add_css_class("flat"); @@ -876,7 +924,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let info_toggle = gtk4::ToggleButton::builder() .icon_name("info-outline-symbolic") - .tooltip_text("Details (i)") + .tooltip_text(gettext("Details (i)")) .valign(gtk4::Align::Center) .build(); info_toggle.add_css_class("flat"); @@ -884,7 +932,8 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let favorite_btn = gtk4::ToggleButton::builder() .icon_name("non-starred-symbolic") - .tooltip_text("Favorite") + // Translators: tooltip of the star button that marks a photo as a favorite. + .tooltip_text(pgettext("verb", "Favorite")) .valign(gtk4::Align::Center) .build(); favorite_btn.add_css_class("flat"); @@ -892,13 +941,13 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { // Only shown for a shot stored as more than one file; `load_photo_group` // decides that per photo. - let group_btn = action("view-paged-symbolic", "Other files of this photo"); + let group_btn = action("view-paged-symbolic", &gettext("Other files of this photo")); group_btn.set_visible(false); - let download_btn = action("document-save-symbolic", "Save a Copy…"); - let delete_btn = action("user-trash-symbolic", "Move to Trash (Delete)"); - let open_ext_btn = action("document-open-symbolic", "Open With…"); - let close_btn = action("window-close-symbolic", "Close (Esc)"); + let download_btn = action("document-save-symbolic", &gettext("Save a Copy…")); + let delete_btn = action("user-trash-symbolic", &gettext("Move to Trash (Delete)")); + let open_ext_btn = action("document-open-symbolic", &gettext("Open With…")); + let close_btn = action("window-close-symbolic", &gettext("Close (Esc)")); close_btn.add_css_class("viewer-close-btn"); let top_bar = gtk4::Box::new(gtk4::Orientation::Horizontal, 6); @@ -921,7 +970,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let info_map = gtk4::Button::builder() .child( &adw::ButtonContent::builder() - .label("Show on map") + .label(gettext("Show on map")) .icon_name("map-symbolic") .build(), ) @@ -931,7 +980,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { info_map.set_visible(false); let info_title = gtk4::Label::builder() - .label("Details") + .label(gettext("Details")) .halign(gtk4::Align::Start) .hexpand(true) .build(); @@ -939,7 +988,7 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { let info_close = gtk4::Button::builder() .icon_name("window-close-symbolic") - .tooltip_text("Hide details") + .tooltip_text(gettext("Hide details")) .build(); info_close.add_css_class("flat"); info_close.add_css_class("circular"); @@ -1193,10 +1242,14 @@ pub(crate) fn open_photo_viewer(ui: &Rc, initial_uid: String) { None } Ok(Ok(Response::Error { message, .. })) => Some(message), - _ => Some("The mount service didn't respond.".to_string()), + _ => Some(gettext("The mount service didn't respond.")), }; if let Some(detail) = failed { - toast_error(&ui_result, "Couldn't change the favorite", &detail); + toast_error( + &ui_result, + &gettext("Couldn't change the favorite"), + &detail, + ); // The server refused, so the button must go back to describing // what is actually stored — without firing this handler again. if *viewer_result.uid.borrow() == uid { diff --git a/crates/pdfs-gui/src/app/pages/photos.rs b/crates/pdfs-gui/src/app/pages/photos.rs index d7cf890..bc3eaca 100644 --- a/crates/pdfs-gui/src/app/pages/photos.rs +++ b/crates/pdfs-gui/src/app/pages/photos.rs @@ -380,7 +380,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // Shown only when a load failed because the mount is down; restarts it. let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -389,11 +389,13 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // The empty-timeline state's two ways forward. `StatusPage` takes one child, // so Retry and these share a box and each is shown only for its own state. - let empty_upload = gtk4::Button::builder().label("Upload photos").build(); + let empty_upload = gtk4::Button::builder() + .label(gettext("Upload photos")) + .build(); empty_upload.add_css_class("pill"); empty_upload.add_css_class("suggested-action"); let empty_import = gtk4::Button::builder() - .label("Import from Google Photos") + .label(gettext("Import from Google Photos")) .build(); empty_import.add_css_class("pill"); let empty_actions = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); @@ -433,7 +435,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { .margin_top(12) .margin_bottom(12) .margin_end(4) - .tooltip_text("Jump to a month") + .tooltip_text(gettext("Jump to a month")) .visible(false) .build(); scrubber.add_css_class("photo-scrubber"); @@ -450,7 +452,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // it — the Albums toggle is what leaves the grid itself. let back = gtk4::Button::builder() .icon_name("go-previous-symbolic") - .tooltip_text("Back to albums") + .tooltip_text(gettext("Back to albums")) .valign(gtk4::Align::Center) .visible(false) .build(); @@ -462,11 +464,11 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { let upload = gtk4::Button::builder() .child( &adw::ButtonContent::builder() - .label("Upload") + .label(pgettext("verb", "Upload")) .icon_name("list-add-symbolic") .build(), ) - .tooltip_text("Upload photos") + .tooltip_text(gettext("Upload photos")) .valign(gtk4::Align::Center) .build(); upload.add_css_class("suggested-action"); @@ -475,7 +477,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // it sits beside Upload as a plain button rather than a second accent one. let import = gtk4::Button::builder() .icon_name("folder-download-symbolic") - .tooltip_text("Import a Google Photos Takeout export") + .tooltip_text(gettext("Import a Google Photos Takeout export")) .valign(gtk4::Align::Center) .build(); import.add_css_class("flat"); @@ -485,7 +487,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // Picking photos is a mode, so its control is a toggle rather than a button. let select_btn = gtk4::ToggleButton::builder() .icon_name("selection-mode-symbolic") - .tooltip_text("Select photos") + .tooltip_text(gettext("Select photos")) .valign(gtk4::Align::Center) .build(); select_btn.add_css_class("flat"); @@ -494,24 +496,24 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // 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("Select photos") + .label(gettext("Select photos")) .hexpand(true) .xalign(0.0) .build(); let select_trash = gtk4::Button::builder() - .label("Move to Trash") + .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("Add to Album…") + .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("Leave selection (Esc)") + .tooltip_text(gettext("Leave selection (Esc)")) .valign(gtk4::Align::Center) .build(); select_done.add_css_class("flat"); @@ -556,16 +558,16 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // that would silently drop the kind the user picked. let favorites_btn = gtk4::ToggleButton::builder() .icon_name("starred-symbolic") - .tooltip_text("Show only favorites") + .tooltip_text(gettext("Show only favorites")) .build(); favorites_btn.add_css_class("pill"); // Date jump: "All dates" plus a row per month, filled in once the timeline's // months are known (see [`refresh_photo_months`]). Pushed to the far end of // the filter row, opposite the kind toggles. - let dates = gtk4::DropDown::from_strings(&["All dates"]); + let dates = gtk4::DropDown::from_strings(&[gettext("All dates").as_str()]); dates.add_css_class("pill"); - dates.set_tooltip_text(Some("Jump to a month")); + dates.set_tooltip_text(Some(&gettext("Jump to a month"))); // The kind toggles and the date jump travel together: they filter the // timeline, and neither applies to the album grid or to an open album. @@ -583,10 +585,12 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { // it sits above the filter row rather than beside the kind toggles. // "Timeline", not "Photos": the kind filter below has a Photos tab too. let photos_btn = gtk4::ToggleButton::builder() - .label("Timeline") + .label(gettext("Timeline")) .active(true) .build(); - let albums_btn = gtk4::ToggleButton::builder().label("Albums").build(); + let albums_btn = gtk4::ToggleButton::builder() + .label(gettext("Albums")) + .build(); albums_btn.set_group(Some(&photos_btn)); let view_switch = gtk4::Box::new(gtk4::Orientation::Horizontal, 0); view_switch.add_css_class("linked"); @@ -634,7 +638,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { albums_stack.add_named(&albums_status, Some("status")); let new_album = gtk4::Button::builder() .icon_name("list-add-symbolic") - .label("New Album…") + .label(gettext("New Album…")) .halign(gtk4::Align::Start) .action_name("win.new-album") .build(); @@ -651,8 +655,8 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { content.add_named(&albums_page, Some("albums")); let import_banner = adw::Banner::builder() - .title("Importing from Google Photos…") - .button_label("View") + .title(gettext("Importing from Google Photos…")) + .button_label(pgettext("verb", "View")) .action_name("win.show-import") .build(); @@ -668,7 +672,7 @@ pub(crate) fn build_gallery_page() -> (gtk4::Widget, GalleryWidgets) { let body = gtk4::Box::new(gtk4::Orientation::Vertical, 0); body.append(&import_banner); body.append(&inner); - let (frame, header, title) = page_frame("Photos", &body); + let (frame, header, title) = page_frame(&gettext("Photos"), &body); header.pack_start(&back); header.pack_start(&upload); header.pack_end(&refresh); @@ -736,21 +740,16 @@ pub(crate) fn month_range(year: i32, month: i32) -> Option<(i64, i64)> { Some((start.to_unix(), end.to_unix())) } -/// English month names, indexed 1..=12. -pub(crate) const MONTH_NAMES: [&str; 12] = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", -]; +/// "June 2024": a calendar month in the user's language, for the date jump +/// and the scrubber. The month name comes from glib, so it follows the locale. +pub(crate) fn month_label(year: i32, month: i32) -> String { + // 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. + let format = gettext("%OB %Y"); + glib::DateTime::from_local(year, month, 1, 0, 0, 0.0) + .and_then(|date| date.format(&format)) + .map(|label| label.to_string()) + .unwrap_or_else(|_| format!("{year}-{month:02}")) +} /// 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 @@ -769,15 +768,15 @@ pub(crate) fn refresh_photo_months(ui: &Rc) { let Ok(Ok(Response::PhotoMonths { months })) = rx.recv().await else { return; }; - let mut labels = vec!["All dates".to_string()]; + let mut labels = vec![gettext("All dates")]; let mut ranges: Vec> = vec![None]; fill_scrubber(&ui, &months); for m in months { - let name = MONTH_NAMES - .get((m.month - 1) as usize) - .copied() - .unwrap_or("?"); - labels.push(format!("{name} {} ({})", m.year, m.count)); + let count = m.count.to_string(); + let month = month_label(m.year, m.month); + // Translators: a row of the date jump; {month} is a month such as "June 2024", {count} how many photos it holds. + let label = gettext_f("{month} ({count})", &[("month", &month), ("count", &count)]); + labels.push(label); ranges.push(month_range(m.year, m.month)); } let label_refs: Vec<&str> = labels.iter().map(|s| s.as_str()).collect(); @@ -1079,11 +1078,11 @@ pub(crate) fn wire_gallery( let ui_upload = ui.clone(); ui.gallery.upload.connect_clicked(move |_| { let dialog = gtk4::FileDialog::builder() - .title("Select Photo to Upload") + .title(gettext("Select Photo to Upload")) .build(); let filter = gtk4::FileFilter::new(); - filter.set_name(Some("Images")); + filter.set_name(Some(&gettext("Images"))); filter.add_mime_type("image/*"); let filters = gio::ListStore::new::(); filters.append(&filter); @@ -1139,16 +1138,21 @@ pub(crate) fn wire_gallery( Ok(Ok(Response::Ok { message })) => { tracing::info!("Photo uploaded: {message}"); load_gallery(&ui_clone, false); - toast(&ui_clone, "Photo uploaded"); + toast(&ui_clone, &gettext("Photo uploaded")); } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui_clone, "Couldn't upload photo", &message, kind); + toast_failure( + &ui_clone, + &gettext("Couldn't upload photo"), + &message, + kind, + ); } _ => { toast_error( &ui_clone, - "Couldn't upload photo", - "The mount service didn't respond.", + &gettext("Couldn't upload photo"), + &gettext("The mount service didn't respond."), ); } } @@ -1361,7 +1365,8 @@ pub(crate) fn photo_tile(ui: &Rc, tile: Tile) -> gtk4::Button { if tile.photo.has_raw || tile.photo.group_size > 1 { let badge = gtk4::Label::builder() .label(if tile.photo.has_raw { - "RAW".to_string() + // Translators: badge on a photo tile whose shot includes a raw camera file. + gettext("RAW") } else { format!("{}", tile.photo.group_size) }) @@ -1491,9 +1496,9 @@ fn toggle_selected(ui: &Rc, uid: &str) { fn sync_selection_bar(ui: &Rc) { let count = ui.gallery.selected.borrow().len(); ui.gallery.select_label.set_label(&match count { - 0 => "Select photos".to_string(), - 1 => "1 selected".to_string(), - n => format!("{n} selected"), + 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); @@ -1535,17 +1540,33 @@ pub(crate) fn confirm_trash_photos(ui: &Rc, uids: Vec) { // find out from the trash. let files = selected_file_count(ui, &uids); let body = match (uids.len(), files) { - (1, 1) => "Move this photo to Trash?".to_string(), - (1, files) => format!("Move this photo to Trash? It is stored as {files} files."), - (n, files) if files == n => format!("Move {n} photos to Trash?"), - (n, files) => format!("Move {n} photos to Trash? They are stored as {files} files."), + (1, 1) => gettext("Move this photo to Trash?"), + (1, files) => ngettext_f( + "Move this photo to Trash? It is stored as {n} file.", + "Move this photo to Trash? It is stored as {n} files.", + files as u64, + &[], + ), + (n, files) if files == n => ngettext_f( + "Move {n} photo to Trash?", + "Move {n} photos to Trash?", + n as u64, + &[], + ), + // Translators: {n} is how many photos are selected, {files} how many files they are stored as (always more than {n}). + (n, files) => ngettext_f( + "Move {n} photo to Trash? They are stored as {files} files.", + "Move {n} photos to Trash? They are stored as {files} files.", + n as u64, + &[("files", &files.to_string())], + ), }; let dialog = adw::AlertDialog::builder() - .heading("Move to Trash") + .heading(gettext("Move to Trash")) .body(body) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("trash", "Move to Trash"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("trash", &gettext("Move to Trash")); dialog.set_response_appearance("trash", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -1592,32 +1613,38 @@ pub(crate) fn trash_photos(ui: &Rc, uids: Vec) { let message = failed .first() .map(|f| f.message.clone()) - .unwrap_or_else(|| "The server refused.".to_string()); - toast_error(&ui, "Some photos couldn't be moved to Trash", &message); + .unwrap_or_else(|| gettext("The server refused.")); + toast_error( + &ui, + &gettext("Some photos couldn't be moved to Trash"), + &message, + ); } if trashed.is_empty() { return; } let count = trashed.len(); - let message = match count { - 1 => "Moved 1 photo to Trash".to_string(), - n => format!("Moved {n} photos to Trash"), - }; - toast_action(&ui, &message, "Undo", move |ui| { + let message = ngettext_f( + "Moved {n} photo to Trash", + "Moved {n} photos to Trash", + count as u64, + &[], + ); + toast_action(&ui, &message, &gettext("Undo"), move |ui| { restore_uids(ui, trashed.clone(), count); load_gallery(ui, false); }); } Ok(Ok(Response::Error { message, kind })) => { restore_photos(&ui, removed.clone()); - toast_failure(&ui, "Couldn't move to Trash", &message, kind); + toast_failure(&ui, &gettext("Couldn't move to Trash"), &message, kind); } _ => { restore_photos(&ui, removed.clone()); toast_error( &ui, - "Couldn't move to Trash", - "The mount service didn't respond.", + &gettext("Couldn't move to Trash"), + &gettext("The mount service didn't respond."), ); } } @@ -2133,7 +2160,7 @@ pub(crate) fn group_photos(model: &gio::ListStore) -> Vec { /// Section heading for a capture time: "Today", "Yesterday", or the local date. pub(crate) fn day_heading(secs: i64) -> String { let Ok(date) = glib::DateTime::from_unix_local(secs) else { - return "Unknown date".into(); + return gettext("Unknown date"); }; let same_day = |other: &glib::DateTime| { other.year() == date.year() @@ -2142,17 +2169,19 @@ pub(crate) fn day_heading(secs: i64) -> String { }; if let Ok(now) = glib::DateTime::now_local() { if same_day(&now) { - return "Today".into(); + return gettext("Today"); } if let Ok(yesterday) = glib::DateTime::from_unix_local(now.to_unix() - 86_400) && same_day(&yesterday) { - return "Yesterday".into(); + return gettext("Yesterday"); } } - date.format("%-d %B %Y") + // Translators: strftime format for a day heading in the photo timeline, such as "3 June 2026". + let format = gettext("%-d %B %Y"); + date.format(&format) .map(|s| s.to_string()) - .unwrap_or_else(|_| "Unknown date".into()) + .unwrap_or_else(|_| gettext("Unknown date")) } pub(crate) fn find_photo_index(model: &gio::ListStore, uid: &str) -> Option { @@ -2169,20 +2198,24 @@ pub(crate) fn find_photo_index(model: &gio::ListStore, uid: &str) -> Option pub(crate) fn format_capture_time(secs: i64) -> String { let date = glib::DateTime::from_unix_local(secs); + // Translators: strftime format for a photo's capture date and time, such as "2026-06-03 14:05:09". + let format = gettext("%Y-%m-%d %H:%M:%S"); match date { - Ok(d) => match d.format("%Y-%m-%d %H:%M:%S") { + Ok(d) => match d.format(&format) { Ok(s) => s.to_string(), - Err(_) => "Unknown Date".to_string(), + Err(_) => gettext("Unknown Date"), }, - Err(_) => "Unknown Date".to_string(), + Err(_) => gettext("Unknown Date"), } } /// The capture time as a tile caption: the clock time alone, since the day is /// already the section heading right above it. pub(crate) fn short_capture_time(secs: i64) -> String { + // Translators: strftime format for the time a photo was taken, shown on its tile, such as "14:05". + let format = gettext("%H:%M"); glib::DateTime::from_unix_local(secs) - .and_then(|d| d.format("%H:%M")) + .and_then(|d| d.format(&format)) .map(|s| s.to_string()) .unwrap_or_default() } @@ -2257,13 +2290,9 @@ pub(crate) fn sync_scrubber(ui: &Rc) { /// "March 2024" for the scrubber's month `index`. fn scrubber_label(months: &[PhotoMonth], index: usize) -> String { - months.get(index).map_or_else(String::new, |m| { - let name = MONTH_NAMES - .get((m.month - 1) as usize) - .copied() - .unwrap_or("?"); - format!("{name} {}", m.year) - }) + months + .get(index) + .map_or_else(String::new, |m| month_label(m.year, m.month)) } /// Move the knob to the month at the top of the timeline, unless the user is @@ -2443,35 +2472,37 @@ fn show_photo_menu(ui: &Rc, photo: &PhotoItem, anchor: >k4::Button, x: f64 let mut menu = ActionMenu::new(); let (ui_c, uid) = (ui.clone(), photo.uid.clone()); let label = if photo.kind == PhotoKind::Video { - "Play" + pgettext("verb", "Play") } else { - "Open" + pgettext("verb", "Open") }; - menu.item(label, move || open_photo_viewer(&ui_c, uid.clone())); + menu.item(&label, move || open_photo_viewer(&ui_c, uid.clone())); let (ui_c, uid) = (ui.clone(), photo.uid.clone()); - menu.toggle("Favorite", photo.favorite, move |favorite| { + // Translators: a check item in a photo's menu, on while the photo is a favorite. + let favorite_label = pgettext("state", "Favorite"); + menu.toggle(&favorite_label, photo.favorite, move |favorite| { set_photo_favorite(&ui_c, uid.clone(), favorite) }); let (ui_c, uid) = (ui.clone(), photo.uid.clone()); - menu.item("Select", move || { + menu.item(&pgettext("verb", "Select"), move || { set_selection_mode(&ui_c, true); toggle_selected(&ui_c, &uid); }); menu.section(); let (ui_c, uid) = (ui.clone(), photo.uid.clone()); - menu.item("Add to Album…", move || { + menu.item(&gettext("Add to Album…"), move || { prompt_add_to_album(&ui_c, vec![uid.clone()]) }); let open_album = ui.gallery.album.borrow().clone(); if let Some(album) = open_album.filter(|album| !album.shared) { let (ui_c, uid) = (ui.clone(), photo.uid.clone()); - menu.item("Remove from Album", move || { + menu.item(&gettext("Remove from Album"), move || { remove_from_album(&ui_c, &album, vec![uid.clone()]) }); } menu.section(); let (ui_c, uid) = (ui.clone(), photo.uid.clone()); - menu.item("Move to Trash…", move || { + menu.item(&gettext("Move to Trash…"), move || { confirm_trash_photos(&ui_c, vec![uid.clone()]) }); menu.popup_at(anchor, x, y); @@ -2494,20 +2525,20 @@ fn set_photo_favorite(ui: &Rc, uid: String, favorite: bool) { repaint_gallery(&ui); toast( &ui, - if favorite { - "Added to Favorites" + &if favorite { + gettext("Added to Favorites") } else { - "Removed from Favorites" + gettext("Removed from Favorites") }, ); } Ok(Ok(Response::Error { message, .. })) => { - toast_error(&ui, "Couldn't change the favorite", &message) + toast_error(&ui, &gettext("Couldn't change the favorite"), &message) } _ => toast_error( &ui, - "Couldn't change the favorite", - "The mount service didn't respond.", + &gettext("Couldn't change the favorite"), + &gettext("The mount service didn't respond."), ), } }); @@ -2526,8 +2557,8 @@ pub(crate) fn load_gallery(ui: &Rc, append: bool) { gallery_status( ui, "image-x-generic-symbolic", - "Loading photos…", - "Reading your Proton Drive timeline.", + &gettext("Loading photos…"), + &gettext("Reading your Proton Drive timeline."), false, ); // Rebuild the date jump for the current kind, but only for a full-span @@ -2584,8 +2615,8 @@ pub(crate) fn load_gallery(ui: &Rc, append: bool) { gallery_status( &ui, "image-missing-symbolic", - "No photo library", - "This Proton account doesn't have Photos enabled.", + &gettext("No photo library"), + &gettext("This Proton account doesn't have Photos enabled."), false, ); return; @@ -2614,8 +2645,8 @@ pub(crate) fn load_gallery(ui: &Rc, append: bool) { || ui.gallery.range.get().is_some(); let (title, description) = if ui.gallery.album.borrow().is_some() { ( - "Empty album".to_string(), - "This album has no photos in it.".to_string(), + gettext("Empty album"), + gettext("This album has no photos in it."), ) } else { let month = ui @@ -2656,26 +2687,26 @@ pub(crate) fn load_gallery(ui: &Rc, append: bool) { // A failed *next* page keeps the photos already on screen — the failure // goes to a toast rather than wiping the timeline for a status page. Ok(Ok(Response::Error { message, .. })) if append => { - toast_error(&ui, "Couldn't load more photos", &message) + toast_error(&ui, &gettext("Couldn't load more photos"), &message) } Ok(Ok(Response::Error { message, .. })) => gallery_status( &ui, "dialog-warning-symbolic", - "Couldn't load photos", + &gettext("Couldn't load photos"), &message, false, ), Ok(Ok(_)) => gallery_status( &ui, "dialog-warning-symbolic", - "Couldn't load photos", - "Unexpected reply from the mount service.", + &gettext("Couldn't load photos"), + &gettext("Unexpected reply from the mount service."), false, ), Ok(Err(_)) | Err(_) if append => toast_error( &ui, - "Couldn't load more photos", - "The mount service didn't respond.", + &gettext("Couldn't load more photos"), + &gettext("The mount service didn't respond."), ), Ok(Err(_)) | Err(_) => gallery_unreachable(&ui), } @@ -2703,8 +2734,8 @@ pub(crate) fn gallery_unreachable(ui: &Rc) { gallery_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; @@ -2712,8 +2743,8 @@ pub(crate) fn gallery_unreachable(ui: &Rc) { gallery_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); diff --git a/crates/pdfs-gui/src/app/pages/shared.rs b/crates/pdfs-gui/src/app/pages/shared.rs index 942d4e8..55dd012 100644 --- a/crates/pdfs-gui/src/app/pages/shared.rs +++ b/crates/pdfs-gui/src/app/pages/shared.rs @@ -48,7 +48,9 @@ pub(crate) struct SharedWidgets { pub(crate) fn build_shared_page() -> (gtk4::Widget, SharedWidgets) { let add_bookmark = gtk4::Button::builder() .icon_name("bookmark-new-symbolic") - .tooltip_text("Add Bookmark — save a public link to open it from here") + .tooltip_text(gettext( + "Add Bookmark — save a public link to open it from here", + )) .build(); let refresh = refresh_button(); @@ -57,13 +59,13 @@ pub(crate) fn build_shared_page() -> (gtk4::Widget, SharedWidgets) { // "nothing here". Invitations come first: they are the one thing on the // page waiting for a decision. let invitations = adw::PreferencesGroup::builder() - .title("Invitations") - .description("Accept to add the item to your shared files.") + .title(gettext("Invitations")) + .description(gettext("Accept to add the item to your shared files.")) .visible(false) .build(); let shared_with_me = adw::PreferencesGroup::new(); let bookmarks = adw::PreferencesGroup::builder() - .title("Bookmarks") + .title(gettext("Bookmarks")) .visible(false) .build(); @@ -78,7 +80,7 @@ pub(crate) fn build_shared_page() -> (gtk4::Widget, SharedWidgets) { .build(); let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -106,10 +108,10 @@ pub(crate) fn build_shared_page() -> (gtk4::Widget, SharedWidgets) { let back = gtk4::Button::builder() .icon_name("go-previous-symbolic") - .tooltip_text("Back") + .tooltip_text(gettext("Back")) .visible(false) .build(); - let (frame, header, title) = page_frame("Shared with Me", &inner); + let (frame, header, title) = page_frame(&gettext("Shared with Me"), &inner); header.pack_start(&back); header.pack_end(&refresh); header.pack_end(&add_bookmark); @@ -176,8 +178,8 @@ pub(crate) fn load_shared(ui: &Rc) { shared_status( ui, "emblem-shared-symbolic", - "Loading…", - "Reading your shared items.", + &gettext("Loading…"), + &gettext("Reading your shared items."), false, ); @@ -229,8 +231,8 @@ fn load_shared_folder(ui: &Rc, uid: String) { shared_status( ui, "folder-symbolic", - "Loading…", - "Reading this shared folder.", + &gettext("Loading…"), + &gettext("Reading this shared folder."), false, ); ui.busy_begin(); @@ -249,7 +251,7 @@ fn load_shared_folder(ui: &Rc, uid: String) { // The folder is gone or access was revoked: fall back to the top // level rather than stranding the page on a dead uid. ui.shared.nav.borrow_mut().pop(); - toast_failure(&ui, "Couldn't open shared folder", &message, kind); + toast_failure(&ui, &gettext("Couldn't open shared folder"), &message, kind); load_shared(&ui); } _ => { @@ -272,9 +274,10 @@ pub(crate) fn shared_path(nav: &[(String, String)]) -> String { /// The Invitations heading, with the count once there is more than one. pub(crate) fn invitations_title(count: usize) -> String { if count > 1 { - format!("Invitations ({count})") + // Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). + gettext_f("Invitations ({count})", &[("count", &count.to_string())]) } else { - "Invitations".to_string() + gettext("Invitations") } } @@ -299,7 +302,7 @@ fn repaint_shared_folder(ui: &Rc, entries: &[DirEntry]) { let mut rows: Vec<(adw::PreferencesGroup, gtk4::Widget)> = Vec::new(); if entries.is_empty() { - let row = dim_row("This folder is empty."); + let row = dim_row(&gettext("This folder is empty.")); ui.shared.with_me_group.add(&row); rows.push((ui.shared.with_me_group.clone(), row.upcast())); } else { @@ -340,7 +343,7 @@ fn shared_entry_row(ui: &Rc, entry: &DirEntry, leavable: bool) -> adw::Actio let warning = gtk4::Image::from_icon_name("dialog-warning-symbolic"); warning.add_css_class("warning"); warning.set_valign(gtk4::Align::Center); - warning.set_tooltip_text(Some(UNVERIFIED_INVITER_TOOLTIP)); + warning.set_tooltip_text(Some(&gettext(UNVERIFIED_INVITER_TOOLTIP))); row.add_suffix(&warning); } row.add_prefix(&file_thumbnail(ui, entry, 40, 24, true)); @@ -370,7 +373,7 @@ fn shared_entry_row(ui: &Rc, entry: &DirEntry, leavable: bool) -> adw::Actio /// A shared row's ⋮ menu: open it, find it in My Files when the mount has /// interned it, and leave it (share roots only). fn shared_entry_menu(ui: &Rc, entry: &DirEntry, leavable: bool) -> gtk4::MenuButton { - let mut items: Vec<(&str, MenuAction)> = Vec::new(); + let mut items: Vec<(String, MenuAction)> = Vec::new(); let (ui_open, uid, name, is_dir) = ( ui.clone(), entry.uid.clone(), @@ -378,7 +381,7 @@ fn shared_entry_menu(ui: &Rc, entry: &DirEntry, leavable: bool) -> gtk4::Men entry.is_dir, ); items.push(( - "Open", + pgettext("verb", "Open"), Box::new(move || { if is_dir { ui_open @@ -395,25 +398,27 @@ fn shared_entry_menu(ui: &Rc, entry: &DirEntry, leavable: bool) -> gtk4::Men if !entry.path.is_empty() { let (ui_show, entry_show) = (ui.clone(), entry.clone()); items.push(( - "Show in My Files", + gettext("Show in My Files"), Box::new(move || show_in_my_files(&ui_show, &entry_show)), )); } if leavable { let (ui_leave, uid, name) = (ui.clone(), entry.uid.clone(), entry.name.clone()); items.push(( - "Leave…", + gettext("Leave…"), Box::new(move || prompt_leave_shared(&ui_leave, &uid, &name)), )); } - let button = more_menu_button(items); + let (labels, actions): (Vec, Vec) = items.into_iter().unzip(); + let button = more_menu_button(labels.iter().map(String::as_str).zip(actions).collect()); button.set_valign(gtk4::Align::Center); button } /// Tooltip on the warning shown next to a share whose invitation did not verify. -const UNVERIFIED_INVITER_TOOLTIP: &str = "The invitation's signature doesn't match the sender's keys. \ - It may not really be from them."; +const UNVERIFIED_INVITER_TOOLTIP: &str = gettext_noop( + "The invitation's signature doesn't match the sender's keys. It may not really be from them.", +); /// A shared row's subtitle: who shared it and when (share roots only — that is /// where the invitation lives) and its size (files only). Where the share sits @@ -437,33 +442,33 @@ pub(crate) fn shared_row_subtitle(entry: &DirEntry) -> String { /// owned content carries no role, and a role the API did not report is not /// guessed at (the SDK's `from_permissions_exact` returns `None` for an /// unrecognised mask rather than degrading it to viewer). -pub(crate) fn role_label(role: &str) -> Option<&'static str> { +pub(crate) fn role_label(role: &str) -> Option { match role { - "viewer" => Some("Viewer"), - "editor" => Some("Editor"), - "admin" => Some("Admin"), + "viewer" => Some(pgettext("role", "Viewer")), + "editor" => Some(pgettext("role", "Editor")), + "admin" => Some(pgettext("role", "Admin")), _ => None, } } /// What a role lets me do, as a short phrase for the row's pill. A bare /// "Editor" beside a Leave button read like one more button. -pub(crate) fn role_access(role: &str) -> Option<&'static str> { +pub(crate) fn role_access(role: &str) -> Option { match role { - "viewer" => Some("Can view"), - "editor" => Some("Can edit"), - "admin" => Some("Can manage"), + "viewer" => Some(gettext("Can view")), + "editor" => Some(gettext("Can edit")), + "admin" => Some(gettext("Can manage")), _ => None, } } /// A tinted, rounded pill saying what I may do with a share I did not create. pub(crate) fn role_pill(role: &str) -> Option { - let pill = gtk4::Label::new(Some(role_access(role)?)); + let pill = gtk4::Label::new(Some(&role_access(role)?)); pill.add_css_class("role-pill"); pill.add_css_class("caption"); pill.set_valign(gtk4::Align::Center); - pill.set_tooltip_text(role_label(role)); + pill.set_tooltip_text(role_label(role).as_deref()); Some(pill) } @@ -477,7 +482,8 @@ fn open_shared_file(ui: &Rc, uid: &str, name: &str) { return; } ui.busy_begin(); - toast(ui, &format!("Downloading “{name}”…")); + // Translators: {name} is a file name. + toast(ui, &gettext_f("Downloading “{name}”…", &[("name", name)])); let rx = spawn_request( ui.dirs.control_socket(), Request::OpenSharedFile { @@ -496,12 +502,12 @@ fn open_shared_file(ui: &Rc, uid: &str, name: &str) { // the shared node's name instead. Ok(Ok(Response::FilePath { path })) => open_named_path(&path, &name), Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't open file", &message, kind) + toast_failure(&ui, &gettext("Couldn't open file"), &message, kind) } _ => toast_error( &ui, - "Couldn't open file", - "The mount service didn't respond.", + &gettext("Couldn't open file"), + &gettext("The mount service didn't respond."), ), } }); @@ -514,8 +520,8 @@ pub(crate) fn shared_unreachable(ui: &Rc) { shared_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; @@ -523,8 +529,8 @@ pub(crate) fn shared_unreachable(ui: &Rc) { shared_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); @@ -554,9 +560,10 @@ pub(crate) fn repaint_shared( shared_status( ui, "emblem-shared-symbolic", - "Nothing Shared with You", - "Files and folders other people share with you appear here. Public links \ - you bookmark are kept here too.", + &gettext("Nothing Shared with You"), + &gettext( + "Files and folders other people share with you appear here. Public links you bookmark are kept here too.", + ), false, ); return; @@ -570,10 +577,10 @@ pub(crate) fn repaint_shared( // The list only needs a heading when another section sits beside it. ui.shared .with_me_group - .set_title(if invitations.is_empty() && bookmarks.is_empty() { - "" + .set_title(&if invitations.is_empty() && bookmarks.is_empty() { + String::new() } else { - "Shared with you" + gettext("Shared with you") }); ui.shared .invitations_group @@ -588,13 +595,11 @@ pub(crate) fn repaint_shared( // Invitations: inviter + item, Accept / Reject. for inv in invitations { - let item = inv - .name - .clone() - .unwrap_or_else(|| "a shared item".to_string()); + let item = inv.name.clone().unwrap_or_else(|| gettext("a shared item")); let row = adw::ActionRow::builder() .title(&item) - .subtitle(format!("From {}", inv.inviter_email)) + // Translators: {email} is the address of the person who sent the invitation. + .subtitle(gettext_f("From {email}", &[("email", &inv.inviter_email)])) .build(); row.add_prefix(>k4::Image::from_icon_name(if inv.is_dir { "folder-symbolic" @@ -603,12 +608,12 @@ pub(crate) fn repaint_shared( })); let reject = gtk4::Button::builder() .icon_name("window-close-symbolic") - .tooltip_text("Reject") + .tooltip_text(gettext("Reject")) .valign(gtk4::Align::Center) .build(); reject.add_css_class("flat"); let accept = gtk4::Button::builder() - .label("Accept") + .label(gettext("Accept")) .valign(gtk4::Align::Center) .build(); accept.add_css_class("suggested-action"); @@ -620,15 +625,19 @@ pub(crate) fn repaint_shared( }); let ui_rej = ui.clone(); let id_rej = inv.id.clone(); - let name_rej = inv.name.clone().unwrap_or_else(|| "this item".into()); + let name_rej = inv.name.clone().unwrap_or_else(|| gettext("this item")); reject.connect_clicked(move |btn| { let ui = ui_rej.clone(); let id = id_rej.clone(); confirm_destructive( btn, - "Reject Invitation?", - &format!("You won't have access to {name_rej} unless it is shared again."), - "Reject", + &gettext("Reject Invitation?"), + // Translators: {name} is the shared item's name, or "this item". + &gettext_f( + "You won't have access to {name} unless it is shared again.", + &[("name", &name_rej)], + ), + &gettext("Reject"), move || respond_invitation(&ui, &id, false), ); }); @@ -640,7 +649,7 @@ pub(crate) fn repaint_shared( // Bookmarks: name/URL, Open / Remove. for bm in bookmarks { - let title = bm.name.clone().unwrap_or_else(|| "Shared link".to_string()); + let title = bm.name.clone().unwrap_or_else(|| gettext("Shared link")); let row = adw::ActionRow::builder() .title(&title) .subtitle(&bm.url) @@ -648,13 +657,13 @@ pub(crate) fn repaint_shared( row.add_prefix(>k4::Image::from_icon_name("emblem-symbolic-link")); let remove = gtk4::Button::builder() .icon_name("user-trash-symbolic") - .tooltip_text("Remove bookmark") + .tooltip_text(gettext("Remove bookmark")) .valign(gtk4::Align::Center) .build(); remove.add_css_class("flat"); let open = gtk4::Button::builder() .icon_name("external-link-symbolic") - .tooltip_text("Open in browser") + .tooltip_text(gettext("Open in browser")) .valign(gtk4::Align::Center) .build(); open.add_css_class("flat"); @@ -681,24 +690,32 @@ pub(crate) fn respond_invitation(ui: &Rc, id: &str, accept: bool) { Request::RejectInvitation { id: id.to_string() } }; let (done, failed) = if accept { - ("Invitation accepted", "Couldn't accept the invitation") + ( + gettext("Invitation accepted"), + gettext("Couldn't accept the invitation"), + ) } else { - ("Invitation rejected", "Couldn't reject the invitation") + ( + gettext("Invitation rejected"), + gettext("Couldn't reject the invitation"), + ) }; - run_shared_mutation(ui, req, done, failed); + run_shared_mutation(ui, req, &done, &failed); } /// Confirm, then leave a node shared with me. pub(crate) fn prompt_leave_shared(ui: &Rc, uid: &str, name: &str) { let win = ui_window(ui); let dialog = adw::AlertDialog::builder() - .heading("Leave shared item") - .body(format!( - "Leave “{name}”? You'll lose access until you're invited again." + .heading(gettext("Leave shared item")) + // Translators: {name} is the shared item's name. + .body(gettext_f( + "Leave “{name}”? You'll lose access until you're invited again.", + &[("name", name)], )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("leave", "Leave"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("leave", &pgettext("verb", "Leave")); dialog.set_response_appearance("leave", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -709,8 +726,8 @@ pub(crate) fn prompt_leave_shared(ui: &Rc, uid: &str, name: &str) { run_shared_mutation( &ui, Request::LeaveShared { uid: uid.clone() }, - "Left shared item", - "Couldn't leave the shared item", + &gettext("Left shared item"), + &gettext("Couldn't leave the shared item"), ); } }); @@ -721,11 +738,15 @@ pub(crate) fn prompt_leave_shared(ui: &Rc, uid: &str, name: &str) { pub(crate) fn prompt_remove_bookmark(ui: &Rc, token: &str, name: &str) { let win = ui_window(ui); let dialog = adw::AlertDialog::builder() - .heading("Remove bookmark") - .body(format!("Remove the bookmark for “{name}”?")) + .heading(gettext("Remove bookmark")) + // Translators: {name} is the bookmark's name. + .body(gettext_f( + "Remove the bookmark for “{name}”?", + &[("name", name)], + )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("remove", "Remove"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("remove", &gettext("Remove")); dialog.set_response_appearance("remove", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -738,8 +759,8 @@ pub(crate) fn prompt_remove_bookmark(ui: &Rc, token: &str, name: &str) { Request::DeleteBookmark { token: token.clone(), }, - "Bookmark removed", - "Couldn't remove the bookmark", + &gettext("Bookmark removed"), + &gettext("Couldn't remove the bookmark"), ); } }); @@ -750,23 +771,23 @@ pub(crate) fn prompt_remove_bookmark(ui: &Rc, token: &str, name: &str) { pub(crate) fn prompt_add_bookmark(ui: &Rc) { let win = ui_window(ui); let dialog = adw::AlertDialog::builder() - .heading("Add bookmark") - .body("Paste a Proton Drive public link to save it here.") + .heading(gettext("Add bookmark")) + .body(gettext("Paste a Proton Drive public link to save it here.")) .build(); let group = adw::PreferencesGroup::new(); let url_row = adw::EntryRow::builder() - .title("Public link URL") + .title(gettext("Public link URL")) .activates_default(true) .build(); let pw_row = adw::PasswordEntryRow::builder() - .title("Password (if the link has one)") + .title(gettext("Password (if the link has one)")) .activates_default(true) .build(); group.add(&url_row); group.add(&pw_row); dialog.set_extra_child(Some(&group)); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("add", "Add"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("add", &gettext("Add")); dialog.set_response_appearance("add", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("add")); dialog.set_close_response("cancel"); @@ -777,7 +798,11 @@ pub(crate) fn prompt_add_bookmark(ui: &Rc) { } let url = url_row.text().trim().to_string(); if url.is_empty() { - toast_error(&ui, "Couldn't add bookmark", "A URL is required."); + toast_error( + &ui, + &gettext("Couldn't add bookmark"), + &gettext("A URL is required."), + ); return; } let pw = pw_row.text().to_string(); @@ -785,24 +810,20 @@ pub(crate) fn prompt_add_bookmark(ui: &Rc) { run_shared_mutation( &ui, Request::CreateBookmark { url, password }, - "Bookmark saved", - "Couldn't add the bookmark", + &gettext("Bookmark saved"), + &gettext("Couldn't add the bookmark"), ); }); dialog.present(win.as_ref()); } /// Run a mutation raised from the Shared page and reload the page on success. -pub(crate) fn run_shared_mutation( - ui: &Rc, - req: Request, - done: &'static str, - failed: &'static str, -) { +pub(crate) fn run_shared_mutation(ui: &Rc, req: Request, done: &str, failed: &str) { ui.busy_begin(); let rx = spawn_request(ui.dirs.control_socket(), req); let ui = ui.clone(); let done = done.to_string(); + let failed = failed.to_string(); glib::spawn_future_local(async move { let result = rx.recv().await; ui.busy_end(); @@ -811,8 +832,10 @@ pub(crate) fn run_shared_mutation( load_shared(&ui); toast(&ui, &done); } - Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, failed, &message, kind), - _ => toast_error(&ui, failed, "The mount service didn't respond."), + Ok(Ok(Response::Error { message, kind })) => { + toast_failure(&ui, &failed, &message, kind) + } + _ => toast_error(&ui, &failed, &gettext("The mount service didn't respond.")), } }); } @@ -868,9 +891,9 @@ mod tests { #[test] fn a_role_pill_says_what_it_allows() { - assert_eq!(role_access("viewer"), Some("Can view")); - assert_eq!(role_access("editor"), Some("Can edit")); - assert_eq!(role_access("admin"), Some("Can manage")); + assert_eq!(role_access("viewer").as_deref(), Some("Can view")); + assert_eq!(role_access("editor").as_deref(), Some("Can edit")); + assert_eq!(role_access("admin").as_deref(), Some("Can manage")); assert_eq!(role_access(""), None); } diff --git a/crates/pdfs-gui/src/app/pages/shared_by_me.rs b/crates/pdfs-gui/src/app/pages/shared_by_me.rs index a267dae..a41631b 100644 --- a/crates/pdfs-gui/src/app/pages/shared_by_me.rs +++ b/crates/pdfs-gui/src/app/pages/shared_by_me.rs @@ -35,7 +35,7 @@ pub(crate) fn build_shared_by_me_page() -> (gtk4::Widget, SharedByMeWidgets) { .build(); let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -60,7 +60,7 @@ pub(crate) fn build_shared_by_me_page() -> (gtk4::Widget, SharedByMeWidgets) { inner.set_margin_start(18); inner.set_margin_end(18); inner.append(&content); - let (frame, header, _) = page_frame("Shared by Me", &inner); + let (frame, header, _) = page_frame(&gettext("Shared by Me"), &inner); header.pack_end(&refresh); ( @@ -109,8 +109,8 @@ pub(crate) fn load_shared_by_me(ui: &Rc) { shared_by_me_status( ui, "emblem-shared-symbolic", - "Loading…", - "Reading what you've shared.", + &gettext("Loading…"), + &gettext("Reading what you've shared."), false, ); ui.busy_begin(); @@ -128,15 +128,15 @@ pub(crate) fn load_shared_by_me(ui: &Rc) { Ok(Ok(Response::Error { message, .. })) => shared_by_me_status( &ui, "dialog-warning-symbolic", - "Couldn't read your shares", + &gettext("Couldn't read your shares"), &message, false, ), Ok(Ok(_)) => shared_by_me_status( &ui, "dialog-warning-symbolic", - "Couldn't read your shares", - "Unexpected reply from the mount service.", + &gettext("Couldn't read your shares"), + &gettext("Unexpected reply from the mount service."), false, ), Ok(Err(_)) | Err(_) => { @@ -153,8 +153,8 @@ pub(crate) fn shared_by_me_unreachable(ui: &Rc) { shared_by_me_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; @@ -162,8 +162,8 @@ pub(crate) fn shared_by_me_unreachable(ui: &Rc) { shared_by_me_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); @@ -183,8 +183,8 @@ pub(crate) fn repaint_shared_by_me(ui: &Rc, items: &[SharedItem]) { shared_by_me_status( ui, "emblem-shared-symbolic", - "Nothing shared yet", - "Items you share with people or by link show up here.", + &gettext("Nothing shared yet"), + &gettext("Items you share with people or by link show up here."), false, ); return; @@ -212,14 +212,14 @@ pub(crate) fn repaint_shared_by_me(ui: &Rc, items: &[SharedItem]) { if let Some(url) = url.clone() { let copy = gtk4::Button::builder() .icon_name("edit-copy-symbolic") - .tooltip_text("Copy link") + .tooltip_text(gettext("Copy link")) .valign(gtk4::Align::Center) .build(); copy.add_css_class("flat"); let ui_copy = ui.clone(); copy.connect_clicked(move |btn| { btn.clipboard().set_text(&url); - toast(&ui_copy, "Link copied"); + toast(&ui_copy, &gettext("Link copied")); }); row.add_suffix(©); } @@ -237,44 +237,48 @@ pub(crate) fn repaint_shared_by_me(ui: &Rc, items: &[SharedItem]) { /// Manage access opens the per-node Share dialog, which addresses a pathless /// node by uid, so every shared item can be managed from here. fn shared_by_me_menu(ui: &Rc, entry: &DirEntry, url: Option) -> gtk4::MenuButton { - let mut items: Vec<(&str, MenuAction)> = Vec::new(); + let mut items: Vec<(String, MenuAction)> = Vec::new(); if !entry.path.is_empty() { let (ui_c, entry_c) = (ui.clone(), entry.clone()); - items.push(("Open", Box::new(move || open_shared_by_me(&ui_c, &entry_c)))); + items.push(( + pgettext("verb", "Open"), + Box::new(move || open_shared_by_me(&ui_c, &entry_c)), + )); let (ui_c, entry_c) = (ui.clone(), entry.clone()); items.push(( - "Show in My Files", + gettext("Show in My Files"), Box::new(move || show_in_my_files(&ui_c, &entry_c)), )); } if let Some(url) = url { - items.push(("Open Link", Box::new(move || open_uri(&url)))); + items.push((gettext("Open Link"), Box::new(move || open_uri(&url)))); } let (ui_c, entry_c) = (ui.clone(), entry.clone()); items.push(( - "Manage Access…", + gettext("Manage Access…"), Box::new(move || open_share_dialog(&ui_c, &entry_c)), )); let (ui_c, entry_c) = (ui.clone(), entry.clone()); items.push(( - "Stop Sharing…", + gettext("Stop Sharing…"), Box::new(move || prompt_stop_sharing(&ui_c, &entry_c)), )); - more_menu_button(items) + let (labels, actions): (Vec, Vec) = items.into_iter().unzip(); + more_menu_button(labels.iter().map(String::as_str).zip(actions).collect()) } /// Confirm, then remove every member, invitation and the public link. pub(crate) fn prompt_stop_sharing(ui: &Rc, entry: &DirEntry) { let dialog = adw::AlertDialog::builder() - .heading("Stop sharing?") - .body(format!( - "Everyone you invited loses access to “{}”, pending invitations are \ - withdrawn and its public link stops working.", - entry.name + .heading(gettext("Stop sharing?")) + // Translators: {name} is the shared item's name. + .body(gettext_f( + "Everyone you invited loses access to “{name}”, pending invitations are withdrawn and its public link stops working.", + &[("name", &entry.name)], )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("stop", "Stop Sharing"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("stop", &gettext("Stop Sharing")); dialog.set_response_appearance("stop", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -285,8 +289,9 @@ pub(crate) fn prompt_stop_sharing(ui: &Rc, entry: &DirEntry) { run_mutation( &ui_c, Request::StopSharingByUid { uid: uid.clone() }, - format!("Stopped sharing {name}"), - "Couldn't stop sharing", + // Translators: {name} is the item's name. + gettext_f("Stopped sharing {name}", &[("name", &name)]), + gettext_noop("Couldn't stop sharing"), ); }); dialog.present(ui_window(ui).as_ref()); @@ -319,24 +324,29 @@ pub(crate) fn show_in_my_files(ui: &Rc, entry: &DirEntry) { pub(crate) fn shared_item_summary(item: &SharedItem) -> String { let mut parts = Vec::new(); if item.member_count > 0 { - parts.push(format!( - "{} {}", - item.member_count, - if item.member_count == 1 { - "person" - } else { - "people" - } + // Translators: how many people have access to a shared item. + parts.push(ngettext_f( + "{n} person", + "{n} people", + item.member_count as u64, + &[], )); } if item.invite_count > 0 { - parts.push(format!("{} pending", item.invite_count)); + // Translators: how many invitations to a shared item are not accepted yet. + parts.push(ngettext_f( + "{n} pending", + "{n} pending", + item.invite_count as u64, + &[], + )); } if item.link.is_some() { - parts.push("Public link".to_string()); + parts.push(gettext("Public link")); } if parts.is_empty() { - "Shared".to_string() + // Translators: a shared item's summary when no people or link can be counted. + pgettext("state", "Shared") } else { parts.join(" · ") } diff --git a/crates/pdfs-gui/src/app/pages/status.rs b/crates/pdfs-gui/src/app/pages/status.rs index 508e294..112b049 100644 --- a/crates/pdfs-gui/src/app/pages/status.rs +++ b/crates/pdfs-gui/src/app/pages/status.rs @@ -48,6 +48,9 @@ pub(crate) struct StatusState { pub(crate) accent_row: adw::SwitchRow, /// "Show tray icon" toggle. Guarded by [`Self::settings_suppress`]. pub(crate) tray_row: adw::SwitchRow, + /// Language picker: "System Default", then [`i18n::LANGUAGES`]. Guarded by + /// [`Self::settings_suppress`]. + pub(crate) language_row: adw::ComboRow, /// Set while a settings widget is being populated programmatically, so its /// change handler skips the IPC/systemd side effect. pub(crate) settings_suppress: Cell, @@ -138,6 +141,7 @@ pub(crate) struct MainWidgets { pub(crate) mountpoint_button: gtk4::Button, pub(crate) accent_row: adw::SwitchRow, pub(crate) tray_row: adw::SwitchRow, + pub(crate) language_row: adw::ComboRow, } /// Build the two surfaces that replaced the old Settings page: @@ -150,22 +154,30 @@ pub(crate) struct MainWidgets { /// the app version and user agent in About → Troubleshooting. pub(crate) fn build_main_page() -> MainWidgets { // ---- Preferences: General - let startup_group = adw::PreferencesGroup::builder().title("Startup").build(); + let startup_group = adw::PreferencesGroup::builder() + .title(gettext("Startup")) + .build(); let autostart_row = adw::SwitchRow::builder() - .title("Start on login") - .subtitle("Connect Proton Drive automatically when you log in") + .title(gettext("Start on login")) + .subtitle(gettext( + "Connect Proton Drive automatically when you log in", + )) .build(); startup_group.add(&autostart_row); - let location_group = adw::PreferencesGroup::builder().title("Location").build(); + let location_group = adw::PreferencesGroup::builder() + .title(gettext("Location")) + .build(); let mountpoint_row = adw::ActionRow::builder() - .title("Proton Drive folder") + .title(gettext("Proton Drive folder")) .subtitle("—") .build(); mountpoint_row.add_css_class("property"); let mountpoint_button = gtk4::Button::builder() - .label("Change…") - .tooltip_text("Choose a different folder for the Proton Drive mount") + .label(gettext("Change…")) + .tooltip_text(gettext( + "Choose a different folder for the Proton Drive mount", + )) .valign(gtk4::Align::Center) .build(); mountpoint_button.add_css_class("flat"); @@ -175,8 +187,10 @@ pub(crate) fn build_main_page() -> MainWidgets { // Bandwidth caps in MiB/s. 0 = unlimited; the smallest cap is one 0.5 step, // since anything slower would stall a single block for most of a minute. let network_group = adw::PreferencesGroup::builder() - .title("Network") - .description("Limit how fast files move, shared by every transfer. 0 means no limit.") + .title(gettext("Network")) + .description(gettext( + "Limit how fast files move, shared by every transfer. 0 means no limit.", + )) .build(); let limit_row = |title: &str| { adw::SpinRow::builder() @@ -185,25 +199,31 @@ pub(crate) fn build_main_page() -> MainWidgets { .digits(1) .build() }; - let upload_limit_row = limit_row("Upload limit (MiB/s)"); - let download_limit_row = limit_row("Download limit (MiB/s)"); + let upload_limit_row = limit_row(&gettext("Upload limit (MiB/s)")); + let download_limit_row = limit_row(&gettext("Download limit (MiB/s)")); network_group.add(&upload_limit_row); network_group.add(&download_limit_row); - let appearance_group = adw::PreferencesGroup::builder().title("Appearance").build(); + let appearance_group = adw::PreferencesGroup::builder() + .title(gettext("Appearance")) + .build(); let accent_row = adw::SwitchRow::builder() - .title("Proton purple accent") - .subtitle("Use the Proton brand color instead of the system accent color") + .title(gettext("Proton purple accent")) + .subtitle(gettext( + "Use the Proton brand color instead of the system accent color", + )) .build(); appearance_group.add(&accent_row); let tray_row = adw::SwitchRow::builder() - .title("Show tray icon") - .subtitle("Sync status and quick actions in the panel") + .title(gettext("Show tray icon")) + .subtitle(gettext("Sync status and quick actions in the panel")) .build(); appearance_group.add(&tray_row); + let language_row = build_language_row(); + appearance_group.add(&language_row); let general = adw::PreferencesPage::builder() - .title("General") + .title(gettext("General")) .icon_name("preferences-system-symbolic") .build(); general.add(&startup_group); @@ -213,8 +233,10 @@ pub(crate) fn build_main_page() -> MainWidgets { // ---- Preferences: Storage let storage_group = adw::PreferencesGroup::builder() - .title("Cache") - .description("Pinned and recently opened files, kept on this computer.") + .title(gettext("Cache")) + .description(gettext( + "Pinned and recently opened files, kept on this computer.", + )) .build(); let storage_box = gtk4::Box::new(gtk4::Orientation::Vertical, 6); storage_box.set_margin_top(12); @@ -236,18 +258,20 @@ pub(crate) fn build_main_page() -> MainWidgets { // as "no eviction". Step in 0.5 GiB; the upper bound is generous. let budget_adj = gtk4::Adjustment::new(0.0, 0.0, 1024.0, 0.5, 1.0, 0.0); let budget_row = adw::SpinRow::builder() - .title("Cache size limit (GiB)") - .subtitle("Older files are removed past this size; 0 means no limit") + .title(gettext("Cache size limit (GiB)")) + .subtitle(gettext( + "Older files are removed past this size; 0 means no limit", + )) .adjustment(&budget_adj) .digits(1) .build(); storage_group.add(&budget_row); let purge_row = adw::ActionRow::builder() - .title("Clear cache") - .subtitle("Remove cached copies. Files kept offline stay.") + .title(gettext("Clear cache")) + .subtitle(gettext("Remove cached copies. Files kept offline stay.")) .build(); let purge_button = gtk4::Button::builder() - .label("Clear…") + .label(gettext("Clear…")) .valign(gtk4::Align::Center) .build(); purge_button.add_css_class("flat"); @@ -256,12 +280,14 @@ pub(crate) fn build_main_page() -> MainWidgets { // Pins group: filled in by refresh. let pins_group = adw::PreferencesGroup::builder() - .title("Available offline") - .description("Files kept on this computer, even without a connection.") + .title(gettext("Available offline")) + .description(gettext( + "Files kept on this computer, even without a connection.", + )) .build(); let storage = adw::PreferencesPage::builder() - .title("Storage") + .title(gettext("Storage")) .icon_name("drive-harddisk-symbolic") .build(); storage.add(&storage_group); @@ -276,7 +302,7 @@ pub(crate) fn build_main_page() -> MainWidgets { // ---- Sidebar footer let status_icon = gtk4::Image::from_icon_name("content-loading-symbolic"); let status_title = gtk4::Label::builder() - .label("Connecting…") + .label(gettext("Connecting…")) .halign(gtk4::Align::Start) .ellipsize(gtk4::pango::EllipsizeMode::End) .build(); @@ -297,7 +323,7 @@ pub(crate) fn build_main_page() -> MainWidgets { status_content.append(&status_text); let status_button = gtk4::Button::builder() .child(&status_content) - .tooltip_text("Show sync status") + .tooltip_text(gettext("Show sync status")) .build(); status_button.add_css_class("flat"); status_button.add_css_class("sidebar-status"); @@ -324,13 +350,13 @@ pub(crate) fn build_main_page() -> MainWidgets { .ellipsize(gtk4::pango::EllipsizeMode::Middle) .build(); let account_menu = gio::Menu::new(); - account_menu.append(Some("Preferences"), Some("win.preferences")); + account_menu.append(Some(&gettext("Preferences")), Some("win.preferences")); let sign_out = gio::Menu::new(); - sign_out.append(Some("Sign Out…"), Some("win.sign-out")); + sign_out.append(Some(&gettext("Sign Out…")), Some("win.sign-out")); account_menu.append_section(None, &sign_out); let account_button = gtk4::MenuButton::builder() .icon_name("view-more-symbolic") - .tooltip_text("Account") + .tooltip_text(gettext("Account")) .menu_model(&account_menu) .valign(gtk4::Align::Center) .build(); @@ -371,15 +397,44 @@ pub(crate) fn build_main_page() -> MainWidgets { mountpoint_button, accent_row, tray_row, + language_row, } } +/// The Preferences language picker. Row 0 follows the system locale; the rest +/// are [`i18n::LANGUAGES`] in order, under their own names. +fn build_language_row() -> adw::ComboRow { + let names = gtk4::StringList::new(&[]); + names.append(&gettext("System Default")); + for (_, name) in i18n::LANGUAGES { + names.append(name); + } + adw::ComboRow::builder() + .title(gettext("Language")) + .subtitle(gettext("Takes effect the next time Proton Drive starts")) + .model(&names) + .build() +} + +/// The picker row for a saved language code; unknown codes show as the system +/// default, which is also how [`i18n::init`] treats them. +pub(crate) fn language_index(code: Option<&str>) -> u32 { + code.and_then(|code| i18n::LANGUAGES.iter().position(|(known, _)| *known == code)) + .map_or(0, |at| at as u32 + 1) +} + +/// The language code a picker row stands for; `None` is the system default. +pub(crate) fn language_at(index: u32) -> Option<&'static str> { + let at = usize::try_from(index).ok()?.checked_sub(1)?; + i18n::LANGUAGES.get(at).map(|(code, _)| *code) +} + /// The Sync page's live-transfers group, hidden until the refresh loop sees an /// in-flight transfer from [`Request::GetQueueStatus`]. pub(crate) fn build_transfers_group() -> adw::PreferencesGroup { adw::PreferencesGroup::builder() - .title("Transfers") - .description("Files moving to and from Proton Drive.") + .title(gettext("Transfers")) + .description(gettext("Files moving to and from Proton Drive.")) .visible(false) .build() } @@ -430,6 +485,9 @@ pub(crate) fn wire_settings( .accent_row .set_active(config.proton_accent.unwrap_or(false)); ui.status.tray_row.set_active(!config.tray_hidden); + ui.status + .language_row + .set_selected(language_index(config.language.as_deref())); ui.status.settings_suppress.set(false); // Cache budget: a user edit applies the new soft cap on the daemon (which @@ -450,8 +508,8 @@ pub(crate) fn wire_settings( settings_request( &ui_fire, Request::SetCacheBudget { bytes }, - "Cache budget updated", - "Couldn't set cache budget", + gettext("Cache budget updated"), + gettext("Couldn't set cache budget"), ); }); *ui_budget.status.budget_source.borrow_mut() = Some(src); @@ -476,8 +534,8 @@ pub(crate) fn wire_settings( settings_request( &ui_fire, Request::SetBandwidthLimits { upload, download }, - "Bandwidth limits updated", - "Couldn't set bandwidth limits", + gettext("Bandwidth limits updated"), + gettext("Couldn't set bandwidth limits"), ); }); *ui_limit.status.limit_source.borrow_mut() = Some(src); @@ -489,14 +547,11 @@ pub(crate) fn wire_settings( purge_button.connect_clicked(move |_| { let ui = ui_purge.clone(); let dialog = adw::AlertDialog::builder() - .heading("Clear Cache?") - .body( - "Cached copies are removed from this computer and download again when \ - you open them. Files kept available offline stay.", - ) + .heading(gettext("Clear Cache?")) + .body(gettext("Cached copies are removed from this computer and download again when you open them. Files kept available offline stay.")) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("purge", "Clear Cache"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("purge", &gettext("Clear Cache")); dialog.set_response_appearance("purge", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -505,8 +560,8 @@ pub(crate) fn wire_settings( settings_request( &ui, Request::PurgeCache, - "Cache cleared", - "Couldn't clear the cache", + gettext("Cache cleared"), + gettext("Couldn't clear the cache"), ); } }); @@ -541,7 +596,11 @@ pub(crate) fn wire_settings( let mut config = ui_accent.dirs.load_config(); config.proton_accent = Some(on); if let Err(e) = ui_accent.dirs.save_config(&config) { - toast_error(&ui_accent, "Couldn't save the accent color", &e.to_string()); + toast_error( + &ui_accent, + &gettext("Couldn't save the accent color"), + &e.to_string(), + ); } }); @@ -556,7 +615,11 @@ pub(crate) fn wire_settings( let mut config = ui_tray.dirs.load_config(); config.tray_hidden = !show; if let Err(e) = ui_tray.dirs.save_config(&config) { - toast_error(&ui_tray, "Couldn't save the tray setting", &e.to_string()); + toast_error( + &ui_tray, + &gettext("Couldn't save the tray setting"), + &e.to_string(), + ); return; } if show { @@ -565,18 +628,36 @@ pub(crate) fn wire_settings( pdfs_core::tray::quit(&ui_tray.dirs); } }); + + // Language: read once at start by the app, the tray and the prompt, so a + // change applies on the next launch. + let ui_language = ui.clone(); + ui.status.language_row.connect_selected_notify(move |row| { + if ui_language.status.settings_suppress.get() { + return; + } + let mut config = ui_language.dirs.load_config(); + config.language = language_at(row.selected()).map(str::to_string); + if let Err(e) = ui_language.dirs.save_config(&config) { + toast_error( + &ui_language, + &gettext("Couldn't save the language"), + &e.to_string(), + ); + return; + } + toast( + &ui_language, + &gettext("Restart Proton Drive to use the new language"), + ); + }); } /// Run a settings control-socket round-trip (budget / purge) on a worker thread, /// confirming with `done` or reporting the daemon's error under `failed`. Unlike /// [`run_mutation`] there's no browser reload; the next refresh tick repaints the /// cache read-out. -pub(crate) fn settings_request( - ui: &Rc, - req: Request, - done: &'static str, - failed: &'static str, -) { +pub(crate) fn settings_request(ui: &Rc, req: Request, done: String, failed: String) { ui.busy_begin(); let rx = spawn_request(ui.dirs.control_socket(), req); let ui = ui.clone(); @@ -584,9 +665,11 @@ pub(crate) fn settings_request( let result = rx.recv().await; ui.busy_end(); match result { - Ok(Ok(Response::Ok { .. })) => toast(&ui, done), - Ok(Ok(Response::Error { message, kind })) => toast_failure(&ui, failed, &message, kind), - _ => toast_error(&ui, failed, "The mount service didn't respond."), + Ok(Ok(Response::Ok { .. })) => toast(&ui, &done), + Ok(Ok(Response::Error { message, kind })) => { + toast_failure(&ui, &failed, &message, kind) + } + _ => toast_error(&ui, &failed, &gettext("The mount service didn't respond.")), } }); } @@ -596,7 +679,7 @@ pub(crate) fn settings_request( pub(crate) fn prompt_mountpoint(ui: &Rc) { let win = ui_window(ui); let dialog = gtk4::FileDialog::builder() - .title("Choose mountpoint folder") + .title(gettext("Choose mountpoint folder")) .build(); let ui = ui.clone(); dialog.select_folder(win.as_ref(), gio::Cancellable::NONE, move |res| { @@ -608,7 +691,7 @@ pub(crate) fn prompt_mountpoint(ui: &Rc) { let mut config = ui.dirs.load_config(); config.mountpoint = Some(path_str.clone()); if let Err(e) = ui.dirs.save_config(&config) { - toast_error(&ui, "Couldn't save mountpoint", &e.to_string()); + toast_error(&ui, &gettext("Couldn't save mountpoint"), &e.to_string()); return; } ui.status.mountpoint_row.set_subtitle(&path_str); @@ -621,13 +704,15 @@ pub(crate) fn prompt_mountpoint(ui: &Rc) { // The daemon only reads the mountpoint at mount time, so offer a restart. let confirm = adw::AlertDialog::builder() - .heading("Restart to apply") - .body(format!( - "The mountpoint is now “{path_str}”. Restart the Drive mount to use it?" + .heading(gettext("Restart to apply")) + // Translators: {path} is the folder the drive is mounted at. + .body(gettext_f( + "The mountpoint is now “{path}”. Restart the Drive mount to use it?", + &[("path", &path_str)], )) .build(); - confirm.add_response("later", "Later"); - confirm.add_response("restart", "Restart now"); + confirm.add_response("later", &gettext("Later")); + confirm.add_response("restart", &gettext("Restart now")); confirm.set_response_appearance("restart", adw::ResponseAppearance::Suggested); confirm.set_default_response(Some("restart")); confirm.set_close_response("later"); @@ -778,17 +863,26 @@ fn paint_account_quota(ui: &Rc, max_space: i64, used_space: i64) { fn quota_display(max_space: i64, used_space: i64) -> (f64, String) { let used = used_space.max(0) as u64; if max_space <= 0 { - return (0.0, format!("{} used", human_bytes(used))); + return ( + 0.0, + // Translators: {size} is an amount of storage, such as "1.2 GiB". + gettext_f("{size} used", &[("size", &human_bytes(used))]), + ); } let total = max_space as u64; let fraction = (used as f64 / total as f64).clamp(0.0, 1.0); let pct = (fraction * 100.0).round() as u64; ( fraction, - format!( - "{} of {} used ({pct}%)", - human_bytes(used), - human_bytes(total) + // Translators: account storage. {used} and {total} are sizes such as + // "1.2 GiB"; {percent} is a whole number, followed by the percent sign. + gettext_f( + "{used} of {total} used ({percent}%)", + &[ + ("used", &human_bytes(used)), + ("total", &human_bytes(total)), + ("percent", &pct.to_string()), + ], ), ) } @@ -806,11 +900,17 @@ fn quota_status_display(max_space: i64, used_space: i64) -> Option<(f64, String, let pct = (fraction * 100.0).round() as u64; Some(( fraction, - format!("{} free", human_bytes(free)), - format!( - "{} free out of {} ({pct}% used)", - human_bytes(free), - human_bytes(total) + // Translators: {size} is an amount of storage, such as "1.2 GiB". + gettext_f("{size} free", &[("size", &human_bytes(free))]), + // Translators: account storage. {free} and {total} are sizes such as + // "1.2 GiB"; {percent} is a whole number, followed by the percent sign. + gettext_f( + "{free} free out of {total} ({percent}% used)", + &[ + ("free", &human_bytes(free)), + ("total", &human_bytes(total)), + ("percent", &pct.to_string()), + ], ), )) } @@ -843,14 +943,14 @@ pub(crate) fn set_mounted(ui: &Rc, mounted: bool) { if mounted { notify( "mount-state", - "Proton Drive connected", - "Your Drive is mounted and available.", + &gettext("Proton Drive connected"), + &gettext("Your Drive is mounted and available."), ); } else { notify( "mount-state", - "Proton Drive disconnected", - "The mount service stopped. Files aren't available until it restarts.", + &gettext("Proton Drive disconnected"), + &gettext("The mount service stopped. Files aren't available until it restarts."), ); } } @@ -900,15 +1000,15 @@ pub(crate) fn repaint_transfers(ui: &Rc, items: &[TransferItem], jobs: &[Job let previous = ui.status.active_transfers.replace(items.len()); if items.is_empty() && previous > 0 { - let files = if previous == 1 { - "1 file".to_string() - } else { - format!("{previous} files") - }; notify( "sync-complete", - "Sync complete", - &format!("{files} finished transferring."), + &gettext("Sync complete"), + &ngettext_f( + "{n} file finished transferring.", + "{n} files finished transferring.", + previous as u64, + &[], + ), ); // A just-finished batch may have added files (bulk upload) the current // listing doesn't show yet; refresh whichever listing is on screen. @@ -966,11 +1066,26 @@ pub(crate) fn repaint_transfers(ui: &Rc, items: &[TransferItem], jobs: &[Job /// One Activity row for a daemon job: its title, plus whatever it can say about /// where it is — a count when it has one, else what it is currently chewing on. pub(crate) fn job_line(j: &JobItem) -> ActivityLine { + let done = j.done.to_string(); + let total = j.total.to_string(); + let args: [(&str, &str); 4] = [ + ("title", &j.title), + ("detail", &j.detail), + ("done", &done), + ("total", &total), + ]; let text = match (j.total > 0, j.detail.is_empty()) { - (true, true) => format!("{} — {} of {}", j.title, j.done, j.total), - (true, false) => format!("{} — {} ({} of {})", j.title, j.detail, j.done, j.total), - (false, true) => format!("{}…", j.title), - (false, false) => format!("{} — {}…", j.title, j.detail), + // Translators: a background job's progress. {title} is the job, such as + // "Scanning Photos"; {done} and {total} are counts. + (true, true) => gettext_f("{title} — {done} of {total}", &args), + // Translators: a background job's progress. {title} is the job, {detail} + // what it is working on; {done} and {total} are counts. + (true, false) => gettext_f("{title} — {detail} ({done} of {total})", &args), + // Translators: a background job still running. {title} is the job. + (false, true) => gettext_f("{title}…", &args), + // Translators: a background job still running. {title} is the job, + // {detail} what it is working on. + (false, false) => gettext_f("{title} — {detail}…", &args), }; ActivityLine { text, @@ -984,25 +1099,30 @@ pub(crate) fn transfer_line(t: &TransferItem) -> ActivityLine { TransferDirection::Download => "↓", TransferDirection::Upload => "↑", }; + let done = human_bytes(t.bytes_completed); + let total = human_bytes(t.bytes_total); + let speed = human_bytes(t.speed_bytes_sec); + let args: [(&str, &str); 5] = [ + ("arrow", arrow), + ("name", &t.name), + ("done", &done), + ("total", &total), + ("speed", &speed), + ]; if t.bytes_total == 0 { ActivityLine { - text: format!( - "{arrow} {} — {} ({}/s)", - t.name, - human_bytes(t.bytes_completed), - human_bytes(t.speed_bytes_sec), - ), + // Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the + // file name, {done} the size moved so far and {speed} a size such as + // "1.2 MiB"; "/s" means per second. + text: gettext_f("{arrow} {name} — {done} ({speed}/s)", &args), fraction: None, } } else { ActivityLine { - text: format!( - "{arrow} {} — {} of {} ({}/s)", - t.name, - human_bytes(t.bytes_completed), - human_bytes(t.bytes_total), - human_bytes(t.speed_bytes_sec), - ), + // Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the + // file name, {done} and {total} sizes and {speed} a size such as + // "1.2 MiB"; "/s" means per second. + text: gettext_f("{arrow} {name} — {done} of {total} ({speed}/s)", &args), fraction: Some((t.bytes_completed as f64 / t.bytes_total as f64).min(1.0)), } } @@ -1042,7 +1162,7 @@ pub(crate) fn refresh_status(ui: &Rc) { // The queue is the more useful thing to say when it has anything // in it: it is why a file that looks saved is not on the remote // yet, and offline is usually the reason it is still queued. - let queued = pending_summary(pending_uploads, pending_changes); + let queued = i18n::pending_summary(pending_uploads, pending_changes); let state = if paused { SyncState::Paused { until: paused_until, @@ -1131,47 +1251,55 @@ fn paint_sync_status(ui: &Rc, state: SyncState) { SyncState::Paused { until, queued } => ( "media-playback-pause-symbolic", Some("warning"), - "Sync paused".to_string(), + gettext("Sync paused"), Some(match (until, queued) { - (Some(until), Some(queued)) => format!("{queued} · resumes {}", clock_time(until)), - (Some(until), None) => format!("Resumes {}", clock_time(until)), + // Translators: {queued} says what is waiting, such as "3 changes + // waiting"; {time} is when syncing resumes, such as "at 14:30". + (Some(until), Some(queued)) => gettext_f( + "{queued} · resumes {time}", + &[("queued", &queued), ("time", &clock_time(until))], + ), + // Translators: {time} is when syncing resumes, such as "at 14:30" + // or "Tue 09:00". + (Some(until), None) => gettext_f("Resumes {time}", &[("time", &clock_time(until))]), (None, Some(queued)) => queued, - (None, None) => "Until you resume".to_string(), + (None, None) => gettext("Until you resume"), }), ), SyncState::Attention { count, error } => ( "dialog-warning-symbolic", Some("error"), - format!( - "{} need{} attention", - count_noun(count as usize, "change", "changes"), - if count == 1 { "s" } else { "" } + ngettext_f( + "{n} change needs attention", + "{n} changes need attention", + count, + &[], ), error, ), SyncState::Offline { queued } => ( "network-offline-symbolic", Some("warning"), - "Offline".to_string(), - Some(queued.unwrap_or_else(|| "Cached files only".to_string())), + pgettext("state", "Offline"), + Some(queued.unwrap_or_else(|| gettext("Cached files only"))), ), SyncState::Syncing { queued } => ( "emblem-synchronizing-symbolic", None, - "Syncing".to_string(), + pgettext("state", "Syncing"), Some(queued), ), SyncState::UpToDate { mountpoint } => ( "emblem-ok-symbolic", Some("success"), - "Up to date".to_string(), + gettext("Up to date"), Some(mountpoint), ), SyncState::Disconnected => ( "network-offline-symbolic", Some("warning"), - "Not connected".to_string(), - Some("Proton Drive isn't running".to_string()), + gettext("Not connected"), + Some(gettext("Proton Drive isn't running")), ), }; let image = &ui.status.status_icon; @@ -1205,18 +1333,24 @@ pub(crate) fn clock_time(unix: i64) -> String { glib::DateTime::from_unix_local(unix), glib::DateTime::now_local(), ) else { - return "later".to_string(); + // Translators: stands in for a time that could not be read, as in + // "Resumes later". + return gettext("later"); }; let format = if at.ymd() == now.ymd() { - "at %H:%M" + // Translators: strftime format for a time later today, such as "at 14:30". + gettext("at %H:%M") } else if at.difference(&now).as_seconds() < 6 * 86_400 { - "%a %H:%M" + // Translators: strftime format for a time within the next week, such as + // "Tue 09:00". + gettext("%a %H:%M") } else { - "%e %b" + // Translators: strftime format for a date further ahead, such as "23 Sep". + gettext("%e %b") }; - at.format(format) + at.format(&format) .map(|s| s.trim().to_string()) - .unwrap_or_else(|_| "later".to_string()) + .unwrap_or_else(|_| gettext("later")) } /// Render the pins group from `pins`, with the unpin buttons enabled only while a @@ -1242,8 +1376,10 @@ pub(crate) fn repaint_pins(ui: &Rc, pins: &[pdfs_core::cache::Pin], mounted: if pins.is_empty() { let row = adw::ActionRow::builder() - .title("No files kept offline") - .subtitle("Right-click a file and choose “Make available offline”.") + .title(gettext("No files kept offline")) + .subtitle(gettext( + "Right-click a file and choose “Make available offline”.", + )) .build(); ui.status.pins_group.add(&row); ui.status @@ -1277,7 +1413,7 @@ pub(crate) fn repaint_pins(ui: &Rc, pins: &[pdfs_core::cache::Pin], mounted: let unpin = gtk4::Button::builder() .icon_name("pdfs-online-only-symbolic") .valign(gtk4::Align::Center) - .tooltip_text("Make online only") + .tooltip_text(gettext("Make online only")) .sensitive(mounted) .build(); unpin.add_css_class("flat"); @@ -1291,14 +1427,17 @@ pub(crate) fn repaint_pins(ui: &Rc, pins: &[pdfs_core::cache::Pin], mounted: let ui = ui_btn.clone(); glib::spawn_future_local(async move { match rx.recv().await { - Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't make it online only", &message, kind) - } + Ok(Ok(Response::Error { message, kind })) => toast_failure( + &ui, + &gettext("Couldn't make it online only"), + &message, + kind, + ), Ok(Ok(_)) => refresh(&ui), _ => toast_error( &ui, - "Couldn't make it online only", - "The mount service didn't respond.", + &gettext("Couldn't make it online only"), + &gettext("The mount service didn't respond."), ), } }); @@ -1315,9 +1454,14 @@ pub(crate) fn repaint_pins(ui: &Rc, pins: &[pdfs_core::cache::Pin], mounted: if pins.len() > PINS_COLLAPSED { let row = adw::ActionRow::builder() .title(if expanded { - "Show fewer".to_string() + gettext("Show fewer") } else { - format!("Show all {}", count_noun(pins.len(), "file", "files")) + ngettext_f( + "Show all {n} file", + "Show all {n} files", + pins.len() as u64, + &[], + ) }) .activatable(true) .build(); @@ -1360,7 +1504,7 @@ mod tests { #[test] fn quota_display_clamps_bad_api_values() { - assert_eq!(quota_display(0, -1), (0.0, "0 B used".to_string())); + assert_eq!(quota_display(0, -1), (0.0, "0 bytes used".to_string())); assert_eq!(quota_display(100, 150).0, 1.0); } diff --git a/crates/pdfs-gui/src/app/pages/takeout.rs b/crates/pdfs-gui/src/app/pages/takeout.rs index 784c609..3cf2125 100644 --- a/crates/pdfs-gui/src/app/pages/takeout.rs +++ b/crates/pdfs-gui/src/app/pages/takeout.rs @@ -70,8 +70,11 @@ fn save_staged(ui: &Rc) { } } -const EMPTY_LIST_DESCRIPTION: &str = "Photos already in Proton Photos are matched by name and content and skipped, so \ - re-running an interrupted import is safe."; +fn empty_list_description() -> String { + gettext( + "Photos already in Proton Photos are matched by name and content and skipped, so re-running an interrupted import is safe.", + ) +} pub(crate) struct TakeoutState { /// Archives staged for this import, in the order they were added. Sent as @@ -130,13 +133,15 @@ pub(crate) fn build_takeout_page() -> (gtk4::Widget, TakeoutWidgets) { // there and has no sidebar row of its own to navigate back with. let back_button = gtk4::Button::builder() .icon_name("go-previous-symbolic") - .tooltip_text("Back to Photos") + .tooltip_text(gettext("Back to Photos")) .valign(gtk4::Align::Center) .build(); back_button.add_css_class("flat"); let subtitle = gtk4::Label::builder() - .label("Add a Google Takeout export to your Proton Photos timeline.") + .label(gettext( + "Add a Google Takeout export to your Proton Photos timeline.", + )) .halign(gtk4::Align::Start) .wrap(true) .xalign(0.0) @@ -152,18 +157,18 @@ pub(crate) fn build_takeout_page() -> (gtk4::Widget, TakeoutWidgets) { drop_icon.set_pixel_size(48); drop_icon.add_css_class("dim-label"); let drop_title = gtk4::Label::builder() - .label("Drop your Takeout .zip files here") + .label(gettext("Drop your Takeout .zip files here")) .build(); drop_title.add_css_class("title-4"); let drop_hint = gtk4::Label::builder() - .label("Add every part of the export at once — a photo and its metadata often sit in different parts.") + .label(gettext("Add every part of the export at once — a photo and its metadata often sit in different parts.")) .wrap(true) .justify(gtk4::Justification::Center) .max_width_chars(48) .build(); drop_hint.add_css_class("dim-label"); let choose_button = gtk4::Button::builder() - .label("Choose files…") + .label(gettext("Choose files…")) .halign(gtk4::Align::Center) .build(); choose_button.add_css_class("pill"); @@ -181,13 +186,13 @@ pub(crate) fn build_takeout_page() -> (gtk4::Widget, TakeoutWidgets) { // group carries a placeholder row while empty so it never renders as a bare // title. let list_group = adw::PreferencesGroup::builder() - .title("Archives to import") - .description(EMPTY_LIST_DESCRIPTION) + .title(gettext("Archives to import")) + .description(empty_list_description()) .build(); let clear_button = gtk4::Button::builder() - .label("Clear") - .tooltip_text("Remove every staged archive") + .label(gettext("Clear")) + .tooltip_text(gettext("Remove every staged archive")) .build(); clear_button.add_css_class("flat"); @@ -195,16 +200,22 @@ pub(crate) fn build_takeout_page() -> (gtk4::Widget, TakeoutWidgets) { // what an import *would* do, without uploading a byte. It is offered first // because the import behind it is hours long and hard to take back. let scan_button = gtk4::Button::builder() - .label("Scan") - .tooltip_text("Check the archives and report what would be imported, without uploading") + .label(pgettext("verb", "Scan")) + .tooltip_text(gettext( + "Check the archives and report what would be imported, without uploading", + )) .build(); scan_button.add_css_class("pill"); - let import_button = gtk4::Button::builder().label("Import").build(); + let import_button = gtk4::Button::builder() + .label(pgettext("verb", "Import")) + .build(); import_button.add_css_class("pill"); import_button.add_css_class("suggested-action"); let cancel_button = gtk4::Button::builder() - .label("Stop import") - .tooltip_text("Finish the photo on the wire, file what was uploaded, then stop") + .label(gettext("Stop import")) + .tooltip_text(gettext( + "Finish the photo on the wire, file what was uploaded, then stop", + )) .build(); cancel_button.add_css_class("pill"); cancel_button.add_css_class("destructive-action"); @@ -224,7 +235,7 @@ pub(crate) fn build_takeout_page() -> (gtk4::Widget, TakeoutWidgets) { // Progress: the import's job from the transfer snapshot, so this page shows // the same numbers the Sync page's Transfers list does. let progress_group = adw::PreferencesGroup::builder() - .title("Import in progress") + .title(gettext("Import in progress")) .visible(false) .build(); let progress_box = gtk4::Box::new(gtk4::Orientation::Vertical, 6); @@ -246,7 +257,7 @@ pub(crate) fn build_takeout_page() -> (gtk4::Widget, TakeoutWidgets) { // outlives the window being on this page, and "what happened" is the whole // reason to come back to it. let summary_group = adw::PreferencesGroup::builder() - .title("Last import") + .title(gettext("Last import")) .visible(false) .build(); @@ -273,7 +284,7 @@ pub(crate) fn build_takeout_page() -> (gtk4::Widget, TakeoutWidgets) { page.set_margin_end(18); page.append(&subtitle_clamp); page.append(&scroll); - let (frame, header, _) = page_frame("Import from Google Photos", &page); + let (frame, header, _) = page_frame(&gettext("Import from Google Photos"), &page); header.pack_start(&back_button); let widgets = TakeoutWidgets { @@ -330,10 +341,10 @@ pub(crate) fn wire_takeout(ui: &Rc, widgets: &TakeoutWidgets) { widgets.choose_button.connect_clicked(move |_| { // Multi-select on purpose: the whole export goes in one request. let dialog = gtk4::FileDialog::builder() - .title("Select your Google Takeout archives") + .title(gettext("Select your Google Takeout archives")) .build(); let filter = gtk4::FileFilter::new(); - filter.set_name(Some("Takeout archives")); + filter.set_name(Some(&gettext("Takeout archives"))); filter.add_pattern("*.zip"); let filters = gio::ListStore::new::(); filters.append(&filter); @@ -373,16 +384,16 @@ pub(crate) fn wire_takeout(ui: &Rc, widgets: &TakeoutWidgets) { let count = ui_import.takeout.archives.borrow().len(); let ui = ui_import.clone(); let dialog = adw::AlertDialog::builder() - .heading("Import this export?") - .body(format!( - "{} will be uploaded to Proton Photos, creating albums as they appear in \ - the export. This can take hours; you can stop it at any point and what has \ - been uploaded stays. Photos you already have are skipped.", - count_noun(count, "archive", "archives") + .heading(gettext("Import this export?")) + .body(ngettext_f( + "{n} archive will be uploaded to Proton Photos, creating albums as they appear in the export. This can take hours; you can stop it at any point and what has been uploaded stays. Photos you already have are skipped.", + "{n} archives will be uploaded to Proton Photos, creating albums as they appear in the export. This can take hours; you can stop it at any point and what has been uploaded stays. Photos you already have are skipped.", + count as u64, + &[], )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("import", "Import"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("import", &pgettext("verb", "Import")); dialog.set_response_appearance("import", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -403,14 +414,14 @@ pub(crate) fn wire_takeout(ui: &Rc, widgets: &TakeoutWidgets) { let result = rx.recv().await; ui.busy_end(); match result { - Ok(Ok(Response::Ok { .. })) => toast(&ui, "Stopping the import…"), + Ok(Ok(Response::Ok { .. })) => toast(&ui, &gettext("Stopping the import…")), Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't stop the import", &message, kind); + toast_failure(&ui, &gettext("Couldn't stop the import"), &message, kind); } _ => toast_error( &ui, - "Couldn't stop the import", - "The mount service didn't respond.", + &gettext("Couldn't stop the import"), + &gettext("The mount service didn't respond."), ), } }); @@ -460,12 +471,14 @@ pub(crate) fn add_archives(ui: &Rc, paths: Vec) { if rejected > 0 { toast( ui, - "Only Takeout .zip files can be imported — extracted folders aren't supported.", + &gettext( + "Only Takeout .zip files can be imported — extracted folders aren't supported.", + ), ); } else if added > 0 { toast( ui, - &format!("Added {}", count_noun(added, "archive", "archives")), + &ngettext_f("Added {n} archive", "Added {n} archives", added as u64, &[]), ); } } @@ -481,8 +494,8 @@ pub(crate) fn repaint_archives(ui: &Rc) { if staged.is_empty() { ui.takeout .list_group - .set_description(Some(EMPTY_LIST_DESCRIPTION)); - let row = dim_row("No archives added yet."); + .set_description(Some(&empty_list_description())); + let row = dim_row(&gettext("No archives added yet.")); ui.takeout.list_group.add(&row); rows.push(row.upcast()); } else { @@ -500,7 +513,7 @@ pub(crate) fn repaint_archives(ui: &Rc) { .build(); let remove = gtk4::Button::builder() .icon_name("edit-delete-symbolic") - .tooltip_text("Remove from this import") + .tooltip_text(gettext("Remove from this import")) .valign(gtk4::Align::Center) .build(); remove.add_css_class("flat"); @@ -518,10 +531,14 @@ pub(crate) fn repaint_archives(ui: &Rc) { ui.takeout.list_group.add(&row); rows.push(row.upcast()); } - ui.takeout.list_group.set_description(Some(&format!( - "{}, {} in total. {EMPTY_LIST_DESCRIPTION}", - count_noun(staged.len(), "archive", "archives"), - human_bytes(total) + let size = human_bytes(total); + let note = empty_list_description(); + // Translators: {size} is a file size such as "4.2 MB"; {note} is the sentence about skipped duplicates. + ui.takeout.list_group.set_description(Some(&ngettext_f( + "{n} archive, {size} in total. {note}", + "{n} archives, {size} in total. {note}", + staged.len() as u64, + &[("size", &size), ("note", ¬e)], ))); } *ui.takeout.rows.borrow_mut() = rows; @@ -575,28 +592,28 @@ fn start_import(ui: &Rc, dry_run: bool) { ui.takeout.summary_group.set_visible(false); ui.takeout.progress_group.set_visible(true); ui.takeout.progress_bar.set_fraction(0.0); - ui.takeout.progress_label.set_text(if dry_run { - "Reading archives…" + ui.takeout.progress_label.set_text(&if dry_run { + gettext("Reading archives…") } else { - "Starting import…" + gettext("Starting import…") }); sync_takeout_actions(&ui); toast( &ui, - if dry_run { - "Scanning the export…" + &if dry_run { + gettext("Scanning the export…") } else { - "Import started — you can leave this page, it keeps running." + gettext("Import started — you can leave this page, it keeps running.") }, ); } Ok(Ok(Response::Error { message, kind })) => { - toast_failure(&ui, "Couldn't start the import", &message, kind); + toast_failure(&ui, &gettext("Couldn't start the import"), &message, kind); } _ => toast_error( &ui, - "Couldn't start the import", - "The mount service didn't respond.", + &gettext("Couldn't start the import"), + &gettext("The mount service didn't respond."), ), } }); @@ -629,23 +646,35 @@ pub(crate) fn refresh_takeout(ui: &Rc) { if was_running { let dry = ui.takeout.dry_run.get(); let headline = if dry { - "Scan finished" + gettext("Scan finished") } else { - "Import finished" + gettext("Import finished") }; - toast(&ui, headline); + toast(&ui, &headline); if !dry { let body = match &summary { - Some(s) if s.failed > 0 => { - format!("{} photos added, {} failed.", s.uploaded, s.failed) - } - Some(s) if s.cancelled => { - format!("Stopped after {} photos.", s.uploaded) - } - Some(s) => format!("{} photos added to Proton Photos.", s.uploaded), - None => "The Google Photos import has finished.".to_string(), + // Translators: {n} is the number of photos uploaded, {failed} the number that failed. + Some(s) if s.failed > 0 => ngettext_f( + "{n} photo added, {failed} failed.", + "{n} photos added, {failed} failed.", + s.uploaded as u64, + &[("failed", &s.failed.to_string())], + ), + Some(s) if s.cancelled => ngettext_f( + "Stopped after {n} photo.", + "Stopped after {n} photos.", + s.uploaded as u64, + &[], + ), + Some(s) => ngettext_f( + "{n} photo added to Proton Photos.", + "{n} photos added to Proton Photos.", + s.uploaded as u64, + &[], + ), + None => gettext("The Google Photos import has finished."), }; - notify("takeout-import", headline, &body); + notify("takeout-import", &headline, &body); } } } @@ -665,69 +694,72 @@ fn repaint_summary(ui: &Rc, summary: &ImportSummary) { ui.takeout.summary_group.remove(&row); } let dry = ui.takeout.dry_run.get(); - ui.takeout - .summary_group - .set_title(if dry { "Scan result" } else { "Last import" }); - ui.takeout.summary_group.set_description(Some(if dry { - "Nothing was uploaded — this is what an import would do." - } else if summary.cancelled { - "Stopped early. Everything uploaded so far is in your timeline; run it again to \ - continue where it left off." + ui.takeout.summary_group.set_title(&if dry { + gettext("Scan result") } else { - "Finished." + gettext("Last import") + }); + ui.takeout.summary_group.set_description(Some(&if dry { + gettext("Nothing was uploaded — this is what an import would do.") + } else if summary.cancelled { + gettext("Stopped early. Everything uploaded so far is in your timeline; run it again to continue where it left off.") + } else { + gettext("Finished.") })); // Only lines that carry information: a run with no failures should not have // to show a "0 failed" row for the user to read past. let mut lines: Vec<(String, String)> = vec![ - ("Photos in the export".into(), summary.found.to_string()), + (gettext("Photos in the export"), summary.found.to_string()), ( - if dry { "Would upload" } else { "Uploaded" }.into(), + if dry { + gettext("Would upload") + } else { + gettext("Uploaded") + }, summary.uploaded.to_string(), ), ]; if summary.duplicates > 0 { lines.push(( - "Already in Proton Photos".into(), + gettext("Already in Proton Photos"), summary.duplicates.to_string(), )); } if summary.albums_created > 0 { lines.push(( if dry { - "Albums to create" + gettext("Albums to create") } else { - "Albums created" - } - .into(), + gettext("Albums created") + }, summary.albums_created.to_string(), )); } if summary.album_links > 0 { lines.push(( - "Photos filed into albums".into(), + gettext("Photos filed into albums"), summary.album_links.to_string(), )); } if summary.skipped_trashed > 0 { lines.push(( - "Skipped (in Google's trash)".into(), + gettext("Skipped (in Google's trash)"), summary.skipped_trashed.to_string(), )); } if summary.bytes > 0 { lines.push(( if dry { - "Data to upload" + gettext("Data to upload") } else { - "Data uploaded" - } - .into(), + gettext("Data uploaded") + }, human_bytes(summary.bytes), )); } if summary.failed > 0 { - lines.push(("Failed".into(), summary.failed.to_string())); + lines.push((pgettext("state", "Failed"), summary.failed.to_string())); } let mut rows = Vec::new(); @@ -756,17 +788,22 @@ pub(crate) fn takeout_progress(ui: &Rc, jobs: &[JobItem]) { ui.takeout .progress_bar .set_fraction((job.done as f64 / job.total as f64).min(1.0)); - ui.takeout - .progress_label - .set_text(&format!("{} of {} — {}", job.done, job.total, job.detail)); + let done = job.done.to_string(); + let total = job.total.to_string(); + // Translators: progress such as "120 of 4000 — IMG_0001.jpg"; {detail} is what is being worked on. + let text = gettext_f( + "{done} of {total} — {detail}", + &[("done", &done), ("total", &total), ("detail", &job.detail)], + ); + ui.takeout.progress_label.set_text(&text); } else { ui.takeout.progress_bar.pulse(); ui.takeout .progress_label - .set_text(if job.detail.is_empty() { - "Working…" + .set_text(&if job.detail.is_empty() { + gettext("Working…") } else { - &job.detail + job.detail.clone() }); } } diff --git a/crates/pdfs-gui/src/app/pages/trash.rs b/crates/pdfs-gui/src/app/pages/trash.rs index bb1b564..bdbdf5e 100644 --- a/crates/pdfs-gui/src/app/pages/trash.rs +++ b/crates/pdfs-gui/src/app/pages/trash.rs @@ -47,14 +47,14 @@ pub(crate) fn build_trash_page() -> (gtk4::Widget, TrashWidgets) { let model = gio::ListStore::new::(); let empty = gtk4::Button::builder() - .label("Empty Trash…") - .tooltip_text("Permanently delete everything in the Trash") + .label(gettext("Empty Trash…")) + .tooltip_text(gettext("Permanently delete everything in the Trash")) .sensitive(false) .build(); let refresh = refresh_button(); let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -90,8 +90,8 @@ pub(crate) fn build_trash_page() -> (gtk4::Widget, TrashWidgets) { inner.append(&content); let selection_label = gtk4::Label::new(None); - let restore_selected = gtk4::Button::with_label("Restore"); - let delete_selected = gtk4::Button::with_label("Delete Permanently…"); + let restore_selected = gtk4::Button::with_label(&pgettext("verb", "Restore")); + let delete_selected = gtk4::Button::with_label(&gettext("Delete Permanently…")); delete_selected.add_css_class("destructive-action"); let bar = gtk4::ActionBar::new(); bar.set_center_widget(Some(&selection_label)); @@ -103,7 +103,7 @@ pub(crate) fn build_trash_page() -> (gtk4::Widget, TrashWidgets) { .build(); inner.append(&selection_bar); - let (frame, header, subtitle) = page_frame("Trash", &inner); + let (frame, header, subtitle) = page_frame(&gettext("Trash"), &inner); header.pack_start(&empty); header.pack_end(&refresh); @@ -154,13 +154,13 @@ pub(crate) fn wire_trash(ui: &Rc, widgets: &TrashWidgets) { let restore = gtk4::Button::builder() .icon_name("edit-undo-symbolic") - .tooltip_text("Restore to its original folder") + .tooltip_text(gettext("Restore to its original folder")) .valign(gtk4::Align::Center) .build(); restore.add_css_class("flat"); let purge = gtk4::Button::builder() .icon_name("edit-delete-symbolic") - .tooltip_text("Delete permanently") + .tooltip_text(gettext("Delete permanently")) .valign(gtk4::Align::Center) .build(); purge.add_css_class("flat"); @@ -211,11 +211,17 @@ pub(crate) fn wire_trash(ui: &Rc, widgets: &TrashWidgets) { } if let Some(meta) = text.last_child().and_downcast::() { let kind = if entry.is_dir { - "Folder".to_string() + gettext("Folder") } else { human_bytes(entry.size) }; - meta.set_label(&format!("{kind} · {}", format_modified(entry.modified))); + let modified = format_modified(entry.modified); + // Translators: {kind} is "Folder" or a file size; {modified} is a date. + let text = gettext_f( + "{kind} · {modified}", + &[("kind", &kind), ("modified", &modified)], + ); + meta.set_label(&text); } } }); @@ -259,9 +265,12 @@ fn sync_trash_selection(ui: &Rc) { let count = ui.trash.selection.selection().size() as usize; ui.trash.selection_bar.set_reveal_child(count > 0); if count > 0 { - ui.trash - .selection_label - .set_label(&format!("{} selected", count_noun(count, "item", "items"))); + ui.trash.selection_label.set_label(&ngettext_f( + "{n} item selected", + "{n} items selected", + count as u64, + &[], + )); } } @@ -284,8 +293,8 @@ pub(crate) fn load_trash(ui: &Rc) { trash_status( ui, "user-trash-symbolic", - "Loading…", - "Reading the trash.", + &gettext("Loading…"), + &gettext("Reading the trash."), false, ); @@ -300,15 +309,15 @@ pub(crate) fn load_trash(ui: &Rc) { Ok(Ok(Response::Error { message, .. })) => trash_status( &ui, "dialog-warning-symbolic", - "Couldn't read the trash", + &gettext("Couldn't read the trash"), &message, false, ), Ok(Ok(_)) => trash_status( &ui, "dialog-warning-symbolic", - "Couldn't read the trash", - "Unexpected reply from the mount service.", + &gettext("Couldn't read the trash"), + &gettext("Unexpected reply from the mount service."), false, ), Ok(Err(_)) | Err(_) => trash_unreachable(&ui), @@ -323,8 +332,8 @@ pub(crate) fn trash_unreachable(ui: &Rc) { trash_status( ui, "network-offline-symbolic", - "Not connected", - "The Proton Drive mount service isn't running.", + &gettext("Not connected"), + &gettext("The Proton Drive mount service isn't running."), true, ); return; @@ -332,8 +341,8 @@ pub(crate) fn trash_unreachable(ui: &Rc) { trash_status( ui, "folder-remote-symbolic", - "Connecting…", - "Waiting for the Proton Drive mount service to come up.", + &gettext("Connecting…"), + &gettext("Waiting for the Proton Drive mount service to come up."), false, ); let ui = ui.clone(); @@ -364,16 +373,19 @@ pub(crate) fn repaint_trash(ui: &Rc, entries: &[DirEntry]) { trash_status( ui, "user-trash-symbolic", - "Trash is empty", - "Items you delete from Proton Drive show up here.", + &gettext("Trash is empty"), + &gettext("Items you delete from Proton Drive show up here."), false, ); return; } ui.trash.content.set_visible_child_name("list"); - ui.trash - .subtitle - .set_subtitle(&count_noun(entries.len(), "item", "items")); + ui.trash.subtitle.set_subtitle(&ngettext_f( + "{n} item", + "{n} items", + entries.len() as u64, + &[], + )); let mut sorted = entries.to_vec(); sorted.sort_by_key(|e| std::cmp::Reverse(e.modified)); @@ -394,30 +406,56 @@ pub(crate) fn restore_entries(ui: &Rc, entries: &[DirEntry]) { Request::Restore { uids: entries.iter().map(|e| e.uid.clone()).collect(), }, - format!("Restored {}", entries_label(entries)), - "Couldn't restore", + match entries { + // Translators: {name} is a file or folder name. + [one] => gettext_f("Restored “{name}”", &[("name", &one.name)]), + _ => ngettext_f( + "Restored {n} item", + "Restored {n} items", + entries.len() as u64, + &[], + ), + }, + gettext_noop("Couldn't restore"), ); } -/// “name” for one entry, “3 items” for several. -fn entries_label(entries: &[DirEntry]) -> String { - match entries { - [one] => format!("“{}”", one.name), - _ => count_noun(entries.len(), "item", "items"), - } -} - /// Confirm, then permanently delete trashed entries. Irreversible, so it asks. pub(crate) fn prompt_delete_forever(ui: &Rc, entries: &[DirEntry]) { let win = ui_window(ui); let uids: Vec = entries.iter().map(|e| e.uid.clone()).collect(); - let name = entries_label(entries); + let count = entries.len() as u64; + let (body, done) = match entries { + [one] => { + let args = [("name", one.name.as_str())]; + ( + // Translators: {name} is a file or folder name. + gettext_f("Permanently delete “{name}”? This cannot be undone.", &args), + // Translators: {name} is a file or folder name. + gettext_f("Deleted “{name}” permanently", &args), + ) + } + _ => ( + ngettext_f( + "Permanently delete {n} item? This cannot be undone.", + "Permanently delete {n} items? This cannot be undone.", + count, + &[], + ), + ngettext_f( + "Deleted {n} item permanently", + "Deleted {n} items permanently", + count, + &[], + ), + ), + }; let dialog = adw::AlertDialog::builder() - .heading("Delete Permanently") - .body(format!("Permanently delete {name}? This cannot be undone.")) + .heading(gettext("Delete Permanently")) + .body(body) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("delete", "Delete Permanently"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("delete", &gettext("Delete Permanently")); dialog.set_response_appearance("delete", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -428,8 +466,8 @@ pub(crate) fn prompt_delete_forever(ui: &Rc, entries: &[DirEntry]) { run_mutation( &ui, Request::DeleteForever { uids: uids.clone() }, - format!("Deleted {name} permanently"), - "Couldn't delete", + done.clone(), + gettext_noop("Couldn't delete"), ); } }); @@ -441,14 +479,16 @@ pub(crate) fn prompt_empty_trash(ui: &Rc) { let win = ui_window(ui); let count = ui.trash.model.n_items(); let dialog = adw::AlertDialog::builder() - .heading("Empty Trash") - .body(format!( - "Permanently delete all {} in the trash? This cannot be undone.", - count_noun(count as usize, "item", "items") + .heading(gettext("Empty Trash")) + .body(ngettext_f( + "Permanently delete all {n} item in the trash? This cannot be undone.", + "Permanently delete all {n} items in the trash? This cannot be undone.", + count as u64, + &[], )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("empty", "Empty Trash"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("empty", &gettext("Empty Trash")); dialog.set_response_appearance("empty", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -459,8 +499,8 @@ pub(crate) fn prompt_empty_trash(ui: &Rc) { run_mutation( &ui, Request::EmptyTrash, - "Trash emptied".to_string(), - "Couldn't empty the trash", + gettext("Trash emptied"), + gettext_noop("Couldn't empty the trash"), ); } }); diff --git a/crates/pdfs-gui/src/app/pages/verify.rs b/crates/pdfs-gui/src/app/pages/verify.rs index a811aee..bc31fe1 100644 --- a/crates/pdfs-gui/src/app/pages/verify.rs +++ b/crates/pdfs-gui/src/app/pages/verify.rs @@ -54,7 +54,7 @@ pub(crate) fn prompt_human_verification( .build(); let dialog = adw::Dialog::builder() - .title("Verification") + .title(gettext("Verification")) .content_width(420) .content_height(560) .build(); diff --git a/crates/pdfs-gui/src/app/widgets/details.rs b/crates/pdfs-gui/src/app/widgets/details.rs index 3d1bf7f..b883679 100644 --- a/crates/pdfs-gui/src/app/widgets/details.rs +++ b/crates/pdfs-gui/src/app/widgets/details.rs @@ -50,12 +50,12 @@ pub(crate) struct DetailsWidgets { pub(crate) fn build_details_pane() -> (gtk4::Widget, DetailsWidgets) { let toggle = gtk4::ToggleButton::builder() .icon_name("sidebar-show-right-symbolic") - .tooltip_text("Details (Alt+Enter)") + .tooltip_text(gettext("Details (Alt+Enter)")) .build(); let close_button = gtk4::Button::builder() .icon_name("window-close-symbolic") - .tooltip_text("Close details") + .tooltip_text(gettext("Close details")) .halign(gtk4::Align::End) .build(); close_button.add_css_class("flat"); @@ -81,19 +81,21 @@ pub(crate) fn build_details_pane() -> (gtk4::Widget, DetailsWidgets) { head.append(&name); head.append(&kind); - let props = adw::PreferencesGroup::builder().title("Info").build(); + let props = adw::PreferencesGroup::builder() + .title(gettext("Info")) + .build(); let size_row = adw::ActionRow::builder() - .title("Size") + .title(pgettext("column", "Size")) .subtitle("—") .build(); size_row.add_css_class("property"); let modified_row = adw::ActionRow::builder() - .title("Modified") + .title(pgettext("column", "Modified")) .subtitle("—") .build(); modified_row.add_css_class("property"); let path_row = adw::ActionRow::builder() - .title("Location") + .title(gettext("Location")) .subtitle("—") .subtitle_lines(3) .build(); @@ -102,22 +104,28 @@ pub(crate) fn build_details_pane() -> (gtk4::Widget, DetailsWidgets) { props.add(&modified_row); props.add(&path_row); - let offline = adw::PreferencesGroup::builder().title("Offline").build(); + let offline = adw::PreferencesGroup::builder() + .title(pgettext("state", "Offline")) + .build(); let pin_row = adw::SwitchRow::builder() - .title("Available offline") - .subtitle("Keep a copy on this computer, even without a connection.") + .title(gettext("Available offline")) + .subtitle(gettext( + "Keep a copy on this computer, even without a connection.", + )) .build(); offline.add(&pin_row); - let sharing = adw::PreferencesGroup::builder().title("Sharing").build(); + let sharing = adw::PreferencesGroup::builder() + .title(gettext("Sharing")) + .build(); let sharing_row = adw::ActionRow::builder() - .title("Access") + .title(gettext("Access")) .subtitle("—") .build(); sharing_row.add_css_class("property"); sharing.add(&sharing_row); - let share_button = gtk4::Button::builder().label("Share…").build(); - let copy_link_button = gtk4::Button::builder().label("Copy Link").build(); + let share_button = gtk4::Button::builder().label(gettext("Share…")).build(); + let copy_link_button = gtk4::Button::builder().label(gettext("Copy Link")).build(); let share_actions = gtk4::Box::builder() .orientation(gtk4::Orientation::Horizontal) .spacing(6) @@ -128,25 +136,31 @@ pub(crate) fn build_details_pane() -> (gtk4::Widget, DetailsWidgets) { share_actions.append(©_link_button); sharing.add(&share_actions); - let versions_group = adw::PreferencesGroup::builder().title("Versions").build(); + let versions_group = adw::PreferencesGroup::builder() + .title(gettext("Versions")) + .build(); let versions_row = adw::ActionRow::builder() - .title("History") + .title(gettext("History")) .subtitle("—") .build(); versions_row.add_css_class("property"); versions_group.add(&versions_row); let versions_button = gtk4::Button::builder() - .label("Versions…") + .label(gettext("Versions…")) .margin_top(6) .build(); versions_group.add(&versions_button); - let open_button = gtk4::Button::builder().label("Open").build(); + let open_button = gtk4::Button::builder() + .label(pgettext("verb", "Open")) + .build(); open_button.add_css_class("suggested-action"); open_button.add_css_class("pill"); - let rename_button = gtk4::Button::builder().label("Rename").build(); + let rename_button = gtk4::Button::builder().label(gettext("Rename")).build(); rename_button.add_css_class("pill"); - let trash_button = gtk4::Button::builder().label("Move to Trash").build(); + let trash_button = gtk4::Button::builder() + .label(gettext("Move to Trash")) + .build(); trash_button.add_css_class("destructive-action"); trash_button.add_css_class("pill"); @@ -178,7 +192,7 @@ pub(crate) fn build_details_pane() -> (gtk4::Widget, DetailsWidgets) { // itself would move the files under the pointer. let empty_close = gtk4::Button::builder() .icon_name("window-close-symbolic") - .tooltip_text("Close details") + .tooltip_text(gettext("Close details")) .halign(gtk4::Align::End) .margin_top(12) .margin_end(12) @@ -189,8 +203,8 @@ pub(crate) fn build_details_pane() -> (gtk4::Widget, DetailsWidgets) { empty_close.connect_clicked(move |_| toggle_off.set_active(false)); let empty_status = adw::StatusPage::builder() .icon_name("sidebar-show-right-symbolic") - .title("No item selected") - .description("Select a file or folder to see its details.") + .title(gettext("No item selected")) + .description(gettext("Select a file or folder to see its details.")) .vexpand(true) .build(); empty_status.add_css_class("compact"); @@ -347,8 +361,11 @@ pub(crate) fn show_details(ui: &Rc, entry: &DirEntry) { let d = &ui.details.details; d.icon.set_icon_name(Some(icon_base_for(entry))); d.name.set_label(&entry.name); - d.kind - .set_label(if entry.is_dir { "Folder" } else { "File" }); + d.kind.set_label(&if entry.is_dir { + gettext("Folder") + } else { + gettext("File") + }); d.size_row.set_subtitle(&if entry.is_dir { "—".to_string() } else { @@ -362,18 +379,21 @@ pub(crate) fn show_details(ui: &Rc, entry: &DirEntry) { Some(i) => &rel[..i], None => "", }; - d.path_row.set_subtitle(if parent.is_empty() { - "Proton Drive" + d.path_row.set_subtitle(&if parent.is_empty() { + gettext("Proton Drive") } else { - parent + parent.to_string() }); // Pinning is per file: the context menu and the selection bar offer it for // files only, so the pane must not offer it for folders either. d.pin_row.set_active(entry.pinned); d.pin_row.set_visible(!entry.is_dir); d.pin_row.set_sensitive(*ui.mounted.borrow()); - d.open_button - .set_label(if entry.is_dir { "Open folder" } else { "Open" }); + d.open_button.set_label(&if entry.is_dir { + gettext("Open folder") + } else { + pgettext("verb", "Open") + }); // Only files have revisions, and only a connected daemon can fetch them. let mounted = *ui.mounted.borrow(); d.versions_group.set_visible(!entry.is_dir); @@ -414,7 +434,7 @@ fn load_details_extras(ui: &Rc, entry: &DirEntry) { Ok(Ok(Response::Share { entries, link })) => { sharing_summary(entries.len(), link.is_some()) } - _ => "Couldn't load sharing".to_string(), + _ => gettext("Couldn't load sharing"), }; if details_showing(&ui_c, &uid) { ui_c.details.details.sharing_row.set_subtitle(&text); @@ -436,7 +456,7 @@ fn load_details_extras(ui: &Rc, entry: &DirEntry) { glib::spawn_future_local(async move { let text = match rx.recv().await { Ok(Ok(Response::Revisions { items })) => versions_summary(&items), - _ => "Couldn't load versions".to_string(), + _ => gettext("Couldn't load versions"), }; if details_showing(&ui_c, &uid) { ui_c.details.details.versions_row.set_subtitle(&text); @@ -454,16 +474,17 @@ fn details_showing(ui: &Rc, uid: &str) -> bool { /// "Only you", "3 people", "Public link" or both. pub(crate) fn sharing_summary(people: usize, link: bool) -> String { - let people = match people { - 0 => None, - 1 => Some("1 person".to_string()), - n => Some(format!("{n} people")), - }; + let n = people as u64; match (people, link) { - (None, false) => "Only you".to_string(), - (None, true) => "Anyone with the link".to_string(), - (Some(p), false) => format!("Shared with {p}"), - (Some(p), true) => format!("Shared with {p} · Public link"), + (0, false) => gettext("Only you"), + (0, true) => gettext("Anyone with the link"), + (_, false) => ngettext_f("Shared with {n} person", "Shared with {n} people", n, &[]), + (_, true) => ngettext_f( + "Shared with {n} person · Public link", + "Shared with {n} people · Public link", + n, + &[], + ), } } @@ -471,9 +492,16 @@ pub(crate) fn sharing_summary(people: usize, link: bool) -> String { pub(crate) fn versions_summary(items: &[RevisionInfo]) -> String { let latest = items.iter().map(|r| r.created).max(); match (items.len(), latest) { - (0, _) | (_, None) => "No earlier versions".to_string(), - (1, Some(t)) => format!("1 version · {}", format_modified(t)), - (n, Some(t)) => format!("{n} versions · latest {}", format_modified(t)), + (0, _) | (_, None) => gettext("No earlier versions"), + // Translators: {date} is the date of the only version. + (1, Some(t)) => gettext_f("1 version · {date}", &[("date", &format_modified(t))]), + // Translators: {date} is the date of the newest version. + (n, Some(t)) => ngettext_f( + "{n} version · latest {date}", + "{n} versions · latest {date}", + n as u64, + &[("date", &format_modified(t))], + ), } } diff --git a/crates/pdfs-gui/src/app/widgets/menu.rs b/crates/pdfs-gui/src/app/widgets/menu.rs index cc619e6..9c7f39a 100644 --- a/crates/pdfs-gui/src/app/widgets/menu.rs +++ b/crates/pdfs-gui/src/app/widgets/menu.rs @@ -120,7 +120,8 @@ impl ActionMenu { let (menu, group) = self.finish(); let button = gtk4::MenuButton::builder() .icon_name("view-more-symbolic") - .tooltip_text("More") + // Translators: tooltip of a button that opens a menu of further actions. + .tooltip_text(gettext("More")) .valign(gtk4::Align::Center) .menu_model(&menu) .build(); diff --git a/crates/pdfs-gui/src/app/widgets/share_dialog.rs b/crates/pdfs-gui/src/app/widgets/share_dialog.rs index 80db419..5ef5870 100644 --- a/crates/pdfs-gui/src/app/widgets/share_dialog.rs +++ b/crates/pdfs-gui/src/app/widgets/share_dialog.rs @@ -1,7 +1,19 @@ use crate::*; -/// The roles offered in the Share dialog's dropdowns, in index order. -pub(crate) const SHARE_ROLES: [&str; 3] = ["Viewer", "Editor", "Admin"]; +/// The role labels offered in the Share dialog's dropdowns, in index order. +pub(crate) fn share_roles() -> [String; 3] { + [ + pgettext("role", "Viewer"), + pgettext("role", "Editor"), + pgettext("role", "Admin"), + ] +} + +/// A dropdown model from translated labels. +fn string_list(labels: &[String]) -> gtk4::StringList { + let labels: Vec<&str> = labels.iter().map(String::as_str).collect(); + gtk4::StringList::new(&labels) +} /// Map a role dropdown index to the wire role string. pub(crate) fn role_index_to_wire(idx: u32) -> &'static str { @@ -24,10 +36,11 @@ pub(crate) fn role_wire_to_index(role: &str) -> u32 { /// The expiry choices offered when creating a public link, in dropdown order, /// with their lifetime in days (`None` never expires). pub(crate) const LINK_EXPIRY: [(&str, Option); 4] = [ - ("Never", None), - ("1 day", Some(1)), - ("7 days", Some(7)), - ("30 days", Some(30)), + // Translators: a public link that never expires. + (gettext_noop("Never"), None), + (gettext_noop("1 day"), Some(1)), + (gettext_noop("7 days"), Some(7)), + (gettext_noop("30 days"), Some(30)), ]; /// The Unix expiry for a [`LINK_EXPIRY`] choice, counted from `now`. @@ -235,7 +248,11 @@ pub(crate) struct ShareDialog { /// access and their roles, and create/copy/remove a public link. pub(crate) fn open_share_dialog(ui: &Rc, entry: &DirEntry) { if !*ui.mounted.borrow() { - toast_error(ui, "Can't share", "Proton Drive isn't connected."); + toast_error( + ui, + &gettext("Can't share"), + &gettext("Proton Drive isn't connected."), + ); return; } // A node with no path is not a bug here: Shared and Shared-with-me list @@ -248,26 +265,35 @@ pub(crate) fn open_share_dialog(ui: &Rc, entry: &DirEntry) { let toolbar = adw::ToolbarView::new(); let header = adw::HeaderBar::new(); - header.set_title_widget(Some(&adw::WindowTitle::new("Share", &entry.name))); + header.set_title_widget(Some(&adw::WindowTitle::new( + &pgettext("verb", "Share"), + &entry.name, + ))); toolbar.add_top_bar(&header); // Invite section: emails + role + optional message. let invite_group = adw::PreferencesGroup::builder() - .title("Invite people") - .description("Proton and non-Proton email addresses, separated by spaces or commas.") + .title(gettext("Invite people")) + .description(gettext( + "Proton and non-Proton email addresses, separated by spaces or commas.", + )) .build(); - let email_row = adw::EntryRow::builder().title("Email addresses").build(); - let role_model = gtk4::StringList::new(&SHARE_ROLES); + let email_row = adw::EntryRow::builder() + .title(gettext("Email addresses")) + .build(); + let role_model = string_list(&share_roles()); let role_drop = gtk4::DropDown::builder() .model(&role_model) .selected(0) .valign(gtk4::Align::Center) .build(); - let role_wrap = adw::ActionRow::builder().title("Role").build(); + let role_wrap = adw::ActionRow::builder().title(gettext("Role")).build(); role_wrap.add_suffix(&role_drop); - let message_row = adw::EntryRow::builder().title("Message (optional)").build(); + let message_row = adw::EntryRow::builder() + .title(gettext("Message (optional)")) + .build(); let invite_btn = gtk4::Button::builder() - .label("Send Invitations") + .label(gettext("Send Invitations")) .halign(gtk4::Align::End) .margin_top(6) .build(); @@ -283,10 +309,10 @@ pub(crate) fn open_share_dialog(ui: &Rc, entry: &DirEntry) { invite_group.add(&invite_wrap); let people = adw::PreferencesGroup::builder() - .title("People with access") + .title(gettext("People with access")) .build(); let link_group = adw::PreferencesGroup::builder() - .title("Public link") + .title(gettext("Public link")) .build(); let content = gtk4::Box::new(gtk4::Orientation::Vertical, 18); @@ -306,7 +332,7 @@ pub(crate) fn open_share_dialog(ui: &Rc, entry: &DirEntry) { toolbar.set_content(Some(&scroll)); let dialog = adw::Dialog::builder() - .title("Share") + .title(pgettext("verb", "Share")) .content_width(480) .content_height(560) .child(&toolbar) @@ -330,7 +356,11 @@ pub(crate) fn open_share_dialog(ui: &Rc, entry: &DirEntry) { match &parsed { Err(bad) => { row.add_css_class("error"); - row.set_tooltip_text(Some(&format!("“{bad}” isn't an email address"))); + // Translators: {text} is what the user typed in place of an email address. + row.set_tooltip_text(Some(&gettext_f( + "“{text}” isn't an email address", + &[("text", bad)], + ))); } Ok(_) => { row.remove_css_class("error"); @@ -367,8 +397,8 @@ pub(crate) fn open_share_dialog(ui: &Rc, entry: &DirEntry) { share_dialog_op( &state_inv, state_inv.target.invite(emails, role, message), - "Invitations sent", - "Couldn't send invitations", + &gettext("Invitations sent"), + &gettext("Couldn't send invitations"), Some(Busy::start(btn)), Some(Box::new(move || { email_clear.set_text(""); @@ -392,12 +422,12 @@ pub(crate) fn share_dialog_reload(state: &Rc) { repaint_share_link(&state, link.as_ref()); } Ok(Ok(Response::Error { message, .. })) => { - toast_error(&state.ui, "Couldn't load sharing", &message) + toast_error(&state.ui, &gettext("Couldn't load sharing"), &message) } _ => toast_error( &state.ui, - "Couldn't load sharing", - "The mount service didn't respond.", + &gettext("Couldn't load sharing"), + &gettext("The mount service didn't respond."), ), } }); @@ -410,7 +440,7 @@ pub(crate) fn repaint_share_people(state: &Rc, entries: &[ShareEntr } let mut rows: Vec = Vec::new(); if entries.is_empty() { - let row = dim_row("No one else has access yet."); + let row = dim_row(&gettext("No one else has access yet.")); state.people.add(&row); rows.push(row.upcast()); *state.people_rows.borrow_mut() = rows; @@ -418,9 +448,9 @@ pub(crate) fn repaint_share_people(state: &Rc, entries: &[ShareEntr } for entry in entries { let subtitle = match entry.kind { - ShareEntryKind::Member => "Member".to_string(), - ShareEntryKind::ProtonInvite => "Invited (pending)".to_string(), - ShareEntryKind::ExternalInvite => "Invited (external, pending)".to_string(), + ShareEntryKind::Member => gettext("Member"), + ShareEntryKind::ProtonInvite => gettext("Invited (pending)"), + ShareEntryKind::ExternalInvite => gettext("Invited (external, pending)"), }; let row = adw::ActionRow::builder() .title(&entry.email) @@ -433,7 +463,7 @@ pub(crate) fn repaint_share_people(state: &Rc, entries: &[ShareEntr entry.kind, ShareEntryKind::Member | ShareEntryKind::ProtonInvite ) { - let model = gtk4::StringList::new(&SHARE_ROLES); + let model = string_list(&share_roles()); let drop = gtk4::DropDown::builder() .model(&model) .selected(role_wire_to_index(&entry.role)) @@ -450,8 +480,8 @@ pub(crate) fn repaint_share_people(state: &Rc, entries: &[ShareEntr kind, role_index_to_wire(d.selected()).to_string(), ), - "Role updated", - "Couldn't update the role", + &gettext("Role updated"), + &gettext("Couldn't update the role"), None, None, ); @@ -459,7 +489,7 @@ pub(crate) fn repaint_share_people(state: &Rc, entries: &[ShareEntr row.add_suffix(&drop); } else { let label = gtk4::Label::builder() - .label(capitalize(&entry.role)) + .label(role_label(&entry.role).unwrap_or_else(|| capitalize(&entry.role))) .valign(gtk4::Align::Center) .build(); label.add_css_class("dim-label"); @@ -468,7 +498,7 @@ pub(crate) fn repaint_share_people(state: &Rc, entries: &[ShareEntr let remove = gtk4::Button::builder() .icon_name("user-trash-symbolic") - .tooltip_text("Remove access") + .tooltip_text(gettext("Remove access")) .valign(gtk4::Align::Center) .build(); remove.add_css_class("flat"); @@ -482,15 +512,19 @@ pub(crate) fn repaint_share_people(state: &Rc, entries: &[ShareEntr let button = btn.clone(); confirm_destructive( btn, - "Remove Access?", - &format!("{who} will no longer be able to open this item."), - "Remove", + &gettext("Remove Access?"), + // Translators: {email} is the address of the person losing access. + &gettext_f( + "{email} will no longer be able to open this item.", + &[("email", &who)], + ), + &gettext("Remove"), move || { share_dialog_op( &state, state.target.remove_entry(id.clone(), kind), - "Access removed", - "Couldn't remove access", + &gettext("Access removed"), + &gettext("Couldn't remove access"), Some(Busy::start(&button)), None, ); @@ -516,16 +550,23 @@ pub(crate) fn repaint_share_link(state: &Rc, link: Option<&PublicLi match link { Some(link) => { let url = link.url.clone().unwrap_or_default(); - let mut subtitle = format!("Anyone with the link ({})", capitalize(&link.role)); + let role = role_label(&link.role).unwrap_or_else(|| capitalize(&link.role)); + // Translators: {role} is the link's role, such as "Viewer". + let mut subtitle = gettext_f("Anyone with the link ({role})", &[("role", &role)]); if link.has_password { - subtitle.push_str(" · password-protected"); + subtitle.push_str(" · "); + subtitle.push_str(&gettext("password-protected")); } if let Some(expires) = link.expires { subtitle.push_str(" · "); subtitle.push_str(&link_expiry_label(expires, glib::real_time() / 1_000_000)); } let row = adw::ActionRow::builder() - .title(if url.is_empty() { "Public link" } else { &url }) + .title(if url.is_empty() { + gettext("Public link") + } else { + url.clone() + }) .subtitle(&subtitle) .build(); row.add_css_class("property"); @@ -533,7 +574,7 @@ pub(crate) fn repaint_share_link(state: &Rc, link: Option<&PublicLi if !url.is_empty() { let copy = gtk4::Button::builder() .icon_name("edit-copy-symbolic") - .tooltip_text("Copy link") + .tooltip_text(gettext("Copy link")) .valign(gtk4::Align::Center) .build(); copy.add_css_class("flat"); @@ -541,14 +582,14 @@ pub(crate) fn repaint_share_link(state: &Rc, link: Option<&PublicLi let url_copy = url.clone(); copy.connect_clicked(move |btn| { btn.clipboard().set_text(&url_copy); - toast(&state_copy.ui, "Link copied"); + toast(&state_copy.ui, &gettext("Link copied")); }); row.add_suffix(©); } let remove = gtk4::Button::builder() .icon_name("user-trash-symbolic") - .tooltip_text("Remove link") + .tooltip_text(gettext("Remove link")) .valign(gtk4::Align::Center) .build(); remove.add_css_class("flat"); @@ -560,16 +601,15 @@ pub(crate) fn repaint_share_link(state: &Rc, link: Option<&PublicLi let button = btn.clone(); confirm_destructive( btn, - "Remove Public Link?", - "The link stops working for everyone who has it. A new link will have \ - a different address.", - "Remove Link", + &gettext("Remove Public Link?"), + &gettext("The link stops working for everyone who has it. A new link will have a different address."), + &gettext("Remove Link"), move || { share_dialog_op( &state, state.target.remove_link(id.clone()), - "Public link removed", - "Couldn't remove the link", + &gettext("Public link removed"), + &gettext("Couldn't remove the link"), Some(Busy::start(&button)), None, ); @@ -582,27 +622,30 @@ pub(crate) fn repaint_share_link(state: &Rc, link: Option<&PublicLi rows.push(row.upcast()); } None => { - let role_model = gtk4::StringList::new(&["Viewer", "Editor"]); + let role_model = string_list(&[pgettext("role", "Viewer"), pgettext("role", "Editor")]); let role_drop = gtk4::DropDown::builder() .model(&role_model) .selected(0) .valign(gtk4::Align::Center) .build(); - let role_row = adw::ActionRow::builder().title("Link role").build(); + let role_row = adw::ActionRow::builder() + .title(gettext("Link role")) + .build(); role_row.add_suffix(&role_drop); let pw_row = adw::PasswordEntryRow::builder() - .title("Password (optional)") + .title(gettext("Password (optional)")) .build(); - let expiry_names: Vec<&str> = LINK_EXPIRY.iter().map(|(name, _)| *name).collect(); + let expiry_names: Vec = + LINK_EXPIRY.iter().map(|(name, _)| gettext(name)).collect(); let expiry_drop = gtk4::DropDown::builder() - .model(>k4::StringList::new(&expiry_names)) + .model(&string_list(&expiry_names)) .selected(0) .valign(gtk4::Align::Center) .build(); - let expiry_row = adw::ActionRow::builder().title("Expires").build(); + let expiry_row = adw::ActionRow::builder().title(gettext("Expires")).build(); expiry_row.add_suffix(&expiry_drop); let create = gtk4::Button::builder() - .label("Create Public Link") + .label(gettext("Create Public Link")) .halign(gtk4::Align::End) .margin_top(6) .build(); @@ -666,16 +709,16 @@ pub(crate) fn share_dialog_create_link( drop(busy); match reply { Ok(Ok(Response::PublicLink { .. })) => { - toast(&state.ui, "Public link created"); + toast(&state.ui, &gettext("Public link created")); share_dialog_reload(&state); } Ok(Ok(Response::Error { message, .. })) => { - toast_error(&state.ui, "Couldn't create the link", &message) + toast_error(&state.ui, &gettext("Couldn't create the link"), &message) } _ => toast_error( &state.ui, - "Couldn't create the link", - "The mount service didn't respond.", + &gettext("Couldn't create the link"), + &gettext("The mount service didn't respond."), ), } }); @@ -687,13 +730,14 @@ pub(crate) fn share_dialog_create_link( pub(crate) fn share_dialog_op( state: &Rc, req: Request, - done: &'static str, - failed: &'static str, + done: &str, + failed: &str, busy: Option, on_success: Option>, ) { let rx = spawn_request(state.ui.dirs.control_socket(), req); let state = state.clone(); + let (done, failed) = (done.to_string(), failed.to_string()); glib::spawn_future_local(async move { let reply = rx.recv().await; drop(busy); @@ -702,14 +746,18 @@ pub(crate) fn share_dialog_op( if let Some(cb) = on_success { cb(); } - toast(&state.ui, done); + toast(&state.ui, &done); share_dialog_reload(&state); } - Ok(Ok(Response::Error { message, .. })) => toast_error(&state.ui, failed, &message), + Ok(Ok(Response::Error { message, .. })) => toast_error(&state.ui, &failed, &message), _ => { // A role dropdown that failed is now out of sync with the server; // reload to snap it back. - toast_error(&state.ui, failed, "The mount service didn't respond."); + toast_error( + &state.ui, + &failed, + &gettext("The mount service didn't respond."), + ); share_dialog_reload(&state); } } @@ -720,14 +768,18 @@ pub(crate) fn share_dialog_op( /// working, or that it already has. pub(crate) fn link_expiry_label(expires: i64, now: i64) -> String { if expires <= now { - return "expired".to_string(); + // Translators: a public link past its expiry date. + return gettext("expired"); } + // Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". + let format = gettext("%x"); let date = glib::DateTime::from_unix_local(expires) .ok() - .and_then(|at| at.format("%x").ok()) + .and_then(|at| at.format(&format).ok()) .map(|s| s.to_string()) .unwrap_or_default(); - format!("expires {date}") + // Translators: {date} is the date a public link stops working. + gettext_f("expires {date}", &[("date", &date)]) } #[cfg(test)] diff --git a/crates/pdfs-gui/src/app/widgets/versions_dialog.rs b/crates/pdfs-gui/src/app/widgets/versions_dialog.rs index 7a2fdac..4cbe66f 100644 --- a/crates/pdfs-gui/src/app/widgets/versions_dialog.rs +++ b/crates/pdfs-gui/src/app/widgets/versions_dialog.rs @@ -85,11 +85,19 @@ pub(crate) struct VersionsDialog { /// Open the Versions dialog for a file. pub(crate) fn open_versions_dialog(ui: &Rc, entry: &DirEntry) { if !*ui.mounted.borrow() { - toast_error(ui, "Can't load versions", "Proton Drive isn't connected."); + toast_error( + ui, + &gettext("Can't load versions"), + &gettext("Proton Drive isn't connected."), + ); return; } if entry.is_dir { - toast_error(ui, "No versions", "Folders don't have versions."); + toast_error( + ui, + &gettext("No versions"), + &gettext("Folders don't have versions."), + ); return; } let target = if entry.path.is_empty() { @@ -100,12 +108,17 @@ pub(crate) fn open_versions_dialog(ui: &Rc, entry: &DirEntry) { let toolbar = adw::ToolbarView::new(); let header = adw::HeaderBar::new(); - header.set_title_widget(Some(&adw::WindowTitle::new("Versions", &entry.name))); + header.set_title_widget(Some(&adw::WindowTitle::new( + &gettext("Versions"), + &entry.name, + ))); toolbar.add_top_bar(&header); let group = adw::PreferencesGroup::builder() - .title("Version history") - .description("Proton Drive keeps earlier versions of a file until you delete them.") + .title(gettext("Version history")) + .description(gettext( + "Proton Drive keeps earlier versions of a file until you delete them.", + )) .build(); let content = gtk4::Box::new(gtk4::Orientation::Vertical, 18); @@ -123,7 +136,7 @@ pub(crate) fn open_versions_dialog(ui: &Rc, entry: &DirEntry) { toolbar.set_content(Some(&scroll)); let dialog = adw::Dialog::builder() - .title("Versions") + .title(gettext("Versions")) .content_width(520) .content_height(520) .child(&toolbar) @@ -149,12 +162,12 @@ pub(crate) fn versions_dialog_reload(state: &Rc) { match rx.recv().await { Ok(Ok(Response::Revisions { items })) => repaint_versions(&state, &items), Ok(Ok(Response::Error { message, .. })) => { - toast_error(&state.ui, "Couldn't load versions", &message) + toast_error(&state.ui, &gettext("Couldn't load versions"), &message) } _ => toast_error( &state.ui, - "Couldn't load versions", - "The mount service didn't respond.", + &gettext("Couldn't load versions"), + &gettext("The mount service didn't respond."), ), } }); @@ -167,7 +180,7 @@ fn repaint_versions(state: &Rc, items: &[RevisionInfo]) { } let mut rows: Vec = Vec::new(); if items.is_empty() { - let row = dim_row("No earlier versions."); + let row = dim_row(&gettext("No earlier versions.")); state.group.add(&row); rows.push(row.upcast()); *state.rows.borrow_mut() = rows; @@ -186,8 +199,15 @@ fn repaint_versions(state: &Rc, items: &[RevisionInfo]) { // when they were saved instead. let (title, mut subtitle) = if item.is_active { ( - "Current version".to_string(), - format!("{} · {}", activity_time(item.created), human_bytes(size)), + gettext("Current version"), + // Translators: {time} is when the version was saved, {size} its file size. + gettext_f( + "{time} · {size}", + &[ + ("time", &activity_time(item.created)), + ("size", &human_bytes(size)), + ], + ), ) } else { (activity_time(item.created), human_bytes(size)) @@ -203,7 +223,7 @@ fn repaint_versions(state: &Rc, items: &[RevisionInfo]) { let save = gtk4::Button::builder() .icon_name("document-save-symbolic") - .tooltip_text("Save a copy…") + .tooltip_text(gettext("Save a copy…")) .valign(gtk4::Align::Center) .build(); save.add_css_class("flat"); @@ -215,7 +235,7 @@ fn repaint_versions(state: &Rc, items: &[RevisionInfo]) { if !item.is_active { let restore = gtk4::Button::builder() .icon_name("edit-undo-symbolic") - .tooltip_text("Restore this version") + .tooltip_text(gettext("Restore this version")) .valign(gtk4::Align::Center) .build(); restore.add_css_class("flat"); @@ -226,7 +246,7 @@ fn repaint_versions(state: &Rc, items: &[RevisionInfo]) { let delete = gtk4::Button::builder() .icon_name("user-trash-symbolic") - .tooltip_text("Delete this version permanently") + .tooltip_text(gettext("Delete this version permanently")) .valign(gtk4::Align::Center) .build(); delete.add_css_class("flat"); @@ -246,14 +266,15 @@ fn repaint_versions(state: &Rc, items: &[RevisionInfo]) { /// every device on the account, not only this one. fn prompt_restore_version(state: &Rc, revision_id: &str) { let dialog = adw::AlertDialog::builder() - .heading("Restore version") - .body(format!( - "Make this version the current content of “{}”? The version it replaces stays in the history.", - state.name + .heading(gettext("Restore version")) + // Translators: {name} is a file name. + .body(gettext_f( + "Make this version the current content of “{name}”? The version it replaces stays in the history.", + &[("name", &state.name)], )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("restore", "Restore"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("restore", &pgettext("verb", "Restore")); dialog.set_response_appearance("restore", adw::ResponseAppearance::Suggested); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -270,8 +291,8 @@ fn prompt_restore_version(state: &Rc, revision_id: &str) { state.target.restore(revision_id.clone()), // The server applies the swap in the background, so the wording // promises the request, not the result. - "Restoring that version", - "Couldn't restore that version", + &gettext("Restoring that version"), + &gettext("Couldn't restore that version"), ); }); dialog.present(window.as_ref()); @@ -280,11 +301,13 @@ fn prompt_restore_version(state: &Rc, revision_id: &str) { /// Confirm, then permanently delete one revision. fn prompt_delete_version(state: &Rc, revision_id: &str) { let dialog = adw::AlertDialog::builder() - .heading("Delete version") - .body("Delete this version permanently? Its content can't be recovered.") + .heading(gettext("Delete version")) + .body(gettext( + "Delete this version permanently? Its content can't be recovered.", + )) .build(); - dialog.add_response("cancel", "Cancel"); - dialog.add_response("delete", "Delete"); + dialog.add_response("cancel", &gettext("Cancel")); + dialog.add_response("delete", &pgettext("verb", "Delete")); dialog.set_response_appearance("delete", adw::ResponseAppearance::Destructive); dialog.set_default_response(Some("cancel")); dialog.set_close_response("cancel"); @@ -299,8 +322,8 @@ fn prompt_delete_version(state: &Rc, revision_id: &str) { versions_dialog_op( &state, state.target.delete(revision_id.clone()), - "Version deleted", - "Couldn't delete that version", + &gettext("Version deleted"), + &gettext("Couldn't delete that version"), ); }); dialog.present(window.as_ref()); @@ -314,7 +337,7 @@ fn prompt_delete_version(state: &Rc, revision_id: &str) { fn prompt_save_version(state: &Rc, revision_id: &str) { let window = ui_window(&state.ui); let dialog = gtk4::FileDialog::builder() - .title("Save version") + .title(gettext("Save version")) .initial_name(&state.name) .build(); let state = state.clone(); @@ -324,16 +347,16 @@ fn prompt_save_version(state: &Rc, revision_id: &str) { let Some(dest) = file.path().and_then(|p| p.to_str().map(str::to_string)) else { toast_error( &state.ui, - "Couldn't save that version", - "That location isn't a local file.", + &gettext("Couldn't save that version"), + &gettext("That location isn't a local file."), ); return; }; versions_dialog_op( &state, state.target.save_as(revision_id.clone(), dest), - "Version saved", - "Couldn't save that version", + &gettext("Version saved"), + &gettext("Couldn't save that version"), ); }); } @@ -351,7 +374,11 @@ fn versions_dialog_op(state: &Rc, request: Request, done: &str, versions_dialog_reload(&state); } Ok(Ok(Response::Error { message, .. })) => toast_error(&state.ui, &failed, &message), - _ => toast_error(&state.ui, &failed, "The mount service didn't respond."), + _ => toast_error( + &state.ui, + &failed, + &gettext("The mount service didn't respond."), + ), } }); } diff --git a/crates/pdfs-gui/src/dmenu.rs b/crates/pdfs-gui/src/dmenu.rs index 3f29615..bc90482 100644 --- a/crates/pdfs-gui/src/dmenu.rs +++ b/crates/pdfs-gui/src/dmenu.rs @@ -16,8 +16,8 @@ use pdfs_core::config::AppDirs; use pdfs_core::menu::{self, MenuChoice, MenuItem, PromptConfig}; use pdfs_core::opener::OpenWith; -use crate::Hit; use crate::query; +use crate::{Hit, gettext, gettext_f}; /// Guard against a launcher that keeps handing back text we cannot satisfy — /// without it a scripted (non-interactive) menu could spin forever. @@ -90,8 +90,10 @@ pub(crate) fn run(options: Options) -> Result<(), String> { /// shows which round you are in. fn title(query: Option<&str>) -> String { match query { - Some(text) => format!("Drive: {text} › "), - None => "Search Drive › ".to_string(), + // Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. + Some(text) => gettext_f("Drive: {query} › ", &[("query", text)]), + // Translators: the launcher prompt; keep the trailing space, the input follows it directly. + None => gettext("Search Drive › "), } } @@ -107,8 +109,10 @@ fn title(query: Option<&str>) -> String { /// wording is parenthesised and avoids words that read like a filename query. fn placeholder(query: Option<&str>) -> String { match query { - Some(text) => format!("(no matches for “{text}”)"), - None => "(no pinned files — type to search)".to_string(), + // Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. + Some(text) => gettext_f("(no matches for “{query}”)", &[("query", text)]), + // Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. + None => gettext("(no pinned files — type to search)"), } } diff --git a/crates/pdfs-gui/src/fzf.rs b/crates/pdfs-gui/src/fzf.rs index 60fd3fc..ab010ef 100644 --- a/crates/pdfs-gui/src/fzf.rs +++ b/crates/pdfs-gui/src/fzf.rs @@ -32,13 +32,14 @@ use pdfs_core::menu::{self, PromptConfig}; use pdfs_core::opener::OpenWith; use crate::query; -use crate::{Hit, SEARCH_DEBOUNCE}; +use crate::{Hit, SEARCH_DEBOUNCE, gettext, gettext_noop}; /// Separates the visible half of a feed line from its payload. const FIELD: char = '\t'; /// What the launcher prompt reads, matching the dmenu front end's wording. -const PROMPT: &str = "Search Drive › "; +// Translators: the launcher prompt; keep the trailing space, the input follows it directly. +const PROMPT: &str = gettext_noop("Search Drive › "); pub(crate) struct Options { /// Search for this immediately instead of opening on the pinned files. @@ -166,7 +167,8 @@ fn interactive(query: Option) -> Result<(), String> { /// empty list with no explanation, so a failure becomes a visible row instead. pub(crate) fn feed(query: Option<&str>) { let Ok(dirs) = AppDirs::new() else { - println!("(cannot resolve app dirs)"); + // Translators: shown as a row in the search list. Keep the parentheses. + println!("{}", gettext("(cannot resolve app dirs)")); return; }; let limit = dirs.load_config().resolved_prompt().resolved_menu_limit(); @@ -219,7 +221,7 @@ fn fzf_argv(exe: &std::path::Path, query: Option<&str>) -> Vec { .iter() .map(|arg| (*arg).to_string()) .collect(); - argv.push(format!("--prompt={PROMPT}")); + argv.push(format!("--prompt={}", gettext(PROMPT))); // `reload:` rather than `reload(…)`: the unparenthesised form runs to the // end of the argument, so an install path containing a bracket cannot // truncate the command fzf parses out of it. diff --git a/crates/pdfs-gui/src/i18n.rs b/crates/pdfs-gui/src/i18n.rs new file mode 100644 index 0000000..410a4a9 --- /dev/null +++ b/crates/pdfs-gui/src/i18n.rs @@ -0,0 +1,359 @@ +//! Translation layer shared by `pdfs-app`, `pdfs-tray` and `pdfs-prompt`. +//! +//! Strings go through GNU gettext in the `pdfs` text domain. [`init`] runs first +//! in every binary: it applies the language picked in Preferences (if any) on +//! top of the system locale, then binds the domain to the installed catalogs. +//! +//! Messages with values use named placeholders (`{name}`) filled in by +//! [`gettext_f`] and [`ngettext_f`], so translators can reorder them. `po/` +//! holds the template and the catalogs; see `docs/TRANSLATING.md`. + +// Each binary includes this module and uses a different part of it. +#![allow(dead_code)] + +use gettextrs::LocaleCategory; +use pdfs_core::config::AppDirs; + +/// The gettext text domain, matching `po/pdfs.pot` and the installed `.mo` name. +pub(crate) const DOMAIN: &str = "pdfs"; + +/// Overrides the catalog directory at run time, for running from a source tree +/// (`PDFS_LOCALEDIR=target/locale`). +const LOCALEDIR_ENV: &str = "PDFS_LOCALEDIR"; + +/// Where packages install the catalogs unless the build sets `PDFS_LOCALEDIR`. +const DEFAULT_LOCALEDIR: &str = "/usr/share/locale"; + +/// Languages the app ships a catalog for, as (gettext code, native name). The +/// Preferences picker lists them after "System Default". US English is the +/// source language and needs no catalog. Names stay untranslated so a user can +/// always find their own language. +pub(crate) const LANGUAGES: &[(&str, &str)] = &[ + ("de", "Deutsch"), + ("en_GB", "English (UK)"), + ("en_US", "English (US)"), + ("es", "Español"), + ("fr", "Français"), + ("it", "Italiano"), + ("nl", "Nederlands"), + ("pl", "Polski"), + ("pt_BR", "Português (Brasil)"), +]; + +/// Set up the locale and the text domain. Call first thing in `main`, before +/// any thread starts: an explicit language is applied through the process +/// environment, so that GTK's own strings follow it too. +pub(crate) fn init() { + let language = AppDirs::new() + .ok() + .and_then(|dirs| dirs.load_config().language) + .filter(|code| LANGUAGES.iter().any(|(known, _)| known == code)); + gettextrs::setlocale(LocaleCategory::LcAll, ""); + if let Some(code) = language { + apply_language(&code); + } + let dir = std::env::var(LOCALEDIR_ENV) + .ok() + .filter(|dir| !dir.is_empty()) + .unwrap_or_else(|| { + option_env!("PDFS_LOCALEDIR") + .unwrap_or(DEFAULT_LOCALEDIR) + .to_string() + }); + if let Err(e) = gettextrs::bindtextdomain(DOMAIN, dir) { + tracing::warn!("bindtextdomain failed: {e}"); + } + let _ = gettextrs::bind_textdomain_codeset(DOMAIN, "UTF-8"); + if let Err(e) = gettextrs::textdomain(DOMAIN) { + tracing::warn!("textdomain failed: {e}"); + } +} + +/// Make `code` the message language. gettext reads `LANGUAGE` first, but +/// ignores it while the message locale is "C" or "C.UTF-8", so a system without +/// a configured locale also gets its message locale moved to a real one. Both +/// go into the environment, because GTK calls `setlocale` again during its own +/// start. +fn apply_language(code: &str) { + // SAFETY: `init` runs at the top of `main`, before any other thread exists. + unsafe { std::env::set_var("LANGUAGE", code) }; + let current = gettextrs::setlocale(LocaleCategory::LcMessages, "") + .map(|name| String::from_utf8_lossy(&name).into_owned()) + .unwrap_or_default(); + if !is_c_locale(¤t) { + return; + } + for candidate in message_locales(code) { + if gettextrs::setlocale(LocaleCategory::LcMessages, candidate.as_str()).is_some() { + // SAFETY: as above, still single-threaded. + unsafe { std::env::set_var("LC_MESSAGES", &candidate) }; + return; + } + } +} + +fn is_c_locale(name: &str) -> bool { + let base = name.split('.').next().unwrap_or(name); + matches!(base, "" | "C" | "POSIX") +} + +/// Locales to try, in order, as the message locale for `code`: the language's +/// own locale, then US English, which any locale-enabled system has and which +/// is enough for gettext to honour `LANGUAGE`. +fn message_locales(code: &str) -> Vec { + let full = if code.contains('_') { + code.to_string() + } else { + format!("{code}_{}", code.to_uppercase()) + }; + let mut locales = vec![format!("{full}.UTF-8")]; + if full != "en_US" { + locales.push("en_US.UTF-8".to_string()); + } + locales +} + +/// Mark `msgid` for extraction without translating it yet, for tables of +/// labels built at compile time. Pass the value through [`gettext`] where it is +/// shown. +pub(crate) const fn gettext_noop(msgid: &'static str) -> &'static str { + msgid +} + +/// Translate `msgid`. +pub(crate) fn gettext(msgid: &str) -> String { + gettextrs::gettext(msgid) +} + +/// Translate `msgid` in context `context`, for short strings whose meaning +/// depends on where they appear ("Open" the verb against "Open" the state). +pub(crate) fn pgettext(context: &str, msgid: &str) -> String { + gettextrs::pgettext(context, msgid) +} + +/// Translate the singular or plural form for `n`. +pub(crate) fn ngettext(singular: &str, plural: &str, n: u64) -> String { + gettextrs::ngettext(singular, plural, plural_count(n)) +} + +/// Translate `msgid`, then fill its `{name}` placeholders from `args`. +pub(crate) fn gettext_f(msgid: &str, args: &[(&str, &str)]) -> String { + fill(&gettext(msgid), args) +} + +/// Translate the form for `n`, then fill `{n}` with the count and the other +/// placeholders from `args`. +pub(crate) fn ngettext_f(singular: &str, plural: &str, n: u64, args: &[(&str, &str)]) -> String { + let count = n.to_string(); + let filled = fill(&ngettext(singular, plural, n), args); + fill(&filled, &[("n", &count)]) +} + +/// The translated form of [`pdfs_core::control::pending_summary`]: what is +/// still waiting to go up, or `None` when nothing is. +pub(crate) fn pending_summary(uploads: u64, changes: u64) -> Option { + match (uploads, changes) { + (0, 0) => None, + (uploads, 0) => Some(ngettext_f( + "{n} upload queued", + "{n} uploads queued", + uploads, + &[], + )), + (0, changes) => Some(ngettext_f( + "{n} change queued", + "{n} changes queued", + changes, + &[], + )), + (uploads, changes) => { + let uploads = ngettext_f("{n} upload", "{n} uploads", uploads, &[]); + let changes = ngettext_f("{n} change", "{n} changes", changes, &[]); + // Translators: {uploads} is "3 uploads", {changes} is "2 changes". + Some(gettext_f( + "{uploads}, {changes} queued", + &[("uploads", &uploads), ("changes", &changes)], + )) + } + } +} + +/// gettext takes the count as `u32`. Counts past that pick the same form as +/// the largest one, which is the plural in every shipped language. +fn plural_count(n: u64) -> u32 { + u32::try_from(n).unwrap_or(u32::MAX) +} + +/// Replace each `{key}` in `template` with its value. Unknown placeholders are +/// left as they are, so a translation mistake shows up rather than vanishing. +fn fill(template: &str, args: &[(&str, &str)]) -> String { + let mut out = template.to_string(); + for (key, value) in args { + out = out.replace(&format!("{{{key}}}"), value); + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn fill_replaces_named_placeholders_in_any_order() { + assert_eq!( + fill("{b} before {a}", &[("a", "x"), ("b", "y")]), + "y before x" + ); + } + + #[test] + fn fill_keeps_unknown_placeholders() { + assert_eq!(fill("{missing} {a}", &[("a", "1")]), "{missing} 1"); + } + + #[test] + fn ngettext_f_fills_the_count() { + assert_eq!(ngettext_f("{n} file", "{n} files", 1, &[]), "1 file"); + assert_eq!( + ngettext_f( + "{n} file in {dir}", + "{n} files in {dir}", + 3, + &[("dir", "A")] + ), + "3 files in A" + ); + } + + #[test] + fn pending_summary_matches_the_core_wording() { + for (uploads, changes) in [(0, 0), (1, 0), (3, 0), (0, 1), (2, 4)] { + assert_eq!( + pending_summary(uploads, changes), + pdfs_core::control::pending_summary(uploads, changes) + ); + } + } + + #[test] + fn plural_count_saturates() { + assert_eq!(plural_count(7), 7); + assert_eq!(plural_count(u64::MAX), u32::MAX); + } + + #[test] + fn language_codes_are_unique_and_sorted() { + let codes: Vec<&str> = LANGUAGES.iter().map(|(code, _)| *code).collect(); + let mut sorted = codes.clone(); + sorted.sort_unstable(); + sorted.dedup(); + assert_eq!(codes, sorted); + } + + fn repo_file(path: &str) -> std::path::PathBuf { + std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../..") + .join(path) + } + + fn linguas() -> Vec { + std::fs::read_to_string(repo_file("po/LINGUAS")) + .unwrap() + .lines() + .map(str::trim) + .filter(|line| !line.is_empty() && !line.starts_with('#')) + .map(str::to_string) + .collect() + } + + #[test] + fn every_offered_language_has_a_catalog() { + let linguas = linguas(); + for (code, _) in LANGUAGES { + // US English is the source language. + if *code != "en_US" { + assert!( + linguas.iter().any(|lang| lang == code), + "{code} is not in po/LINGUAS" + ); + } + } + for lang in &linguas { + assert!( + repo_file(&format!("po/{lang}.po")).exists(), + "po/{lang}.po is missing" + ); + } + } + + #[test] + fn potfiles_lists_every_source_that_translates() { + let listed = std::fs::read_to_string(repo_file("po/POTFILES.in")).unwrap(); + let listed: Vec<&str> = listed.lines().map(str::trim).collect(); + let src = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src"); + let mut stack = vec![src]; + while let Some(dir) = stack.pop() { + for entry in std::fs::read_dir(dir).unwrap() { + let path = entry.unwrap().path(); + if path.is_dir() { + stack.push(path); + continue; + } + if path.extension().is_none_or(|ext| ext != "rs") { + continue; + } + let text = std::fs::read_to_string(&path).unwrap(); + if !text.contains("gettext") { + continue; + } + let relative = path.strip_prefix(env!("CARGO_MANIFEST_DIR")).unwrap(); + let name = format!("crates/pdfs-gui/{}", relative.display()); + assert!( + listed.contains(&name.as_str()), + "{name} is not in po/POTFILES.in" + ); + } + } + } + + /// `msgfmt --check` rejects a translation whose `{placeholders}` differ from + /// the English, besides syntax errors. Skipped where gettext is not installed. + #[test] + fn catalogs_compile_with_matching_placeholders() { + let msgfmt = std::process::Command::new("msgfmt") + .arg("--version") + .output(); + if msgfmt.is_err() { + eprintln!("msgfmt not installed; skipping the catalog check"); + return; + } + for lang in linguas() { + let output = std::process::Command::new("msgfmt") + .args(["--check", "--output-file=/dev/null"]) + .arg(repo_file(&format!("po/{lang}.po"))) + .output() + .unwrap(); + assert!( + output.status.success(), + "po/{lang}.po: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + } + + #[test] + fn c_locales_are_detected() { + assert!(is_c_locale("C")); + assert!(is_c_locale("POSIX")); + assert!(is_c_locale("C.UTF-8")); + assert!(is_c_locale("C.utf8")); + assert!(!is_c_locale("de_DE.UTF-8")); + } + + #[test] + fn message_locales_start_with_the_language_region() { + assert_eq!(message_locales("de"), ["de_DE.UTF-8", "en_US.UTF-8"]); + assert_eq!(message_locales("pt_BR"), ["pt_BR.UTF-8", "en_US.UTF-8"]); + assert_eq!(message_locales("en_US"), ["en_US.UTF-8"]); + } +} diff --git a/crates/pdfs-gui/src/main.rs b/crates/pdfs-gui/src/main.rs index 65be204..70e2ead 100644 --- a/crates/pdfs-gui/src/main.rs +++ b/crates/pdfs-gui/src/main.rs @@ -21,11 +21,12 @@ use ksni::menu::StandardItem; use ksni::{MenuItem, Status, ToolTip, Tray}; use pdfs_core::auth; use pdfs_core::config::AppDirs; -use pdfs_core::control::{ - JobItem, Request, Response, TransferDirection, TransferItem, pending_summary, send, -}; +use pdfs_core::control::{JobItem, Request, Response, TransferDirection, TransferItem, send}; use pdfs_core::service; +mod i18n; +use i18n::{gettext, gettext_f, ngettext_f}; + /// How often the tray re-polls the daemon to refresh its menu. const POLL_INTERVAL: Duration = Duration::from_secs(3); @@ -89,7 +90,14 @@ struct DriveState { fn sync_line(items: &[TransferItem], jobs: &[JobItem]) -> String { match items { [] => match jobs.first() { - Some(j) if j.total > 0 => format!("{} ({} of {})", j.title, j.done, j.total), + Some(j) if j.total > 0 => { + let (done, total) = (j.done.to_string(), j.total.to_string()); + // Translators: {title} names a running job such as a scan; {done} and {total} are counts. + gettext_f( + "{title} ({done} of {total})", + &[("title", &j.title), ("done", &done), ("total", &total)], + ) + } Some(j) => format!("{}…", j.title), None => String::new(), }, @@ -112,8 +120,10 @@ fn sync_line(items: &[TransferItem], jobs: &[JobItem]) -> String { .count(); let up = items.len() - down; match (down, up) { - (d, 0) => format!("↓ {d} downloading"), - (0, u) => format!("↑ {u} uploading"), + // Translators: {n} files are downloading; keep the arrow. + (d, 0) => ngettext_f("↓ {n} downloading", "↓ {n} downloading", d as u64, &[]), + // Translators: {n} files are uploading; keep the arrow. + (0, u) => ngettext_f("↑ {n} uploading", "↑ {n} uploading", u as u64, &[]), (d, u) => format!("↓ {d} · ↑ {u}"), } } @@ -144,7 +154,7 @@ fn poll_state(socket: &Path, default_mountpoint: &Path) -> DriveState { Ok(Response::Transfers { items, jobs }) => sync_line(&items, &jobs), _ => String::new(), }; - let queued = pending_summary(pending_uploads, pending_changes); + let queued = i18n::pending_summary(pending_uploads, pending_changes); let phase = phase_of( paused, failing_ops, @@ -153,15 +163,36 @@ fn poll_state(socket: &Path, default_mountpoint: &Path) -> DriveState { ); DriveState { line: match (online, queued) { - _ if paused => "Sync paused".to_string(), - _ if failing_ops > 0 => match failing_ops { - 1 => "1 change needs attention".to_string(), - n => format!("{n} changes need attention"), - }, - (true, None) => format!("Mounted at {mountpoint} ({pinned} pinned)"), - (true, Some(q)) => format!("Syncing — {q} ({pinned} pinned)"), - (false, None) => format!("Offline — cached files only ({pinned} pinned)"), - (false, Some(q)) => format!("Offline — {q}"), + _ if paused => gettext("Sync paused"), + _ if failing_ops > 0 => ngettext_f( + "{n} change needs attention", + "{n} changes need attention", + failing_ops, + &[], + ), + // Translators: {mountpoint} is a folder path; {n} is the number of pinned items. + (true, None) => ngettext_f( + "Mounted at {mountpoint} ({n} pinned)", + "Mounted at {mountpoint} ({n} pinned)", + pinned as u64, + &[("mountpoint", &mountpoint)], + ), + // Translators: {queued} is a queue summary such as "3 uploads queued"; {n} is the number of pinned items. + (true, Some(q)) => ngettext_f( + "Syncing — {queued} ({n} pinned)", + "Syncing — {queued} ({n} pinned)", + pinned as u64, + &[("queued", &q)], + ), + // Translators: {n} is the number of pinned items. + (false, None) => ngettext_f( + "Offline — cached files only ({n} pinned)", + "Offline — cached files only ({n} pinned)", + pinned as u64, + &[], + ), + // Translators: {queued} is a queue summary such as "3 uploads queued". + (false, Some(q)) => gettext_f("Offline — {queued}", &[("queued", &q)]), }, phase, mounted: true, @@ -173,7 +204,7 @@ fn poll_state(socket: &Path, default_mountpoint: &Path) -> DriveState { } // Socket answered but with something unexpected — treat as up but odd. Ok(_) => DriveState { - line: "Mount: unexpected daemon response".into(), + line: gettext("Mount: unexpected daemon response"), phase: Phase::Attention, mounted: true, mountpoint: default_mountpoint.to_path_buf(), @@ -185,11 +216,19 @@ fn poll_state(socket: &Path, default_mountpoint: &Path) -> DriveState { Err(_) => { let (line, phase) = match auth::load() { Ok(s) => ( - format!("Logged in as {} — not mounted", s.username), + // Translators: {username} is the Proton account name. + gettext_f( + "Logged in as {username} — not mounted", + &[("username", &s.username)], + ), Phase::Disconnected, ), - Err(pdfs_core::Error::NotLoggedIn) => ("Not signed in".into(), Phase::SignedOut), - Err(e) => (format!("Error: {e}"), Phase::Attention), + Err(pdfs_core::Error::NotLoggedIn) => (gettext("Not signed in"), Phase::SignedOut), + Err(e) => ( + // Translators: {error} is an error message, in English. + gettext_f("Error: {error}", &[("error", &e.to_string())]), + Phase::Attention, + ), }; DriveState { line, @@ -222,10 +261,8 @@ fn phase_of(paused: bool, failing: u64, online: bool, busy: bool) -> Phase { /// "3 issues — View": the menu item that opens the Sync page's queue. fn issues_label(failing: u64) -> String { - match failing { - 1 => "1 issue — View".to_string(), - n => format!("{n} issues — View"), - } + // Translators: a menu item that opens the list of failing changes. + ngettext_f("{n} issue — View", "{n} issues — View", failing, &[]) } fn open_folder(mountpoint: &Path) { @@ -331,14 +368,14 @@ impl Tray for DriveTray { match self.state.phase { // Nothing to mount without a session; the app's sign-in page is the // way in. - Phase::SignedOut => items.push(item("Sign In…", |_| open_manager(&[]))), - _ => items.push(item("Open Proton Drive", |_| open_manager(&[]))), + Phase::SignedOut => items.push(item(&gettext("Sign In…"), |_| open_manager(&[]))), + _ => items.push(item(&gettext("Open Proton Drive"), |_| open_manager(&[]))), } if self.state.mounted { items.push( StandardItem { - label: "Open Folder".into(), + label: gettext("Open Folder"), activate: Box::new(move |_: &mut Self| open_folder(&open_mp)), ..Default::default() } @@ -349,7 +386,11 @@ impl Tray for DriveTray { let paused = self.state.paused; items.push( StandardItem { - label: if paused { "Resume Sync" } else { "Pause Sync" }.into(), + label: if paused { + gettext("Resume Sync") + } else { + gettext("Pause Sync") + }, activate: Box::new(move |this: &mut Self| { let request = Request::SetSyncPaused { paused: !paused, @@ -367,22 +408,22 @@ impl Tray for DriveTray { ); } else if self.state.phase == Phase::Disconnected { // Enable+start the service so it mounts now and on future logins. - items.push(item("Connect", |this| { + items.push(item(&gettext("Connect"), |this| { service::enable_start(); - this.state.line = "Connecting…".into(); + this.state.line = gettext("Connecting…"); })); } items.push(MenuItem::Separator); - items.push(item("Hide Tray Icon", |_| hide_tray())); + items.push(item(&gettext("Hide Tray Icon"), |_| hide_tray())); if self.state.mounted { // Stopping unmounts the drive, so the app asks first; the tray has no // GTK of its own to ask with. - items.push(item("Stop Proton Drive…", |_| { + items.push(item(&gettext("Stop Proton Drive…"), |_| { open_manager(&["--confirm-stop"]) })); } else { - items.push(item("Quit", |_| std::process::exit(0))); + items.push(item(&gettext("Quit"), |_| std::process::exit(0))); } items } @@ -394,6 +435,7 @@ fn main() -> Result<()> { tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()), ) .init(); + i18n::init(); let dirs = AppDirs::new().context("resolve app dirs")?; // Hidden from its own menu: the session's autostart still runs the tray, and diff --git a/crates/pdfs-gui/src/prompt.rs b/crates/pdfs-gui/src/prompt.rs index 34cd581..4566a91 100644 --- a/crates/pdfs-gui/src/prompt.rs +++ b/crates/pdfs-gui/src/prompt.rs @@ -23,6 +23,8 @@ use pdfs_core::menu::PromptMode; use pdfs_core::opener::{self, OpenWith}; mod activation; +mod i18n; +use i18n::{gettext, gettext_f, gettext_noop, ngettext_f, pgettext}; mod dmenu; mod fzf; mod query; @@ -51,11 +53,13 @@ enum Filter { /// The chip row, in Tab-cycle order. const FILTERS: [(Filter, &str); 5] = [ - (Filter::All, "All"), - (Filter::Folders, "Folders"), - (Filter::Documents, "Documents"), - (Filter::Images, "Images"), - (Filter::Media, "Media"), + // Translators: a filter chip that shows every kind of result. + (Filter::All, gettext_noop("All")), + (Filter::Folders, gettext_noop("Folders")), + (Filter::Documents, gettext_noop("Documents")), + (Filter::Images, gettext_noop("Images")), + // Translators: a filter chip for audio and video files. + (Filter::Media, gettext_noop("Media")), ]; impl Filter { @@ -162,9 +166,13 @@ impl Hit { None => { let parent = parent_of(&h.path); if parent.is_empty() { - "My files".to_string() + gettext("My files") } else { - format!("My files / {}", parent.replace('/', " / ")) + // Translators: {path} is a folder path inside the user's Drive, such as "Work / Taxes". + gettext_f( + "My files / {path}", + &[("path", &parent.replace('/', " / "))], + ) } } }, @@ -425,6 +433,7 @@ fn main() -> glib::ExitCode { tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into()), ) .init(); + i18n::init(); let raw: Vec = std::env::args().skip(1).collect(); if raw.iter().any(|arg| arg == "-h" || arg == "--help") { @@ -506,7 +515,7 @@ fn build_window(app: &adw::Application) -> Option> { let window = adw::ApplicationWindow::builder() .application(app) - .title("Search Proton Drive") + .title(gettext("Search Proton Drive")) .default_width(720) .default_height(540) .resizable(false) @@ -527,7 +536,7 @@ fn build_window(app: &adw::Application) -> Option> { search_bar.append(&search_icon); let entry = gtk4::Entry::builder() - .placeholder_text("Search in Drive and on this computer") + .placeholder_text(gettext("Search in Drive and on this computer")) .hexpand(true) .build(); entry.add_css_class("search-entry"); @@ -537,7 +546,8 @@ fn build_window(app: &adw::Application) -> Option> { spinner.set_visible(false); search_bar.append(&spinner); - let esc = gtk4::Label::new(Some("Esc")); + // Translators: the Escape key, shown as a hint that it closes the window. + let esc = gtk4::Label::new(Some(&gettext("Esc"))); esc.add_css_class("key-hint"); search_bar.append(&esc); card.append(&search_bar); @@ -551,9 +561,9 @@ fn build_window(app: &adw::Application) -> Option> { let results = gtk4::Box::new(gtk4::Orientation::Vertical, 0); results.add_css_class("results"); - let search_section = Section::new("Best matches", "system-search-symbolic"); + let search_section = Section::new(&gettext("Best matches"), "system-search-symbolic"); let drive_section = Section::new("Proton Drive", "folder-remote-symbolic"); - let local_section = Section::new("This computer", "drive-harddisk-symbolic"); + let local_section = Section::new(&gettext("This computer"), "drive-harddisk-symbolic"); search_section.attach(&results); drive_section.attach(&results); local_section.attach(&results); @@ -567,7 +577,7 @@ fn build_window(app: &adw::Application) -> Option> { let placeholder = adw::StatusPage::builder() .icon_name("system-search-symbolic") - .title("No results") + .title(gettext("No results")) .build(); placeholder.add_css_class("compact"); @@ -575,12 +585,12 @@ fn build_window(app: &adw::Application) -> Option> { // is still usable for nothing else, so it owns the whole view. let offline = adw::StatusPage::builder() .icon_name("network-offline-symbolic") - .title("Proton Drive is not running") - .description("Start the mount daemon to search your Drive.") + .title(gettext("Proton Drive is not running")) + .description(gettext("Start the mount daemon to search your Drive.")) .build(); offline.add_css_class("compact"); let retry = gtk4::Button::builder() - .label("Retry") + .label(gettext("Retry")) .halign(gtk4::Align::Center) .build(); retry.add_css_class("pill"); @@ -601,14 +611,15 @@ fn build_window(app: &adw::Application) -> Option> { let footer = gtk4::Box::new(gtk4::Orientation::Horizontal, 8); footer.add_css_class("footer"); let hint = gtk4::Label::builder() - .label("Connecting…") + .label(gettext("Connecting…")) .xalign(0.0) .hexpand(true) .ellipsize(gtk4::pango::EllipsizeMode::End) .build(); hint.add_css_class("footer-text"); footer.append(&hint); - let keys = gtk4::Label::new(Some("↑↓ navigate · ↵ open · Tab filter")); + // Translators: keyboard hints in the footer; keep the arrow and Enter symbols. + let keys = gtk4::Label::new(Some(&gettext("↑↓ navigate · ↵ open · Tab filter"))); keys.add_css_class("footer-text"); footer.append(&keys); card.append(&footer); @@ -646,7 +657,7 @@ fn build_window(app: &adw::Application) -> Option> { for (filter, label) in FILTERS { let chip = gtk4::ToggleButton::builder() - .label(label) + .label(gettext(label)) .active(filter == Filter::All) .build(); chip.add_css_class("chip"); @@ -852,7 +863,7 @@ impl Ui { /// Ask the daemon for status and, if it answers, load the suggested (pinned) /// files. Runs off-thread: a dead daemon must not freeze the first frame. fn connect(self: &Rc) { - self.hint.set_label("Connecting…"); + self.hint.set_label(&gettext("Connecting…")); let rx = spawn_request(self.socket.clone(), Request::Status); let ui = self.clone(); glib::spawn_future_local(async move { @@ -865,7 +876,7 @@ impl Ui { } _ => { ui.entry.set_sensitive(false); - ui.hint.set_label("Daemon offline"); + ui.hint.set_label(&gettext("Daemon offline")); ui.stack.set_visible_child_name("offline"); } } @@ -879,7 +890,7 @@ impl Ui { self.spinner.stop(); self.spinner.set_visible(false); self.entry.set_sensitive(false); - self.hint.set_label("Daemon offline"); + self.hint.set_label(&gettext("Daemon offline")); self.stack.set_visible_child_name("offline"); } @@ -1072,7 +1083,8 @@ impl Ui { visible.extend(local); if searching { rank_hits(&mut visible); - self.search_section.set_rows(&visible, Some("Best matches")); + self.search_section + .set_rows(&visible, Some(&gettext("Best matches"))); self.drive_section.set_rows(&[], None); self.local_section.set_rows(&[], None); } else { @@ -1081,8 +1093,10 @@ impl Ui { .iter() .take_while(|hit| matches!(hit, Hit::Drive(_))) .count(); - self.drive_section - .set_rows(&visible[..drive_count], Some("Pinned in Proton Drive")); + self.drive_section.set_rows( + &visible[..drive_count], + Some(&gettext("Pinned in Proton Drive")), + ); self.local_section.set_rows(&visible[drive_count..], None); } @@ -1093,18 +1107,20 @@ impl Ui { *self.rendered_query.borrow_mut() = query; if total == 0 { - self.placeholder.set_title(if searching { - "No results" + self.placeholder.set_title(&if searching { + gettext("No results") } else { - "Search your Drive" + gettext("Search your Drive") }); self.placeholder - .set_description(Some(match (searching, self.indexing.get()) { - (true, true) => { - "Still indexing this computer — local results will fill in shortly." - } - (true, false) => "Try a different search, or another filter.", - _ => "Start typing to search Proton Drive and the files on this computer.", + .set_description(Some(&match (searching, self.indexing.get()) { + (true, true) => gettext( + "Still indexing this computer — local results will fill in shortly.", + ), + (true, false) => gettext("Try a different search, or another filter."), + _ => gettext( + "Start typing to search Proton Drive and the files on this computer.", + ), })); self.stack.set_visible_child_name("empty"); self.cursor.set(None); @@ -1129,18 +1145,23 @@ impl Ui { fn status_text(&self, total: usize, searching: bool) -> String { if !searching { return match total { - 0 => "No pinned files".to_string(), - 1 => "1 pinned file".to_string(), - n => format!("{n} pinned files"), + 0 => gettext("No pinned files"), + n => ngettext_f("{n} pinned file", "{n} pinned files", n as u64, &[]), }; } - let drive = self.drive_count(); - let local = total - drive; - let mut text = format!("{drive} in Drive · {local} on this computer"); + let drive = self.drive_count().to_string(); + let local = (total - self.drive_count()).to_string(); + let args = [("drive", drive.as_str()), ("local", local.as_str())]; if self.indexing.get() { - text.push_str(" · indexing…"); + // Translators: result counts in the footer while this computer is still being indexed; {drive} and {local} are numbers. + gettext_f( + "{drive} in Drive · {local} on this computer · indexing…", + &args, + ) + } else { + // Translators: result counts in the footer; {drive} and {local} are numbers. + gettext_f("{drive} in Drive · {local} on this computer", &args) } - text } /// Move the cursor by `delta` rows, wrapping at both ends. @@ -1272,7 +1293,9 @@ impl Ui { self.opening.set(true); self.spinner.set_visible(true); self.spinner.start(); - self.hint.set_label(&format!("Opening {}…", drive.name)); + // Translators: {name} is a file name. + let opening = gettext_f("Opening {name}…", &[("name", &drive.name)]); + self.hint.set_label(&opening); let rx = spawn_request( self.socket.clone(), @@ -1293,9 +1316,13 @@ impl Ui { ui.dismiss(); } Ok(Ok(Response::Error { message, .. })) => { - ui.hint.set_label(&format!("Could not open: {message}")); + // Translators: {message} is an error from the daemon, in English. + ui.hint.set_label(&gettext_f( + "Could not open: {message}", + &[("message", &message)], + )); } - _ => ui.hint.set_label("Could not reach the daemon"), + _ => ui.hint.set_label(&gettext("Could not reach the daemon")), } }); } @@ -1403,8 +1430,10 @@ fn home_relative(parent: &str) -> String { .ok() .map(|rel| rel.display().to_string()) }) { - Some(rel) if rel.is_empty() => "Home".to_string(), - Some(rel) => format!("Home / {}", rel.replace('/', " / ")), + // Translators: the user's home folder, as the location of a result. + Some(rel) if rel.is_empty() => gettext("Home"), + // Translators: {path} is a folder path inside the home folder, folder names separated by " / ". + Some(rel) => gettext_f("Home / {path}", &[("path", &rel.replace('/', " / "))]), None => parent.to_string(), } } @@ -1418,16 +1447,21 @@ fn parent_of(path: &str) -> String { fn format_size(bytes: u64) -> String { const UNITS: [(u64, &str); 3] = [ - (1024 * 1024 * 1024, "GB"), - (1024 * 1024, "MB"), - (1024, "KB"), + // Translators: a file size in gigabytes; {size} is a number such as "4.2". + (1024 * 1024 * 1024, gettext_noop("{size} GB")), + // Translators: a file size in megabytes; {size} is a number such as "4.2". + (1024 * 1024, gettext_noop("{size} MB")), + // Translators: a file size in kilobytes; {size} is a number such as "4.2". + (1024, gettext_noop("{size} KB")), ]; for (scale, unit) in UNITS { if bytes >= scale { - return format!("{:.1} {unit}", bytes as f64 / scale as f64); + let size = format!("{:.1}", bytes as f64 / scale as f64); + return gettext_f(unit, &[("size", &size)]); } } - format!("{bytes} B") + // Translators: a file size in bytes; {size} is a whole number. + gettext_f("{size} B", &[("size", &bytes.to_string())]) } /// Coarse relative age, in the granularity a launcher row has room for. @@ -1437,12 +1471,18 @@ fn format_age(epoch_secs: i64) -> String { .map_or(0, |d| d.as_secs() as i64); let diff = now - epoch_secs; match diff { - d if d < 60 => "now".to_string(), - d if d < 3600 => format!("{}m", d / 60), - d if d < 86_400 => format!("{}h", d / 3600), - d if d < 2_592_000 => format!("{}d", d / 86_400), - d if d < 31_536_000 => format!("{}mo", d / 2_592_000), - d => format!("{}y", d / 31_536_000), + // Translators: the age of a file modified under a minute ago. + d if d < 60 => pgettext("age", "now"), + // Translators: a compact file age; {count} is a number of minutes. + d if d < 3600 => gettext_f("{count}m", &[("count", &(d / 60).to_string())]), + // Translators: a compact file age; {count} is a number of hours. + d if d < 86_400 => gettext_f("{count}h", &[("count", &(d / 3600).to_string())]), + // Translators: a compact file age; {count} is a number of days. + d if d < 2_592_000 => gettext_f("{count}d", &[("count", &(d / 86_400).to_string())]), + // Translators: a compact file age; {count} is a number of months. + d if d < 31_536_000 => gettext_f("{count}mo", &[("count", &(d / 2_592_000).to_string())]), + // Translators: a compact file age; {count} is a number of years. + d => gettext_f("{count}y", &[("count", &(d / 31_536_000).to_string())]), } } diff --git a/crates/pdfs-gui/src/query.rs b/crates/pdfs-gui/src/query.rs index 8ee0d45..e91e85a 100644 --- a/crates/pdfs-gui/src/query.rs +++ b/crates/pdfs-gui/src/query.rs @@ -17,7 +17,7 @@ use pdfs_core::control::{ use pdfs_core::opener::{self, OpenWith}; use crate::activation::{DriveActivation, drive_activation, mounted_or_relative, mounted_target}; -use crate::{Hit, file_name, is_document, is_image, is_media, rank_hits}; +use crate::{Hit, file_name, gettext_f, is_document, is_image, is_media, rank_hits}; /// Where the mount lives, for turning a Drive path into something an /// application can open. Falls back to the configured default so a momentarily @@ -164,7 +164,13 @@ pub(crate) fn open( /// One control-socket round-trip, with the daemon-is-down case phrased for a /// terminal rather than a status page. pub(crate) fn request(socket: &Path, request: Request) -> Result { - send(socket, &request).map_err(|e| format!("cannot reach the Proton Drive daemon: {e}")) + send(socket, &request).map_err(|e| { + // Translators: shown as a row in the search list; {error} is a system error, in English. + gettext_f( + "cannot reach the Proton Drive daemon: {error}", + &[("error", &e.to_string())], + ) + }) } #[cfg(test)] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 648985f..baaaadd 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -13,6 +13,31 @@ scratch (user data in `staging/` and `recovery/` is never touched by this). Schema: **31** (unchanged). +### Added +- **Translations.** The desktop app, the tray and the search prompt are translated into German, + British English, Spanish, French, Italian, Dutch, Polish and Brazilian Portuguese, and follow the + system language. Counts use each language's plural rules, and dates use its own formats. The + desktop files carry translated descriptions and search keywords. The `pdfs` CLI and messages + from the daemon stay in English. [docs/TRANSLATING.md](TRANSLATING.md) describes how to improve a + translation or add a language. A few labels on the Photos page (the filter tabs, the gallery + subtitle and the empty timeline) are still in English. +- **Language preference.** Preferences → General → Appearance → Language overrides the system + language for the app, the tray and the prompt, from their next start. + +### Changed +- **Packages install translations.** The Arch, AUR, Debian and Fedora packages install the compiled + catalogs under `/usr/share/locale`, and the release tarball carries them in `locale/`. Building + the source packages now needs `gettext`. + +## [2.0.0] — 2026-09-23 + +A redesign of the desktop app: a new shell with a Preferences dialog, keyboard-driven context +menus, a docked details pane, a rewritten photo viewer with infinite scroll, album management, +stop sharing and link expiry, a redesigned Shared with Me page, per-device restore, a tray that +shows the sync state, and a new app icon. + +Schema: **31** (unchanged). + ### Added - **Pause and resume sync.** The Sync page, the tray and `pdfs sync pause [--for 1h]` / `pdfs sync resume` hold back queued uploads and mirror-folder reconciles. Reads through the mount @@ -970,6 +995,7 @@ First stable release: FUSE files-on-demand mount, sync daemon under `proton-driv - The outstanding FUSE defects tracked in `docs/BUGS.md`, plus a truncate defect, validated by a new POSIX compliance suite for the filesystem. +[2.0.0]: https://github.com/narrrl/proton-drive-linux/releases/tag/v2.0.0 [1.11.1]: https://github.com/narrrl/proton-drive-linux/releases/tag/v1.11.1 [1.11.0]: https://github.com/narrrl/proton-drive-linux/releases/tag/v1.11.0 [1.10.2]: https://github.com/narrrl/proton-drive-linux/releases/tag/v1.10.2 diff --git a/docs/TRANSLATING.md b/docs/TRANSLATING.md new file mode 100644 index 0000000..c91e06f --- /dev/null +++ b/docs/TRANSLATING.md @@ -0,0 +1,78 @@ +# Translating Proton Drive for Linux + +The desktop app (`pdfs-app`), the tray (`pdfs-tray`) and the search prompt (`pdfs-prompt`) are +translated with GNU gettext in the `pdfs` text domain. The `pdfs` command-line tool and the daemon's +own messages stay in English, because scripts parse their output. + +US English is the source language. The shipped catalogs are listed in [`po/LINGUAS`](../po/LINGUAS): +German, British English, Spanish, French, Italian, Dutch, Polish and Brazilian Portuguese. + +## Picking a language + +The apps follow the system locale (`LANGUAGE`, `LC_ALL`, `LC_MESSAGES`, `LANG`). Preferences → +General → Appearance → **Language** overrides that for the app, the tray and the prompt. The choice is +stored as `language` in `config.json` and takes effect the next time they start. + +## Layout + +| Path | Purpose | +| --- | --- | +| `crates/pdfs-gui/src/i18n.rs` | Locale setup and the `gettext`, `gettext_f`, `ngettext_f`, `pgettext` and `gettext_noop` helpers | +| `po/POTFILES.in` | Sources that `xgettext` scans | +| `po/pdfs.pot` | The template, generated from the sources | +| `po/.po` | One catalog per language | +| `po/update.sh` | Regenerates the template and merges it into every catalog | +| `po/build.sh ` | Compiles the catalogs to `//LC_MESSAGES/pdfs.mo` | + +## Updating an existing translation + +1. Run `po/update.sh`. It regenerates `po/pdfs.pot` and merges new and changed strings into each + catalog, marking changed ones `fuzzy`. +2. Edit `po/.po` with a PO editor (Poedit, Lokalize, GNOME Translation Editor) or a text + editor. Translate the empty entries and review every `fuzzy` one, then remove its `fuzzy` flag. +3. Check the catalog with `msgfmt --check --statistics -o /dev/null po/.po`. +4. Try it from the source tree: + + ```bash + po/build.sh target/locale + PDFS_LOCALEDIR=target/locale LANGUAGE= cargo run -p pdfs-gui --bin pdfs-app + ``` + +## Adding a language + +1. Add the code (for example `sv` or `pt_PT`) to `po/LINGUAS`, keeping the list sorted. +2. Run `po/update.sh`. It creates `po/.po` from the template with `msginit`. +3. Fill in the `Plural-Forms` header if `msginit` did not, and translate the catalog. +4. Add the code and the language's own name to `LANGUAGES` in `crates/pdfs-gui/src/i18n.rs`, so the + Preferences picker offers it. +5. Add `GenericName[]`, `Comment[]` and `Keywords[]` lines to the two desktop files + in `packaging/`. + +`cargo test -p pdfs-gui` checks that every language in the picker has a catalog, that +`po/POTFILES.in` lists every source file that calls gettext, and that every catalog passes +`msgfmt --check`. + +## Rules for translators + +- Keep every `{placeholder}` from the English text. You may move it, but not rename or drop it. + `msgfmt --check` rejects a catalog where they differ. Plural forms keep `{n}` in every form. +- Read the `#.` translator comments above an entry. They explain placeholders and date formats. +- Date entries such as `%b %e` are `strftime` formats for GLib's `DateTime::format`. Translate them + into the order and separators your language uses, not into literal dates. +- A `msgctxt` such as `verb` or `column` tells you which meaning of a short word is meant. +- Keep product names as they are: Proton Drive, Proton, Google Takeout. +- Use the same term for the same thing across the catalog, and follow the terminology of your + desktop (GNOME or KDE) for common actions such as Trash, Preferences and Cancel. + +## Rules for developers + +- Wrap every user-visible GUI string: `gettext("Move to Trash")`. +- Never build a sentence from translated pieces or with `format!`. Use named placeholders: + `gettext_f("Moved {name} to Trash", &[("name", &name)])`. +- Counts use `ngettext_f("{n} item", "{n} items", count, &[])`; `{n}` is filled in for you. +- Give short, ambiguous words a context: `pgettext("verb", "Open")`. +- Mark labels in `const` tables with `gettext_noop` and translate them where they are shown. +- The message id must be a single string literal on one line, since `xgettext` reads literals only. +- Add a `// Translators:` comment on the line above a call whose meaning is not obvious. +- Do not translate log messages, CLI output, action or icon names, or values the daemon sends back. +- Run `po/update.sh` after changing strings and commit the updated template and catalogs. diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD index f7bdc95..e2f5517 100644 --- a/packaging/PKGBUILD +++ b/packaging/PKGBUILD @@ -16,7 +16,7 @@ arch=('x86_64') url="https://github.com/narrrl/proton-drive-linux" license=('MIT') depends=('fuse3' 'gtk4' 'libadwaita' 'webkitgtk-6.0' 'perl-image-exiftool') -makedepends=('cargo' 'git') +makedepends=('cargo' 'git' 'gettext') provides=('pdfs') # Files-on-demand mount + keyring need these at runtime. optdepends=('gnome-keyring: credential storage via Secret Service' @@ -73,5 +73,8 @@ package() { install -Dm644 "packaging/proton-drive.service" \ "$pkgdir/usr/lib/systemd/user/proton-drive.service" + # Translations: compiled from po/ into /usr/share/locale. + po/build.sh "$pkgdir/usr/share/locale" + install -Dm644 "LICENSE" "$pkgdir/usr/share/licenses/$pkgname/LICENSE" } diff --git a/packaging/aur/proton-drive-for-linux-bin/PKGBUILD b/packaging/aur/proton-drive-for-linux-bin/PKGBUILD index 34473aa..15c2a3e 100644 --- a/packaging/aur/proton-drive-for-linux-bin/PKGBUILD +++ b/packaging/aur/proton-drive-for-linux-bin/PKGBUILD @@ -53,5 +53,9 @@ package() { install -Dm644 "$srcdir/proton-drive.service" \ "$pkgdir/usr/lib/systemd/user/proton-drive.service" + # Translations ship precompiled in the release tarball. + install -dm755 "$pkgdir/usr/share" + cp -r --no-preserve=ownership "$srcdir/locale" "$pkgdir/usr/share/locale" + install -Dm644 "$srcdir/LICENSE-$pkgver" "$pkgdir/usr/share/licenses/$pkgname/LICENSE" } diff --git a/packaging/aur/proton-drive-for-linux-git/PKGBUILD b/packaging/aur/proton-drive-for-linux-git/PKGBUILD index fca80bd..ce327b5 100644 --- a/packaging/aur/proton-drive-for-linux-git/PKGBUILD +++ b/packaging/aur/proton-drive-for-linux-git/PKGBUILD @@ -9,7 +9,7 @@ url="https://github.com/narrrl/proton-drive-linux" license=('MIT') depends=('fuse3' 'gtk4' 'libadwaita' 'webkitgtk-6.0' 'dbus' 'gcc-libs' 'glibc' 'hicolor-icon-theme') -makedepends=('cargo' 'git') +makedepends=('cargo' 'git' 'gettext') optdepends=('perl-image-exiftool: thumbnails for camera RAW files' 'gnome-keyring: credential storage over the Secret Service API' 'kwallet: credential storage over the Secret Service API' @@ -73,6 +73,9 @@ package() { install -Dm644 packaging/proton-drive.service \ "$pkgdir/usr/lib/systemd/user/proton-drive.service" + # Translations: compiled from po/ into /usr/share/locale. + po/build.sh "$pkgdir/usr/share/locale" + install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/README.md" } diff --git a/packaging/aur/proton-drive-for-linux/PKGBUILD b/packaging/aur/proton-drive-for-linux/PKGBUILD index 310c2c1..0c0c4f1 100644 --- a/packaging/aur/proton-drive-for-linux/PKGBUILD +++ b/packaging/aur/proton-drive-for-linux/PKGBUILD @@ -9,7 +9,7 @@ url="https://github.com/narrrl/proton-drive-linux" license=('MIT') depends=('fuse3' 'gtk4' 'libadwaita' 'webkitgtk-6.0' 'dbus' 'gcc-libs' 'glibc' 'hicolor-icon-theme') -makedepends=('cargo') +makedepends=('cargo' 'gettext') optdepends=('perl-image-exiftool: thumbnails for camera RAW files' 'gnome-keyring: credential storage over the Secret Service API' 'kwallet: credential storage over the Secret Service API' @@ -68,6 +68,9 @@ package() { install -Dm644 packaging/proton-drive.service \ "$pkgdir/usr/lib/systemd/user/proton-drive.service" + # Translations: compiled from po/ into /usr/share/locale. + po/build.sh "$pkgdir/usr/share/locale" + install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/README.md" } diff --git a/packaging/io.narl.proton-drive-linux-tray.desktop b/packaging/io.narl.proton-drive-linux-tray.desktop index f1cf285..5a13f8c 100644 --- a/packaging/io.narl.proton-drive-linux-tray.desktop +++ b/packaging/io.narl.proton-drive-linux-tray.desktop @@ -2,7 +2,23 @@ Type=Application Name=Proton Drive for Linux (Tray) GenericName=Cloud Drive Tray +GenericName[de]=Cloud-Speicher im Infobereich +GenericName[en_GB]=Cloud Drive Tray +GenericName[es]=Bandeja de almacenamiento en la nube +GenericName[fr]=Zone de notification du stockage en ligne +GenericName[it]=Area di notifica archiviazione cloud +GenericName[nl]=Cloudopslag in systeemvak +GenericName[pl]=Dysk w chmurze w zasobniku +GenericName[pt_BR]=Bandeja de armazenamento em nuvem Comment=Proton Drive status and quick actions (unofficial client) +Comment[de]=Status und Schnellaktionen für Proton Drive (inoffizieller Client) +Comment[en_GB]=Proton Drive status and quick actions (unofficial client) +Comment[es]=Estado y acciones rápidas de Proton Drive (cliente no oficial) +Comment[fr]=État et actions rapides de Proton Drive (client non officiel) +Comment[it]=Stato e azioni rapide di Proton Drive (client non ufficiale) +Comment[nl]=Status en snelle acties voor Proton Drive (onofficiële client) +Comment[pl]=Stan i szybkie działania Proton Drive (nieoficjalny klient) +Comment[pt_BR]=Status e ações rápidas do Proton Drive (cliente não oficial) Exec=pdfs-tray Icon=io.narl.proton-drive-linux Terminal=false diff --git a/packaging/io.narl.proton-drive-linux.desktop b/packaging/io.narl.proton-drive-linux.desktop index f2cd1b0..028b53a 100644 --- a/packaging/io.narl.proton-drive-linux.desktop +++ b/packaging/io.narl.proton-drive-linux.desktop @@ -2,11 +2,35 @@ Type=Application Name=Proton Drive for Linux GenericName=Cloud Drive +GenericName[de]=Cloud-Speicher +GenericName[en_GB]=Cloud Drive +GenericName[es]=Almacenamiento en la nube +GenericName[fr]=Stockage en ligne +GenericName[it]=Archiviazione cloud +GenericName[nl]=Cloudopslag +GenericName[pl]=Dysk w chmurze +GenericName[pt_BR]=Armazenamento em nuvem Comment=Files-on-demand Proton Drive (unofficial client) +Comment[de]=Proton Drive mit Dateien auf Abruf (inoffizieller Client) +Comment[en_GB]=Files-on-demand Proton Drive (unofficial client) +Comment[es]=Proton Drive con archivos bajo demanda (cliente no oficial) +Comment[fr]=Proton Drive avec fichiers à la demande (client non officiel) +Comment[it]=Proton Drive con file su richiesta (client non ufficiale) +Comment[nl]=Proton Drive met bestanden op aanvraag (onofficiële client) +Comment[pl]=Proton Drive z plikami na żądanie (nieoficjalny klient) +Comment[pt_BR]=Proton Drive com arquivos sob demanda (cliente não oficial) Exec=pdfs-app Icon=io.narl.proton-drive-linux Terminal=false Categories=Network;FileTransfer;GTK; Keywords=proton;drive;cloud;sync;storage;files;backup; +Keywords[de]=proton;drive;cloud;sync;speicher;dateien;sicherung;synchronisation; +Keywords[en_GB]=proton;drive;cloud;sync;storage;files;backup; +Keywords[es]=proton;drive;nube;sincronizar;almacenamiento;archivos;copia de seguridad; +Keywords[fr]=proton;drive;cloud;nuage;synchronisation;stockage;fichiers;sauvegarde; +Keywords[it]=proton;drive;cloud;sincronizzazione;archiviazione;file;backup; +Keywords[nl]=proton;drive;cloud;synchronisatie;opslag;bestanden;back-up; +Keywords[pl]=proton;drive;chmura;synchronizacja;dysk;pliki;kopia zapasowa; +Keywords[pt_BR]=proton;drive;nuvem;sincronização;armazenamento;arquivos;backup; StartupNotify=true SingleMainWindow=true diff --git a/packaging/proton-drive-linux.spec b/packaging/proton-drive-linux.spec index 260da8a..a8d7848 100644 --- a/packaging/proton-drive-linux.spec +++ b/packaging/proton-drive-linux.spec @@ -27,6 +27,7 @@ BuildRequires: libsecret-devel BuildRequires: dbus-devel BuildRequires: glib2-devel BuildRequires: webkitgtk6.0-devel +BuildRequires: gettext Requires: fuse3 Requires: gtk4 @@ -80,6 +81,7 @@ install -D -m0644 %{git_dir}/packaging/io.narl.proton-drive-linux.svg \ %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/io.narl.proton-drive-linux.svg install -D -m0644 %{git_dir}/packaging/proton-drive.service \ %{buildroot}/usr/lib/systemd/user/proton-drive.service +%{git_dir}/po/build.sh %{buildroot}%{_datadir}/locale %files %license LICENSE @@ -91,6 +93,7 @@ install -D -m0644 %{git_dir}/packaging/proton-drive.service \ %{_sysconfdir}/xdg/autostart/io.narl.proton-drive-linux-tray.desktop %{_datadir}/icons/hicolor/scalable/apps/io.narl.proton-drive-linux.svg /usr/lib/systemd/user/proton-drive.service +%{_datadir}/locale/*/LC_MESSAGES/pdfs.mo %changelog * Sun Jul 19 2026 Local Packager - 0.4.0-1 diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..ab79ff7 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,8 @@ +de +en_GB +es +fr +it +nl +pl +pt_BR diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..c8309cf --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,27 @@ +crates/pdfs-gui/src/activation.rs +crates/pdfs-gui/src/app/main.rs +crates/pdfs-gui/src/app/pages/activity.rs +crates/pdfs-gui/src/app/pages/albums.rs +crates/pdfs-gui/src/app/pages/browser.rs +crates/pdfs-gui/src/app/pages/devices.rs +crates/pdfs-gui/src/app/pages/locations.rs +crates/pdfs-gui/src/app/pages/login.rs +crates/pdfs-gui/src/app/pages/photo_viewer.rs +crates/pdfs-gui/src/app/pages/photos.rs +crates/pdfs-gui/src/app/pages/shared.rs +crates/pdfs-gui/src/app/pages/shared_by_me.rs +crates/pdfs-gui/src/app/pages/status.rs +crates/pdfs-gui/src/app/pages/takeout.rs +crates/pdfs-gui/src/app/pages/trash.rs +crates/pdfs-gui/src/app/pages/verify.rs +crates/pdfs-gui/src/app/widgets/details.rs +crates/pdfs-gui/src/app/widgets/menu.rs +crates/pdfs-gui/src/app/widgets/share_dialog.rs +crates/pdfs-gui/src/app/widgets/thumbnails.rs +crates/pdfs-gui/src/app/widgets/versions_dialog.rs +crates/pdfs-gui/src/dmenu.rs +crates/pdfs-gui/src/fzf.rs +crates/pdfs-gui/src/i18n.rs +crates/pdfs-gui/src/main.rs +crates/pdfs-gui/src/prompt.rs +crates/pdfs-gui/src/query.rs diff --git a/po/build.sh b/po/build.sh new file mode 100755 index 0000000..36fa897 --- /dev/null +++ b/po/build.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# Compile every catalog in po/LINGUAS into //LC_MESSAGES/pdfs.mo. +# Packages pass their install tree, e.g. "$pkgdir/usr/share/locale"; for a run +# from the source tree use target/locale with PDFS_LOCALEDIR=target/locale. +set -euo pipefail + +if [ $# -ne 1 ]; then + echo "usage: $0 " >&2 + exit 2 +fi +localedir="$1" +po_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +while read -r lang; do + [ -n "$lang" ] || continue + mkdir -p "$localedir/$lang/LC_MESSAGES" + msgfmt --check --output-file="$localedir/$lang/LC_MESSAGES/pdfs.mo" "$po_dir/$lang.po" +done < "$po_dir/LINGUAS" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..1ae9b80 --- /dev/null +++ b/po/de.po @@ -0,0 +1,4708 @@ +# German translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "Meine Dateien" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Fotos" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Mit mir geteilt" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Von mir geteilt" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Computer" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Papierkorb" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Synchronisierung" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Aktivität" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Aktualisieren (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what}: {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "Keine Internetverbindung" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "Das ist nicht mehr vorhanden" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "Kein Zugriff darauf" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "Etwas anderes hat dies zuerst geändert" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Das Proton Drive ist voll" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Einstellungen" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Tastenkürzel" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "Info zu Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Hauptmenü" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Proton Drive mit Dateien auf Abruf für den Linux-Desktop.\n" +"\n" +"Inoffizieller Client – nicht mit Proton AG verbunden, von Proton AG " +"unterstützt oder befürwortet." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Mitwirkende an Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "Proton Drive beenden?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"Das Laufwerk wird ausgehängt und nichts wird synchronisiert, bis wieder eine " +"Verbindung hergestellt wird. Proton Drive startet bei der nächsten Anmeldung " +"erneut." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Abbrechen" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Beenden" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "Proton Drive konnte nicht beendet werden" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "Der Einhängedienst wurde nicht beendet." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "Allgemein" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Drive durchsuchen" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Aktualisieren" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Tastenkürzel" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "Dateien" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "Neuer Ordner" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Dateien hochladen" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Zurück / Vor" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Übergeordneter Ordner" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Raster / Liste" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Umbenennen" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "In den Papierkorb verschieben" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Auswahl aufheben" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Größere Vorschaubilder" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Kleinere Vorschaubilder" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Vorschaubildgröße zurücksetzen" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Alles auswählen" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Fotobetrachter" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Vorheriges / nächstes Foto" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "Erstes / letztes Foto" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Details anzeigen" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Vollbild" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Schließen" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Zum Umbenennen genau ein Element auswählen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "Alle" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Übertragungen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Änderungen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Freigaben" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Probleme" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Erfordert Aufmerksamkeit" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Erneut versuchen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Wird geladen …" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Letzte Aktivitäten werden gelesen." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "Aktivität konnte nicht gelesen werden" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Unerwartete Antwort vom Einhängedienst." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Nicht verbunden" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "Der Proton-Drive-Einhängedienst läuft nicht." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Verbindung wird hergestellt …" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "Warten auf den Start des Proton-Drive-Einhängedienstes." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Heute" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Gestern" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A, %-d. %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d. %B %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Noch nichts" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" +"Uploads, Verschiebungen, Freigaben und andere Änderungen erscheinen hier, " +"sobald sie geschehen." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"Eine Datei wurde gleichzeitig an zwei Stellen geändert. Bitte die zu " +"behaltende Version auswählen." +msgstr[1] "" +"{n} Dateien wurden gleichzeitig an zwei Stellen geändert. Bitte die zu " +"behaltenden Versionen auswählen." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "Keine passenden Aktivitäten" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Nichts im aktuellen Protokoll entspricht diesem Filter." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n}-mal seit {time}" +msgstr[1] "{n}-mal seit {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Gelöst" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Lösen …" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "{name} hochgeladen" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "{name} heruntergeladen" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "{name} synchronisiert" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "{name} umbenannt" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "{name} verschoben" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Ordner {name} erstellt" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "{name} in den Papierkorb verschoben" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "{name} wiederhergestellt" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "{name} gelöscht" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Papierkorb geleert ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "{name} geteilt" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Link zu {name} erstellt" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "Freigabe von {name} beendet" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Konflikt {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d. %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Alben werden geladen …" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Proton-Drive-Alben werden gelesen." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "Keine Fotobibliothek" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "Für dieses Proton-Konto ist Fotos nicht aktiviert." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "Keine Alben" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Mit „Neues Album“ oder in Proton Photos ein Album erstellen." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "Alben konnten nicht geladen werden" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "Der Proton-Drive-Einhängedienst hat nicht geantwortet." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} Album" +msgstr[1] "{n} Alben" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Öffnen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Umbenennen …" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Album löschen …" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Albumname" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Erstellen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "Neues Album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Album erstellt" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "Das Album konnte nicht erstellt werden" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "Der Einhängedienst hat nicht geantwortet." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Album umbenennen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Album umbenannt" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "Das Album konnte nicht umbenannt werden" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "Album löschen?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "„{name}“ wird gelöscht. Die Fotos bleiben in der Zeitleiste." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Löschen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Album gelöscht" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "Das Album konnte nicht gelöscht werden" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Zum Album hinzufügen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Ein Album für dieses Foto auswählen." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +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:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "Neues Album …" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "Einige Fotos konnten nicht hinzugefügt werden" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "{n} Foto zum Album hinzugefügt" +msgstr[1] "{n} Fotos zum Album hinzugefügt" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "Hinzufügen zum Album fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "Einige Fotos konnten nicht aus dem Album entfernt werden" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "{n} Foto aus dem Album entfernt" +msgstr[1] "{n} Fotos aus dem Album entfernt" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "Entfernen aus dem Album fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} Foto · mit mir geteilt" +msgstr[1] "{n} Fotos · mit mir geteilt" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} Foto" +msgstr[1] "{n} Fotos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Zurück (Alt+Links)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Vor (Alt+Rechts)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "Neuer Ordner" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Dateien hochladen …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Ordner hochladen …" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "Neu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Raster" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "Liste" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Größe" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Zuletzt geändert" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Sortieren nach" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Umgekehrte Reihenfolge" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Ordner zuerst" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Als Liste anzeigen (Strg+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Sortier- und Ansichtsoptionen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "In Dateiverwaltung öffnen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Vorschaubilder erstellen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Ordneraktionen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Erstellen der Vorschaubilder abbrechen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Nur diesen Ordner durchsuchen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Offline verfügbar machen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Nur online verfügbar machen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Verschieben nach …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Auswahl aufheben (Esc)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Zoom:" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Größe: {n} Pixel" +msgstr[1] "Größe: {n} Pixel" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Speicherplatz des Proton-Kontos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "Meine Dateien" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "{n} ausgewählt" +msgstr[1] "{n} ausgewählt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "Verschieben in den Papierkorb fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "Proton Drive ist nicht verbunden." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "" +"{n} Element in den Papierkorb verschoben – einige konnten nicht verschoben " +"werden" +msgstr[1] "" +"{n} Elemente in den Papierkorb verschoben – einige konnten nicht verschoben " +"werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "„{name}“ in den Papierkorb verschoben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "{n} Element in den Papierkorb verschoben" +msgstr[1] "{n} Elemente in den Papierkorb verschoben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Rückgängig" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Aus dem Papierkorb wiederhergestellt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "{n} Element aus dem Papierkorb wiederhergestellt" +msgstr[1] "{n} Elemente aus dem Papierkorb wiederhergestellt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "Wiederherstellen aus dem Papierkorb fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "Offline-Status konnte nicht geändert werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} Datei ist jetzt offline verfügbar" +msgstr[1] "{n} Dateien sind jetzt offline verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} Datei ist jetzt nur online verfügbar" +msgstr[1] "{n} Dateien sind jetzt nur online verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Geändert" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Ort" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Öffnen mit …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Abspielen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Offline verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Teilen …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Link kopieren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Verschieben nach …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Versionen …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Details" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "Neuer Ordner …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Alles auswählen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "Datei konnte nicht geöffnet werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "Für „Öffnen mit“ muss der Proton-Drive-Ordner eingehängt sein." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Link kopiert" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "Link konnte nicht kopiert werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "Medium konnte nicht abgespielt werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "Der Dateipfad ist kein gültiges UTF-8." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "„{name}“ wird gestreamt …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "„{name}“ ist jetzt nur online verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "„{name}“ ist jetzt offline verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "Die Ansicht konnte nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Als Raster anzeigen (Strg+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "Der Ordner konnte nicht geöffnet werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "Vorschaubilder konnten nicht erstellt werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Erstellen der Vorschaubilder wird gestartet …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Erstellen der Vorschaubilder wird angehalten …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "Erstellen der Vorschaubilder konnte nicht abgebrochen werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Erstellen der Vorschaubilder angehalten" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "Der Einhängedienst meldet keinen Fortschritt der Vorschaubilder mehr." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} Ordner" +msgstr[1] "{n} Ordner" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} Bild" +msgstr[1] "{n} Bilder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "{root} wird durchsucht … {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Vorschaubilder in {root} werden erstellt … {done} von {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Vorschaubilder für {n} Bild in {root} bereit" +msgstr[1] "Vorschaubilder für {n} Bilder in {root} bereit" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "" +"Vorschaubilder für {n} Bild in {root} bereit; {failed} nicht verfügbar" +msgstr[1] "" +"Vorschaubilder für {n} Bilder in {root} bereit; {failed} nicht verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "Neuer Name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Umbenannt in „{name}“" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "Umbenennen fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "„{name}“ verschieben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "{n} Element verschieben" +msgstr[1] "{n} Elemente verschieben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Den Zielordner auswählen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Hierher verschieben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "Dieser Ordner konnte nicht gelesen werden." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "Hier gibt es keine Ordner." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "Verschieben fehlgeschlagen" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "„{name}“" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} Element nach {place} verschoben, aber nicht alle" +msgstr[1] "{n} Elemente nach {place} verschoben, aber nicht alle" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Nach {place} verschoben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} Element nach {place} verschoben" +msgstr[1] "{n} Elemente nach {place} verschoben" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Einen Ordner im aktuellen Verzeichnis erstellen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Ordnername" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "„{name}“ erstellt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "Ordner konnte nicht erstellt werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Dateien hochladen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Ordner hochladen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "Hochladen fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Wird hochgeladen …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "{n} Element wird hochgeladen …" +msgstr[1] "{n} Elemente werden hochgeladen …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "Anzeigen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Nach „{name}“ verschoben" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d. %b %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Dieser Ordner wird gelesen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Ordner nicht verfügbar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "Dieser Ordner konnte nicht geöffnet werden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "Dieser Ordner ist leer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Dateien hierher ziehen oder zum Einstieg eine Datei hochladen oder einen " +"Ordner erstellen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Überall suchen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Suche läuft …" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Suche nach „{query}“." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} – das erste Suchergebnis wird angezeigt" +msgstr[1] "{summary} – die ersten {n} Suchergebnisse werden angezeigt" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} – Suchergebnisse" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "Keine Treffer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "Keine Dateien oder Ordner entsprechen dieser Suche." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} Datei" +msgstr[1] "{n} Dateien" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "Dieser Computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "Der Computer, als der dieser Rechner gesichert wird." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Diesen Computer umbenennen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Andere Computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Andere Computer, die in diesem Konto gesichert werden." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Computer werden gelesen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Wird als „{name}“ gesichert." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Diesen Computer umbenennen ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "Keine anderen Computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "Desktop-Apps, die mit diesem Konto synchronisieren, erscheinen hier." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Auf diesem Computer wiederherstellen …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Identität dieses Computers verwenden …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Computer entfernen …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · zuletzt synchronisiert: {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · nie synchronisiert" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Synchronisierung öffnen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "Ordner und Einhängepunkt dieses Computers verwalten" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Ordner wiederherstellen …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "" +"Noch keine Ordner gesichert – auf der Seite „Synchronisierung“ einen " +"hinzufügen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} Ordner gesichert" +msgstr[1] "{n} Ordner gesichert" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · auf der Seite „Synchronisierung“ verwalten" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} erfordert Aufmerksamkeit" +msgstr[1] "{folders} · {n} erfordern Aufmerksamkeit" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "wird synchronisiert …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "Synchronisierungsfehler" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "erfordert Aufmerksamkeit" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "aktuell" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "wird auf Änderungen geprüft …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "wird auf Änderungen geprüft – {done} von {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "{done} von {total} wird synchronisiert" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "{file} wird synchronisiert – {done} von {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Ordner zur Synchronisierung hinzufügen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Ordner wird synchronisiert …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "Ordner konnte nicht hinzugefügt werden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "Wiederherstellbare Ordner konnten nicht aufgelistet werden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Die Ordner ankreuzen, die mit diesem Rechner synchronisiert werden sollen, " +"und für jeden den Speicherort anpassen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Ordner wiederherstellen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Wiederherstellen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Ordner werden wiederhergestellt …" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "Ordner konnten nicht wiederhergestellt werden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"Diese Ordner werden von „{name}“ gesichert. Wiederhergestellte Ordner werden " +"weiterhin mit der Kopie dieses Computers synchronisiert." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "Diese Ordner werden in Proton Drive unter diesem Computer gesichert." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" +"Nichts wiederherzustellen – alle Ordner von „{name}“ werden bereits hier " +"synchronisiert." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" +"Nichts wiederherzustellen – alle Ordner dieses Computers werden bereits hier " +"synchronisiert." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "Ordner wird auf Abruf umgestellt" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "Ordner wird heruntergeladen und bleibt synchronisiert" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "Modus konnte nicht geändert werden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"Synchronisierung von „{path}“ beenden?\n" +"\n" +"Dieser Ordner ist auf Abruf: Seine Dateien liegen in Proton Drive, nicht auf " +"diesem Datenträger, daher ist der Ordner nach dem Aushängen leer. Um eine " +"lokale Kopie zu behalten, abbrechen, „Auf Abruf“ ausschalten und vor dem " +"Entfernen warten, bis der Download abgeschlossen ist." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"Synchronisierung von „{path}“ beenden?\n" +"\n" +"Die lokalen Dateien bleiben auf diesem Datenträger und werden einfach nicht " +"mehr synchronisiert. Es kann zusätzlich ausgewählt werden, die Kopie in " +"Proton Drive zu löschen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Synchronisierung des Ordners beenden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Auch aus Proton Drive löschen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Löscht die einzige Kopie dieser Dateien." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "Die lokale Kopie bleibt unverändert." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Synchronisierung beenden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "Synchronisierung des Ordners beendet" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "Synchronisierung des Ordners konnte nicht beendet werden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Computer umbenennen" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "„{name}“ umbenennen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "Der Computer konnte nicht umbenannt werden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "Ein Name ist erforderlich." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Computer umbenannt" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Zur Bestätigung „{name}“ eingeben" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Computer entfernen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"„{name}“ aus diesem Konto entfernen?\n" +"\n" +"Alles, was dieser Computer in Proton Drive gesichert hat, wird ebenfalls " +"gelöscht. Die Dateien auf dem Computer selbst bleiben unberührt – dies kann " +"jedoch von hier aus nicht rückgängig gemacht werden." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Entfernen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Computer entfernt" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "Der Computer konnte nicht entfernt werden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Identität dieses Computers verwenden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"Diesen Rechner als „{name}“ behandeln?\n" +"\n" +"Neu synchronisierte Ordner werden in Proton Drive unter diesem Computer " +"angelegt, und dieser Rechner behält die Identität auch, wenn sich sein " +"Hostname ändert. Bereits hier synchronisierte Ordner werden nicht " +"verschoben.\n" +"\n" +"Anschließend mit „Ordner wiederherstellen“ zurückholen, was „{name}“ " +"synchronisiert hat." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Identität verwenden" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Identität übernommen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "Der Computer konnte nicht übernommen werden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Ordner hinzufügen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "Einen lokalen Ordner im Proton-Drive-Gerät dieses Computers sichern" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Konflikte" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"Dateien wurden gleichzeitig an zwei Stellen geändert. Beide Versionen wurden " +"behalten; bitte auswählen, welche bleiben soll." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "Auf diesem Computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"Der Ort von Proton Drive auf diesem Rechner. Synchronisierte Ordner behalten " +"eine vollständige Kopie auf diesem Datenträger; Ordner auf Abruf behalten " +"die Dateien nur in Proton Drive und laden sie beim Öffnen herunter." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Synchronisierung" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "Für 1 Stunde pausieren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "Für 8 Stunden pausieren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "Für 24 Stunden pausieren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Pausieren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" +"Hochladen bis zur Fortsetzung anhalten. Dateien lassen sich weiterhin wie " +"gewohnt öffnen." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Eine Weile pausieren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Wird geprüft …" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Fortsetzen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "" +"Alles hochladen, was während der pausierten Synchronisierung gewartet hat" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "Synchronisierung konnte nicht pausiert werden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "Synchronisierung konnte nicht fortgesetzt werden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Synchronisierung fortgesetzt" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Synchronisierung bis zur Fortsetzung pausiert" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Synchronisierung pausiert" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Alle erneut versuchen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Alle fehlgeschlagenen Änderungen jetzt erneut versuchen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "Warten auf Hochladen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "" +"Auf diesem Computer vorgenommene Änderungen, die noch nicht in Proton Drive " +"sind." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Auf diesem Computer vorgenommene Änderungen, die noch nicht in Proton Drive " +"sind. Die ersten {shown} von {n} werden angezeigt." +msgstr[1] "" +"Auf diesem Computer vorgenommene Änderungen, die noch nicht in Proton Drive " +"sind. Die ersten {shown} von {n} werden angezeigt." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Änderungen hochladen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Neue Datei hochladen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Ordner erstellen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Umbenennen oder verschieben" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "In den Papierkorb verschieben" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Änderung" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "wartet, bis die schreibende Anwendung fertig ist" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "erneuter Versuch {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "wartet auf Fortsetzung der Synchronisierung" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "als Nächstes" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "{n}-mal fehlgeschlagen: {error}" +msgstr[1] "{n}-mal fehlgeschlagen: {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Jetzt erneut versuchen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Wird erneut versucht …" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "Erneuter Versuch fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, geändert {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "Das Original ist weg; nur diese Kopie ist übrig" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Gleicher Inhalt wie das Original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Unterscheidet sich von {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"„{name}“ wurde hier und an anderer Stelle gleichzeitig geändert.\n" +"\n" +"Original: {original}\n" +"Kopie: {copy}\n" +"\n" +"Was nicht behalten wird, kommt in den Papierkorb und kann dort " +"wiederhergestellt werden." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"Das Original „{name}“ existiert nicht mehr; nur die Kopie ist übrig " +"({copy}).\n" +"\n" +"Die Kopie behalten, um ihr den ursprünglichen Namen zurückzugeben." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Konflikt lösen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Name für die Kopie, falls beide behalten werden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Original behalten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Beide behalten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Kopie behalten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "Der Konflikt konnte nicht gelöst werden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "Proton-Drive-Orte dieses Computers werden gelesen." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "Nicht verfügbar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "Keine Orte" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "Der Einhängedienst hat noch keinen Einhängepunkt gemeldet." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Schreibgeschützt" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Diesen Ordner öffnen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Ändern" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Einen anderen Ordner als Einhängepunkt für Proton Drive auswählen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Synchronisierung dieses Ordners fortsetzen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Synchronisierung dieses Ordners pausieren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Diesen Ordner jetzt synchronisieren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"Auf Abruf: Platz auf diesem Datenträger freigeben, indem die Dateien nur in " +"Proton Drive bleiben und jede beim Öffnen heruntergeladen wird. Ausschalten, " +"um sie wieder herunterzuladen und eine vollständige lokale Kopie zu behalten." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Synchronisierung dieses Ordners beenden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "Ordner auf Abruf umstellen?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"Dateien in {path} werden von diesem Computer entfernt und nur in Proton " +"Drive behalten. Jede Datei wird beim Öffnen erneut heruntergeladen." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Auf Abruf umstellen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "Der Ordner konnte nicht pausiert werden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "Der Ordner konnte nicht fortgesetzt werden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Ordner pausiert" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Ordner fortgesetzt" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "Synchronisieren fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Geteilter Ordner" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Wird auf Abruf umgestellt" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Wird auf synchronisiert umgestellt" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "Auf Abruf" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Synchronisiert" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "pausiert" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "nicht eingehängt" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Bei Proton anmelden" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Mit dem Proton-Konto Drive verbinden." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "E-Mail oder Benutzername" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Passwort" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Anmelden" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Konto erstellen" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "Passwort vergessen?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "E-Mail-Adresse und Passwort eingeben." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Anmeldung läuft …" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Zum Fortfahren die Überprüfung abschließen …" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "Anmeldung abgebrochen" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "Zu viele Anmeldeversuche. Einige Minuten warten und erneut versuchen." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" +"Proton ist nicht erreichbar. Bitte die Internetverbindung prüfen und erneut " +"versuchen." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Angemeldet, aber die Sitzung konnte nicht im Schlüsselbund des Systems " +"gespeichert werden. Bitte sicherstellen, dass ein Schlüsselbund (GNOME " +"Keyring oder KWallet) läuft und entsperrt ist." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "Anmeldung abgebrochen: Es wurde kein Zwei-Faktor-Code eingegeben." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Anmeldung abgebrochen: Die Überprüfung wurde nicht abgeschlossen. Für eine " +"neue Überprüfung erneut anmelden." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Anmeldung fehlgeschlagen: {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Zwei-Faktor-Authentifizierung" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" +"Den Code aus der Authentifizierungs-App oder einen der " +"Wiederherstellungscodes eingeben." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Authentifizierungscode" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Bestätigen" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "Abmelden?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"Proton Drive trennt die Verbindung und synchronisiert nicht mehr bis zur " +"nächsten Anmeldung. Dateien, die sich bereits auf diesem Computer befinden, " +"bleiben, wo sie sind." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "{name} anzeigen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "RAW-Datei anzeigen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "Video anzeigen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "Foto anzeigen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "Dieses Foto konnte nicht dargestellt werden." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +msgid "Couldn't reach Proton Drive." +msgstr "Proton Drive ist nicht erreichbar." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:345 +msgid "Reading photo details…" +msgstr "Fotodetails werden gelesen …" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Größe" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "Dieses Foto enthält keine Metadaten." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Abmessungen" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Aufgenommen" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Kamera" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Objektiv" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Belichtung" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Ort" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Kopie speichern" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "„{name}“ gespeichert" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "Die Kopie konnte nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "Das Kopieren wurde unterbrochen." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} von {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} von {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Zurück (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Weiter (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Als Favorit markieren" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Andere Dateien dieses Fotos" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Kopie speichern …" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "In den Papierkorb verschieben (Entf)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Schließen (Esc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Auf Karte anzeigen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Details ausblenden" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "Favorit konnte nicht geändert werden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Fotos hochladen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Zu einem Monat springen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Zurück zu den Alben" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Hochladen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Einen Google-Photos-Takeout-Export importieren" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Fotos auswählen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Zum Album hinzufügen …" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Auswahl verlassen (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Nur Favoriten anzeigen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "Alle Zeiträume" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Zeitleiste" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Alben" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Import aus Google Photos läuft …" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Foto zum Hochladen auswählen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Bilder" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Foto hochgeladen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "Foto konnte nicht hochgeladen werden" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "Dieses Foto in den Papierkorb verschieben?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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] "" +"Dieses Foto in den Papierkorb verschieben? Es ist als {n} Datei gespeichert." +msgstr[1] "" +"Dieses Foto in den Papierkorb verschieben? Es ist als {n} Dateien " +"gespeichert." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1551 +#, 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:1558 +#, 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] "" +"{n} Foto in den Papierkorb verschieben? Es ist als {files} Dateien " +"gespeichert." +msgstr[1] "" +"{n} Fotos in den Papierkorb verschieben? Sie sind als {files} Dateien " +"gespeichert." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1616 +msgid "The server refused." +msgstr "Der Server hat abgelehnt." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "{n} Foto in den Papierkorb verschoben" +msgstr[1] "{n} Fotos in den Papierkorb verschoben" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%d.%m.%Y %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Unbekanntes Datum" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Favorit" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Auswählen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Aus Album entfernen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "In den Papierkorb verschieben …" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Zu Favoriten hinzugefügt" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Aus Favoriten entfernt" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Fotos werden geladen …" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Proton-Drive-Zeitleiste wird gelesen." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Leeres Album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "Dieses Album enthält keine Fotos." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "Weitere Fotos konnten nicht geladen werden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "Fotos konnten nicht geladen werden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "" +"Lesezeichen hinzufügen – einen öffentlichen Link speichern, um ihn von hier " +"aus zu öffnen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Einladungen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Annehmen, um das Element zu den geteilten Dateien hinzuzufügen." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Lesezeichen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Zurück" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Mit mir geteilt" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Geteilte Elemente werden gelesen." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Dieser geteilte Ordner wird gelesen." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "Geteilter Ordner konnte nicht geöffnet werden" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Einladungen ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "Dieser Ordner ist leer." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "In „Meine Dateien“ anzeigen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Verlassen …" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"Die Signatur der Einladung passt nicht zu den Schlüsseln des Absenders. Sie " +"stammt möglicherweise nicht wirklich von dieser Person." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Betrachter" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Bearbeiter" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Administrator" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Kann ansehen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Kann bearbeiten" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Kann verwalten" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "„{name}“ wird heruntergeladen …" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "Nichts mit mir geteilt" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"Dateien und Ordner, die andere Personen teilen, erscheinen hier. Als " +"Lesezeichen gespeicherte öffentliche Links werden ebenfalls hier aufbewahrt." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Mit mir geteilt" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "ein geteiltes Element" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "Von {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Ablehnen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Annehmen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "dieses Element" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "Einladung ablehnen?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "Ohne erneute Freigabe besteht kein Zugriff mehr auf {name}." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Geteilter Link" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Lesezeichen entfernen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Im Browser öffnen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Einladung angenommen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "Die Einladung konnte nicht angenommen werden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Einladung abgelehnt" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "Die Einladung konnte nicht abgelehnt werden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Geteiltes Element verlassen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "" +"„{name}“ verlassen? Der Zugriff geht verloren, bis eine erneute Einladung " +"erfolgt." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Verlassen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Geteiltes Element verlassen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "Das geteilte Element konnte nicht verlassen werden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "Lesezeichen für „{name}“ entfernen?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Lesezeichen entfernt" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "Das Lesezeichen konnte nicht entfernt werden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Lesezeichen hinzufügen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "" +"Einen öffentlichen Proton-Drive-Link einfügen, um ihn hier zu speichern." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "URL des öffentlichen Links" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Passwort (falls der Link eines hat)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Hinzufügen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "Lesezeichen konnte nicht hinzugefügt werden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "Eine URL ist erforderlich." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Lesezeichen gespeichert" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "Das Lesezeichen konnte nicht hinzugefügt werden" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Von mir geteilt" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Eigene Freigaben werden gelesen." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "Die eigenen Freigaben konnten nicht gelesen werden" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Noch nichts geteilt" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "" +"Elemente, die mit Personen oder per Link geteilt werden, erscheinen hier." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Link kopieren" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Link öffnen" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Zugriff verwalten …" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Freigabe beenden …" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "Freigabe beenden?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Alle eingeladenen Personen verlieren den Zugriff auf „{name}“, ausstehende " +"Einladungen werden zurückgezogen und der öffentliche Link funktioniert nicht " +"mehr." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Freigabe beenden" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "Freigabe von {name} beendet" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "Freigabe konnte nicht beendet werden" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} Person" +msgstr[1] "{n} Personen" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "{n} ausstehend" +msgstr[1] "{n} ausstehend" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Öffentlicher Link" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Geteilt" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Systemstart" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Bei Anmeldung starten" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Proton Drive bei der Anmeldung automatisch verbinden" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Proton-Drive-Ordner" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Ändern …" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Netzwerk" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" +"Übertragungsgeschwindigkeit begrenzen, gemeinsam für alle Übertragungen. 0 " +"bedeutet keine Begrenzung." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Upload-Begrenzung (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Download-Begrenzung (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Erscheinungsbild" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Proton-Lila als Akzentfarbe" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "Die Proton-Markenfarbe statt der Akzentfarbe des Systems verwenden" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Symbol im Benachrichtigungsfeld anzeigen" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "Synchronisierungsstatus und Schnellaktionen im Panel" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Zwischenspeicher" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "" +"Angeheftete und kürzlich geöffnete Dateien, die auf diesem Computer " +"aufbewahrt werden." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Größenbegrenzung des Zwischenspeichers (GiB)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" +"Ältere Dateien werden oberhalb dieser Größe entfernt; 0 bedeutet keine " +"Begrenzung" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Zwischenspeicher leeren" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "" +"Zwischengespeicherte Kopien entfernen. Offline verfügbare Dateien bleiben " +"erhalten." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Leeren …" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "" +"Dateien, die auf diesem Computer aufbewahrt werden, auch ohne Verbindung." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Speicherplatz" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Synchronisierungsstatus anzeigen" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Abmelden …" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Konto" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "Systemstandard" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Sprache" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Wird beim nächsten Start von Proton Drive wirksam" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Übertragungen" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "Dateien, die zu und von Proton Drive übertragen werden." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Zwischenspeicher-Budget aktualisiert" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "Zwischenspeicher-Budget konnte nicht festgelegt werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Bandbreitenbegrenzungen aktualisiert" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "Bandbreitenbegrenzungen konnten nicht festgelegt werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "Zwischenspeicher leeren?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"Zwischengespeicherte Kopien werden von diesem Computer entfernt und beim " +"Öffnen erneut heruntergeladen. Offline verfügbare Dateien bleiben erhalten." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Zwischenspeicher leeren" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Zwischenspeicher geleert" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "Der Zwischenspeicher konnte nicht geleert werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "Die Akzentfarbe konnte nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "" +"Die Einstellung für das Benachrichtigungsfeld konnte nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "Die Sprache konnte nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Proton Drive neu starten, um die neue Sprache zu verwenden" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Ordner für den Einhängepunkt auswählen" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "Einhängepunkt konnte nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Zum Anwenden neu starten" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" +"Der Einhängepunkt ist jetzt „{path}“. Den Drive-Einhängedienst neu starten, " +"um ihn zu verwenden?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Später" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Jetzt neu starten" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "{size} belegt" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "{used} von {total} belegt ({percent} %)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "{size} frei" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "{free} von {total} frei ({percent} % belegt)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Proton Drive verbunden" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Das Drive ist eingehängt und verfügbar." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Proton Drive getrennt" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" +"Der Einhängedienst wurde beendet. Dateien sind erst nach seinem Neustart " +"wieder verfügbar." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Synchronisierung abgeschlossen" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "Übertragung von {n} Datei abgeschlossen." +msgstr[1] "Übertragung von {n} Dateien abgeschlossen." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title} – {done} von {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title} – {detail} ({done} von {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title} …" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title} – {detail} …" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name} – {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name} – {done} von {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · wird {time} fortgesetzt" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Wird {time} fortgesetzt" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Bis zur manuellen Fortsetzung" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} Änderung erfordert Aufmerksamkeit" +msgstr[1] "{n} Änderungen erfordern Aufmerksamkeit" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Nur zwischengespeicherte Dateien" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Wird synchronisiert" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "Auf dem neuesten Stand" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "Proton Drive läuft nicht" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "später" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "um %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "am %a um %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "am %-d. %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "Keine offline verfügbaren Dateien" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "" +"Mit einem Rechtsklick auf eine Datei „Offline verfügbar machen“ auswählen." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "Konnte nicht auf „nur online“ umgestellt werden" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Weniger anzeigen" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "{n} Datei anzeigen" +msgstr[1] "Alle {n} Dateien anzeigen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Fotos, die bereits in Proton Photos vorhanden sind, werden anhand von Name " +"und Inhalt erkannt und übersprungen. Ein unterbrochener Import kann daher " +"gefahrlos erneut gestartet werden." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Zurück zu den Fotos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "Einen Google-Takeout-Export zur Proton-Photos-Zeitleiste hinzufügen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Takeout-.zip-Dateien hierher ziehen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Alle Teile des Exports auf einmal hinzufügen – ein Foto und seine Metadaten " +"liegen oft in verschiedenen Teilen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Dateien auswählen …" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Zu importierende Archive" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Leeren" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Alle vorgemerkten Archive entfernen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Prüfen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" +"Die Archive prüfen und melden, was importiert würde, ohne etwas hochzuladen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Importieren" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Import anhalten" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "" +"Das aktuell übertragene Foto fertigstellen, das Hochgeladene einsortieren " +"und dann anhalten" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Import läuft" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Letzter Import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Google-Takeout-Archive auswählen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Takeout-Archive" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "Diesen Export importieren?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"{n} Archiv wird zu Proton Photos hochgeladen, wobei Alben wie im Export " +"angelegt werden. Dies kann Stunden dauern; der Import kann jederzeit " +"angehalten werden, und bereits Hochgeladenes bleibt erhalten. Bereits " +"vorhandene Fotos werden übersprungen." +msgstr[1] "" +"{n} Archive werden zu Proton Photos hochgeladen, wobei Alben wie im Export " +"angelegt werden. Dies kann Stunden dauern; der Import kann jederzeit " +"angehalten werden, und bereits Hochgeladenes bleibt erhalten. Bereits " +"vorhandene Fotos werden übersprungen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Import wird angehalten …" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "Der Import konnte nicht angehalten werden" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Nur Takeout-.zip-Dateien können importiert werden – entpackte Ordner werden " +"nicht unterstützt." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "{n} Archiv hinzugefügt" +msgstr[1] "{n} Archive hinzugefügt" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "Noch keine Archive hinzugefügt." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Aus diesem Import entfernen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} Archiv, insgesamt {size}. {note}" +msgstr[1] "{n} Archive, insgesamt {size}. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Archive werden gelesen …" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Import wird gestartet …" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Export wird geprüft …" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "" +"Import gestartet – diese Seite kann verlassen werden, der Import läuft " +"weiter." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "Der Import konnte nicht gestartet werden" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Prüfung abgeschlossen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Import abgeschlossen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "{n} Foto hinzugefügt, {failed} fehlgeschlagen." +msgstr[1] "{n} Fotos hinzugefügt, {failed} fehlgeschlagen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Nach {n} Foto angehalten." +msgstr[1] "Nach {n} Fotos angehalten." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "{n} Foto zu Proton Photos hinzugefügt." +msgstr[1] "{n} Fotos zu Proton Photos hinzugefügt." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "Der Import aus Google Photos ist abgeschlossen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Prüfergebnis" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "Es wurde nichts hochgeladen – so würde ein Import aussehen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Vorzeitig angehalten. Alles bisher Hochgeladene ist in der Zeitleiste; " +"einfach erneut starten, um dort fortzufahren, wo aufgehört wurde." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Abgeschlossen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Fotos im Export" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "Würden hochgeladen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Hochgeladen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Bereits in Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Zu erstellende Alben" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Erstellte Alben" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "In Alben einsortierte Fotos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Übersprungen (im Google-Papierkorb)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Hochzuladende Daten" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Hochgeladene Daten" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} von {total} – {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Wird bearbeitet …" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Papierkorb leeren …" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Alles im Papierkorb endgültig löschen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Wiederherstellen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Endgültig löschen …" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Im ursprünglichen Ordner wiederherstellen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Endgültig löschen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Ordner" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "{n} Element ausgewählt" +msgstr[1] "{n} Elemente ausgewählt" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "Der Papierkorb wird gelesen." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "Der Papierkorb konnte nicht gelesen werden" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "Der Papierkorb ist leer" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Aus Proton Drive gelöschte Elemente erscheinen hier." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} Element" +msgstr[1] "{n} Elemente" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "„{name}“ wiederhergestellt" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "{n} Element wiederhergestellt" +msgstr[1] "{n} Elemente wiederhergestellt" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "Wiederherstellen fehlgeschlagen" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "„{name}“ endgültig löschen? Dies kann nicht rückgängig gemacht werden." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "„{name}“ endgültig gelöscht" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "" +"{n} Element endgültig löschen? Dies kann nicht rückgängig gemacht werden." +msgstr[1] "" +"{n} Elemente endgültig löschen? Dies kann nicht rückgängig gemacht werden." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "{n} Element endgültig gelöscht" +msgstr[1] "{n} Elemente endgültig gelöscht" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Endgültig löschen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "Löschen fehlgeschlagen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Papierkorb leeren" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +"{n} Element im Papierkorb endgültig löschen? Dies kann nicht rückgängig " +"gemacht werden." +msgstr[1] "" +"Alle {n} Elemente im Papierkorb endgültig löschen? Dies kann nicht " +"rückgängig gemacht werden." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Papierkorb geleert" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "Der Papierkorb konnte nicht geleert werden" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Überprüfung" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Details (Alt+Eingabe)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Details schließen" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Info" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "Eine Kopie auf diesem Computer behalten, auch ohne Verbindung." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Freigabe" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Zugriff" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Versionen" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "Verlauf" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "Kein Element ausgewählt" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Eine Datei oder einen Ordner auswählen, um die Details anzuzeigen." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "Datei" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Ordner öffnen" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "Freigaben konnten nicht geladen werden" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "Versionen konnten nicht geladen werden" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Nur ich" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Alle mit dem Link" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Mit {n} Person geteilt" +msgstr[1] "Mit {n} Personen geteilt" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Mit {n} Person geteilt · Öffentlicher Link" +msgstr[1] "Mit {n} Personen geteilt · Öffentlicher Link" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "Keine früheren Versionen" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 Version · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} Version · neueste {date}" +msgstr[1] "{n} Versionen · neueste {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "Mehr" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Nie" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 Tag" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 Tage" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 Tage" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "Teilen nicht möglich" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Teilen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Personen einladen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "" +"Proton- und andere E-Mail-Adressen, durch Leerzeichen oder Kommas getrennt." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "E-Mail-Adressen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Rolle" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Nachricht (optional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Einladungen senden" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "Personen mit Zugriff" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "„{text}“ ist keine E-Mail-Adresse" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Einladungen gesendet" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "Einladungen konnten nicht gesendet werden" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "Noch hat niemand sonst Zugriff." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Mitglied" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Eingeladen (ausstehend)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Eingeladen (extern, ausstehend)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Rolle aktualisiert" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "Die Rolle konnte nicht aktualisiert werden" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Zugriff entfernen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "Zugriff entfernen?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} kann dieses Element nicht mehr öffnen." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Zugriff entfernt" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "Zugriff konnte nicht entfernt werden" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Alle mit dem Link ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "passwortgeschützt" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Link entfernen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "Öffentlichen Link entfernen?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"Der Link funktioniert für niemanden mehr, der ihn hat. Ein neuer Link erhält " +"eine andere Adresse." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Link entfernen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Öffentlicher Link entfernt" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "Der Link konnte nicht entfernt werden" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Rolle des Links" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Passwort (optional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Läuft ab" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Öffentlichen Link erstellen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Öffentlicher Link erstellt" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "Der Link konnte nicht erstellt werden" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "abgelaufen" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "läuft ab am {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "Versionen können nicht geladen werden" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "Keine Versionen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Ordner haben keine Versionen." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Versionsverlauf" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" +"Proton Drive behält frühere Versionen einer Datei, bis sie gelöscht werden." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "Keine früheren Versionen." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Aktuelle Version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Kopie speichern …" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Diese Version wiederherstellen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Diese Version endgültig löschen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Version wiederherstellen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"Diese Version zum aktuellen Inhalt von „{name}“ machen? Die ersetzte Version " +"bleibt im Verlauf." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Version wird wiederhergestellt" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "Diese Version konnte nicht wiederhergestellt werden" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Version löschen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "" +"Diese Version endgültig löschen? Ihr Inhalt kann nicht wiederhergestellt " +"werden." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Löschen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Version gelöscht" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "Diese Version konnte nicht gelöscht werden" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Version speichern" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "Diese Version konnte nicht gespeichert werden" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "Dieser Ort ist keine lokale Datei." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Version gespeichert" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive: {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Drive durchsuchen › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(keine Treffer für „{query}“)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(keine angehefteten Elemente – zum Suchen tippen)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(Anwendungsverzeichnisse nicht ermittelbar)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} Upload in der Warteschlange" +msgstr[1] "{n} Uploads in der Warteschlange" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} Änderung in der Warteschlange" +msgstr[1] "{n} Änderungen in der Warteschlange" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} Upload" +msgstr[1] "{n} Uploads" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} Änderung" +msgstr[1] "{n} Änderungen" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "{uploads}, {changes} in der Warteschlange" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} Datei in {dir}" +msgstr[1] "{n} Dateien in {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} von {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ {n} wird heruntergeladen" +msgstr[1] "↓ {n} werden heruntergeladen" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ {n} wird hochgeladen" +msgstr[1] "↑ {n} werden hochgeladen" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Eingehängt unter {mountpoint} ({n} angeheftet)" +msgstr[1] "Eingehängt unter {mountpoint} ({n} angeheftet)" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Wird synchronisiert – {queued} ({n} angeheftet)" +msgstr[1] "Wird synchronisiert – {queued} ({n} angeheftet)" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)" +msgstr[1] "Offline – nur zwischengespeicherte Dateien ({n} angeheftet)" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Offline – {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Einhängen: unerwartete Antwort des Hintergrunddienstes" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Angemeldet als {username} – nicht eingehängt" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Nicht angemeldet" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Fehler: {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} Problem – Anzeigen" +msgstr[1] "{n} Probleme – Anzeigen" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Anmelden …" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Proton Drive öffnen" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Ordner öffnen" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Synchronisierung fortsetzen" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Synchronisierung pausieren" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Verbinden" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Symbol im Benachrichtigungsfeld ausblenden" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Proton Drive beenden …" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Beenden" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "Alle" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Ordner" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "Dokumente" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Medien" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "Meine Dateien / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Proton Drive durchsuchen" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "In Drive und auf diesem Computer suchen" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Esc" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Beste Treffer" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "Keine Ergebnisse" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "Proton Drive läuft nicht" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "Den Einhängedienst starten, um das Drive zu durchsuchen." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ Navigieren · ↵ Öffnen · Tab Filter" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Hintergrunddienst offline" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "In Proton Drive angeheftet" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Das Drive durchsuchen" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "" +"Dieser Computer wird noch indiziert – lokale Ergebnisse erscheinen in Kürze." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Eine andere Suche oder einen anderen Filter versuchen." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" +"Mit dem Tippen beginnen, um Proton Drive und die Dateien auf diesem Computer " +"zu durchsuchen." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "Keine angehefteten Dateien" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} angeheftete Datei" +msgstr[1] "{n} angeheftete Dateien" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} in Drive · {local} auf diesem Computer · wird indiziert …" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} in Drive · {local} auf diesem Computer" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "{name} wird geöffnet …" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "Öffnen fehlgeschlagen: {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "Der Hintergrunddienst ist nicht erreichbar" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Persönlicher Ordner" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Persönlicher Ordner / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} GB" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} MB" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} kB" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} B" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "jetzt" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count} Min." + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count} Std." + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count} T." + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count} Mon." + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count} J." + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "Proton-Drive-Hintergrunddienst nicht erreichbar: {error}" diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..40df2ac --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,4626 @@ +# English (United Kingdom) translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: English (United Kingdom)\n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "My files" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Photos" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Shared with me" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Shared by me" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Computers" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Trash" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Sync" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Activity" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Refresh (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what}: {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "You're offline" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "That's not there any more" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "You don't have access to that" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "Something changed this first" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Your Proton Drive is full" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Preferences" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Keyboard Shortcuts" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "About Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Main menu" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Proton Drive for Linux contributors" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "Stop Proton Drive?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Cancel" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Stop" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "Couldn't stop Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "The mount service did not stop." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "General" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Search Drive" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Refresh" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Keyboard shortcuts" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "Files" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "New folder" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Upload files" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Back / forward" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Parent folder" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Grid / list" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Rename" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "Move to Trash" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Clear the selection" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Larger thumbnails" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Smaller thumbnails" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Reset thumbnail size" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Select all" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Photo Viewer" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Previous / next photo" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "First / last photo" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Show details" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Fullscreen" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Close" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Select a single item to rename it" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "All" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Transfers" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Changes" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Sharing" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Problems" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Needs attention" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Retry" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Loading…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Reading recent activity." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "Couldn't read activity" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Unexpected reply from the mount service." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Not connected" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "The Proton Drive mount service isn't running." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Connecting…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "Waiting for the Proton Drive mount service to come up." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Today" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Yesterday" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A %-d %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d %B %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Nothing yet" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "Uploads, moves, shares and other changes appear here as they happen." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"A file was changed in two places at once. Choose which version to keep." +msgstr[1] "" +"{n} files were changed in two places at once. Choose which versions to keep." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "No matching activity" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Nothing in the recent log fits this filter." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n} time since {time}" +msgstr[1] "{n} times since {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Resolved" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Resolve…" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "Uploaded {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "Downloaded {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "Synced {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "Renamed {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "Moved {name}" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Created folder {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "Trashed {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "Restored {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "Deleted {name}" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Emptied Trash ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "Shared {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Created a link to {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "Unshared {name}" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Conflict {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Loading albums…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Reading your Proton Drive albums." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "No photo library" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "This Proton account doesn't have Photos enabled." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "No albums" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Create one with New Album, or in Proton Photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "Couldn't load albums" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "The Proton Drive mount service didn't respond." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} album" +msgstr[1] "{n} albums" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Open" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Rename…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Delete Album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Album name" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Create" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "New Album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Album created" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "Couldn't create the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "The mount service didn't respond." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Rename Album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Album renamed" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "Couldn't rename the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "Delete Album?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "“{name}” is deleted. Its photos stay in your timeline." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Delete" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Album deleted" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "Couldn't delete the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Add to Album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Choose an album for this photo." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +msgstr[0] "Choose an album for {n} photo." +msgstr[1] "Choose an album for {n} photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "New Album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "Some photos couldn't be added" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "Added {n} photo to the album" +msgstr[1] "Added {n} photos to the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "Couldn't add to the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "Some photos couldn't be removed from the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "Removed {n} photo from the album" +msgstr[1] "Removed {n} photos from the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "Couldn't remove from the album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} photo · shared with me" +msgstr[1] "{n} photos · shared with me" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} photo" +msgstr[1] "{n} photos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Back (Alt+Left)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Forward (Alt+Right)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "New Folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Upload Files…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Upload Folder…" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "New" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Grid" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "List" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Size" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Last Modified" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Sort By" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Reversed Order" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Folders First" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Show as list (Ctrl+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Sort and view options" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "Open in File Manager" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Build Thumbnails" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Folder actions" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Cancel thumbnail build" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Search this folder only" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Make available offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Make online only" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Move to…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Clear selection (Esc)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Zoom:" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Size: {n} pixel" +msgstr[1] "Size: {n} pixels" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Proton account storage" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "My Files" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "{n} selected" +msgstr[1] "{n} selected" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "Couldn't move to Trash" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "Proton Drive isn't connected." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "Moved {n} item to Trash — some couldn't be moved" +msgstr[1] "Moved {n} items to Trash — some couldn't be moved" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "Moved “{name}” to Trash" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "Moved {n} item to Trash" +msgstr[1] "Moved {n} items to Trash" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Undo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Restored from Trash" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "Restored {n} item from Trash" +msgstr[1] "Restored {n} items from Trash" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "Couldn't restore from Trash" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "Couldn't change offline state" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} file is now available offline" +msgstr[1] "{n} files are now available offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} file is now online only" +msgstr[1] "{n} files are now online only" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Modified" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Location" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Open With…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Play" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Available offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Share…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Copy Link" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Move To…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Versions…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Details" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "New Folder…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Select All" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "Couldn't open file" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "Open With needs the Proton Drive folder to be mounted." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Link copied" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "Couldn't copy link" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "Couldn't play media" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "The file path isn't valid UTF-8." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "Streaming “{name}”…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "“{name}” is now online only" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "“{name}” is now available offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "Couldn't save the view" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Show as grid (Ctrl+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "Couldn't open the folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "Couldn't build thumbnails" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Starting thumbnail build…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Stopping thumbnail build…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "Couldn't cancel thumbnail build" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Thumbnail build stopped" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "The mount service stopped reporting thumbnail progress." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} folder" +msgstr[1] "{n} folders" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} image" +msgstr[1] "{n} images" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Scanning {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Building thumbnails in {root}… {done} of {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Thumbnails ready for {n} image in {root}" +msgstr[1] "Thumbnails ready for {n} images in {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgstr[1] "Thumbnails ready for {n} images in {root}; {failed} unavailable" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "New name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renamed to “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "Couldn't rename" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "Move “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Move {n} item" +msgstr[1] "Move {n} items" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Choose the folder to move into." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Move Here" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "Couldn't read this folder." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "No folders here." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "Couldn't move" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "Moved {n} item to {place}, but not all" +msgstr[1] "Moved {n} items to {place}, but not all" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Moved to {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "Moved {n} item to {place}" +msgstr[1] "Moved {n} items to {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Create a folder in the current directory." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Folder name" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "Created “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "Couldn't create folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Upload Files" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Upload Folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "Couldn't upload" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Uploading…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Uploading {n} item…" +msgstr[1] "Uploading {n} items…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "View" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Moved into “{name}”" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d %b %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Reading this folder." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Folder unavailable" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "Couldn't open this folder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "This folder is empty" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "Drop files here, or upload a file or create a folder to get started." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Search everywhere" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Searching…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Looking for “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — showing the first {n} search result" +msgstr[1] "{summary} — showing the first {n} search results" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — search results" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "No matches" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "No files or folders match that search." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} file" +msgstr[1] "{n} files" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "This computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "The computer this machine backs up as." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Rename this computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Other computers" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Other computers backing up to this account." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Reading your computers." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Backing up as “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Rename this computer ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "No other computers" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "Desktop apps syncing to this account appear here." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Restore to This Computer…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Use This Computer's Identity…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Remove Computer…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · last synced {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · never synced" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Open Sync" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "Manage this computer's folders and mountpoint" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Restore Folders…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "No folders backed up yet — add one on the Sync page." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} folder backed up" +msgstr[1] "{n} folders backed up" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · manage them on the Sync page" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} needs attention" +msgstr[1] "{folders} · {n} need attention" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "syncing…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "sync error" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "needs attention" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "up to date" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "checking for changes…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "checking for changes — {done} of {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "syncing {done} of {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "syncing {file} — {done} of {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Add Folder to Sync" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Syncing folder…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "Couldn't add folder" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "Couldn't list folders to restore" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Restore folders" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Restore" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Restoring folders…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "Couldn't restore folders" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "These folders are backed up under this computer in Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "Nothing to restore — “{name}”'s folders are all synced here." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "Nothing to restore — this computer's folders are all synced here." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "Folder will switch to on-demand" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "Folder will download and stay synced" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "Couldn't change mode" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Stop syncing folder" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Also delete from Proton Drive" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Deletes the only copy of these files." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "The local copy is unaffected." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Stop Syncing" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "Stopped syncing folder" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "Couldn't stop syncing the folder" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Rename Computer" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "Rename “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "Couldn't rename the computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "A name is required." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Computer renamed" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Type “{name}” to confirm" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Remove Computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Remove" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Computer removed" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "Couldn't remove the computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Use this computer's identity" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Use identity" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Identity adopted" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "Couldn't adopt that computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Add Folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "Back a local folder up to this computer's Proton Drive device" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Conflicts" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "On this computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Sync" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "Pause for 1 Hour" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "Pause for 8 Hours" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "Pause for 24 Hours" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Pause" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "Stop uploading until you resume. Files still open as usual." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Pause for a while" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Checking…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Resume" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "Upload everything that waited while sync was paused" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "Couldn't pause sync" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "Couldn't resume sync" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Sync resumed" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Sync paused until you resume" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Sync paused" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Retry All" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Try every failed change again now" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "Waiting to Upload" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "Changes made on this computer that are not on Proton Drive yet." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[1] "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Upload changes" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Upload new file" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Create folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Rename or move" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "Move to trash" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Change" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "waiting for the app writing it to finish" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "retrying {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "waiting for sync to resume" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "up next" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "Failed {n} time: {error}" +msgstr[1] "Failed {n} times: {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Retry now" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Retrying now…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "Couldn't retry" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, changed {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "The original is gone; only this copy is left" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Same content as the original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Differs from {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Resolve conflict" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Name for the copy, if keeping both" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Keep Original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Keep Both" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Keep Copy" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "Couldn't resolve the conflict" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "Reading this computer's Proton Drive locations." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "Unavailable" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "No locations" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "The mount service hasn't reported a mountpoint yet." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Read-only" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Open this folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Change" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Choose a different folder for the Proton Drive mount" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Resume syncing this folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Pause syncing this folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Sync this folder now" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Stop syncing this folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "Make Folder On-Demand?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Make On-Demand" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "Couldn't pause the folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "Couldn't resume the folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Folder paused" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Folder resumed" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "Couldn't sync" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Shared folder" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Going on-demand" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Switching to synced" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "On-demand" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Synced" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "paused" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "not mounted" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Sign in to Proton" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Use your Proton account to connect Drive." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "Email or username" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Password" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Sign in" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Create account" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "Forgot password?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "Enter your email and password." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Signing in…" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Complete the verification to continue…" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "login cancelled" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "Too many sign-in attempts. Wait a few minutes and try again." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "Couldn't reach Proton. Check your internet connection and try again." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "Sign-in cancelled: no two-factor code was entered." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Sign-in failed: {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Two-factor authentication" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" +"Enter the code from your authenticator app, or one of your recovery codes." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Authentication code" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Confirm" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "Sign Out?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "Show {name}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "Show the raw file" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "Show the video" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "Show the photo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "Couldn't render this photo." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +msgid "Couldn't reach Proton Drive." +msgstr "Couldn't reach Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:345 +msgid "Reading photo details…" +msgstr "Reading photo details…" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Size" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "This photo carries no metadata." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Dimensions" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Taken" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Camera" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Lens" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Exposure" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Location" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Save a Copy" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "Saved “{name}”" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "Couldn't save the copy" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "The copy was interrupted." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} of {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} of {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Photo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Previous (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Next (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Favourite" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Other files of this photo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Save a Copy…" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "Move to Trash (Delete)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Close (Esc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Show on map" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Hide details" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "Couldn't change the favourite" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Upload photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Jump to a month" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Back to albums" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Upload" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Import a Google Photos Takeout export" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Select photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Add to Album…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Leave selection (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Show only favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "All dates" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Timeline" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Albums" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Importing from Google Photos…" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Select Photo to Upload" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Images" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Photo uploaded" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "Couldn't upload photo" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "Move this photo to Trash?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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:1551 +#, 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:1558 +#, 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:1616 +msgid "The server refused." +msgstr "The server refused." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "Moved {n} photo to Trash" +msgstr[1] "Moved {n} photos to Trash" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%Y-%m-%d %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Unknown Date" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Favourite" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Select" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Remove from Album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "Move to Trash…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Added to Favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Removed from Favourites" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Loading photos…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Reading your Proton Drive timeline." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Empty album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "This album has no photos in it." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "Couldn't load more photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "Couldn't load photos" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "Add Bookmark — save a public link to open it from here" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Invitations" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Accept to add the item to your shared files." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Bookmarks" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Back" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Shared with Me" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Reading your shared items." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Reading this shared folder." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "Couldn't open shared folder" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Invitations ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "This folder is empty." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "Show in My Files" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Leave…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Viewer" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Editor" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Admin" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Can view" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Can edit" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Can manage" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "Downloading “{name}”…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "Nothing Shared with You" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Shared with you" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "a shared item" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "From {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Reject" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Accept" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "this item" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "Reject Invitation?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "You won't have access to {name} unless it is shared again." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Shared link" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Remove bookmark" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Open in browser" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Invitation accepted" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "Couldn't accept the invitation" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Invitation rejected" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "Couldn't reject the invitation" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Leave shared item" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "Leave “{name}”? You'll lose access until you're invited again." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Leave" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Left shared item" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "Couldn't leave the shared item" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "Remove the bookmark for “{name}”?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Bookmark removed" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "Couldn't remove the bookmark" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Add bookmark" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "Paste a Proton Drive public link to save it here." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "Public link URL" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Password (if the link has one)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Add" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "Couldn't add bookmark" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "A URL is required." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Bookmark saved" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "Couldn't add the bookmark" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Shared by Me" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Reading what you've shared." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "Couldn't read your shares" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Nothing shared yet" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "Items you share with people or by link show up here." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Copy link" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Open Link" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Manage Access…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Stop Sharing…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "Stop sharing?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Stop Sharing" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "Stopped sharing {name}" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "Couldn't stop sharing" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} person" +msgstr[1] "{n} people" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "{n} pending" +msgstr[1] "{n} pending" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Public link" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Shared" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Startup" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Start on login" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Connect Proton Drive automatically when you log in" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Proton Drive folder" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Change…" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Network" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "Limit how fast files move, shared by every transfer. 0 means no limit." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Upload limit (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Download limit (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Appearance" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Proton purple accent" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "Use the Proton brand colour instead of the system accent colour" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Show tray icon" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "Sync status and quick actions in the panel" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "Pinned and recently opened files, kept on this computer." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Cache size limit (GiB)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "Older files are removed past this size; 0 means no limit" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Clear cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "Remove cached copies. Files kept offline stay." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Clear…" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "Files kept on this computer, even without a connection." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Storage" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Show sync status" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Sign Out…" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Account" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "System Default" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Language" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Takes effect the next time Proton Drive starts" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Transfers" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "Files moving to and from Proton Drive." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Cache budget updated" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "Couldn't set cache budget" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Bandwidth limits updated" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "Couldn't set bandwidth limits" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "Clear Cache?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Clear Cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Cache cleared" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "Couldn't clear the cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "Couldn't save the accent colour" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "Couldn't save the tray setting" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "Couldn't save the language" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Restart Proton Drive to use the new language" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Choose mountpoint folder" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "Couldn't save mountpoint" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Restart to apply" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "The mountpoint is now “{path}”. Restart the Drive mount to use it?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Later" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Restart now" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "{size} used" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "{used} of {total} used ({percent}%)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "{size} free" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "{free} free out of {total} ({percent}% used)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Proton Drive connected" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Your Drive is mounted and available." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Proton Drive disconnected" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "The mount service stopped. Files aren't available until it restarts." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Sync complete" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "{n} file finished transferring." +msgstr[1] "{n} files finished transferring." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title} — {done} of {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title} — {detail} ({done} of {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title}…" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title} — {detail}…" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name} — {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name} — {done} of {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · resumes {time}" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Resumes {time}" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Until you resume" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} change needs attention" +msgstr[1] "{n} changes need attention" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Cached files only" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Syncing" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "Up to date" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "Proton Drive isn't running" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "later" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "at %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "%a %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "%e %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "No files kept offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "Right-click a file and choose “Make available offline”." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "Couldn't make it online only" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Show fewer" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "Show all {n} file" +msgstr[1] "Show all {n} files" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Back to Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "Add a Google Takeout export to your Proton Photos timeline." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Drop your Takeout .zip files here" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Choose files…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Archives to import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Clear" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Remove every staged archive" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Scan" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" +"Check the archives and report what would be imported, without uploading" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Stop import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "Finish the photo on the wire, file what was uploaded, then stop" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Import in progress" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Last import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Select your Google Takeout archives" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Takeout archives" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "Import this export?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[1] "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Stopping the import…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "Couldn't stop the import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "Added {n} archive" +msgstr[1] "Added {n} archives" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "No archives added yet." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Remove from this import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} archive, {size} in total. {note}" +msgstr[1] "{n} archives, {size} in total. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Reading archives…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Starting import…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Scanning the export…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "Import started — you can leave this page, it keeps running." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "Couldn't start the import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Scan finished" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Import finished" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "{n} photo added, {failed} failed." +msgstr[1] "{n} photos added, {failed} failed." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Stopped after {n} photo." +msgstr[1] "Stopped after {n} photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "{n} photo added to Proton Photos." +msgstr[1] "{n} photos added to Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "The Google Photos import has finished." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Scan result" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "Nothing was uploaded — this is what an import would do." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Finished." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Photos in the export" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "Would upload" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Uploaded" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Already in Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Albums to create" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Albums created" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "Photos filed into albums" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Skipped (in Google's trash)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Data to upload" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Data uploaded" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Failed" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} of {total} — {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Working…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Empty Trash…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Permanently delete everything in the Trash" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Restore" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Delete Permanently…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Restore to its original folder" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Delete permanently" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Folder" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "{n} item selected" +msgstr[1] "{n} items selected" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "Reading the trash." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "Couldn't read the trash" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "Trash is empty" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Items you delete from Proton Drive show up here." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} item" +msgstr[1] "{n} items" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "Restored “{name}”" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "Restored {n} item" +msgstr[1] "Restored {n} items" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "Couldn't restore" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "Permanently delete “{name}”? This cannot be undone." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "Deleted “{name}” permanently" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "Permanently delete {n} item? This cannot be undone." +msgstr[1] "Permanently delete {n} items? This cannot be undone." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "Deleted {n} item permanently" +msgstr[1] "Deleted {n} items permanently" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Delete Permanently" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "Couldn't delete" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Empty Trash" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +"Permanently delete all {n} item in the trash? This cannot be undone." +msgstr[1] "" +"Permanently delete all {n} items in the trash? This cannot be undone." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Trash emptied" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "Couldn't empty the trash" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Verification" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Details (Alt+Enter)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Close details" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Info" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "Keep a copy on this computer, even without a connection." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Sharing" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Access" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Versions" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "History" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "No item selected" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Select a file or folder to see its details." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "File" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Open folder" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "Couldn't load sharing" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "Couldn't load versions" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Only you" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Anyone with the link" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Shared with {n} person" +msgstr[1] "Shared with {n} people" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Shared with {n} person · Public link" +msgstr[1] "Shared with {n} people · Public link" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "No earlier versions" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 version · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} version · latest {date}" +msgstr[1] "{n} versions · latest {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "More" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Never" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 day" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 days" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 days" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "Can't share" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Share" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Invite people" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "Proton and non-Proton email addresses, separated by spaces or commas." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "Email addresses" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Role" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Message (optional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Send Invitations" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "People with access" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "“{text}” isn't an email address" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Invitations sent" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "Couldn't send invitations" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "No one else has access yet." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Member" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Invited (pending)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Invited (external, pending)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Role updated" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "Couldn't update the role" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Remove access" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "Remove Access?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} will no longer be able to open this item." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Access removed" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "Couldn't remove access" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Anyone with the link ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "password-protected" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Remove link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "Remove Public Link?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"The link stops working for everyone who has it. A new link will have a " +"different address." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Remove Link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Public link removed" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "Couldn't remove the link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Link role" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Password (optional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Expires" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Create Public Link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Public link created" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "Couldn't create the link" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "expired" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "expires {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "Can't load versions" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "No versions" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Folders don't have versions." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Version history" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "Proton Drive keeps earlier versions of a file until you delete them." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "No earlier versions." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Current version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Save a copy…" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Restore this version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Delete this version permanently" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Restore version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Restoring that version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "Couldn't restore that version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Delete version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "Delete this version permanently? Its content can't be recovered." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Delete" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Version deleted" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "Couldn't delete that version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Save version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "Couldn't save that version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "That location isn't a local file." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Version saved" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive: {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Search Drive › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(no matches for “{query}”)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(no pinned files — type to search)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(cannot resolve app dirs)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} upload queued" +msgstr[1] "{n} uploads queued" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} change queued" +msgstr[1] "{n} changes queued" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} upload" +msgstr[1] "{n} uploads" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} change" +msgstr[1] "{n} changes" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "{uploads}, {changes} queued" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} file in {dir}" +msgstr[1] "{n} files in {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} of {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ {n} downloading" +msgstr[1] "↓ {n} downloading" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ {n} uploading" +msgstr[1] "↑ {n} uploading" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Mounted at {mountpoint} ({n} pinned)" +msgstr[1] "Mounted at {mountpoint} ({n} pinned)" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Syncing — {queued} ({n} pinned)" +msgstr[1] "Syncing — {queued} ({n} pinned)" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Offline — cached files only ({n} pinned)" +msgstr[1] "Offline — cached files only ({n} pinned)" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Offline — {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Mount: unexpected daemon response" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Logged in as {username} — not mounted" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Not signed in" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Error: {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} issue — View" +msgstr[1] "{n} issues — View" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Sign In…" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Open Proton Drive" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Open Folder" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Resume Sync" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Pause Sync" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Connect" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Hide Tray Icon" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Stop Proton Drive…" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Quit" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "All" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Folders" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "Documents" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Media" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "My files / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Search Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "Search in Drive and on this computer" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Esc" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Best matches" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "No results" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "Proton Drive is not running" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "Start the mount daemon to search your Drive." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ navigate · ↵ open · Tab filter" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Daemon offline" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "Pinned in Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Search your Drive" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "Still indexing this computer — local results will fill in shortly." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Try a different search, or another filter." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "Start typing to search Proton Drive and the files on this computer." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "No pinned files" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} pinned file" +msgstr[1] "{n} pinned files" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} in Drive · {local} on this computer · indexing…" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} in Drive · {local} on this computer" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "Opening {name}…" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "Could not open: {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "Could not reach the daemon" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Home" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Home / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} GB" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} MB" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} KB" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} B" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "now" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count}m" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count}h" + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count}d" + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count}mo" + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count}y" + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "cannot reach the Proton Drive daemon: {error}" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..de677db --- /dev/null +++ b/po/es.po @@ -0,0 +1,4687 @@ +# Spanish translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: Spanish\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "Mis archivos" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Fotos" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Compartido conmigo" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Compartido por mí" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Equipos" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Papelera" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Sincronización" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Actividad" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Actualizar (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what}: {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "Está sin conexión" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "Eso ya no existe" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "No tiene acceso a eso" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "Algo lo cambió antes" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Su Proton Drive está lleno" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Preferencias" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Atajos del teclado" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "Acerca de Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Menú principal" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Proton Drive con archivos bajo demanda para el escritorio Linux.\n" +"\n" +"Cliente no oficial: no está afiliado a Proton AG, ni respaldado ni mantenido " +"por esta." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Colaboradores de Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "¿Detener Proton Drive?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"La unidad se desmonta y no se sincroniza nada hasta que vuelva a conectarse. " +"Proton Drive se iniciará de nuevo en su próximo inicio de sesión." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Cancelar" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Detener" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "No se pudo detener Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "El servicio de montaje no se detuvo." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "General" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Buscar en Drive" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Actualizar" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Atajos del teclado" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "Archivos" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "Carpeta nueva" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Subir archivos" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Atrás / adelante" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Carpeta superior" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Cuadrícula / lista" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Renombrar" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "Mover a la papelera" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Anular la selección" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Miniaturas más grandes" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Miniaturas más pequeñas" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Restablecer el tamaño de las miniaturas" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Seleccionar todo" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Visor de fotos" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Foto anterior / siguiente" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "Primera / última foto" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Mostrar detalles" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Pantalla completa" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Cerrar" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Seleccione un único elemento para renombrarlo" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "Todo" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Transferencias" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Cambios" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Compartición" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Problemas" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Requiere atención" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Reintentar" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Cargando…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Leyendo la actividad reciente." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "No se pudo leer la actividad" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Respuesta inesperada del servicio de montaje." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Sin conexión" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "El servicio de montaje de Proton Drive no está en ejecución." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Conectando…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "Esperando a que se inicie el servicio de montaje de Proton Drive." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Hoy" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Ayer" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A, %-d de %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d de %B de %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Nada todavía" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" +"Las subidas, los movimientos, las comparticiones y otros cambios aparecen " +"aquí a medida que ocurren." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"Un archivo se modificó en dos lugares a la vez. Elija qué versión conservar." +msgstr[1] "" +"{n} archivos se modificaron en dos lugares a la vez. Elija qué versiones " +"conservar." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "No hay actividad coincidente" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Nada del registro reciente coincide con este filtro." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n} vez desde {time}" +msgstr[1] "{n} veces desde {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Resuelto" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Resolver…" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "Se subió {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "Se descargó {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "Se sincronizó {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "Se renombró {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "Se movió {name}" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Se creó la carpeta {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "Se movió {name} a la papelera" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "Se restauró {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "Se eliminó {name}" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Se vació la papelera ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "Se compartió {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Se creó un enlace a {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "Se dejó de compartir {name}" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Conflicto {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Cargando álbumes…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Leyendo sus álbumes de Proton Drive." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "No hay fototeca" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "Esta cuenta de Proton no tiene Fotos activado." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "No hay álbumes" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Cree uno con Álbum nuevo o en Proton Photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "No se pudieron cargar los álbumes" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "El servicio de montaje de Proton Drive no respondió." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} álbum" +msgstr[1] "{n} álbumes" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Abrir" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Renombrar…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Eliminar álbum…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Nombre del álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Crear" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "Álbum nuevo" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Álbum creado" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "No se pudo crear el álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "El servicio de montaje no respondió." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Renombrar álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Álbum renombrado" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "No se pudo renombrar el álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "¿Eliminar el álbum?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "Se eliminará “{name}”. Sus fotos permanecen en la cronología." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Eliminar" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Álbum eliminado" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "No se pudo eliminar el álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Añadir al álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Elija un álbum para esta foto." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +msgstr[0] "Elija un álbum para {n} foto." +msgstr[1] "Elija un álbum para {n} fotos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "Álbum nuevo…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "No se pudieron añadir algunas fotos" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "Se añadió {n} foto al álbum" +msgstr[1] "Se añadieron {n} fotos al álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "No se pudo añadir al álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "No se pudieron quitar algunas fotos del álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "Se quitó {n} foto del álbum" +msgstr[1] "Se quitaron {n} fotos del álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "No se pudo quitar del álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} foto · compartido conmigo" +msgstr[1] "{n} fotos · compartido conmigo" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} foto" +msgstr[1] "{n} fotos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Atrás (Alt+Izquierda)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Adelante (Alt+Derecha)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "Carpeta nueva" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Subir archivos…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Subir carpeta…" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "Nuevo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Cuadrícula" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "Lista" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Nombre" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Tamaño" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Última modificación" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Ordenar por" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Orden inverso" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Carpetas primero" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Mostrar como lista (Ctrl+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Opciones de orden y vista" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "Abrir en el gestor de archivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Generar miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Acciones de la carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Cancelar la generación de miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Buscar solo en esta carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Hacer disponible sin conexión" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Hacer solo en línea" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Mover a…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Anular la selección (Esc)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Ampliación:" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Tamaño: {n} píxel" +msgstr[1] "Tamaño: {n} píxeles" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Almacenamiento de la cuenta de Proton" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "Mis archivos" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "{n} seleccionado" +msgstr[1] "{n} seleccionados" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "No se pudo mover a la papelera" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "Proton Drive no está conectado." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "Se movió {n} elemento a la papelera; algunos no se pudieron mover" +msgstr[1] "" +"Se movieron {n} elementos a la papelera; algunos no se pudieron mover" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "Se movió “{name}” a la papelera" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +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:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Deshacer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Restaurado de la papelera" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "Se restauró {n} elemento de la papelera" +msgstr[1] "Se restauraron {n} elementos de la papelera" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "No se pudo restaurar de la papelera" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "No se pudo cambiar el estado sin conexión" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} archivo ya está disponible sin conexión" +msgstr[1] "{n} archivos ya están disponibles sin conexión" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} archivo ahora está solo en línea" +msgstr[1] "{n} archivos ahora están solo en línea" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Modificado" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Ubicación" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Abrir con…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Reproducir" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Disponible sin conexión" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Compartir…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Copiar enlace" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Mover a…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Versiones…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Detalles" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "Carpeta nueva…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Seleccionar todo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "No se pudo abrir el archivo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "Abrir con requiere que la carpeta de Proton Drive esté montada." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Enlace copiado" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "No se pudo copiar el enlace" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "No se pudo reproducir el contenido multimedia" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "La ruta del archivo no es UTF-8 válido." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "Transmitiendo “{name}”…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "“{name}” ahora está solo en línea" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "“{name}” ya está disponible sin conexión" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "No se pudo guardar la vista" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Mostrar como cuadrícula (Ctrl+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "No se pudo abrir la carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "No se pudieron generar las miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Iniciando la generación de miniaturas…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Deteniendo la generación de miniaturas…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "No se pudo cancelar la generación de miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Generación de miniaturas detenida" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "" +"El servicio de montaje dejó de informar del progreso de las miniaturas." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} carpeta" +msgstr[1] "{n} carpetas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} imagen" +msgstr[1] "{n} imágenes" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Analizando {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Generando miniaturas en {root}… {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Miniaturas listas para {n} imagen en {root}" +msgstr[1] "Miniaturas listas para {n} imágenes en {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "" +"Miniaturas listas para {n} imagen en {root}; {failed} no disponibles" +msgstr[1] "" +"Miniaturas listas para {n} imágenes en {root}; {failed} no disponibles" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "Nombre nuevo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renombrado a “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "No se pudo renombrar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "Mover “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Mover {n} elemento" +msgstr[1] "Mover {n} elementos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Elija la carpeta de destino." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Mover aquí" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "No se pudo leer esta carpeta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "No hay carpetas aquí." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "No se pudo mover" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "Se movió {n} elemento a {place}, pero no todos" +msgstr[1] "Se movieron {n} elementos a {place}, pero no todos" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Movido a {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "Se movió {n} elemento a {place}" +msgstr[1] "Se movieron {n} elementos a {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Crear una carpeta en la carpeta actual." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Nombre de la carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "Se creó “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "No se pudo crear la carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Subir archivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Subir carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "No se pudo subir" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Subiendo…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Subiendo {n} elemento…" +msgstr[1] "Subiendo {n} elementos…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "Ver" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Movido a “{name}”" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d %b %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Leyendo esta carpeta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Carpeta no disponible" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "No se pudo abrir esta carpeta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "Esta carpeta está vacía" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Suelte archivos aquí, o suba un archivo o cree una carpeta para empezar." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Buscar en todas partes" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Buscando…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Buscando “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary}: se muestra el primer resultado de búsqueda" +msgstr[1] "{summary}: se muestran los primeros {n} resultados de búsqueda" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary}: resultados de búsqueda" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "Sin coincidencias" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "Ningún archivo ni carpeta coincide con esa búsqueda." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} archivo" +msgstr[1] "{n} archivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "Este equipo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "El equipo con el que esta máquina hace copias de seguridad." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Renombrar este equipo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Otros equipos" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Otros equipos que hacen copias de seguridad en esta cuenta." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Leyendo sus equipos." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Haciendo copias de seguridad como “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Renombrar este equipo ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "No hay otros equipos" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "" +"Las aplicaciones de escritorio que se sincronizan con esta cuenta aparecen " +"aquí." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Restaurar en este equipo…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Usar la identidad de este equipo…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Quitar equipo…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · última sincronización {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · nunca sincronizado" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Abrir Sincronización" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "Gestionar las carpetas y el punto de montaje de este equipo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Restaurar carpetas…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "" +"Todavía no hay carpetas con copia de seguridad; añada una en la página " +"Sincronización." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} carpeta con copia de seguridad" +msgstr[1] "{n} carpetas con copia de seguridad" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · gestiónelas en la página Sincronización" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} requiere atención" +msgstr[1] "{folders} · {n} requieren atención" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "sincronizando…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "error de sincronización" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "requiere atención" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "actualizado" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "buscando cambios…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "buscando cambios: {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "sincronizando {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "sincronizando {file}: {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Añadir carpeta para sincronizar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Sincronizando la carpeta…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "No se pudo añadir la carpeta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "No se pudieron listar las carpetas para restaurar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Marque las carpetas que sincronizar con esta máquina y ajuste dónde debe " +"estar cada una." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Restaurar carpetas" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Restaurar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Restaurando carpetas…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "No se pudieron restaurar las carpetas" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"Estas carpetas tienen copia de seguridad desde “{name}”. Las carpetas " +"restauradas siguen sincronizándose con la copia de ese equipo." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "" +"Estas carpetas tienen copia de seguridad bajo este equipo en Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" +"Nada que restaurar: todas las carpetas de “{name}” ya se sincronizan aquí." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" +"Nada que restaurar: todas las carpetas de este equipo ya se sincronizan aquí." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "La carpeta pasará a bajo demanda" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "La carpeta se descargará y permanecerá sincronizada" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "No se pudo cambiar el modo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"¿Dejar de sincronizar “{path}”?\n" +"\n" +"Esta carpeta es bajo demanda: sus archivos están en Proton Drive, no en este " +"disco, así que la carpeta quedará vacía al desmontarla. Para conservar una " +"copia local, cancele, desactive Bajo demanda y espere a que termine la " +"descarga antes de quitarla." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"¿Dejar de sincronizar “{path}”?\n" +"\n" +"Los archivos locales permanecen en este disco y simplemente dejan de " +"sincronizarse. Elija si quiere eliminar también la copia en Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Dejar de sincronizar la carpeta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Eliminar también de Proton Drive" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Elimina la única copia de estos archivos." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "La copia local no se ve afectada." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Dejar de sincronizar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "Se dejó de sincronizar la carpeta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "No se pudo dejar de sincronizar la carpeta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Renombrar equipo" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "Renombrar “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "No se pudo renombrar el equipo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "Se necesita un nombre." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Equipo renombrado" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Escriba “{name}” para confirmar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Quitar equipo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"¿Quitar “{name}” de esta cuenta?\n" +"\n" +"Todo lo que respaldó en Proton Drive se eliminará con él. Los archivos de " +"ese equipo no se tocan, pero esto no se puede deshacer desde aquí." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Quitar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Equipo quitado" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "No se pudo quitar el equipo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Usar la identidad de este equipo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"¿Tratar esta máquina como “{name}”?\n" +"\n" +"Las carpetas sincronizadas nuevas se crean bajo ese equipo en Proton Drive, " +"y esta máquina conserva esa identidad aunque cambie su nombre de host. Las " +"carpetas que ya se sincronizan aquí no se mueven.\n" +"\n" +"Después, use “Restaurar carpetas” para recuperar lo que “{name}” " +"sincronizaba." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Usar identidad" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Identidad adoptada" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "No se pudo adoptar ese equipo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Añadir carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "" +"Hacer copia de seguridad de una carpeta local en el dispositivo de Proton " +"Drive de este equipo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Conflictos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"Archivos modificados en dos lugares a la vez. Se conservaron ambas " +"versiones; elija cuál se queda." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "En este equipo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"Dónde está Proton Drive en esta máquina. Las carpetas sincronizadas guardan " +"una copia completa en este disco; las carpetas bajo demanda mantienen los " +"archivos solo en Proton Drive y los obtienen al abrirlos." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Sincronización" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "Pausar durante 1 hora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "Pausar durante 8 horas" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "Pausar durante 24 horas" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Pausar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" +"Dejar de subir hasta que reanude. Los archivos se siguen abriendo como " +"siempre." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Pausar durante un tiempo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Comprobando…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Reanudar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "" +"Subir todo lo que quedó en espera mientras la sincronización estaba en pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "No se pudo pausar la sincronización" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "No se pudo reanudar la sincronización" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Sincronización reanudada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Sincronización en pausa hasta que la reanude" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Sincronización en pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Reintentar todo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Volver a intentar ahora todos los cambios fallidos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "En espera de subida" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "Cambios hechos en este equipo que todavía no están en Proton Drive." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Cambios hechos en este equipo que todavía no están en Proton Drive. Se " +"muestran los primeros {shown} de {n}." +msgstr[1] "" +"Cambios hechos en este equipo que todavía no están en Proton Drive. Se " +"muestran los primeros {shown} de {n}." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Subir cambios" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Subir archivo nuevo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Crear carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Renombrar o mover" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "Mover a la papelera" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Cambio" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "esperando a que termine la aplicación que lo escribe" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "reintento a las {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "esperando a que se reanude la sincronización" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "el siguiente" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "Falló {n} vez: {error}" +msgstr[1] "Falló {n} veces: {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Reintentar ahora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Reintentando ahora…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "No se pudo reintentar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, modificado {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "El original ya no existe; solo queda esta copia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Mismo contenido que el original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Difiere de {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"“{name}” se modificó aquí y en otro lugar al mismo tiempo.\n" +"\n" +"Original: {original}\n" +"Copia: {copy}\n" +"\n" +"Lo que no se conserve va a la papelera, desde donde se puede restaurar." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"El original “{name}” ya no existe; solo queda la copia ({copy}).\n" +"\n" +"Conserve la copia para devolverle el nombre original." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Resolver conflicto" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Nombre de la copia, si se conservan ambos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Conservar original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Conservar ambos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Conservar copia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "No se pudo resolver el conflicto" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "Leyendo las ubicaciones de Proton Drive de este equipo." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "No disponible" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "No hay ubicaciones" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "El servicio de montaje todavía no ha informado de un punto de montaje." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Solo lectura" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Abrir esta carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Cambiar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Elegir otra carpeta para el montaje de Proton Drive" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Reanudar la sincronización de esta carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Pausar la sincronización de esta carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Sincronizar esta carpeta ahora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"Bajo demanda: libere este disco manteniendo los archivos solo en Proton " +"Drive y obteniendo cada uno al abrirlo. Desactívelo para volver a " +"descargarlos y mantener una copia local completa." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Dejar de sincronizar esta carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "¿Hacer la carpeta bajo demanda?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"Los archivos de {path} se quitarán de este equipo y se conservarán solo en " +"Proton Drive. Cada archivo se vuelve a descargar al abrirlo." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Hacer bajo demanda" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "No se pudo pausar la carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "No se pudo reanudar la carpeta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Carpeta en pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Carpeta reanudada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "No se pudo sincronizar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Carpeta compartida" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Pasando a bajo demanda" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Pasando a sincronizada" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "Bajo demanda" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Sincronizada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "en pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "sin montar" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Iniciar sesión en Proton" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Use su cuenta de Proton para conectar Drive." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "Correo electrónico o nombre de usuario" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Contraseña" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Iniciar sesión" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Crear cuenta" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "¿Olvidó la contraseña?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "Introduzca su correo electrónico y su contraseña." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Iniciando sesión…" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Complete la verificación para continuar…" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "inicio de sesión cancelado" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "" +"Demasiados intentos de inicio de sesión. Espere unos minutos e inténtelo de " +"nuevo." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" +"No se pudo contactar con Proton. Compruebe su conexión a Internet e " +"inténtelo de nuevo." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Se inició la sesión, pero no se pudo guardar en el depósito de claves del " +"sistema. Asegúrese de que un depósito de claves (GNOME Keyring o KWallet) " +"esté en ejecución y desbloqueado." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "" +"Inicio de sesión cancelado: no se introdujo ningún código de dos factores." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Inicio de sesión cancelado: no se completó la verificación. Vuelva a iniciar " +"sesión para obtener una nueva." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Falló el inicio de sesión: {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Autenticación de dos factores" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" +"Introduzca el código de su aplicación de autenticación o uno de sus códigos " +"de recuperación." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Código de autenticación" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Confirmar" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "¿Cerrar la sesión?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"Proton Drive se desconectará y dejará de sincronizar hasta que vuelva a " +"iniciar sesión. Los archivos que ya están en este equipo se quedan donde " +"están." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "Mostrar {name}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "Mostrar el archivo RAW" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "Mostrar el vídeo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "Mostrar la foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "No se pudo representar esta foto." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +msgid "Couldn't reach Proton Drive." +msgstr "No se pudo contactar con Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:345 +msgid "Reading photo details…" +msgstr "Leyendo los detalles de la foto…" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Tamaño" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "Esta foto no contiene metadatos." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Dimensiones" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Tomada" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Cámara" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Objetivo" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Exposición" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Ubicación" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Guardar una copia" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "Se guardó “{name}”" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "No se pudo guardar la copia" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "Se interrumpió la copia." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} de {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} de {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Anterior (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Siguiente (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Marcar como favorita" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Otros archivos de esta foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Guardar una copia…" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "Mover a la papelera (Supr)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Cerrar (Esc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Mostrar en el mapa" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Ocultar detalles" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "No se pudo cambiar el favorito" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Subir fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Saltar a un mes" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Volver a los álbumes" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Subir" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Importar una exportación de Google Takeout de Google Photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Seleccionar fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Añadir al álbum…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Salir de la selección (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Mostrar solo favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "Todas las fechas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Cronología" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Álbumes" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Importando de Google Photos…" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Seleccionar la foto que subir" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Imágenes" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Foto subida" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "No se pudo subir la foto" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "¿Mover esta foto a la papelera?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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:1551 +#, 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:1558 +#, 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] "¿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:1616 +msgid "The server refused." +msgstr "El servidor lo rechazó." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "Se movió {n} foto a la papelera" +msgstr[1] "Se movieron {n} fotos a la papelera" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%d/%m/%Y %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Fecha desconocida" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Favorita" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Seleccionar" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Quitar del álbum" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "Mover a la papelera…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Añadida a favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Quitada de favoritas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Cargando fotos…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Leyendo su cronología de Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Álbum vacío" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "Este álbum no tiene fotos." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "No se pudieron cargar más fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "No se pudieron cargar las fotos" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "Añadir marcador: guarde un enlace público para abrirlo desde aquí" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Invitaciones" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Acepte para añadir el elemento a sus archivos compartidos." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Marcadores" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Atrás" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Compartido conmigo" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Leyendo sus elementos compartidos." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Leyendo esta carpeta compartida." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "No se pudo abrir la carpeta compartida" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Invitaciones ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "Esta carpeta está vacía." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "Mostrar en Mis archivos" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Abandonar…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"La firma de la invitación no coincide con las claves del remitente. Puede " +"que no sea realmente suya." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Lector" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Editor" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Administrador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Puede ver" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Puede editar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Puede gestionar" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "Descargando “{name}”…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "No se ha compartido nada con usted" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"Los archivos y carpetas que otras personas comparten con usted aparecen " +"aquí. Los enlaces públicos que guarde como marcadores también se conservan " +"aquí." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Compartido con usted" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "un elemento compartido" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "De {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Rechazar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Aceptar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "este elemento" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "¿Rechazar la invitación?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "No tendrá acceso a {name} a menos que se vuelva a compartir." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Enlace compartido" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Quitar marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Abrir en el navegador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Invitación aceptada" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "No se pudo aceptar la invitación" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Invitación rechazada" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "No se pudo rechazar la invitación" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Abandonar el elemento compartido" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "¿Abandonar “{name}”? Perderá el acceso hasta que le vuelvan a invitar." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Abandonar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Se abandonó el elemento compartido" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "No se pudo abandonar el elemento compartido" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "¿Quitar el marcador de “{name}”?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Marcador quitado" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "No se pudo quitar el marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Añadir marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "Pegue un enlace público de Proton Drive para guardarlo aquí." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "URL del enlace público" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Contraseña (si el enlace tiene una)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Añadir" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "No se pudo añadir el marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "Se necesita un URL." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Marcador guardado" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "No se pudo añadir el marcador" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Compartido por mí" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Leyendo lo que ha compartido." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "No se pudieron leer sus comparticiones" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Todavía no se ha compartido nada" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "" +"Los elementos que comparta con personas o mediante un enlace aparecen aquí." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Copiar enlace" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Abrir enlace" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Gestionar el acceso…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Dejar de compartir…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "¿Dejar de compartir?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Todas las personas que invitó perderán el acceso a “{name}”, las " +"invitaciones pendientes se retirarán y su enlace público dejará de funcionar." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Dejar de compartir" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "Se dejó de compartir {name}" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "No se pudo dejar de compartir" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} persona" +msgstr[1] "{n} personas" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "{n} pendiente" +msgstr[1] "{n} pendientes" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Enlace público" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Compartido" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Inicio" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Iniciar al iniciar sesión" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Conectar Proton Drive automáticamente al iniciar sesión" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Carpeta de Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Cambiar…" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Red" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" +"Limitar la velocidad de transferencia de archivos, compartida entre todas " +"las transferencias. 0 significa sin límite." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Límite de subida (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Límite de descarga (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Apariencia" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Acento morado de Proton" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "" +"Usar el color de la marca Proton en lugar del color de acento del sistema" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Mostrar icono en la bandeja" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "Estado de la sincronización y acciones rápidas en el panel" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Caché" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "Archivos anclados y abiertos recientemente, guardados en este equipo." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Límite del tamaño de la caché (GiB)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" +"Los archivos más antiguos se quitan al superar este tamaño; 0 significa sin " +"límite" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Vaciar la caché" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "" +"Quitar las copias en caché. Los archivos disponibles sin conexión se " +"mantienen." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Vaciar…" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "Archivos guardados en este equipo, incluso sin conexión." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Almacenamiento" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Mostrar el estado de la sincronización" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Cerrar la sesión…" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Cuenta" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "Predeterminado del sistema" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Idioma" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Se aplica la próxima vez que se inicie Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Transferencias" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "Archivos que se transfieren hacia y desde Proton Drive." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Límite de la caché actualizado" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "No se pudo establecer el límite de la caché" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Límites de ancho de banda actualizados" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "No se pudieron establecer los límites de ancho de banda" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "¿Vaciar la caché?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"Las copias en caché se quitan de este equipo y se vuelven a descargar al " +"abrirlas. Los archivos disponibles sin conexión se mantienen." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Vaciar la caché" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Caché vaciada" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "No se pudo vaciar la caché" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "No se pudo guardar el color de acento" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "No se pudo guardar la configuración de la bandeja" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "No se pudo guardar el idioma" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Reinicie Proton Drive para usar el idioma nuevo" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Elegir la carpeta del punto de montaje" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "No se pudo guardar el punto de montaje" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Reiniciar para aplicar" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" +"El punto de montaje ahora es “{path}”. ¿Reiniciar el montaje de Drive para " +"usarlo?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Más tarde" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Reiniciar ahora" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "{size} usados" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "{used} de {total} usados ({percent}%)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "{size} libres" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "{free} libres de {total} ({percent}% usado)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Proton Drive conectado" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Su Drive está montado y disponible." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Proton Drive desconectado" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" +"El servicio de montaje se detuvo. Los archivos no están disponibles hasta " +"que se reinicie." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Sincronización completada" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "{n} archivo terminó de transferirse." +msgstr[1] "{n} archivos terminaron de transferirse." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title}: {done} de {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title}: {detail} ({done} de {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title}…" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title}: {detail}…" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name}: {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name}: {done} de {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · se reanuda {time}" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Se reanuda {time}" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Hasta que la reanude" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} cambio requiere atención" +msgstr[1] "{n} cambios requieren atención" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Sin conexión" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Solo archivos en caché" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Sincronizando" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "Actualizado" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "Proton Drive no está en ejecución" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "más tarde" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "a las %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "%a %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "%-d %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "No hay archivos disponibles sin conexión" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "" +"Pulse con el botón derecho en un archivo y elija “Hacer disponible sin " +"conexión”." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "No se pudo hacer solo en línea" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Mostrar menos" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "Mostrar {n} archivo" +msgstr[1] "Mostrar los {n} archivos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Las fotos que ya están en Proton Photos se reconocen por nombre y contenido " +"y se omiten, así que volver a ejecutar una importación interrumpida es " +"seguro." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Volver a Fotos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "" +"Añadir una exportación de Google Takeout a su cronología de Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Suelte aquí sus archivos .zip de Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Añada todas las partes de la exportación a la vez: una foto y sus metadatos " +"suelen estar en partes distintas." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Elegir archivos…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Archivadores que importar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Vaciar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Quitar todos los archivadores preparados" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Analizar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" +"Comprobar los archivadores e informar de lo que se importaría, sin subir nada" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Importar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Detener la importación" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "Terminar la foto en curso, archivar lo que se ha subido y detenerse" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Importación en curso" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Última importación" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Seleccione sus archivadores de Google Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Archivadores de Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "¿Importar esta exportación?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"Se subirá {n} archivador a Proton Photos, creando los álbumes tal como " +"aparecen en la exportación. Esto puede tardar horas; puede detenerlo en " +"cualquier momento y lo que ya se haya subido se conserva. Las fotos que ya " +"tiene se omiten." +msgstr[1] "" +"Se subirán {n} archivadores a Proton Photos, creando los álbumes tal como " +"aparecen en la exportación. Esto puede tardar horas; puede detenerlo en " +"cualquier momento y lo que ya se haya subido se conserva. Las fotos que ya " +"tiene se omiten." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Deteniendo la importación…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "No se pudo detener la importación" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Solo se pueden importar archivos .zip de Takeout; no se admiten carpetas " +"extraídas." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "Se añadió {n} archivador" +msgstr[1] "Se añadieron {n} archivadores" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "Todavía no se ha añadido ningún archivador." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Quitar de esta importación" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} archivador, {size} en total. {note}" +msgstr[1] "{n} archivadores, {size} en total. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Leyendo los archivadores…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Iniciando la importación…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Analizando la exportación…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "" +"Importación iniciada: puede salir de esta página, seguirá ejecutándose." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "No se pudo iniciar la importación" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Análisis terminado" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Importación terminada" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "{n} foto añadida, {failed} fallidas." +msgstr[1] "{n} fotos añadidas, {failed} fallidas." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Detenido después de {n} foto." +msgstr[1] "Detenido después de {n} fotos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "{n} foto añadida a Proton Photos." +msgstr[1] "{n} fotos añadidas a Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "La importación de Google Photos ha terminado." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Resultado del análisis" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "No se subió nada: esto es lo que haría una importación." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Detenido antes de tiempo. Todo lo subido hasta ahora está en su cronología; " +"vuelva a ejecutarlo para continuar donde se quedó." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Terminado." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Fotos en la exportación" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "Se subirían" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Subidas" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Ya en Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Álbumes que crear" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Álbumes creados" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "Fotos archivadas en álbumes" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Omitidas (en la papelera de Google)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Datos que subir" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Datos subidos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Fallidas" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} de {total}: {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Trabajando…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Vaciar la papelera…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Eliminar permanentemente todo lo que hay en la papelera" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Restaurar" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Eliminar permanentemente…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Restaurar en su carpeta original" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Eliminar permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Carpeta" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "{n} elemento seleccionado" +msgstr[1] "{n} elementos seleccionados" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "Leyendo la papelera." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "No se pudo leer la papelera" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "La papelera está vacía" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Los elementos que elimine de Proton Drive aparecen aquí." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} elemento" +msgstr[1] "{n} elementos" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "Se restauró “{name}”" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "Se restauró {n} elemento" +msgstr[1] "Se restauraron {n} elementos" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "No se pudo restaurar" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "¿Eliminar permanentemente “{name}”? Esto no se puede deshacer." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "Se eliminó “{name}” permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "¿Eliminar permanentemente {n} elemento? Esto no se puede deshacer." +msgstr[1] "¿Eliminar permanentemente {n} elementos? Esto no se puede deshacer." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "Se eliminó {n} elemento permanentemente" +msgstr[1] "Se eliminaron {n} elementos permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Eliminar permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "No se pudo eliminar" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Vaciar la papelera" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +"¿Eliminar permanentemente {n} elemento de la papelera? Esto no se puede " +"deshacer." +msgstr[1] "" +"¿Eliminar permanentemente los {n} elementos de la papelera? Esto no se puede " +"deshacer." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Papelera vaciada" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "No se pudo vaciar la papelera" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Verificación" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Detalles (Alt+Intro)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Cerrar los detalles" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Información" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "Conservar una copia en este equipo, incluso sin conexión." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Compartición" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Acceso" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Versiones" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "Historial" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "No hay ningún elemento seleccionado" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Seleccione un archivo o una carpeta para ver sus detalles." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "Archivo" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Abrir carpeta" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "No se pudo cargar la compartición" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "No se pudieron cargar las versiones" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Solo usted" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Cualquiera con el enlace" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Compartido con {n} persona" +msgstr[1] "Compartido con {n} personas" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Compartido con {n} persona · Enlace público" +msgstr[1] "Compartido con {n} personas · Enlace público" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "No hay versiones anteriores" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 versión · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} versión · la última {date}" +msgstr[1] "{n} versiones · la última {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "Más" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Nunca" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 día" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 días" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 días" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "No se puede compartir" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Compartir" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Invitar a personas" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "" +"Direcciones de correo electrónico de Proton y de otros proveedores, " +"separadas por espacios o comas." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "Direcciones de correo electrónico" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Rol" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Mensaje (opcional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Enviar invitaciones" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "Personas con acceso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "“{text}” no es una dirección de correo electrónico" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Invitaciones enviadas" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "No se pudieron enviar las invitaciones" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "Nadie más tiene acceso todavía." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Miembro" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Invitado (pendiente)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Invitado (externo, pendiente)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Rol actualizado" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "No se pudo actualizar el rol" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Quitar el acceso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "¿Quitar el acceso?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} ya no podrá abrir este elemento." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Acceso quitado" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "No se pudo quitar el acceso" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Cualquiera con el enlace ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "protegido con contraseña" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Quitar el enlace" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "¿Quitar el enlace público?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"El enlace deja de funcionar para todas las personas que lo tienen. Un enlace " +"nuevo tendrá una dirección distinta." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Quitar enlace" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Enlace público quitado" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "No se pudo quitar el enlace" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Rol del enlace" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Contraseña (opcional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Caduca" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Crear enlace público" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Enlace público creado" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "No se pudo crear el enlace" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "caducado" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "caduca el {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "No se pueden cargar las versiones" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "No hay versiones" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Las carpetas no tienen versiones." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Historial de versiones" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" +"Proton Drive conserva las versiones anteriores de un archivo hasta que las " +"elimine." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "No hay versiones anteriores." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Versión actual" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Guardar una copia…" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Restaurar esta versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Eliminar esta versión permanentemente" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Restaurar versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"¿Hacer que esta versión sea el contenido actual de “{name}”? La versión que " +"reemplaza permanece en el historial." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Restaurando esa versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "No se pudo restaurar esa versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Eliminar versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "" +"¿Eliminar esta versión permanentemente? Su contenido no se podrá recuperar." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Eliminar" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Versión eliminada" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "No se pudo eliminar esa versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Guardar versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "No se pudo guardar esa versión" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "Esa ubicación no es un archivo local." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Versión guardada" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive: {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Buscar en Drive › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(no hay coincidencias para “{query}”)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(no hay archivos anclados; escriba para buscar)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(no se pueden resolver las carpetas de la aplicación)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} subida en cola" +msgstr[1] "{n} subidas en cola" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} cambio en cola" +msgstr[1] "{n} cambios en cola" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} subida" +msgstr[1] "{n} subidas" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} cambio" +msgstr[1] "{n} cambios" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "{uploads} y {changes} en cola" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} archivo en {dir}" +msgstr[1] "{n} archivos en {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} de {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ {n} descargando" +msgstr[1] "↓ {n} descargando" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ {n} subiendo" +msgstr[1] "↑ {n} subiendo" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Montado en {mountpoint} ({n} anclado)" +msgstr[1] "Montado en {mountpoint} ({n} anclados)" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Sincronizando: {queued} ({n} anclado)" +msgstr[1] "Sincronizando: {queued} ({n} anclados)" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Sin conexión: solo archivos en caché ({n} anclado)" +msgstr[1] "Sin conexión: solo archivos en caché ({n} anclados)" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Sin conexión: {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Montaje: respuesta inesperada del demonio" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Sesión iniciada como {username}: sin montar" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Sesión no iniciada" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Error: {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} problema: ver" +msgstr[1] "{n} problemas: ver" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Iniciar sesión…" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Abrir Proton Drive" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Abrir carpeta" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Reanudar la sincronización" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Pausar la sincronización" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Conectar" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Ocultar el icono de la bandeja" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Detener Proton Drive…" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Salir" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "Todo" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Carpetas" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "Documentos" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Multimedia" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "Mis archivos / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Buscar en Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "Buscar en Drive y en este equipo" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Esc" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Mejores coincidencias" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "No hay resultados" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "Proton Drive no está en ejecución" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "Inicie el demonio de montaje para buscar en su Drive." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ navegar · ↵ abrir · Tab filtrar" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Demonio sin conexión" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "Anclado en Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Buscar en su Drive" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "" +"Todavía se está indexando este equipo; los resultados locales aparecerán en " +"breve." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Pruebe con otra búsqueda u otro filtro." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" +"Empiece a escribir para buscar en Proton Drive y en los archivos de este " +"equipo." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "No hay archivos anclados" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} archivo anclado" +msgstr[1] "{n} archivos anclados" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} en Drive · {local} en este equipo · indexando…" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} en Drive · {local} en este equipo" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "Abriendo {name}…" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "No se pudo abrir: {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "No se pudo contactar con el demonio" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Carpeta personal" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Carpeta personal / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} GB" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} MB" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} KB" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} B" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "ahora" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count} min" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count} h" + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count} d" + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count} mes." + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count} a" + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "no se puede contactar con el demonio de Proton Drive: {error}" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..b54f2c2 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,4710 @@ +# French translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "Mes fichiers" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Photos" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Partagés avec moi" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Partagés par moi" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Ordinateurs" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Corbeille" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Synchronisation" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Activité" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Actualiser (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what} : {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "Vous êtes hors ligne" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "Cet élément n’existe plus" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "Vous n’avez pas accès à cet élément" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "Quelque chose l’a modifié entre-temps" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Votre Proton Drive est plein" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Préférences" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Raccourcis clavier" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "À propos de Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Menu principal" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Proton Drive avec fichiers à la demande pour le bureau Linux.\n" +"\n" +"Client non officiel — non affilié à Proton AG, ni approuvé ni pris en charge " +"par Proton AG." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Les contributeurs de Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "Arrêter Proton Drive ?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"Le lecteur est démonté et plus rien n’est synchronisé jusqu’à ce que vous " +"vous reconnectiez. Proton Drive redémarrera à votre prochaine ouverture de " +"session." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Annuler" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Arrêter" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "Impossible d’arrêter Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "Le service de montage ne s’est pas arrêté." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "Général" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Rechercher dans Drive" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Actualiser" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Raccourcis clavier" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "Fichiers" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "Nouveau dossier" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Téléverser des fichiers" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Précédent / suivant" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Dossier parent" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Grille / liste" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Renommer" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "Mettre à la corbeille" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Effacer la sélection" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Miniatures plus grandes" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Miniatures plus petites" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Réinitialiser la taille des miniatures" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Tout sélectionner" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Visionneuse de photos" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Photo précédente / suivante" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "Première / dernière photo" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Afficher les détails" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Plein écran" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Fermer" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Sélectionnez un seul élément pour le renommer" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "Tout" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Transferts" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Modifications" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Partage" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Problèmes" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Attention requise" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Réessayer" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Chargement…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Lecture de l’activité récente." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "Impossible de lire l’activité" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Réponse inattendue du service de montage." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Non connecté" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "Le service de montage de Proton Drive n’est pas en cours d’exécution." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Connexion…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "En attente du démarrage du service de montage de Proton Drive." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Aujourd’hui" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Hier" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A %-d %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d %B %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Rien pour l’instant" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" +"Les téléversements, déplacements, partages et autres modifications " +"apparaissent ici au fur et à mesure." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"Un fichier a été modifié à deux endroits en même temps. Choisissez la " +"version à conserver." +msgstr[1] "" +"{n} fichiers ont été modifiés à deux endroits en même temps. Choisissez les " +"versions à conserver." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "Aucune activité correspondante" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Rien dans le journal récent ne correspond à ce filtre." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n} fois depuis {time}" +msgstr[1] "{n} fois depuis {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Résolu" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Résoudre…" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "{name} téléversé" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "{name} téléchargé" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "{name} synchronisé" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "{name} renommé" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "{name} déplacé" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Dossier {name} créé" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "{name} mis à la corbeille" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "{name} restauré" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "{name} supprimé" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Corbeille vidée ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "{name} partagé" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Lien vers {name} créé" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "{name} n’est plus partagé" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Conflit {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Chargement des albums…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Lecture de vos albums Proton Drive." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "Aucune photothèque" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "Photos n’est pas activé pour ce compte Proton." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "Aucun album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Créez-en un avec « Nouvel album » ou dans Proton Photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "Impossible de charger les albums" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "Le service de montage de Proton Drive n’a pas répondu." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} album" +msgstr[1] "{n} albums" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Ouvrir" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Renommer…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Supprimer l’album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Nom de l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Créer" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "Nouvel album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Album créé" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "Impossible de créer l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "Le service de montage n’a pas répondu." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Renommer l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Album renommé" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "Impossible de renommer l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "Supprimer l’album ?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "« {name} » sera supprimé. Ses photos restent dans votre chronologie." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Supprimer" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Album supprimé" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "Impossible de supprimer l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Ajouter à un album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Choisissez un album pour cette photo." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +msgstr[0] "Choisissez un album pour {n} photo." +msgstr[1] "Choisissez un album pour {n} photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "Nouvel album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "Certaines photos n’ont pas pu être ajoutées" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "{n} photo ajoutée à l’album" +msgstr[1] "{n} photos ajoutées à l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "Impossible d’ajouter à l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "Certaines photos n’ont pas pu être retirées de l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "{n} photo retirée de l’album" +msgstr[1] "{n} photos retirées de l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "Impossible de retirer de l’album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} photo · partagé avec moi" +msgstr[1] "{n} photos · partagé avec moi" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} photo" +msgstr[1] "{n} photos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Précédent (Alt+Gauche)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Suivant (Alt+Droite)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "Nouveau dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Téléverser des fichiers…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Téléverser un dossier…" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "Nouveau" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Grille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "Liste" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Nom" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Taille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Dernière modification" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Trier par" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Ordre inversé" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Dossiers en premier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Afficher en liste (Ctrl+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Options de tri et d’affichage" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "Ouvrir dans le gestionnaire de fichiers" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Générer les miniatures" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Actions du dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Annuler la génération des miniatures" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Rechercher uniquement dans ce dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Rendre disponible hors ligne" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Garder en ligne uniquement" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Déplacer vers…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Effacer la sélection (Échap)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Zoom :" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Taille : {n} pixel" +msgstr[1] "Taille : {n} pixels" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Stockage du compte Proton" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "Mes fichiers" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "{n} sélectionné" +msgstr[1] "{n} sélectionnés" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "Impossible de mettre à la corbeille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "Proton Drive n’est pas connecté." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "" +"{n} élément mis à la corbeille — certains n’ont pas pu être déplacés" +msgstr[1] "" +"{n} éléments mis à la corbeille — certains n’ont pas pu être déplacés" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "« {name} » mis à la corbeille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "{n} élément mis à la corbeille" +msgstr[1] "{n} éléments mis à la corbeille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Annuler" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Restauré depuis la corbeille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "{n} élément restauré depuis la corbeille" +msgstr[1] "{n} éléments restaurés depuis la corbeille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "Impossible de restaurer depuis la corbeille" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "Impossible de modifier la disponibilité hors ligne" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} fichier est désormais disponible hors ligne" +msgstr[1] "{n} fichiers sont désormais disponibles hors ligne" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} fichier est désormais en ligne uniquement" +msgstr[1] "{n} fichiers sont désormais en ligne uniquement" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Modifié" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Emplacement" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Ouvrir avec…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Lire" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Disponible hors ligne" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Partager…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Copier le lien" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Déplacer vers…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Versions…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Détails" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "Nouveau dossier…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Tout sélectionner" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "Impossible d’ouvrir le fichier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "« Ouvrir avec » nécessite que le dossier Proton Drive soit monté." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Lien copié" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "Impossible de copier le lien" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "Impossible de lire le média" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "Le chemin du fichier n’est pas en UTF-8 valide." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "Diffusion de « {name} »…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "« {name} » est désormais en ligne uniquement" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "« {name} » est désormais disponible hors ligne" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "Impossible d’enregistrer l’affichage" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Afficher en grille (Ctrl+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "Impossible d’ouvrir le dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "Impossible de générer les miniatures" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Démarrage de la génération des miniatures…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Arrêt de la génération des miniatures…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "Impossible d’annuler la génération des miniatures" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Génération des miniatures arrêtée" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "" +"Le service de montage a cessé de signaler la progression des miniatures." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} dossier" +msgstr[1] "{n} dossiers" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} image" +msgstr[1] "{n} images" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Analyse de {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Génération des miniatures dans {root}… {done} sur {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Miniatures prêtes pour {n} image dans {root}" +msgstr[1] "Miniatures prêtes pour {n} images dans {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "" +"Miniatures prêtes pour {n} image dans {root} ; indisponibles : {failed}" +msgstr[1] "" +"Miniatures prêtes pour {n} images dans {root} ; indisponibles : {failed}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "Nouveau nom" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renommé en « {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "Impossible de renommer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "Déplacer « {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Déplacer {n} élément" +msgstr[1] "Déplacer {n} éléments" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Choisissez le dossier de destination." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Déplacer ici" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "Impossible de lire ce dossier." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "Aucun dossier ici." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "Impossible de déplacer" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "« {name} »" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} élément déplacé vers {place}, mais pas tous" +msgstr[1] "{n} éléments déplacés vers {place}, mais pas tous" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Déplacé vers {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} élément déplacé vers {place}" +msgstr[1] "{n} éléments déplacés vers {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Créer un dossier dans le répertoire actuel." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Nom du dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "« {name} » créé" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "Impossible de créer le dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Téléverser des fichiers" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Téléverser un dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "Impossible de téléverser" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Téléversement…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Téléversement de {n} élément…" +msgstr[1] "Téléversement de {n} éléments…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "Afficher" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Déplacé dans « {name} »" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d %b %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Lecture de ce dossier." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Dossier indisponible" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "Impossible d’ouvrir ce dossier" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "Ce dossier est vide" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Déposez des fichiers ici, ou téléversez un fichier ou créez un dossier pour " +"commencer." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Rechercher partout" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Recherche…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Recherche de « {query} »." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — affichage de {n} premier résultat de recherche" +msgstr[1] "{summary} — affichage des {n} premiers résultats de recherche" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — résultats de recherche" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "Aucun résultat" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "Aucun fichier ni dossier ne correspond à cette recherche." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} fichier" +msgstr[1] "{n} fichiers" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "Cet ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "L’ordinateur sous le nom duquel cette machine est sauvegardée." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Renommer cet ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Autres ordinateurs" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Autres ordinateurs sauvegardés sur ce compte." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Lecture de vos ordinateurs." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Sauvegardé en tant que « {name} »." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Renommer cet ordinateur ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "Aucun autre ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "" +"Les applications de bureau qui se synchronisent avec ce compte apparaissent " +"ici." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Restaurer sur cet ordinateur…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Utiliser l’identité de cet ordinateur…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Retirer l’ordinateur…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · dernière synchronisation : {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · jamais synchronisé" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Ouvrir la synchronisation" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "Gérer les dossiers et le point de montage de cet ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Restaurer des dossiers…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "" +"Aucun dossier sauvegardé pour l’instant — ajoutez-en un sur la page " +"Synchronisation." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} dossier sauvegardé" +msgstr[1] "{n} dossiers sauvegardés" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · gérez-les sur la page Synchronisation" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} requiert votre attention" +msgstr[1] "{folders} · {n} requièrent votre attention" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "synchronisation…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "erreur de synchronisation" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "attention requise" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "à jour" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "recherche de modifications…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "recherche de modifications — {done} sur {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "synchronisation de {done} sur {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "synchronisation de {file} — {done} sur {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Ajouter un dossier à synchroniser" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Synchronisation du dossier…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "Impossible d’ajouter le dossier" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "Impossible de lister les dossiers à restaurer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Cochez les dossiers à synchroniser sur cette machine et ajustez " +"l’emplacement de chacun." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Restaurer des dossiers" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Restaurer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Restauration des dossiers…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "Impossible de restaurer les dossiers" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"Ces dossiers sont sauvegardés depuis « {name} ». Les dossiers restaurés " +"restent synchronisés avec la copie de cet ordinateur." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "Ces dossiers sont sauvegardés sous cet ordinateur dans Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" +"Rien à restaurer — les dossiers de « {name} » sont tous synchronisés ici." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" +"Rien à restaurer — les dossiers de cet ordinateur sont tous synchronisés ici." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "Le dossier va passer en mode à la demande" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "Le dossier va être téléchargé et rester synchronisé" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "Impossible de changer de mode" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"Arrêter la synchronisation de « {path} » ?\n" +"\n" +"Ce dossier est à la demande : ses fichiers résident dans Proton Drive et non " +"sur ce disque, le dossier sera donc vide une fois démonté. Pour conserver " +"une copie locale, annulez, désactivez « À la demande » et attendez la fin du " +"téléchargement avant de le retirer." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"Arrêter la synchronisation de « {path} » ?\n" +"\n" +"Les fichiers locaux restent sur ce disque et ne sont simplement plus " +"synchronisés. Choisissez s’il faut aussi supprimer la copie dans Proton " +"Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Arrêter la synchronisation du dossier" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Supprimer aussi de Proton Drive" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Supprime l’unique copie de ces fichiers." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "La copie locale n’est pas affectée." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Arrêter la synchronisation" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "Synchronisation du dossier arrêtée" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "Impossible d’arrêter la synchronisation du dossier" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Renommer l’ordinateur" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "Renommer « {name} »." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "Impossible de renommer l’ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "Un nom est requis." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Ordinateur renommé" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Saisissez « {name} » pour confirmer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Retirer l’ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"Retirer « {name} » de ce compte ?\n" +"\n" +"Tout ce qu’il a sauvegardé dans Proton Drive est supprimé avec lui. Les " +"fichiers présents sur cet ordinateur ne sont pas touchés — mais cette action " +"ne peut pas être annulée d’ici." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Retirer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Ordinateur retiré" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "Impossible de retirer l’ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Utiliser l’identité de cet ordinateur" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"Traiter cette machine comme « {name} » ?\n" +"\n" +"Les nouveaux dossiers synchronisés sont créés sous cet ordinateur dans " +"Proton Drive, et cette machine conserve cette identité même si son nom " +"d’hôte change. Les dossiers déjà synchronisés ici ne sont pas déplacés.\n" +"\n" +"Utilisez ensuite « Restaurer des dossiers » pour récupérer ce que « {name} » " +"synchronisait." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Utiliser l’identité" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Identité adoptée" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "Impossible d’adopter cet ordinateur" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Ajouter un dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "" +"Sauvegarder un dossier local sur l’appareil Proton Drive de cet ordinateur" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Conflits" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"Fichiers modifiés à deux endroits en même temps. Les deux versions ont été " +"conservées ; choisissez celle qui reste." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "Sur cet ordinateur" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"L’emplacement de Proton Drive sur cette machine. Les dossiers synchronisés " +"conservent une copie complète sur ce disque ; les dossiers à la demande " +"conservent les fichiers uniquement dans Proton Drive et les récupèrent quand " +"vous les ouvrez." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Synchronisation" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "Mettre en pause pendant 1 heure" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "Mettre en pause pendant 8 heures" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "Mettre en pause pendant 24 heures" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Mettre en pause" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" +"Arrêter les téléversements jusqu’à la reprise. Les fichiers s’ouvrent " +"toujours normalement." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Mettre en pause un moment" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Vérification…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Reprendre" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "" +"Téléverser tout ce qui attendait pendant la pause de la synchronisation" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "Impossible de mettre en pause la synchronisation" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "Impossible de reprendre la synchronisation" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Synchronisation reprise" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Synchronisation en pause jusqu’à la reprise" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Synchronisation en pause" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Tout réessayer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Réessayer maintenant toutes les modifications ayant échoué" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "En attente de téléversement" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "" +"Modifications effectuées sur cet ordinateur qui ne sont pas encore sur " +"Proton Drive." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Modifications effectuées sur cet ordinateur qui ne sont pas encore sur " +"Proton Drive. Affichage des {shown} premières sur {n}." +msgstr[1] "" +"Modifications effectuées sur cet ordinateur qui ne sont pas encore sur " +"Proton Drive. Affichage des {shown} premières sur {n}." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Téléverser les modifications" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Téléverser le nouveau fichier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Créer le dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Renommer ou déplacer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "Mettre à la corbeille" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Modification" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "en attente de la fin de l’écriture par l’application" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "nouvelle tentative à {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "en attente de la reprise de la synchronisation" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "prochain dans la file" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "{n} échec : {error}" +msgstr[1] "{n} échecs : {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Réessayer maintenant" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Nouvelle tentative…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "Impossible de réessayer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, modification : {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "L’original a disparu ; seule cette copie subsiste" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Même contenu que l’original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Diffère de {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"« {name} » a été modifié ici et ailleurs en même temps.\n" +"\n" +"Original : {original}\n" +"Copie : {copy}\n" +"\n" +"Ce qui n’est pas conservé est placé dans la corbeille, d’où il peut être " +"restauré." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"L’original « {name} » n’existe plus ; seule la copie subsiste ({copy}).\n" +"\n" +"Conservez la copie pour lui redonner le nom d’origine." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Résoudre le conflit" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Nom de la copie, si les deux sont conservés" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Conserver l’original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Conserver les deux" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Conserver la copie" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "Impossible de résoudre le conflit" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "Lecture des emplacements Proton Drive de cet ordinateur." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "Indisponible" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "Aucun emplacement" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "Le service de montage n’a pas encore signalé de point de montage." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Lecture seule" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Ouvrir ce dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Modifier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Choisir un autre dossier pour le montage Proton Drive" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Reprendre la synchronisation de ce dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Mettre en pause la synchronisation de ce dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Synchroniser ce dossier maintenant" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"À la demande : libérez de l’espace sur ce disque en conservant les fichiers " +"uniquement dans Proton Drive et en récupérant chacun à son ouverture. " +"Désactivez pour les retélécharger et conserver une copie locale complète." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Arrêter la synchronisation de ce dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "Passer le dossier en mode à la demande ?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"Les fichiers de {path} seront retirés de cet ordinateur et conservés " +"uniquement dans Proton Drive. Chaque fichier sera à nouveau téléchargé à son " +"ouverture." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Passer à la demande" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "Impossible de mettre en pause le dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "Impossible de reprendre le dossier" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Dossier en pause" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Dossier repris" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "Impossible de synchroniser" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Dossier partagé" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Passage en mode à la demande" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Passage en mode synchronisé" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "À la demande" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Synchronisé" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "en pause" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "non monté" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Se connecter à Proton" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Utilisez votre compte Proton pour connecter Drive." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "Adresse électronique ou nom d’utilisateur" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Mot de passe" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Se connecter" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Créer un compte" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "Mot de passe oublié ?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "Saisissez votre adresse électronique et votre mot de passe." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Connexion…" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Terminez la vérification pour continuer…" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "connexion annulée" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "" +"Trop de tentatives de connexion. Patientez quelques minutes et réessayez." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" +"Impossible de joindre Proton. Vérifiez votre connexion Internet et réessayez." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Connecté, mais la session n’a pas pu être enregistrée dans le trousseau du " +"système. Assurez-vous qu’un trousseau (GNOME Keyring ou KWallet) est en " +"cours d’exécution et déverrouillé." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "Connexion annulée : aucun code à deux facteurs n’a été saisi." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Connexion annulée : la vérification n’a pas été terminée. Reconnectez-vous " +"pour en obtenir une nouvelle." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Échec de la connexion : {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Authentification à deux facteurs" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" +"Saisissez le code de votre application d’authentification ou l’un de vos " +"codes de récupération." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Code d’authentification" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Confirmer" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "Se déconnecter ?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"Proton Drive va se déconnecter et arrêter la synchronisation jusqu’à ce que " +"vous vous reconnectiez. Les fichiers déjà présents sur cet ordinateur " +"restent en place." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "Afficher {name}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "Afficher le fichier RAW" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "Afficher la vidéo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "Afficher la photo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "Impossible d’afficher cette photo." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +msgid "Couldn't reach Proton Drive." +msgstr "Impossible de joindre Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:345 +msgid "Reading photo details…" +msgstr "Lecture des détails de la photo…" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Taille" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "Cette photo ne contient aucune métadonnée." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Dimensions" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Prise de vue" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Appareil photo" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Objectif" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Exposition" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Lieu" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Enregistrer une copie" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "« {name} » enregistré" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "Impossible d’enregistrer la copie" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "La copie a été interrompue." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} sur {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} sur {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Photo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Précédente (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Suivante (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Ajouter aux favoris" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Autres fichiers de cette photo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Enregistrer une copie…" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "Mettre à la corbeille (Suppr)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Fermer (Échap)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Afficher sur la carte" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Masquer les détails" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "Impossible de modifier le favori" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Téléverser des photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Aller à un mois" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Retour aux albums" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Téléverser" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Importer une archive Google Takeout de Google Photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Sélectionner des photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Ajouter à un album…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Quitter la sélection (Échap)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Afficher uniquement les favoris" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "Toutes les dates" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Chronologie" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Albums" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Importation depuis Google Photos…" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Sélectionner une photo à téléverser" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Images" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Photo téléversée" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "Impossible de téléverser la photo" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "Mettre cette photo à la corbeille ?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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] "" +"Mettre cette photo à la corbeille ? Elle est stockée sous forme de {n} " +"fichier." +msgstr[1] "" +"Mettre cette photo à la corbeille ? Elle est stockée sous forme de {n} " +"fichiers." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1551 +#, 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:1558 +#, 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] "" +"Mettre {n} photo à la corbeille ? Elle est stockée sous forme de {files} " +"fichiers." +msgstr[1] "" +"Mettre {n} photos à la corbeille ? Elles sont stockées sous forme de {files} " +"fichiers." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1616 +msgid "The server refused." +msgstr "Le serveur a refusé." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "{n} photo mise à la corbeille" +msgstr[1] "{n} photos mises à la corbeille" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%d/%m/%Y %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Date inconnue" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Favori" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Sélectionner" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Retirer de l’album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "Mettre à la corbeille…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Ajoutée aux favoris" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Retirée des favoris" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Chargement des photos…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Lecture de votre chronologie Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Album vide" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "Cet album ne contient aucune photo." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "Impossible de charger plus de photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "Impossible de charger les photos" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "Ajouter un signet — enregistrez un lien public pour l’ouvrir d’ici" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Invitations" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Acceptez pour ajouter l’élément à vos fichiers partagés." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Signets" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Retour" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Partagés avec moi" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Lecture de vos éléments partagés." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Lecture de ce dossier partagé." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "Impossible d’ouvrir le dossier partagé" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Invitations ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "Ce dossier est vide." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "Afficher dans Mes fichiers" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Quitter…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"La signature de l’invitation ne correspond pas aux clés de l’expéditeur. " +"Elle ne provient peut-être pas vraiment de cette personne." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Lecteur" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Éditeur" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Administrateur" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Peut consulter" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Peut modifier" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Peut gérer" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "Téléchargement de « {name} »…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "Rien n’est partagé avec vous" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"Les fichiers et dossiers que d’autres personnes partagent avec vous " +"apparaissent ici. Les liens publics que vous ajoutez en signet y sont " +"également conservés." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Partagés avec vous" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "un élément partagé" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "De {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Refuser" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Accepter" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "cet élément" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "Refuser l’invitation ?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "Vous n’aurez plus accès à {name}, sauf s’il est partagé à nouveau." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Lien partagé" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Retirer le signet" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Ouvrir dans le navigateur" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Invitation acceptée" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "Impossible d’accepter l’invitation" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Invitation refusée" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "Impossible de refuser l’invitation" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Quitter l’élément partagé" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "" +"Quitter « {name} » ? Vous perdrez l’accès jusqu’à ce que vous soyez invité à " +"nouveau." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Quitter" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Élément partagé quitté" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "Impossible de quitter l’élément partagé" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "Retirer le signet de « {name} » ?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Signet retiré" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "Impossible de retirer le signet" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Ajouter un signet" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "Collez un lien public Proton Drive pour l’enregistrer ici." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "URL du lien public" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Mot de passe (si le lien en a un)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Ajouter" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "Impossible d’ajouter le signet" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "Une URL est requise." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Signet enregistré" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "Impossible d’ajouter le signet" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Partagés par moi" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Lecture de ce que vous avez partagé." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "Impossible de lire vos partages" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Rien de partagé pour l’instant" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "" +"Les éléments que vous partagez avec des personnes ou par lien apparaissent " +"ici." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Copier le lien" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Ouvrir le lien" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Gérer l’accès…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Arrêter le partage…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "Arrêter le partage ?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Toutes les personnes invitées perdent l’accès à « {name} », les invitations " +"en attente sont retirées et son lien public cesse de fonctionner." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Arrêter le partage" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "Partage de {name} arrêté" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "Impossible d’arrêter le partage" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} personne" +msgstr[1] "{n} personnes" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "{n} en attente" +msgstr[1] "{n} en attente" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Lien public" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Partagé" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Démarrage" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Démarrer à l’ouverture de session" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Connecter automatiquement Proton Drive lorsque vous ouvrez une session" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Dossier Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Modifier…" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Réseau" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" +"Limiter la vitesse de transfert des fichiers, partagée entre tous les " +"transferts. 0 signifie aucune limite." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Limite de téléversement (Mio/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Limite de téléchargement (Mio/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Apparence" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Couleur d’accentuation violet Proton" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "" +"Utiliser la couleur de la marque Proton au lieu de la couleur d’accentuation " +"du système" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Afficher l’icône de la zone de notification" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "État de la synchronisation et actions rapides dans le panneau" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "Fichiers épinglés et récemment ouverts, conservés sur cet ordinateur." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Taille maximale du cache (Gio)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" +"Les fichiers les plus anciens sont supprimés au-delà de cette taille ; 0 " +"signifie aucune limite" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Vider le cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "" +"Supprimer les copies en cache. Les fichiers disponibles hors ligne sont " +"conservés." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Vider…" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "Fichiers conservés sur cet ordinateur, même sans connexion." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Stockage" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Afficher l’état de la synchronisation" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Se déconnecter…" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Compte" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "Par défaut du système" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Langue" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Prend effet au prochain démarrage de Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Transferts" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "Fichiers en cours de transfert vers et depuis Proton Drive." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Budget du cache mis à jour" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "Impossible de définir le budget du cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Limites de bande passante mises à jour" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "Impossible de définir les limites de bande passante" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "Vider le cache ?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"Les copies en cache sont supprimées de cet ordinateur et seront à nouveau " +"téléchargées à leur ouverture. Les fichiers disponibles hors ligne sont " +"conservés." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Vider le cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Cache vidé" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "Impossible de vider le cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "Impossible d’enregistrer la couleur d’accentuation" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "Impossible d’enregistrer le réglage de la zone de notification" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "Impossible d’enregistrer la langue" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Redémarrez Proton Drive pour utiliser la nouvelle langue" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Choisir le dossier du point de montage" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "Impossible d’enregistrer le point de montage" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Redémarrer pour appliquer" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" +"Le point de montage est désormais « {path} ». Redémarrer le montage Drive " +"pour l’utiliser ?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Plus tard" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Redémarrer maintenant" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "{size} utilisés" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "{used} utilisés sur {total} ({percent} %)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "{size} libres" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "{free} libres sur {total} ({percent} % utilisés)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Proton Drive connecté" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Votre Drive est monté et disponible." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Proton Drive déconnecté" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" +"Le service de montage s’est arrêté. Les fichiers ne sont pas disponibles " +"tant qu’il n’a pas redémarré." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Synchronisation terminée" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "Le transfert de {n} fichier est terminé." +msgstr[1] "Le transfert de {n} fichiers est terminé." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title} — {done} sur {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title} — {detail} ({done} sur {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title}…" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title} — {detail}…" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name} — {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name} — {done} sur {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · reprise {time}" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Reprise {time}" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Jusqu’à la reprise" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} modification requiert votre attention" +msgstr[1] "{n} modifications requièrent votre attention" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Hors ligne" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Fichiers en cache uniquement" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Synchronisation" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "À jour" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "Proton Drive n’est pas en cours d’exécution" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "plus tard" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "à %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "%a %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "%e %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "Aucun fichier disponible hors ligne" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "" +"Faites un clic droit sur un fichier et choisissez « Rendre disponible hors " +"ligne »." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "Impossible de le garder en ligne uniquement" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Afficher moins" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "Afficher {n} fichier" +msgstr[1] "Afficher les {n} fichiers" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Les photos déjà présentes dans Proton Photos sont reconnues par leur nom et " +"leur contenu, puis ignorées : relancer une importation interrompue est donc " +"sans risque." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Retour aux photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "Ajouter une archive Google Takeout à votre chronologie Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Déposez ici vos fichiers .zip Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Ajoutez toutes les parties de l’archive en même temps — une photo et ses " +"métadonnées se trouvent souvent dans des parties différentes." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Choisir des fichiers…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Archives à importer" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Effacer" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Retirer toutes les archives ajoutées" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Analyser" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" +"Vérifier les archives et indiquer ce qui serait importé, sans rien téléverser" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Importer" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Arrêter l’importation" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "" +"Terminer la photo en cours d’envoi, classer ce qui a été téléversé, puis " +"s’arrêter" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Importation en cours" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Dernière importation" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Sélectionnez vos archives Google Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Archives Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "Importer cette archive ?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"{n} archive sera téléversée vers Proton Photos, en créant les albums tels " +"qu’ils figurent dans l’archive. Cela peut prendre des heures ; vous pouvez " +"l’arrêter à tout moment et ce qui a été téléversé est conservé. Les photos " +"que vous avez déjà sont ignorées." +msgstr[1] "" +"{n} archives seront téléversées vers Proton Photos, en créant les albums " +"tels qu’ils figurent dans l’archive. Cela peut prendre des heures ; vous " +"pouvez l’arrêter à tout moment et ce qui a été téléversé est conservé. Les " +"photos que vous avez déjà sont ignorées." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Arrêt de l’importation…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "Impossible d’arrêter l’importation" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Seuls les fichiers .zip Takeout peuvent être importés — les dossiers " +"extraits ne sont pas pris en charge." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "{n} archive ajoutée" +msgstr[1] "{n} archives ajoutées" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "Aucune archive ajoutée pour l’instant." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Retirer de cette importation" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} archive, {size} au total. {note}" +msgstr[1] "{n} archives, {size} au total. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Lecture des archives…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Démarrage de l’importation…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Analyse de l’archive…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "" +"Importation démarrée — vous pouvez quitter cette page, elle se poursuit." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "Impossible de démarrer l’importation" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Analyse terminée" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Importation terminée" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "{n} photo ajoutée, {failed} en échec." +msgstr[1] "{n} photos ajoutées, {failed} en échec." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Arrêtée après {n} photo." +msgstr[1] "Arrêtée après {n} photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "{n} photo ajoutée à Proton Photos." +msgstr[1] "{n} photos ajoutées à Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "L’importation depuis Google Photos est terminée." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Résultat de l’analyse" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "Rien n’a été téléversé — voici ce que ferait une importation." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Arrêtée prématurément. Tout ce qui a été téléversé jusqu’ici est dans votre " +"chronologie ; relancez-la pour reprendre là où elle s’est arrêtée." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Terminé." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Photos dans l’archive" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "À téléverser" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Téléversées" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Déjà dans Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Albums à créer" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Albums créés" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "Photos classées dans des albums" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Ignorées (dans la corbeille de Google)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Données à téléverser" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Données téléversées" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Échec" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} sur {total} — {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Traitement…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Vider la corbeille…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Supprimer définitivement tout le contenu de la corbeille" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Restaurer" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Supprimer définitivement…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Restaurer dans son dossier d’origine" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Supprimer définitivement" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Dossier" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "{n} élément sélectionné" +msgstr[1] "{n} éléments sélectionnés" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "Lecture de la corbeille." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "Impossible de lire la corbeille" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "La corbeille est vide" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Les éléments que vous supprimez de Proton Drive apparaissent ici." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} élément" +msgstr[1] "{n} éléments" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "« {name} » restauré" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "{n} élément restauré" +msgstr[1] "{n} éléments restaurés" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "Impossible de restaurer" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "Supprimer définitivement « {name} » ? Cette action est irréversible." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "« {name} » supprimé définitivement" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "" +"Supprimer définitivement {n} élément ? Cette action est irréversible." +msgstr[1] "" +"Supprimer définitivement {n} éléments ? Cette action est irréversible." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "{n} élément supprimé définitivement" +msgstr[1] "{n} éléments supprimés définitivement" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Supprimer définitivement" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "Impossible de supprimer" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Vider la corbeille" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +"Supprimer définitivement {n} élément de la corbeille ? Cette action est " +"irréversible." +msgstr[1] "" +"Supprimer définitivement les {n} éléments de la corbeille ? Cette action est " +"irréversible." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Corbeille vidée" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "Impossible de vider la corbeille" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Vérification" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Détails (Alt+Entrée)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Fermer les détails" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Informations" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "Conserver une copie sur cet ordinateur, même sans connexion." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Partage" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Accès" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Versions" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "Historique" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "Aucun élément sélectionné" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Sélectionnez un fichier ou un dossier pour afficher ses détails." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "Fichier" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Ouvrir le dossier" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "Impossible de charger le partage" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "Impossible de charger les versions" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Vous uniquement" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Toute personne disposant du lien" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Partagé avec {n} personne" +msgstr[1] "Partagé avec {n} personnes" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Partagé avec {n} personne · Lien public" +msgstr[1] "Partagé avec {n} personnes · Lien public" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "Aucune version antérieure" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 version · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} version · dernière : {date}" +msgstr[1] "{n} versions · dernière : {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "Plus" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Jamais" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 jour" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 jours" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 jours" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "Partage impossible" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Partager" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Inviter des personnes" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "" +"Adresses électroniques Proton ou non, séparées par des espaces ou des " +"virgules." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "Adresses électroniques" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Rôle" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Message (facultatif)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Envoyer les invitations" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "Personnes ayant accès" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "« {text} » n’est pas une adresse électronique" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Invitations envoyées" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "Impossible d’envoyer les invitations" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "Personne d’autre n’a encore accès." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Membre" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Invité (en attente)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Invité (externe, en attente)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Rôle mis à jour" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "Impossible de mettre à jour le rôle" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Retirer l’accès" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "Retirer l’accès ?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} ne pourra plus ouvrir cet élément." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Accès retiré" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "Impossible de retirer l’accès" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Toute personne disposant du lien ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "protégé par mot de passe" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Supprimer le lien" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "Supprimer le lien public ?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"Le lien cesse de fonctionner pour toutes les personnes qui l’ont. Un nouveau " +"lien aura une adresse différente." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Supprimer le lien" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Lien public supprimé" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "Impossible de supprimer le lien" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Rôle du lien" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Mot de passe (facultatif)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Expiration" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Créer un lien public" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Lien public créé" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "Impossible de créer le lien" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "expiré" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "expire le {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "Impossible de charger les versions" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "Aucune version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Les dossiers n’ont pas de versions." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Historique des versions" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" +"Proton Drive conserve les versions antérieures d’un fichier jusqu’à ce que " +"vous les supprimiez." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "Aucune version antérieure." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Version actuelle" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Enregistrer une copie…" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Restaurer cette version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Supprimer définitivement cette version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Restaurer la version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"Faire de cette version le contenu actuel de « {name} » ? La version " +"remplacée reste dans l’historique." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Restauration de cette version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "Impossible de restaurer cette version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Supprimer la version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "" +"Supprimer définitivement cette version ? Son contenu ne pourra pas être " +"récupéré." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Supprimer" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Version supprimée" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "Impossible de supprimer cette version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Enregistrer la version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "Impossible d’enregistrer cette version" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "Cet emplacement n’est pas un fichier local." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Version enregistrée" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive : {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Rechercher dans Drive › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(aucun résultat pour « {query} »)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(aucun fichier épinglé — tapez pour rechercher)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(impossible de déterminer les répertoires de l’application)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} téléversement en attente" +msgstr[1] "{n} téléversements en attente" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} modification en attente" +msgstr[1] "{n} modifications en attente" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} téléversement" +msgstr[1] "{n} téléversements" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} modification" +msgstr[1] "{n} modifications" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "{uploads} et {changes} en attente" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} fichier dans {dir}" +msgstr[1] "{n} fichiers dans {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} sur {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ {n} en téléchargement" +msgstr[1] "↓ {n} en téléchargement" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ {n} en téléversement" +msgstr[1] "↑ {n} en téléversement" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Monté sur {mountpoint} ({n} épinglé)" +msgstr[1] "Monté sur {mountpoint} ({n} épinglés)" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Synchronisation — {queued} ({n} épinglé)" +msgstr[1] "Synchronisation — {queued} ({n} épinglés)" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Hors ligne — fichiers en cache uniquement ({n} épinglé)" +msgstr[1] "Hors ligne — fichiers en cache uniquement ({n} épinglés)" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Hors ligne — {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Montage : réponse inattendue du démon" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Connecté en tant que {username} — non monté" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Non connecté" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Erreur : {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} problème — Afficher" +msgstr[1] "{n} problèmes — Afficher" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Se connecter…" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Ouvrir Proton Drive" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Ouvrir le dossier" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Reprendre la synchronisation" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Mettre en pause la synchronisation" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Connecter" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Masquer l’icône de la zone de notification" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Arrêter Proton Drive…" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Quitter" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "Tout" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Dossiers" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Médias" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "Mes fichiers / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Rechercher dans Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "Rechercher dans Drive et sur cet ordinateur" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Échap" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Meilleurs résultats" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "Aucun résultat" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "Proton Drive n’est pas en cours d’exécution" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "" +"Démarrez le démon de montage pour effectuer une recherche dans votre Drive." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ naviguer · ↵ ouvrir · Tab filtrer" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Démon hors ligne" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "Épinglé dans Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Rechercher dans votre Drive" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "" +"Indexation de cet ordinateur en cours — les résultats locaux vont bientôt " +"apparaître." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Essayez une autre recherche ou un autre filtre." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" +"Commencez à taper pour rechercher dans Proton Drive et dans les fichiers de " +"cet ordinateur." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "Aucun fichier épinglé" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} fichier épinglé" +msgstr[1] "{n} fichiers épinglés" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} dans Drive · {local} sur cet ordinateur · indexation…" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} dans Drive · {local} sur cet ordinateur" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "Ouverture de {name}…" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "Impossible d’ouvrir : {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "Impossible de joindre le démon" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Dossier personnel" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Dossier personnel / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} Go" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} Mo" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} Ko" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} o" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "maintenant" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count} min" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count} h" + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count} j" + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count} mois" + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count} a" + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "impossible de joindre le démon Proton Drive : {error}" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..30868f6 --- /dev/null +++ b/po/it.po @@ -0,0 +1,4693 @@ +# Italian translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: Italian\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "I miei file" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Foto" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Condivisi con me" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Condivisi da me" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Computer" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Cestino" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Sincronizzazione" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Attività" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Aggiorna (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what}: {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "Sei offline" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "Non esiste più" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "Non hai accesso a questo elemento" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "È stato modificato prima da qualcos'altro" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Il tuo Proton Drive è pieno" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Preferenze" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Scorciatoie da tastiera" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "Informazioni su Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Menu principale" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Proton Drive con file su richiesta per il desktop Linux.\n" +"\n" +"Client non ufficiale: non affiliato, approvato né supportato da Proton AG." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Collaboratori di Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "Arrestare Proton Drive?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"Il disco viene smontato e nulla viene sincronizzato finché non ti " +"riconnetti. Proton Drive si riavvierà al prossimo accesso." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Annulla" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Arresta" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "Impossibile arrestare Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "Il servizio di montaggio non si è arrestato." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "Generale" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Cerca in Drive" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Aggiorna" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Scorciatoie da tastiera" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "File" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "Nuova cartella" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Carica file" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Indietro / avanti" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Cartella superiore" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Griglia / elenco" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Rinomina" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "Sposta nel cestino" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Annulla la selezione" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Miniature più grandi" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Miniature più piccole" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Ripristina la dimensione delle miniature" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Seleziona tutto" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Visualizzatore di foto" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Foto precedente / successiva" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "Prima / ultima foto" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Mostra dettagli" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Schermo intero" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Chiudi" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Seleziona un solo elemento per rinominarlo" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "Tutto" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Trasferimenti" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Modifiche" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Condivisione" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Problemi" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Richiede attenzione" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Riprova" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Caricamento…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Lettura delle attività recenti." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "Impossibile leggere le attività" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Risposta inattesa dal servizio di montaggio." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Non connesso" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "Il servizio di montaggio di Proton Drive non è in esecuzione." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Connessione…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "In attesa dell'avvio del servizio di montaggio di Proton Drive." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Oggi" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Ieri" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A %-d %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d %B %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Ancora niente" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" +"Caricamenti, spostamenti, condivisioni e altre modifiche appaiono qui non " +"appena avvengono." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"Un file è stato modificato in due posti contemporaneamente. Scegli quale " +"versione mantenere." +msgstr[1] "" +"{n} file sono stati modificati in due posti contemporaneamente. Scegli quali " +"versioni mantenere." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "Nessuna attività corrispondente" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Nessuna voce del registro recente corrisponde a questo filtro." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n} volta da {time}" +msgstr[1] "{n} volte da {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Risolto" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Risolvi…" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "Caricato {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "Scaricato {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "Sincronizzato {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "Rinominato {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "Spostato {name}" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Creata la cartella {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "Spostato nel cestino {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "Ripristinato {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "Eliminato {name}" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Cestino svuotato ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "Condiviso {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Creato un collegamento a {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "Condivisione rimossa per {name}" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Conflitto {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Caricamento degli album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Lettura degli album di Proton Drive." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "Nessuna libreria di foto" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "Questo account Proton non ha Foto abilitato." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "Nessun album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Creane uno con Nuovo album oppure in Proton Photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "Impossibile caricare gli album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "Il servizio di montaggio di Proton Drive non ha risposto." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} album" +msgstr[1] "{n} album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Apri" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Rinomina…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Elimina album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Nome dell'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Crea" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "Nuovo album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Album creato" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "Impossibile creare l'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "Il servizio di montaggio non ha risposto." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Rinomina album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Album rinominato" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "Impossibile rinominare l'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "Eliminare l'album?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "“{name}” verrà eliminato. Le sue foto restano nella cronologia." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Elimina" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Album eliminato" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "Impossibile eliminare l'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Aggiungi all'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Scegli un album per questa foto." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +msgstr[0] "Scegli un album per {n} foto." +msgstr[1] "Scegli un album per {n} foto." + +#: crates/pdfs-gui/src/app/pages/albums.rs:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "Nuovo album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "Non è stato possibile aggiungere alcune foto" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "{n} foto aggiunta all'album" +msgstr[1] "{n} foto aggiunte all'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "Impossibile aggiungere all'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "Non è stato possibile rimuovere alcune foto dall'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "{n} foto rimossa dall'album" +msgstr[1] "{n} foto rimosse dall'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "Impossibile rimuovere dall'album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} foto · condiviso con me" +msgstr[1] "{n} foto · condiviso con me" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} foto" +msgstr[1] "{n} foto" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Indietro (Alt+Sinistra)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Avanti (Alt+Destra)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "Nuova cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Carica file…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Carica cartella…" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "Nuovo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Griglia" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "Elenco" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Nome" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Dimensione" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Ultima modifica" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Ordina per" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Ordine inverso" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Prima le cartelle" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Mostra come elenco (Ctrl+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Opzioni di ordinamento e visualizzazione" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "Apri nel gestore di file" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Genera miniature" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Azioni sulla cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Annulla la generazione delle miniature" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Cerca solo in questa cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Rendi disponibile offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Rendi solo online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Sposta in…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Annulla la selezione (Esc)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Zoom:" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Dimensione: {n} pixel" +msgstr[1] "Dimensione: {n} pixel" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Spazio di archiviazione dell'account Proton" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "I miei file" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "{n} selezionato" +msgstr[1] "{n} selezionati" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "Impossibile spostare nel cestino" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "Proton Drive non è connesso." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "" +"{n} elemento spostato nel cestino; non è stato possibile spostarne alcuni" +msgstr[1] "" +"{n} elementi spostati nel cestino; non è stato possibile spostarne alcuni" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "“{name}” spostato nel cestino" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "{n} elemento spostato nel cestino" +msgstr[1] "{n} elementi spostati nel cestino" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Annulla" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Ripristinato dal cestino" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "{n} elemento ripristinato dal cestino" +msgstr[1] "{n} elementi ripristinati dal cestino" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "Impossibile ripristinare dal cestino" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "Impossibile modificare la disponibilità offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} file è ora disponibile offline" +msgstr[1] "{n} file sono ora disponibili offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} file è ora solo online" +msgstr[1] "{n} file sono ora solo online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Modificato" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Posizione" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Apri con…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Riproduci" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Disponibile offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Condividi…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Copia collegamento" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Sposta in…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Versioni…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Dettagli" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "Nuova cartella…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Seleziona tutto" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "Impossibile aprire il file" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "Apri con richiede che la cartella di Proton Drive sia montata." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Collegamento copiato" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "Impossibile copiare il collegamento" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "Impossibile riprodurre il contenuto multimediale" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "Il percorso del file non è UTF-8 valido." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "Streaming di “{name}”…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "“{name}” è ora solo online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "“{name}” è ora disponibile offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "Impossibile salvare la visualizzazione" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Mostra come griglia (Ctrl+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "Impossibile aprire la cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "Impossibile generare le miniature" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Avvio della generazione delle miniature…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Arresto della generazione delle miniature…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "Impossibile annullare la generazione delle miniature" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Generazione delle miniature arrestata" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "" +"Il servizio di montaggio ha smesso di comunicare l'avanzamento delle " +"miniature." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} cartella" +msgstr[1] "{n} cartelle" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} immagine" +msgstr[1] "{n} immagini" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Analisi di {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Generazione delle miniature in {root}… {done} di {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Miniature pronte per {n} immagine in {root}" +msgstr[1] "Miniature pronte per {n} immagini in {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "" +"Miniature pronte per {n} immagine in {root}; {failed} non disponibili" +msgstr[1] "" +"Miniature pronte per {n} immagini in {root}; {failed} non disponibili" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "Nuovo nome" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Rinominato in “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "Impossibile rinominare" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "Sposta “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Sposta {n} elemento" +msgstr[1] "Sposta {n} elementi" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Scegli la cartella di destinazione." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Sposta qui" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "Impossibile leggere questa cartella." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "Nessuna cartella qui." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "Impossibile spostare" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} elemento spostato in {place}, ma non tutti" +msgstr[1] "{n} elementi spostati in {place}, ma non tutti" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Spostato in {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} elemento spostato in {place}" +msgstr[1] "{n} elementi spostati in {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Crea una cartella nella directory corrente." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Nome della cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "“{name}” creata" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "Impossibile creare la cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Carica file" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Carica cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "Impossibile caricare" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Caricamento…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Caricamento di {n} elemento…" +msgstr[1] "Caricamento di {n} elementi…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "Visualizza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Spostato in “{name}”" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d %b %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Lettura di questa cartella." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Cartella non disponibile" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "Impossibile aprire questa cartella" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "Questa cartella è vuota" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Trascina qui dei file, oppure carica un file o crea una cartella per " +"iniziare." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Cerca ovunque" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Ricerca…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Ricerca di “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary}: visualizzato il primo {n} risultato della ricerca" +msgstr[1] "{summary}: visualizzati i primi {n} risultati della ricerca" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary}: risultati della ricerca" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "Nessuna corrispondenza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "Nessun file o cartella corrisponde alla ricerca." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} file" +msgstr[1] "{n} file" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "Questo computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "Il computer con cui questa macchina esegue il backup." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Rinomina questo computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Altri computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Altri computer che eseguono il backup su questo account." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Lettura dei computer." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Backup come “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Rinomina questo computer ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "Nessun altro computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "Le app desktop che sincronizzano con questo account appaiono qui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Ripristina su questo computer…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Usa l'identità di questo computer…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Rimuovi computer…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · ultima sincronizzazione {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · mai sincronizzato" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Apri Sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "Gestisci le cartelle e il punto di montaggio di questo computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Ripristina cartelle…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "" +"Nessuna cartella ancora sottoposta a backup: aggiungine una nella pagina " +"Sincronizzazione." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} cartella sottoposta a backup" +msgstr[1] "{n} cartelle sottoposte a backup" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · gestiscile nella pagina Sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} richiede attenzione" +msgstr[1] "{folders} · {n} richiedono attenzione" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "sincronizzazione…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "errore di sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "richiede attenzione" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "aggiornato" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "controllo delle modifiche…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "controllo delle modifiche: {done} di {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "sincronizzazione {done} di {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "sincronizzazione di {file}: {done} di {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Aggiungi cartella da sincronizzare" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Sincronizzazione della cartella…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "Impossibile aggiungere la cartella" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "Impossibile elencare le cartelle da ripristinare" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Seleziona le cartelle da sincronizzare su questa macchina e regola dove deve " +"trovarsi ciascuna." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Ripristina cartelle" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Ripristina" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Ripristino delle cartelle…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "Impossibile ripristinare le cartelle" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"Queste cartelle sono sottoposte a backup da “{name}”. Le cartelle " +"ripristinate continuano a sincronizzarsi con la copia di quel computer." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "" +"Queste cartelle sono sottoposte a backup sotto questo computer in Proton " +"Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" +"Niente da ripristinare: le cartelle di “{name}” sono già tutte sincronizzate " +"qui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" +"Niente da ripristinare: le cartelle di questo computer sono già tutte " +"sincronizzate qui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "La cartella passerà alla modalità su richiesta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "La cartella verrà scaricata e resterà sincronizzata" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "Impossibile cambiare modalità" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"Interrompere la sincronizzazione di “{path}”?\n" +"\n" +"Questa cartella è su richiesta: i suoi file si trovano in Proton Drive, non " +"su questo disco, quindi la cartella sarà vuota una volta smontata. Per " +"conservare una copia locale, annulla, disattiva Su richiesta e attendi il " +"completamento del download prima di rimuoverla." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"Interrompere la sincronizzazione di “{path}”?\n" +"\n" +"I file locali restano su questo disco e semplicemente smettono di essere " +"sincronizzati. Scegli se eliminare anche la copia in Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Interrompi la sincronizzazione della cartella" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Elimina anche da Proton Drive" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Elimina l'unica copia di questi file." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "La copia locale non viene modificata." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Interrompi sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "Sincronizzazione della cartella interrotta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "Impossibile interrompere la sincronizzazione della cartella" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Rinomina computer" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "Rinomina “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "Impossibile rinominare il computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "È richiesto un nome." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Computer rinominato" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Digita “{name}” per confermare" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Rimuovi computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"Rimuovere “{name}” da questo account?\n" +"\n" +"Tutto ciò di cui ha eseguito il backup su Proton Drive viene eliminato " +"insieme a esso. I file su quel computer non vengono toccati, ma questa " +"operazione non può essere annullata da qui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Rimuovi" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Computer rimosso" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "Impossibile rimuovere il computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Usa l'identità di questo computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"Trattare questa macchina come “{name}”?\n" +"\n" +"Le nuove cartelle sincronizzate vengono create sotto quel computer in Proton " +"Drive e questa macchina mantiene quell'identità anche se il suo nome host " +"cambia. Le cartelle già sincronizzate qui non vengono spostate.\n" +"\n" +"Usa poi “Ripristina cartelle” per recuperare ciò che “{name}” stava " +"sincronizzando." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Usa identità" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Identità adottata" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "Impossibile adottare quel computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Aggiungi cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "" +"Esegui il backup di una cartella locale sul dispositivo Proton Drive di " +"questo computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Conflitti" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"File modificati in due posti contemporaneamente. Entrambe le versioni sono " +"state conservate: scegli quale mantenere." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "Su questo computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"Dove si trova Proton Drive su questa macchina. Le cartelle sincronizzate " +"mantengono una copia completa su questo disco; le cartelle su richiesta " +"mantengono i file solo in Proton Drive e li scaricano quando li apri." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "Pausa per 1 ora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "Pausa per 8 ore" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "Pausa per 24 ore" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Metti in pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" +"Interrompe i caricamenti finché non riprendi. I file si aprono comunque come " +"di consueto." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Metti in pausa per un po'" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Controllo…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Riprendi" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "" +"Carica tutto ciò che era in attesa mentre la sincronizzazione era in pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "Impossibile mettere in pausa la sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "Impossibile riprendere la sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Sincronizzazione ripresa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Sincronizzazione in pausa finché non riprendi" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Sincronizzazione in pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Riprova tutto" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Riprova ora tutte le modifiche non riuscite" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "In attesa di caricamento" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "" +"Modifiche fatte su questo computer che non sono ancora su Proton Drive." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Modifiche fatte su questo computer che non sono ancora su Proton Drive. " +"Visualizzate le prime {shown} di {n}." +msgstr[1] "" +"Modifiche fatte su questo computer che non sono ancora su Proton Drive. " +"Visualizzate le prime {shown} di {n}." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Carica modifiche" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Carica nuovo file" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Crea cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Rinomina o sposta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "Sposta nel cestino" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Modifica" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "in attesa che l'app che lo scrive finisca" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "nuovo tentativo alle {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "in attesa della ripresa della sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "il prossimo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "Non riuscito {n} volta: {error}" +msgstr[1] "Non riuscito {n} volte: {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Riprova ora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Nuovo tentativo in corso…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "Impossibile riprovare" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, modificato {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "L'originale non esiste più; rimane solo questa copia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Stesso contenuto dell'originale" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Diverso da {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"“{name}” è stato modificato qui e altrove nello stesso momento.\n" +"\n" +"Originale: {original}\n" +"Copia: {copy}\n" +"\n" +"Ciò che non viene mantenuto va nel cestino, da cui può essere ripristinato." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"L'originale “{name}” non esiste più; rimane solo la copia ({copy}).\n" +"\n" +"Mantieni la copia per restituirle il nome originale." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Risolvi conflitto" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Nome per la copia, se si mantengono entrambi" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Mantieni originale" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Mantieni entrambi" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Mantieni copia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "Impossibile risolvere il conflitto" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "Lettura delle posizioni di Proton Drive di questo computer." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "Non disponibile" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "Nessuna posizione" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "" +"Il servizio di montaggio non ha ancora comunicato un punto di montaggio." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Sola lettura" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Apri questa cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Cambia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Scegli una cartella diversa per il montaggio di Proton Drive" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Riprendi la sincronizzazione di questa cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Metti in pausa la sincronizzazione di questa cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Sincronizza ora questa cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"Su richiesta: libera spazio su questo disco mantenendo i file solo in Proton " +"Drive e scaricandoli man mano che li apri. Disattiva per riscaricarli e " +"mantenere una copia locale completa." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Interrompi la sincronizzazione di questa cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "Rendere la cartella su richiesta?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"I file in {path} verranno rimossi da questo computer e mantenuti solo in " +"Proton Drive. Ogni file viene scaricato di nuovo quando lo apri." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Rendi su richiesta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "Impossibile mettere in pausa la cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "Impossibile riprendere la cartella" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Cartella in pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Cartella ripresa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "Impossibile sincronizzare" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Cartella condivisa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Passaggio a su richiesta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Passaggio a sincronizzata" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "Su richiesta" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Sincronizzata" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "in pausa" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "non montato" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Accedi a Proton" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Usa il tuo account Proton per connettere Drive." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "Email o nome utente" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Password" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Accedi" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Crea account" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "Password dimenticata?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "Inserisci la tua email e la password." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Accesso in corso…" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Completa la verifica per continuare…" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "accesso annullato" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "Troppi tentativi di accesso. Attendi qualche minuto e riprova." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" +"Impossibile raggiungere Proton. Controlla la connessione a Internet e " +"riprova." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Accesso eseguito, ma non è stato possibile salvare la sessione nel " +"portachiavi di sistema. Assicurati che un portachiavi (GNOME Keyring o " +"KWallet) sia in esecuzione e sbloccato." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "" +"Accesso annullato: non è stato inserito alcun codice di autenticazione a due " +"fattori." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Accesso annullato: la verifica non è stata completata. Accedi di nuovo per " +"riceverne una nuova." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Accesso non riuscito: {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Autenticazione a due fattori" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" +"Inserisci il codice dell'app di autenticazione o uno dei tuoi codici di " +"recupero." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Codice di autenticazione" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Conferma" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "Disconnettersi?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"Proton Drive si disconnetterà e interromperà la sincronizzazione finché non " +"accedi di nuovo. I file già presenti su questo computer restano dove sono." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "Mostra {name}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "Mostra il file RAW" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "Mostra il video" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "Mostra la foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "Impossibile visualizzare questa foto." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +msgid "Couldn't reach Proton Drive." +msgstr "Impossibile raggiungere Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:345 +msgid "Reading photo details…" +msgstr "Lettura dei dettagli della foto…" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Dimensione" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "Questa foto non contiene metadati." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Dimensioni" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Scattata" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Fotocamera" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Obiettivo" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Esposizione" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Luogo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Salva una copia" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "“{name}” salvato" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "Impossibile salvare la copia" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "La copia è stata interrotta." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} di {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} di {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Precedente (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Successiva (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Aggiungi ai preferiti" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Altri file di questa foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Salva una copia…" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "Sposta nel cestino (Canc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Chiudi (Esc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Mostra sulla mappa" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Nascondi dettagli" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "Impossibile modificare il preferito" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Carica foto" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Vai a un mese" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Torna agli album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Carica" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Importa un'esportazione Google Takeout di Google Photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Seleziona foto" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Aggiungi all'album…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Esci dalla selezione (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Mostra solo i preferiti" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "Tutte le date" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Cronologia" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Importazione da Google Photos…" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Seleziona la foto da caricare" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Immagini" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Foto caricata" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "Impossibile caricare la foto" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "Spostare questa foto nel cestino?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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:1551 +#, 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:1558 +#, 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:1616 +msgid "The server refused." +msgstr "Il server ha rifiutato la richiesta." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "{n} foto spostata nel cestino" +msgstr[1] "{n} foto spostate nel cestino" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%d/%m/%Y %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Data sconosciuta" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Preferito" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Seleziona" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Rimuovi dall'album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "Sposta nel cestino…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Aggiunto ai preferiti" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Rimosso dai preferiti" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Caricamento delle foto…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Lettura della cronologia di Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Album vuoto" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "Questo album non contiene foto." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "Impossibile caricare altre foto" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "Impossibile caricare le foto" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "Aggiungi segnalibro: salva un collegamento pubblico per aprirlo da qui" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Inviti" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Accetta per aggiungere l'elemento ai tuoi file condivisi." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Segnalibri" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Indietro" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Condivisi con me" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Lettura degli elementi condivisi." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Lettura di questa cartella condivisa." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "Impossibile aprire la cartella condivisa" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Inviti ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "Questa cartella è vuota." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "Mostra in I miei file" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Abbandona…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"La firma dell'invito non corrisponde alle chiavi del mittente. Potrebbe non " +"provenire davvero da questa persona." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Visualizzatore" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Editor" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Amministratore" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Può visualizzare" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Può modificare" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Può gestire" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "Scaricamento di “{name}”…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "Nessun elemento condiviso con te" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"I file e le cartelle che altre persone condividono con te appaiono qui. " +"Anche i collegamenti pubblici salvati come segnalibri vengono conservati qui." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Condiviso con te" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "un elemento condiviso" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "Da {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Rifiuta" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Accetta" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "questo elemento" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "Rifiutare l'invito?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "Non avrai accesso a {name} a meno che non venga condiviso di nuovo." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Collegamento condiviso" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Rimuovi segnalibro" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Apri nel browser" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Invito accettato" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "Impossibile accettare l'invito" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Invito rifiutato" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "Impossibile rifiutare l'invito" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Abbandona elemento condiviso" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "" +"Abbandonare “{name}”? Perderai l'accesso finché non verrai invitato di nuovo." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Abbandona" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Elemento condiviso abbandonato" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "Impossibile abbandonare l'elemento condiviso" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "Rimuovere il segnalibro di “{name}”?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Segnalibro rimosso" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "Impossibile rimuovere il segnalibro" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Aggiungi segnalibro" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "Incolla un collegamento pubblico di Proton Drive per salvarlo qui." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "URL del collegamento pubblico" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Password (se il collegamento ne ha una)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Aggiungi" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "Impossibile aggiungere il segnalibro" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "È richiesto un URL." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Segnalibro salvato" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "Impossibile aggiungere il segnalibro" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Condivisi da me" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Lettura di ciò che hai condiviso." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "Impossibile leggere le tue condivisioni" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Ancora nessuna condivisione" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "" +"Gli elementi che condividi con altre persone o tramite collegamento appaiono " +"qui." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Copia collegamento" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Apri collegamento" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Gestisci accesso…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Interrompi condivisione…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "Interrompere la condivisione?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Tutte le persone invitate perdono l'accesso a “{name}”, gli inviti in " +"sospeso vengono ritirati e il suo collegamento pubblico smette di funzionare." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Interrompi condivisione" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "Condivisione di {name} interrotta" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "Impossibile interrompere la condivisione" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} persona" +msgstr[1] "{n} persone" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "{n} in sospeso" +msgstr[1] "{n} in sospeso" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Collegamento pubblico" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Condiviso" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Avvio" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Avvia all'accesso" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Connetti automaticamente Proton Drive quando accedi" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Cartella di Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Cambia…" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Rete" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" +"Limita la velocità di trasferimento dei file, condivisa tra tutti i " +"trasferimenti. 0 significa nessun limite." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Limite di caricamento (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Limite di scaricamento (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Aspetto" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Colore di risalto viola Proton" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "" +"Usa il colore del marchio Proton al posto del colore di risalto di sistema" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Mostra icona nell'area di notifica" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "Stato della sincronizzazione e azioni rapide nel pannello" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "File fissati e aperti di recente, conservati su questo computer." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Limite di dimensione della cache (GiB)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" +"I file più vecchi vengono rimossi oltre questa dimensione; 0 significa " +"nessun limite" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Svuota cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "Rimuove le copie in cache. I file mantenuti offline restano." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Svuota…" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "File conservati su questo computer, anche senza connessione." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Spazio di archiviazione" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Mostra stato della sincronizzazione" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Disconnetti…" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Account" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "Predefinita di sistema" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Lingua" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Ha effetto al prossimo avvio di Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Trasferimenti" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "File in trasferimento da e verso Proton Drive." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Limite della cache aggiornato" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "Impossibile impostare il limite della cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Limiti di banda aggiornati" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "Impossibile impostare i limiti di banda" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "Svuotare la cache?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"Le copie in cache vengono rimosse da questo computer e scaricate di nuovo " +"quando le apri. I file resi disponibili offline restano." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Svuota cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Cache svuotata" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "Impossibile svuotare la cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "Impossibile salvare il colore di risalto" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "Impossibile salvare l'impostazione dell'area di notifica" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "Impossibile salvare la lingua" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Riavvia Proton Drive per usare la nuova lingua" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Scegli la cartella del punto di montaggio" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "Impossibile salvare il punto di montaggio" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Riavvia per applicare" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" +"Il punto di montaggio è ora “{path}”. Riavviare il montaggio di Drive per " +"usarlo?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Più tardi" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Riavvia ora" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "{size} utilizzati" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "{used} di {total} utilizzati ({percent}%)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "{size} liberi" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "{free} liberi su {total} ({percent}% utilizzato)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Proton Drive connesso" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Il tuo Drive è montato e disponibile." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Proton Drive disconnesso" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" +"Il servizio di montaggio si è arrestato. I file non sono disponibili finché " +"non si riavvia." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Sincronizzazione completata" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "Trasferimento di {n} file completato." +msgstr[1] "Trasferimento di {n} file completato." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title}: {done} di {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title}: {detail} ({done} di {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title}…" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title}: {detail}…" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name}: {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name}: {done} di {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · riprende {time}" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Riprende {time}" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Finché non riprendi" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} modifica richiede attenzione" +msgstr[1] "{n} modifiche richiedono attenzione" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Solo file in cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Sincronizzazione in corso" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "Aggiornato" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "Proton Drive non è in esecuzione" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "più tardi" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "alle %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "%a %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "%e %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "Nessun file mantenuto offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "Fai clic destro su un file e scegli “Rendi disponibile offline”." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "Impossibile renderlo solo online" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Mostra meno" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "Mostra {n} file" +msgstr[1] "Mostra tutti i {n} file" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Le foto già presenti in Proton Photos vengono riconosciute per nome e " +"contenuto e saltate, quindi è sicuro ripetere un'importazione interrotta." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Torna alle foto" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "" +"Aggiungi un'esportazione di Google Takeout alla cronologia di Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Trascina qui i file .zip di Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Aggiungi tutte le parti dell'esportazione insieme: una foto e i suoi " +"metadati si trovano spesso in parti diverse." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Scegli file…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Archivi da importare" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Cancella" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Rimuovi tutti gli archivi aggiunti" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Analizza" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" +"Controlla gli archivi e mostra cosa verrebbe importato, senza caricare nulla" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Importa" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Interrompi importazione" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "" +"Completa la foto in trasferimento, archivia ciò che è stato caricato, quindi " +"interrompi" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Importazione in corso" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Ultima importazione" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Seleziona gli archivi di Google Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Archivi di Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "Importare questa esportazione?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"{n} archivio verrà caricato su Proton Photos, creando gli album così come " +"appaiono nell'esportazione. Può richiedere ore; puoi interromperla in " +"qualsiasi momento e ciò che è stato caricato resta. Le foto che hai già " +"vengono saltate." +msgstr[1] "" +"{n} archivi verranno caricati su Proton Photos, creando gli album così come " +"appaiono nell'esportazione. Può richiedere ore; puoi interromperla in " +"qualsiasi momento e ciò che è stato caricato resta. Le foto che hai già " +"vengono saltate." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Interruzione dell'importazione…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "Impossibile interrompere l'importazione" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Si possono importare solo i file .zip di Takeout: le cartelle estratte non " +"sono supportate." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "{n} archivio aggiunto" +msgstr[1] "{n} archivi aggiunti" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "Nessun archivio ancora aggiunto." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Rimuovi da questa importazione" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} archivio, {size} in totale. {note}" +msgstr[1] "{n} archivi, {size} in totale. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Lettura degli archivi…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Avvio dell'importazione…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Analisi dell'esportazione…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "" +"Importazione avviata: puoi lasciare questa pagina, continuerà in background." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "Impossibile avviare l'importazione" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Analisi completata" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Importazione completata" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "{n} foto aggiunta, {failed} non riuscite." +msgstr[1] "{n} foto aggiunte, {failed} non riuscite." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Interrotta dopo {n} foto." +msgstr[1] "Interrotta dopo {n} foto." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "{n} foto aggiunta a Proton Photos." +msgstr[1] "{n} foto aggiunte a Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "L'importazione da Google Photos è terminata." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Risultato dell'analisi" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "Non è stato caricato nulla: questo è ciò che farebbe un'importazione." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Interrotta in anticipo. Tutto ciò che è stato caricato finora è nella " +"cronologia; eseguila di nuovo per riprendere da dove si era fermata." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Completata." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Foto nell'esportazione" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "Da caricare" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Caricate" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Già in Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Album da creare" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Album creati" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "Foto inserite negli album" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Saltate (nel cestino di Google)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Dati da caricare" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Dati caricati" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Non riuscite" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} di {total}: {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Elaborazione…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Svuota cestino…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Elimina definitivamente tutto il contenuto del cestino" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Ripristina" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Elimina definitivamente…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Ripristina nella cartella originale" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Elimina definitivamente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Cartella" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "{n} elemento selezionato" +msgstr[1] "{n} elementi selezionati" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "Lettura del cestino." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "Impossibile leggere il cestino" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "Il cestino è vuoto" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Gli elementi eliminati da Proton Drive appaiono qui." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} elemento" +msgstr[1] "{n} elementi" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "“{name}” ripristinato" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "{n} elemento ripristinato" +msgstr[1] "{n} elementi ripristinati" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "Impossibile ripristinare" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "" +"Eliminare definitivamente “{name}”? Questa operazione non può essere " +"annullata." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "“{name}” eliminato definitivamente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "" +"Eliminare definitivamente {n} elemento? Questa operazione non può essere " +"annullata." +msgstr[1] "" +"Eliminare definitivamente {n} elementi? Questa operazione non può essere " +"annullata." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "{n} elemento eliminato definitivamente" +msgstr[1] "{n} elementi eliminati definitivamente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Elimina definitivamente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "Impossibile eliminare" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Svuota cestino" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +"Eliminare definitivamente {n} elemento nel cestino? Questa operazione non " +"può essere annullata." +msgstr[1] "" +"Eliminare definitivamente tutti i {n} elementi nel cestino? Questa " +"operazione non può essere annullata." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Cestino svuotato" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "Impossibile svuotare il cestino" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Verifica" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Dettagli (Alt+Invio)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Chiudi dettagli" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Informazioni" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "Mantieni una copia su questo computer, anche senza connessione." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Condivisione" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Accesso" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Versioni" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "Cronologia" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "Nessun elemento selezionato" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Seleziona un file o una cartella per vederne i dettagli." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "File" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Apri cartella" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "Impossibile caricare la condivisione" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "Impossibile caricare le versioni" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Solo tu" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Chiunque abbia il collegamento" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Condiviso con {n} persona" +msgstr[1] "Condiviso con {n} persone" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Condiviso con {n} persona · Collegamento pubblico" +msgstr[1] "Condiviso con {n} persone · Collegamento pubblico" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "Nessuna versione precedente" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 versione · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} versione · ultima {date}" +msgstr[1] "{n} versioni · ultima {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "Altro" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Mai" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 giorno" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 giorni" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 giorni" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "Impossibile condividere" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Condividi" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Invita persone" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "Indirizzi email Proton e non Proton, separati da spazi o virgole." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "Indirizzi email" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Ruolo" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Messaggio (facoltativo)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Invia inviti" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "Persone con accesso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "“{text}” non è un indirizzo email" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Inviti inviati" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "Impossibile inviare gli inviti" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "Nessun altro ha ancora accesso." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Membro" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Invitato (in sospeso)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Invitato (esterno, in sospeso)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Ruolo aggiornato" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "Impossibile aggiornare il ruolo" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Rimuovi accesso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "Rimuovere l'accesso?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} non potrà più aprire questo elemento." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Accesso rimosso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "Impossibile rimuovere l'accesso" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Chiunque abbia il collegamento ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "protetto da password" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Rimuovi collegamento" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "Rimuovere il collegamento pubblico?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"Il collegamento smette di funzionare per chiunque lo abbia. Un nuovo " +"collegamento avrà un indirizzo diverso." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Rimuovi collegamento" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Collegamento pubblico rimosso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "Impossibile rimuovere il collegamento" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Ruolo del collegamento" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Password (facoltativa)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Scadenza" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Crea collegamento pubblico" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Collegamento pubblico creato" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "Impossibile creare il collegamento" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "scaduto" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "scade il {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "Impossibile caricare le versioni" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "Nessuna versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Le cartelle non hanno versioni." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Cronologia delle versioni" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" +"Proton Drive conserva le versioni precedenti di un file finché non le " +"elimini." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "Nessuna versione precedente." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Versione attuale" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Salva una copia…" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Ripristina questa versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Elimina definitivamente questa versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Ripristina versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"Rendere questa versione il contenuto attuale di “{name}”? La versione " +"sostituita resta nella cronologia." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Ripristino della versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "Impossibile ripristinare la versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Elimina versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "" +"Eliminare definitivamente questa versione? Il suo contenuto non potrà essere " +"recuperato." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Elimina" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Versione eliminata" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "Impossibile eliminare la versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Salva versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "Impossibile salvare la versione" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "Quella posizione non è un file locale." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Versione salvata" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive: {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Cerca in Drive › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(nessuna corrispondenza per “{query}”)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(nessun file fissato: digita per cercare)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(impossibile determinare le directory dell'app)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} caricamento in coda" +msgstr[1] "{n} caricamenti in coda" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} modifica in coda" +msgstr[1] "{n} modifiche in coda" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} caricamento" +msgstr[1] "{n} caricamenti" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} modifica" +msgstr[1] "{n} modifiche" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "{uploads}, {changes} in coda" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} file in {dir}" +msgstr[1] "{n} file in {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} di {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ {n} in scaricamento" +msgstr[1] "↓ {n} in scaricamento" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ {n} in caricamento" +msgstr[1] "↑ {n} in caricamento" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Montato in {mountpoint} ({n} fissato)" +msgstr[1] "Montato in {mountpoint} ({n} fissati)" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Sincronizzazione: {queued} ({n} fissato)" +msgstr[1] "Sincronizzazione: {queued} ({n} fissati)" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Offline: solo file in cache ({n} fissato)" +msgstr[1] "Offline: solo file in cache ({n} fissati)" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Offline: {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Montaggio: risposta inattesa dal demone" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Accesso eseguito come {username}: non montato" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Accesso non eseguito" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Errore: {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} problema: visualizza" +msgstr[1] "{n} problemi: visualizza" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Accedi…" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Apri Proton Drive" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Apri cartella" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Riprendi sincronizzazione" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Metti in pausa sincronizzazione" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Connetti" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Nascondi icona nell'area di notifica" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Arresta Proton Drive…" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Esci" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "Tutti" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Cartelle" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "Documenti" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Multimedia" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "I miei file / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Cerca in Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "Cerca in Drive e su questo computer" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Esc" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Migliori corrispondenze" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "Nessun risultato" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "Proton Drive non è in esecuzione" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "Avvia il demone di montaggio per cercare nel tuo Drive." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ naviga · ↵ apri · Tab filtra" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Demone offline" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "Fissato in Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Cerca nel tuo Drive" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "" +"Indicizzazione di questo computer ancora in corso: i risultati locali " +"arriveranno a breve." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Prova una ricerca diversa o un altro filtro." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" +"Inizia a digitare per cercare in Proton Drive e nei file di questo computer." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "Nessun file fissato" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} file fissato" +msgstr[1] "{n} file fissati" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} in Drive · {local} su questo computer · indicizzazione…" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} in Drive · {local} su questo computer" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "Apertura di {name}…" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "Impossibile aprire: {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "Impossibile raggiungere il demone" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Home" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Home / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} GB" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} MB" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} KB" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} B" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "ora" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count} min" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count} h" + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count} g" + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count} mes." + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count} a" + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "impossibile raggiungere il demone di Proton Drive: {error}" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..882a219 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,4689 @@ +# Dutch translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: Dutch\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "Mijn bestanden" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Foto's" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Gedeeld met mij" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Gedeeld door mij" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Computers" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Prullenbak" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Synchronisatie" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Activiteit" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Verversen (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what}: {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "Je bent offline" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "Dat bestaat niet meer" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "Je hebt daar geen toegang toe" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "Er is eerst iets anders gewijzigd" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Je Proton Drive is vol" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Voorkeuren" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Sneltoetsen" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "Over Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Hoofdmenu" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Proton Drive met bestanden op aanvraag voor de Linux-desktop.\n" +"\n" +"Onofficiële client — niet gelieerd aan, onderschreven door of ondersteund " +"door Proton AG." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Bijdragers aan Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "Proton Drive stoppen?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"De schijf wordt ontkoppeld en er wordt niets gesynchroniseerd totdat je " +"opnieuw verbinding maakt. Proton Drive start weer bij je volgende aanmelding." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Annuleren" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Stoppen" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "Kon Proton Drive niet stoppen" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "De koppeldienst is niet gestopt." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "Algemeen" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Drive doorzoeken" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Verversen" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Sneltoetsen" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "Bestanden" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "Nieuwe map" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Bestanden uploaden" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Terug / vooruit" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Bovenliggende map" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Raster / lijst" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Hernoemen" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "Naar prullenbak verplaatsen" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Selectie wissen" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Grotere miniaturen" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Kleinere miniaturen" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Miniatuurgrootte herstellen" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Alles selecteren" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Fotoweergave" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Vorige / volgende foto" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "Eerste / laatste foto" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Details tonen" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Volledig scherm" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Sluiten" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Selecteer één item om het te hernoemen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "Alles" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Overdrachten" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Wijzigingen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Delen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Problemen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Vereist aandacht" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Opnieuw proberen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Laden…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Recente activiteit wordt gelezen." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "Kon activiteit niet lezen" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Onverwacht antwoord van de koppeldienst." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Niet verbonden" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "De koppeldienst van Proton Drive draait niet." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Verbinden…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "Wachten tot de koppeldienst van Proton Drive gestart is." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Vandaag" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Gisteren" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A %-d %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d %B %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Nog niets" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" +"Uploads, verplaatsingen, delingen en andere wijzigingen verschijnen hier " +"zodra ze plaatsvinden." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"Een bestand is op twee plaatsen tegelijk gewijzigd. Kies welke versie je " +"wilt behouden." +msgstr[1] "" +"{n} bestanden zijn op twee plaatsen tegelijk gewijzigd. Kies welke versies " +"je wilt behouden." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "Geen overeenkomende activiteit" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Niets in het recente logboek past bij dit filter." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n} keer sinds {time}" +msgstr[1] "{n} keer sinds {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Opgelost" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Oplossen…" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "{name} geüpload" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "{name} gedownload" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "{name} gesynchroniseerd" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "{name} hernoemd" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "{name} verplaatst" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Map {name} aangemaakt" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "{name} naar prullenbak verplaatst" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "{name} teruggezet" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "{name} verwijderd" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Prullenbak geleegd ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "{name} gedeeld" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Link naar {name} aangemaakt" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "Delen van {name} gestopt" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Conflict {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Albums laden…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Je Proton Drive-albums worden gelezen." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "Geen fotobibliotheek" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "Dit Proton-account heeft Foto's niet ingeschakeld." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "Geen albums" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Maak er een aan met Nieuw album, of in Proton Photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "Kon albums niet laden" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "De koppeldienst van Proton Drive reageerde niet." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} album" +msgstr[1] "{n} albums" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Openen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Hernoemen…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Album verwijderen…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Albumnaam" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Aanmaken" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "Nieuw album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Album aangemaakt" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "Kon het album niet aanmaken" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "De koppeldienst reageerde niet." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Album hernoemen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Album hernoemd" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "Kon het album niet hernoemen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "Album verwijderen?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "“{name}” wordt verwijderd. De foto's blijven in je tijdlijn." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Verwijderen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Album verwijderd" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "Kon het album niet verwijderen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Aan album toevoegen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Kies een album voor deze foto." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +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:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "Nieuw album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "Sommige foto's konden niet worden toegevoegd" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "{n} foto aan het album toegevoegd" +msgstr[1] "{n} foto's aan het album toegevoegd" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "Kon niet aan het album toevoegen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "Sommige foto's konden niet uit het album worden verwijderd" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "{n} foto uit het album verwijderd" +msgstr[1] "{n} foto's uit het album verwijderd" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "Kon niet uit het album verwijderen" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} foto · gedeeld met mij" +msgstr[1] "{n} foto's · gedeeld met mij" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} foto" +msgstr[1] "{n} foto's" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Terug (Alt+Links)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Vooruit (Alt+Rechts)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "Nieuwe map" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Bestanden uploaden…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Map uploaden…" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "Nieuw" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Raster" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "Lijst" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Naam" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Grootte" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Laatst gewijzigd" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Sorteren op" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Omgekeerde volgorde" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Mappen eerst" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Als lijst tonen (Ctrl+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Sorteer- en weergaveopties" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "Openen in bestandsbeheerder" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Miniaturen aanmaken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Mapacties" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Aanmaken van miniaturen annuleren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Alleen in deze map zoeken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Offline beschikbaar maken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Alleen online maken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Verplaatsen naar…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Selectie wissen (Esc)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Zoom:" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Grootte: {n} pixel" +msgstr[1] "Grootte: {n} pixels" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Opslag van Proton-account" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "Mijn bestanden" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "{n} geselecteerd" +msgstr[1] "{n} geselecteerd" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "Kon niet naar prullenbak verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "Proton Drive is niet verbonden." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "" +"{n} item naar prullenbak verplaatst — sommige konden niet worden verplaatst" +msgstr[1] "" +"{n} items naar prullenbak verplaatst — sommige konden niet worden verplaatst" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "“{name}” naar prullenbak verplaatst" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "{n} item naar prullenbak verplaatst" +msgstr[1] "{n} items naar prullenbak verplaatst" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Ongedaan maken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Teruggezet uit prullenbak" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "{n} item teruggezet uit prullenbak" +msgstr[1] "{n} items teruggezet uit prullenbak" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "Kon niet terugzetten uit prullenbak" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "Kon offlinestatus niet wijzigen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} bestand is nu offline beschikbaar" +msgstr[1] "{n} bestanden zijn nu offline beschikbaar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} bestand is nu alleen online" +msgstr[1] "{n} bestanden zijn nu alleen online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Gewijzigd" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Locatie" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Openen met…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Afspelen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Offline beschikbaar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Delen…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Link kopiëren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Verplaatsen naar…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Versies…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Details" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "Nieuwe map…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Alles selecteren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "Kon bestand niet openen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "Voor Openen met moet de Proton Drive-map gekoppeld zijn." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Link gekopieerd" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "Kon link niet kopiëren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "Kon media niet afspelen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "Het bestandspad is geen geldige UTF-8." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "“{name}” wordt gestreamd…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "“{name}” is nu alleen online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "“{name}” is nu offline beschikbaar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "Kon de weergave niet opslaan" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Als raster tonen (Ctrl+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "Kon de map niet openen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "Kon miniaturen niet aanmaken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Aanmaken van miniaturen starten…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Aanmaken van miniaturen stoppen…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "Kon aanmaken van miniaturen niet annuleren" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Aanmaken van miniaturen gestopt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "De koppeldienst meldt geen voortgang van de miniaturen meer." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} map" +msgstr[1] "{n} mappen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} afbeelding" +msgstr[1] "{n} afbeeldingen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "{root} scannen… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Miniaturen aanmaken in {root}… {done} van {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Miniaturen klaar voor {n} afbeelding in {root}" +msgstr[1] "Miniaturen klaar voor {n} afbeeldingen in {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "" +"Miniaturen klaar voor {n} afbeelding in {root}; {failed} niet beschikbaar" +msgstr[1] "" +"Miniaturen klaar voor {n} afbeeldingen in {root}; {failed} niet beschikbaar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "Nieuwe naam" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Hernoemd naar “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "Kon niet hernoemen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "“{name}” verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "{n} item verplaatsen" +msgstr[1] "{n} items verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Kies de map waarnaar je wilt verplaatsen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Hierheen verplaatsen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "Kon deze map niet lezen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "Geen mappen hier." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "Kon niet verplaatsen" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} item verplaatst naar {place}, maar niet alles" +msgstr[1] "{n} items verplaatst naar {place}, maar niet alles" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Verplaatst naar {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} item verplaatst naar {place}" +msgstr[1] "{n} items verplaatst naar {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Een map aanmaken in de huidige map." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Mapnaam" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "“{name}” aangemaakt" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "Kon map niet aanmaken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Bestanden uploaden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Map uploaden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "Kon niet uploaden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Uploaden…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "{n} item uploaden…" +msgstr[1] "{n} items uploaden…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "Bekijken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Verplaatst naar “{name}”" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d %b %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Deze map wordt gelezen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Map niet beschikbaar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "Kon deze map niet openen" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "Deze map is leeg" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Sleep bestanden hierheen, of upload een bestand of maak een map aan om te " +"beginnen." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Overal zoeken" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Zoeken…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Zoeken naar “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — eerste {n} zoekresultaat wordt getoond" +msgstr[1] "{summary} — eerste {n} zoekresultaten worden getoond" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — zoekresultaten" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "Geen overeenkomsten" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "Geen bestanden of mappen komen overeen met deze zoekopdracht." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} bestand" +msgstr[1] "{n} bestanden" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "Deze computer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "De computer waarmee dit apparaat een back-up maakt." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Deze computer hernoemen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Andere computers" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Andere computers die een back-up maken naar dit account." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Je computers worden gelezen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Back-up als “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Deze computer hernoemen ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "Geen andere computers" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "Desktop-apps die met dit account synchroniseren verschijnen hier." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Terugzetten op deze computer…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Identiteit van deze computer gebruiken…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Computer verwijderen…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · laatst gesynchroniseerd {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · nooit gesynchroniseerd" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Synchronisatie openen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "De mappen en het koppelpunt van deze computer beheren" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Mappen terugzetten…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "" +"Nog geen mappen in de back-up — voeg er een toe op de pagina Synchronisatie." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} map in back-up" +msgstr[1] "{n} mappen in back-up" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · beheer ze op de pagina Synchronisatie" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} vereist aandacht" +msgstr[1] "{folders} · {n} vereisen aandacht" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "synchroniseren…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "synchronisatiefout" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "vereist aandacht" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "bijgewerkt" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "controleren op wijzigingen…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "controleren op wijzigingen — {done} van {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "synchroniseren: {done} van {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "{file} synchroniseren — {done} van {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Map toevoegen aan synchronisatie" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Map synchroniseren…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "Kon map niet toevoegen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "Kon mappen om terug te zetten niet weergeven" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Vink de mappen aan die je met dit apparaat wilt synchroniseren en pas aan " +"waar elke map moet komen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Mappen terugzetten" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Terugzetten" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Mappen terugzetten…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "Kon mappen niet terugzetten" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"Van deze mappen is een back-up gemaakt vanaf “{name}”. Teruggezette mappen " +"blijven synchroniseren met de kopie van die computer." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "" +"Van deze mappen is een back-up gemaakt onder deze computer in Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" +"Niets om terug te zetten — de mappen van “{name}” worden hier al allemaal " +"gesynchroniseerd." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" +"Niets om terug te zetten — de mappen van deze computer worden hier al " +"allemaal gesynchroniseerd." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "Map schakelt over naar op aanvraag" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "Map wordt gedownload en blijft gesynchroniseerd" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "Kon modus niet wijzigen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"Synchroniseren van “{path}” stoppen?\n" +"\n" +"Deze map staat op aanvraag: de bestanden staan in Proton Drive, niet op deze " +"schijf, dus de map is leeg zodra hij ontkoppeld is. Wil je een lokale kopie " +"houden, annuleer dan, schakel Op aanvraag uit en wacht tot de download klaar " +"is voordat je hem verwijdert." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"Synchroniseren van “{path}” stoppen?\n" +"\n" +"De lokale bestanden blijven op deze schijf en worden gewoon niet meer " +"gesynchroniseerd. Kies of je ook de kopie in Proton Drive wilt verwijderen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Synchroniseren van map stoppen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Ook uit Proton Drive verwijderen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Verwijdert de enige kopie van deze bestanden." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "De lokale kopie blijft ongewijzigd." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Synchroniseren stoppen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "Synchroniseren van map gestopt" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "Kon het synchroniseren van de map niet stoppen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Computer hernoemen" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "“{name}” hernoemen." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "Kon de computer niet hernoemen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "Een naam is vereist." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Computer hernoemd" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Typ “{name}” om te bevestigen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Computer verwijderen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"“{name}” uit dit account verwijderen?\n" +"\n" +"Alles waarvan deze computer een back-up in Proton Drive heeft gemaakt, wordt " +"mee verwijderd. De bestanden op die computer zelf blijven onaangeroerd — " +"maar dit kan hier niet ongedaan worden gemaakt." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Verwijderen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Computer verwijderd" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "Kon de computer niet verwijderen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Identiteit van deze computer gebruiken" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"Dit apparaat behandelen als “{name}”?\n" +"\n" +"Nieuwe gesynchroniseerde mappen worden onder die computer in Proton Drive " +"aangemaakt, en dit apparaat houdt die identiteit ook als de hostnaam " +"verandert. Mappen die hier al worden gesynchroniseerd, worden niet " +"verplaatst.\n" +"\n" +"Gebruik daarna “Mappen terugzetten” om terug te halen wat “{name}” " +"synchroniseerde." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Identiteit gebruiken" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Identiteit overgenomen" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "Kon die computer niet overnemen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Map toevoegen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "" +"Een back-up van een lokale map maken naar het Proton Drive-apparaat van deze " +"computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Conflicten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"Bestanden zijn op twee plaatsen tegelijk gewijzigd. Beide versies zijn " +"bewaard; kies welke blijft." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "Op deze computer" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"Waar Proton Drive zich op dit apparaat bevindt. Gesynchroniseerde mappen " +"bewaren een volledige kopie op deze schijf; mappen op aanvraag bewaren de " +"bestanden alleen in Proton Drive en halen ze op wanneer je ze opent." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Synchronisatie" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "1 uur pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "8 uur pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "24 uur pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" +"Stop met uploaden totdat je hervat. Bestanden openen gewoon zoals altijd." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Een tijdje pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Controleren…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Hervatten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "" +"Alles uploaden wat heeft gewacht terwijl de synchronisatie gepauzeerd was" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "Kon synchronisatie niet pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "Kon synchronisatie niet hervatten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Synchronisatie hervat" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Synchronisatie gepauzeerd totdat je hervat" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Synchronisatie gepauzeerd" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Alles opnieuw proberen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Alle mislukte wijzigingen nu opnieuw proberen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "Wacht op upload" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "Wijzigingen op deze computer die nog niet in Proton Drive staan." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Wijzigingen op deze computer die nog niet in Proton Drive staan. De eerste " +"{shown} van {n} worden getoond." +msgstr[1] "" +"Wijzigingen op deze computer die nog niet in Proton Drive staan. De eerste " +"{shown} van {n} worden getoond." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Wijzigingen uploaden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Nieuw bestand uploaden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Map aanmaken" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Hernoemen of verplaatsen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "Naar prullenbak verplaatsen" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Wijziging" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "wacht tot de app die het schrijft klaar is" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "nieuwe poging om {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "wacht tot de synchronisatie wordt hervat" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "volgende" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "{n} keer mislukt: {error}" +msgstr[1] "{n} keer mislukt: {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Nu opnieuw proberen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Nu opnieuw proberen…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "Kon niet opnieuw proberen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, gewijzigd {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "Het origineel is weg; alleen deze kopie is over" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Zelfde inhoud als het origineel" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Verschilt van {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"“{name}” is hier en elders tegelijk gewijzigd.\n" +"\n" +"Origineel: {original}\n" +"Kopie: {copy}\n" +"\n" +"Wat niet wordt behouden, gaat naar de prullenbak, waar het kan worden " +"teruggezet." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"Het origineel “{name}” bestaat niet meer; alleen de kopie is over ({copy}).\n" +"\n" +"Behoud de kopie om haar de oorspronkelijke naam terug te geven." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Conflict oplossen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Naam voor de kopie, als je beide behoudt" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Origineel behouden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Beide behouden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Kopie behouden" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "Kon het conflict niet oplossen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "De Proton Drive-locaties van deze computer worden gelezen." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "Niet beschikbaar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "Geen locaties" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "De koppeldienst heeft nog geen koppelpunt gemeld." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Alleen-lezen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Deze map openen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Wijzigen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Een andere map kiezen voor de Proton Drive-koppeling" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Synchroniseren van deze map hervatten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Synchroniseren van deze map pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Deze map nu synchroniseren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"Op aanvraag: maak ruimte vrij op deze schijf door de bestanden alleen in " +"Proton Drive te bewaren en ze pas op te halen als je ze opent. Schakel uit " +"om ze terug te downloaden en een volledige lokale kopie te houden." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Synchroniseren van deze map stoppen" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "Map op aanvraag zetten?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"Bestanden in {path} worden van deze computer verwijderd en alleen in Proton " +"Drive bewaard. Elk bestand wordt opnieuw gedownload wanneer je het opent." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Op aanvraag zetten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "Kon de map niet pauzeren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "Kon de map niet hervatten" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Map gepauzeerd" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Map hervat" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "Kon niet synchroniseren" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Gedeelde map" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Overschakelen naar op aanvraag" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Overschakelen naar gesynchroniseerd" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "Op aanvraag" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Gesynchroniseerd" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "gepauzeerd" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "niet gekoppeld" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Aanmelden bij Proton" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Gebruik je Proton-account om Drive te verbinden." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "E-mailadres of gebruikersnaam" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Wachtwoord" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Aanmelden" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Account aanmaken" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "Wachtwoord vergeten?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "Voer je e-mailadres en wachtwoord in." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Aanmelden…" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Voltooi de verificatie om verder te gaan…" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "aanmelden geannuleerd" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "" +"Te veel aanmeldpogingen. Wacht een paar minuten en probeer het opnieuw." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" +"Kon Proton niet bereiken. Controleer je internetverbinding en probeer het " +"opnieuw." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Aangemeld, maar de sessie kon niet in de sleutelbos van het systeem worden " +"opgeslagen. Zorg dat een sleutelbos (GNOME Keyring of KWallet) actief en " +"ontgrendeld is." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "Aanmelden geannuleerd: er is geen tweestapscode ingevoerd." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Aanmelden geannuleerd: de verificatie is niet voltooid. Meld je opnieuw aan " +"om een nieuwe te krijgen." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Aanmelden mislukt: {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Tweestapsverificatie" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "Voer de code uit je authenticator-app in, of een van je herstelcodes." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Verificatiecode" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Bevestigen" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "Afmelden?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"Proton Drive verbreekt de verbinding en stopt met synchroniseren totdat je " +"je opnieuw aanmeldt. Bestanden die al op deze computer staan, blijven waar " +"ze zijn." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "{name} tonen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "Het RAW-bestand tonen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "De video tonen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "De foto tonen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "Kon deze foto niet weergeven." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +msgid "Couldn't reach Proton Drive." +msgstr "Kon Proton Drive niet bereiken." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:345 +msgid "Reading photo details…" +msgstr "Fotodetails lezen…" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Grootte" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "Deze foto bevat geen metadata." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Afmetingen" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Genomen" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Camera" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Lens" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Belichting" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Locatie" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Een kopie opslaan" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "“{name}” opgeslagen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "Kon de kopie niet opslaan" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "Het kopiëren is onderbroken." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} van {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} van {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Vorige (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Volgende (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Favoriet maken" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Andere bestanden van deze foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Een kopie opslaan…" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "Naar prullenbak verplaatsen (Delete)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Sluiten (Esc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Tonen op kaart" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Details verbergen" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "Kon de favoriet niet wijzigen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Foto's uploaden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Naar een maand springen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Terug naar albums" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Uploaden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Een Google Photos Takeout-export importeren" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Foto's selecteren" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Aan album toevoegen…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Selectie verlaten (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Alleen favorieten tonen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "Alle datums" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Tijdlijn" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Albums" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Importeren uit Google Photos…" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Foto selecteren om te uploaden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Afbeeldingen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Foto geüpload" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "Kon foto niet uploaden" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "Deze foto naar de prullenbak verplaatsen?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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] "" +"Deze foto naar de prullenbak verplaatsen? Hij is opgeslagen als {n} bestand." +msgstr[1] "" +"Deze foto naar de prullenbak verplaatsen? Hij is opgeslagen als {n} " +"bestanden." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1551 +#, 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:1558 +#, 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] "" +"{n} foto naar de prullenbak verplaatsen? Ze zijn opgeslagen als {files} " +"bestanden." +msgstr[1] "" +"{n} foto's naar de prullenbak verplaatsen? Ze zijn opgeslagen als {files} " +"bestanden." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1616 +msgid "The server refused." +msgstr "De server weigerde." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "{n} foto naar prullenbak verplaatst" +msgstr[1] "{n} foto's naar prullenbak verplaatst" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%d-%m-%Y %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Onbekende datum" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Favoriet" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Selecteren" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Uit album verwijderen" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "Naar prullenbak verplaatsen…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Aan favorieten toegevoegd" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Uit favorieten verwijderd" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Foto's laden…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Je Proton Drive-tijdlijn wordt gelezen." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Leeg album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "Dit album bevat geen foto's." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "Kon niet meer foto's laden" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "Kon foto's niet laden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "" +"Bladwijzer toevoegen — sla een openbare link op om die hiervandaan te openen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Uitnodigingen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Accepteer om het item aan je gedeelde bestanden toe te voegen." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Bladwijzers" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Terug" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Gedeeld met mij" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Je gedeelde items worden gelezen." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Deze gedeelde map wordt gelezen." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "Kon gedeelde map niet openen" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Uitnodigingen ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "Deze map is leeg." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "Tonen in Mijn bestanden" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Verlaten…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"De handtekening van de uitnodiging komt niet overeen met de sleutels van de " +"afzender. Mogelijk is ze niet echt van hen afkomstig." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Lezer" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Bewerker" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Beheerder" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Kan bekijken" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Kan bewerken" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Kan beheren" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "“{name}” downloaden…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "Niets met je gedeeld" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"Bestanden en mappen die anderen met je delen, verschijnen hier. Openbare " +"links waarvoor je een bladwijzer maakt, worden hier ook bewaard." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Gedeeld met jou" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "een gedeeld item" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "Van {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Weigeren" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Accepteren" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "dit item" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "Uitnodiging weigeren?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "" +"Je hebt geen toegang meer tot {name}, tenzij het opnieuw wordt gedeeld." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Gedeelde link" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Bladwijzer verwijderen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Openen in browser" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Uitnodiging geaccepteerd" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "Kon de uitnodiging niet accepteren" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Uitnodiging geweigerd" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "Kon de uitnodiging niet weigeren" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Gedeeld item verlaten" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "" +"“{name}” verlaten? Je verliest de toegang totdat je opnieuw wordt " +"uitgenodigd." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Verlaten" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Gedeeld item is verlaten" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "Kon het gedeelde item niet verlaten" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "De bladwijzer voor “{name}” verwijderen?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Bladwijzer verwijderd" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "Kon de bladwijzer niet verwijderen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Bladwijzer toevoegen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "Plak een openbare Proton Drive-link om die hier op te slaan." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "URL van openbare link" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Wachtwoord (als de link er een heeft)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Toevoegen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "Kon bladwijzer niet toevoegen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "Een URL is vereist." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Bladwijzer opgeslagen" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "Kon de bladwijzer niet toevoegen" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Gedeeld door mij" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Wat je hebt gedeeld wordt gelezen." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "Kon je delingen niet lezen" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Nog niets gedeeld" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "Items die je met anderen of via een link deelt, verschijnen hier." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Link kopiëren" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Link openen" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Toegang beheren…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Delen stoppen…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "Delen stoppen?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Iedereen die je hebt uitgenodigd verliest de toegang tot “{name}”, " +"openstaande uitnodigingen worden ingetrokken en de openbare link werkt niet " +"meer." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Delen stoppen" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "Delen van {name} gestopt" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "Kon delen niet stoppen" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} persoon" +msgstr[1] "{n} personen" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "{n} openstaand" +msgstr[1] "{n} openstaand" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Openbare link" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Gedeeld" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Opstarten" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Starten bij aanmelden" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Proton Drive automatisch verbinden wanneer je je aanmeldt" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Proton Drive-map" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Wijzigen…" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Netwerk" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" +"Beperk hoe snel bestanden worden overgedragen, gedeeld door alle " +"overdrachten. 0 betekent geen limiet." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Uploadlimiet (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Downloadlimiet (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Uiterlijk" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Proton-paars als accentkleur" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "" +"De merkkleur van Proton gebruiken in plaats van de accentkleur van het " +"systeem" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Pictogram in systeemvak tonen" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "Synchronisatiestatus en snelle acties in het paneel" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "Vastgezette en recent geopende bestanden, bewaard op deze computer." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Maximale cachegrootte (GiB)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" +"Oudere bestanden worden verwijderd boven deze grootte; 0 betekent geen limiet" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Cache wissen" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "Kopieën in de cache verwijderen. Offline bewaarde bestanden blijven." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Wissen…" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "Bestanden die op deze computer worden bewaard, ook zonder verbinding." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Opslag" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Synchronisatiestatus tonen" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Afmelden…" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Account" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "Systeemstandaard" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Taal" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Wordt van kracht bij de volgende start van Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Overdrachten" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "Bestanden die van en naar Proton Drive worden overgedragen." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Cachebudget bijgewerkt" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "Kon cachebudget niet instellen" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Bandbreedtelimieten bijgewerkt" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "Kon bandbreedtelimieten niet instellen" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "Cache wissen?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"Kopieën in de cache worden van deze computer verwijderd en opnieuw " +"gedownload wanneer je ze opent. Offline beschikbare bestanden blijven." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Cache wissen" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Cache gewist" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "Kon de cache niet wissen" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "Kon de accentkleur niet opslaan" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "Kon de systeemvakinstelling niet opslaan" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "Kon de taal niet opslaan" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Herstart Proton Drive om de nieuwe taal te gebruiken" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Map voor koppelpunt kiezen" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "Kon koppelpunt niet opslaan" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Herstarten om toe te passen" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" +"Het koppelpunt is nu “{path}”. De Drive-koppeling herstarten om het te " +"gebruiken?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Later" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Nu herstarten" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "{size} gebruikt" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "{used} van {total} gebruikt ({percent}%)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "{size} vrij" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "{free} vrij van {total} ({percent}% gebruikt)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Proton Drive verbonden" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Je Drive is gekoppeld en beschikbaar." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Verbinding met Proton Drive verbroken" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" +"De koppeldienst is gestopt. Bestanden zijn niet beschikbaar totdat hij " +"opnieuw start." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Synchronisatie voltooid" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "{n} bestand is klaar met overdragen." +msgstr[1] "{n} bestanden zijn klaar met overdragen." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title} — {done} van {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title} — {detail} ({done} van {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title}…" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title} — {detail}…" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name} — {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name} — {done} van {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · hervat {time}" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Hervat {time}" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Totdat je hervat" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} wijziging vereist aandacht" +msgstr[1] "{n} wijzigingen vereisen aandacht" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Alleen bestanden in cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Synchroniseren" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "Bijgewerkt" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "Proton Drive draait niet" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "later" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "om %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "%a %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "%e %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "Geen offline bewaarde bestanden" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "Klik met rechts op een bestand en kies “Offline beschikbaar maken”." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "Kon het niet alleen online maken" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Minder tonen" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "Alle {n} bestand tonen" +msgstr[1] "Alle {n} bestanden tonen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Foto's die al in Proton Photos staan, worden op naam en inhoud herkend en " +"overgeslagen, dus een onderbroken import opnieuw uitvoeren is veilig." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Terug naar Foto's" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "Een Google Takeout-export aan je Proton Photos-tijdlijn toevoegen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Sleep je Takeout-.zip-bestanden hierheen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Voeg alle delen van de export in één keer toe — een foto en de bijbehorende " +"metadata zitten vaak in verschillende delen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Bestanden kiezen…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Te importeren archieven" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Wissen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Alle klaargezette archieven verwijderen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Scannen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" +"De archieven controleren en melden wat er geïmporteerd zou worden, zonder te " +"uploaden" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Importeren" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Import stoppen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "" +"De foto die nu wordt verzonden afmaken, het geüploade opbergen en dan stoppen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Import bezig" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Laatste import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Selecteer je Google Takeout-archieven" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Takeout-archieven" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "Deze export importeren?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"{n} archief wordt geüpload naar Proton Photos, waarbij albums worden " +"aangemaakt zoals ze in de export voorkomen. Dit kan uren duren; je kunt op " +"elk moment stoppen en wat al is geüpload blijft staan. Foto's die je al " +"hebt, worden overgeslagen." +msgstr[1] "" +"{n} archieven worden geüpload naar Proton Photos, waarbij albums worden " +"aangemaakt zoals ze in de export voorkomen. Dit kan uren duren; je kunt op " +"elk moment stoppen en wat al is geüpload blijft staan. Foto's die je al " +"hebt, worden overgeslagen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Import stoppen…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "Kon de import niet stoppen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Alleen Takeout-.zip-bestanden kunnen worden geïmporteerd — uitgepakte mappen " +"worden niet ondersteund." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "{n} archief toegevoegd" +msgstr[1] "{n} archieven toegevoegd" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "Nog geen archieven toegevoegd." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Uit deze import verwijderen" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} archief, {size} in totaal. {note}" +msgstr[1] "{n} archieven, {size} in totaal. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Archieven lezen…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Import starten…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Export scannen…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "Import gestart — je kunt deze pagina verlaten, hij loopt door." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "Kon de import niet starten" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Scan voltooid" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Import voltooid" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "{n} foto toegevoegd, {failed} mislukt." +msgstr[1] "{n} foto's toegevoegd, {failed} mislukt." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Gestopt na {n} foto." +msgstr[1] "Gestopt na {n} foto's." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "{n} foto toegevoegd aan Proton Photos." +msgstr[1] "{n} foto's toegevoegd aan Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "De import uit Google Photos is voltooid." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Scanresultaat" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "Er is niets geüpload — dit is wat een import zou doen." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Vroegtijdig gestopt. Alles wat tot nu toe is geüpload, staat in je tijdlijn; " +"voer het opnieuw uit om verder te gaan waar het gebleven was." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Voltooid." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Foto's in de export" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "Zou uploaden" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Geüpload" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Al in Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Aan te maken albums" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Aangemaakte albums" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "Foto's in albums geplaatst" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Overgeslagen (in prullenbak van Google)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Te uploaden gegevens" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Geüploade gegevens" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Mislukt" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} van {total} — {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Bezig…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Prullenbak legen…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Alles in de prullenbak definitief verwijderen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Terugzetten" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Definitief verwijderen…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Terugzetten naar de oorspronkelijke map" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Definitief verwijderen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Map" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "{n} item geselecteerd" +msgstr[1] "{n} items geselecteerd" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "De prullenbak wordt gelezen." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "Kon de prullenbak niet lezen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "Prullenbak is leeg" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Items die je uit Proton Drive verwijdert, verschijnen hier." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} item" +msgstr[1] "{n} items" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "“{name}” teruggezet" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "{n} item teruggezet" +msgstr[1] "{n} items teruggezet" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "Kon niet terugzetten" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "“{name}” definitief verwijderen? Dit kan niet ongedaan worden gemaakt." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "“{name}” definitief verwijderd" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "" +"{n} item definitief verwijderen? Dit kan niet ongedaan worden gemaakt." +msgstr[1] "" +"{n} items definitief verwijderen? Dit kan niet ongedaan worden gemaakt." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "{n} item definitief verwijderd" +msgstr[1] "{n} items definitief verwijderd" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Definitief verwijderen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "Kon niet verwijderen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Prullenbak legen" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +"Het {n} item in de prullenbak definitief verwijderen? Dit kan niet ongedaan " +"worden gemaakt." +msgstr[1] "" +"Alle {n} items in de prullenbak definitief verwijderen? Dit kan niet " +"ongedaan worden gemaakt." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Prullenbak geleegd" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "Kon de prullenbak niet legen" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Verificatie" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Details (Alt+Enter)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Details sluiten" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Info" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "Een kopie op deze computer bewaren, ook zonder verbinding." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Delen" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Toegang" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Versies" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "Geschiedenis" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "Geen item geselecteerd" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Selecteer een bestand of map om de details te zien." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "Bestand" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Map openen" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "Kon delen niet laden" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "Kon versies niet laden" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Alleen jij" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Iedereen met de link" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Gedeeld met {n} persoon" +msgstr[1] "Gedeeld met {n} personen" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Gedeeld met {n} persoon · Openbare link" +msgstr[1] "Gedeeld met {n} personen · Openbare link" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "Geen eerdere versies" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 versie · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} versie · laatste {date}" +msgstr[1] "{n} versies · laatste {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "Meer" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Nooit" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 dag" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 dagen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 dagen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "Kan niet delen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Delen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Personen uitnodigen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "" +"E-mailadressen van Proton en daarbuiten, gescheiden door spaties of komma's." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "E-mailadressen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Rol" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Bericht (optioneel)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Uitnodigingen versturen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "Personen met toegang" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "“{text}” is geen e-mailadres" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Uitnodigingen verstuurd" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "Kon uitnodigingen niet versturen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "Nog niemand anders heeft toegang." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Lid" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Uitgenodigd (openstaand)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Uitgenodigd (extern, openstaand)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Rol bijgewerkt" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "Kon de rol niet bijwerken" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Toegang intrekken" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "Toegang intrekken?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} kan dit item niet meer openen." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Toegang ingetrokken" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "Kon toegang niet intrekken" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Iedereen met de link ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "met wachtwoord beveiligd" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Link verwijderen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "Openbare link verwijderen?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"De link werkt niet meer voor iedereen die hem heeft. Een nieuwe link krijgt " +"een ander adres." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Link verwijderen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Openbare link verwijderd" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "Kon de link niet verwijderen" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Rol van link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Wachtwoord (optioneel)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Verloopt" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Openbare link aanmaken" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Openbare link aangemaakt" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "Kon de link niet aanmaken" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "verlopen" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "verloopt {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "Kan versies niet laden" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "Geen versies" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Mappen hebben geen versies." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Versiegeschiedenis" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" +"Proton Drive bewaart eerdere versies van een bestand totdat je ze verwijdert." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "Geen eerdere versies." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Huidige versie" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Een kopie opslaan…" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Deze versie terugzetten" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Deze versie definitief verwijderen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Versie terugzetten" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"Deze versie de huidige inhoud van “{name}” maken? De versie die wordt " +"vervangen, blijft in de geschiedenis." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Die versie wordt teruggezet" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "Kon die versie niet terugzetten" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Versie verwijderen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "" +"Deze versie definitief verwijderen? De inhoud kan niet worden hersteld." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Verwijderen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Versie verwijderd" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "Kon die versie niet verwijderen" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Versie opslaan" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "Kon die versie niet opslaan" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "Die locatie is geen lokaal bestand." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Versie opgeslagen" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive: {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Drive doorzoeken › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(geen overeenkomsten voor “{query}”)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(geen vastgezette bestanden — typ om te zoeken)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(kan app-mappen niet bepalen)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} upload in wachtrij" +msgstr[1] "{n} uploads in wachtrij" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} wijziging in wachtrij" +msgstr[1] "{n} wijzigingen in wachtrij" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} upload" +msgstr[1] "{n} uploads" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} wijziging" +msgstr[1] "{n} wijzigingen" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "{uploads}, {changes} in wachtrij" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} bestand in {dir}" +msgstr[1] "{n} bestanden in {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} van {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ {n} wordt gedownload" +msgstr[1] "↓ {n} worden gedownload" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ {n} wordt geüpload" +msgstr[1] "↑ {n} worden geüpload" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Gekoppeld op {mountpoint} ({n} vastgezet)" +msgstr[1] "Gekoppeld op {mountpoint} ({n} vastgezet)" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Synchroniseren — {queued} ({n} vastgezet)" +msgstr[1] "Synchroniseren — {queued} ({n} vastgezet)" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Offline — alleen bestanden in cache ({n} vastgezet)" +msgstr[1] "Offline — alleen bestanden in cache ({n} vastgezet)" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Offline — {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Koppeling: onverwacht antwoord van achtergronddienst" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Aangemeld als {username} — niet gekoppeld" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Niet aangemeld" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Fout: {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} probleem — Bekijken" +msgstr[1] "{n} problemen — Bekijken" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Aanmelden…" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Proton Drive openen" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Map openen" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Synchronisatie hervatten" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Synchronisatie pauzeren" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Verbinden" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Pictogram in systeemvak verbergen" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Proton Drive stoppen…" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Afsluiten" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "Alles" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Mappen" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "Documenten" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Media" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "Mijn bestanden / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Proton Drive doorzoeken" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "Zoeken in Drive en op deze computer" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Esc" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Beste overeenkomsten" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "Geen resultaten" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "Proton Drive draait niet" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "Start de koppeldienst om je Drive te doorzoeken." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ navigeren · ↵ openen · Tab filter" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Achtergronddienst offline" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "Vastgezet in Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Je Drive doorzoeken" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "" +"Deze computer wordt nog geïndexeerd — lokale resultaten verschijnen zo." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Probeer een andere zoekopdracht of een ander filter." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" +"Begin met typen om Proton Drive en de bestanden op deze computer te " +"doorzoeken." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "Geen vastgezette bestanden" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} vastgezet bestand" +msgstr[1] "{n} vastgezette bestanden" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} in Drive · {local} op deze computer · indexeren…" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} in Drive · {local} op deze computer" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "{name} openen…" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "Kon niet openen: {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "Kon de achtergronddienst niet bereiken" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Persoonlijke map" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Persoonlijke map / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} GB" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} MB" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} KB" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} B" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "nu" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count}m" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count}u" + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count}d" + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count}mnd" + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count}j" + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "kan de achtergronddienst van Proton Drive niet bereiken: {error}" diff --git a/po/pdfs.pot b/po/pdfs.pot new file mode 100644 index 0000000..44e266b --- /dev/null +++ b/po/pdfs.pot @@ -0,0 +1,4537 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the proton-drive-linux package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +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-09-23 08:01+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "" + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +msgid "Couldn't reach Proton Drive." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:345 +msgid "Reading photo details…" +msgstr "" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "" + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: crates/pdfs-gui/src/app/pages/takeout.rs:287 +msgid "Import from Google Photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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:1551 +#, 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:1558 +#, 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:1616 +msgid "The server refused." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +msgid "Some photos couldn't be moved to Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "" +msgstr[1] "" + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "" +msgstr[1] "" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "" + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "" + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "" +msgstr[1] "" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "" + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "" +msgstr[1] "" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "" + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "" + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "" + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "" + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..c72d702 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,4746 @@ +# Polish translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: Polish\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "Moje pliki" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Zdjęcia" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Udostępnione mi" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Udostępnione przeze mnie" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Komputery" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Kosz" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Synchronizacja" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Aktywność" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Odśwież (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what}: {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "Brak połączenia z siecią" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "Ten element już nie istnieje" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "Brak dostępu do tego elementu" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "Coś zmieniło ten element wcześniej" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Proton Drive jest pełny" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Preferencje" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Skróty klawiszowe" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "O programie Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Menu główne" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Proton Drive z plikami na żądanie dla pulpitu systemu Linux.\n" +"\n" +"Nieoficjalny klient — niepowiązany z Proton AG, niepopierany ani " +"niewspierany przez tę firmę." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Współtwórcy programu Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "Zatrzymać Proton Drive?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"Dysk zostanie odmontowany, a synchronizacja wstrzymana do czasu ponownego " +"połączenia. Proton Drive uruchomi się ponownie przy następnym zalogowaniu." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Anuluj" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Zatrzymaj" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "Nie można zatrzymać Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "Usługa montowania nie została zatrzymana." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "Ogólne" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Przeszukaj Drive" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Odśwież" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Skróty klawiszowe" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "Pliki" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "Nowy katalog" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Wyślij pliki" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Wstecz/dalej" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Katalog nadrzędny" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Siatka/lista" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Zmień nazwę" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "Przenieś do kosza" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Wyczyść zaznaczenie" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Większe miniatury" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Mniejsze miniatury" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Przywróć rozmiar miniatur" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Zaznacz wszystko" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Przeglądarka zdjęć" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Poprzednie/następne zdjęcie" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "Pierwsze/ostatnie zdjęcie" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Wyświetl szczegóły" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Pełny ekran" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Zamknij" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Należy zaznaczyć jeden element, aby zmienić jego nazwę" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "Wszystko" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Przesyłanie" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Zmiany" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Udostępnianie" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Problemy" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Wymaga uwagi" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Ponów" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Wczytywanie…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Odczytywanie ostatniej aktywności." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "Nie można odczytać aktywności" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Nieoczekiwana odpowiedź od usługi montowania." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Brak połączenia" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "Usługa montowania Proton Drive nie jest uruchomiona." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Łączenie…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "Oczekiwanie na uruchomienie usługi montowania Proton Drive." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Dzisiaj" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Wczoraj" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A, %-d %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d %B %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Na razie nic" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" +"Wysyłanie, przenoszenie, udostępnianie i inne zmiany pojawiają się tutaj na " +"bieżąco." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"Plik został zmieniony w dwóch miejscach jednocześnie. Należy wybrać wersję " +"do zachowania." +msgstr[1] "" +"{n} pliki zostały zmienione w dwóch miejscach jednocześnie. Należy wybrać " +"wersje do zachowania." +msgstr[2] "" +"{n} plików zostało zmienionych w dwóch miejscach jednocześnie. Należy wybrać " +"wersje do zachowania." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "Brak pasującej aktywności" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Nic w ostatnim dzienniku nie pasuje do tego filtru." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n} raz od {time}" +msgstr[1] "{n} razy od {time}" +msgstr[2] "{n} razy od {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Rozwiązane" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Rozwiąż…" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "Wysłano {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "Pobrano {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "Zsynchronizowano {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "Zmieniono nazwę {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "Przeniesiono {name}" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Utworzono katalog {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "Przeniesiono do kosza {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "Przywrócono {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "Usunięto {name}" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Opróżniono kosz ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "Udostępniono {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Utworzono odnośnik do {name}" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "Zakończono udostępnianie {name}" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Konflikt: {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Wczytywanie albumów…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Odczytywanie albumów w Proton Drive." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "Brak biblioteki zdjęć" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "To konto Proton nie ma włączonych Zdjęć." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "Brak albumów" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Można utworzyć album przyciskiem Nowy album lub w Proton Photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "Nie można wczytać albumów" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "Usługa montowania Proton Drive nie odpowiedziała." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} album" +msgstr[1] "{n} albumy" +msgstr[2] "{n} albumów" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Otwórz" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Zmień nazwę…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Usuń album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Nazwa albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Utwórz" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "Nowy album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Utworzono album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "Nie można utworzyć albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "Usługa montowania nie odpowiedziała." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Zmiana nazwy albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Zmieniono nazwę albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "Nie można zmienić nazwy albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "Usunąć album?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "Album „{name}” zostanie usunięty. Jego zdjęcia pozostaną na osi czasu." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Usuń" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Usunięto album" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "Nie można usunąć albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Dodaj do albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Proszę wybrać album dla tego zdjęcia." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +msgstr[0] "Proszę wybrać album dla {n} zdjęcia." +msgstr[1] "Proszę wybrać album dla {n} zdjęć." +msgstr[2] "Proszę wybrać album dla {n} zdjęć." + +#: crates/pdfs-gui/src/app/pages/albums.rs:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "Nowy album…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "Nie można dodać niektórych zdjęć" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "Dodano {n} zdjęcie do albumu" +msgstr[1] "Dodano {n} zdjęcia do albumu" +msgstr[2] "Dodano {n} zdjęć do albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "Nie można dodać do albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "Nie można usunąć niektórych zdjęć z albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "Usunięto {n} zdjęcie z albumu" +msgstr[1] "Usunięto {n} zdjęcia z albumu" +msgstr[2] "Usunięto {n} zdjęć z albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "Nie można usunąć z albumu" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} zdjęcie · udostępnione mi" +msgstr[1] "{n} zdjęcia · udostępnione mi" +msgstr[2] "{n} zdjęć · udostępnione mi" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} zdjęcie" +msgstr[1] "{n} zdjęcia" +msgstr[2] "{n} zdjęć" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Wstecz (Alt+Strzałka w lewo)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Dalej (Alt+Strzałka w prawo)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "Nowy katalog" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Wyślij pliki…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Wyślij katalog…" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "Nowy" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Siatka" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "Lista" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Nazwa" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Rozmiar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Ostatnia modyfikacja" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Sortowanie według" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Odwrotna kolejność" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Katalogi na początku" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Wyświetl jako listę (Ctrl+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Opcje sortowania i widoku" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "Otwórz w menedżerze plików" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Utwórz miniatury" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Działania na katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Anuluj tworzenie miniatur" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Przeszukaj tylko ten katalog" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Oznacz jako dostępne offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Oznacz jako tylko online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Przenieś do…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Wyczyść zaznaczenie (Esc)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Powiększenie:" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Rozmiar: {n} piksel" +msgstr[1] "Rozmiar: {n} piksele" +msgstr[2] "Rozmiar: {n} pikseli" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Miejsce na koncie Proton" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "Moje pliki" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "Zaznaczono: {n}" +msgstr[1] "Zaznaczono: {n}" +msgstr[2] "Zaznaczono: {n}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "Nie można przenieść do kosza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "Proton Drive nie jest połączony." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "" +"Przeniesiono {n} element do kosza — niektórych nie można było przenieść" +msgstr[1] "" +"Przeniesiono {n} elementy do kosza — niektórych nie można było przenieść" +msgstr[2] "" +"Przeniesiono {n} elementów do kosza — niektórych nie można było przenieść" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "Przeniesiono „{name}” do kosza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "Przeniesiono {n} element do kosza" +msgstr[1] "Przeniesiono {n} elementy do kosza" +msgstr[2] "Przeniesiono {n} elementów do kosza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Cofnij" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Przywrócono z kosza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "Przywrócono {n} element z kosza" +msgstr[1] "Przywrócono {n} elementy z kosza" +msgstr[2] "Przywrócono {n} elementów z kosza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "Nie można przywrócić z kosza" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "Nie można zmienić stanu dostępności offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} plik jest teraz dostępny offline" +msgstr[1] "{n} pliki są teraz dostępne offline" +msgstr[2] "{n} plików jest teraz dostępnych offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} plik jest teraz tylko online" +msgstr[1] "{n} pliki są teraz tylko online" +msgstr[2] "{n} plików jest teraz tylko online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Modyfikacja" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Położenie" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Otwórz za pomocą…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Odtwórz" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Dostępne offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Udostępnij…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Skopiuj odnośnik" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Przenieś do…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Wersje…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Szczegóły" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "Nowy katalog…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Zaznacz wszystko" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "Nie można otworzyć pliku" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "Funkcja „Otwórz za pomocą” wymaga zamontowania katalogu Proton Drive." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Skopiowano odnośnik" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "Nie można skopiować odnośnika" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "Nie można odtworzyć multimediów" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "Ścieżka do pliku nie jest prawidłowym tekstem UTF-8." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "Przesyłanie strumieniowe „{name}”…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "„{name}” jest teraz tylko online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "„{name}” jest teraz dostępne offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "Nie można zapisać widoku" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Wyświetl jako siatkę (Ctrl+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "Nie można otworzyć katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "Nie można utworzyć miniatur" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Rozpoczynanie tworzenia miniatur…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Zatrzymywanie tworzenia miniatur…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "Nie można anulować tworzenia miniatur" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Zatrzymano tworzenie miniatur" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "Usługa montowania przestała zgłaszać postęp tworzenia miniatur." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} katalog" +msgstr[1] "{n} katalogi" +msgstr[2] "{n} katalogów" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} obraz" +msgstr[1] "{n} obrazy" +msgstr[2] "{n} obrazów" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Skanowanie {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Tworzenie miniatur w {root}… {done} z {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Miniatury gotowe dla {n} obrazu w {root}" +msgstr[1] "Miniatury gotowe dla {n} obrazów w {root}" +msgstr[2] "Miniatury gotowe dla {n} obrazów w {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "Miniatury gotowe dla {n} obrazu w {root}; niedostępne: {failed}" +msgstr[1] "Miniatury gotowe dla {n} obrazów w {root}; niedostępne: {failed}" +msgstr[2] "Miniatury gotowe dla {n} obrazów w {root}; niedostępne: {failed}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "Nowa nazwa" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Zmieniono nazwę na „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "Nie można zmienić nazwy" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "Przenieś „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Przenieś {n} element" +msgstr[1] "Przenieś {n} elementy" +msgstr[2] "Przenieś {n} elementów" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Proszę wybrać katalog docelowy." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Przenieś tutaj" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "Nie można odczytać tego katalogu." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "Brak katalogów." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "Nie można przenieść" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "„{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "Przeniesiono {n} element do {place}, ale nie wszystkie" +msgstr[1] "Przeniesiono {n} elementy do {place}, ale nie wszystkie" +msgstr[2] "Przeniesiono {n} elementów do {place}, ale nie wszystkie" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Przeniesiono do {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "Przeniesiono {n} element do {place}" +msgstr[1] "Przeniesiono {n} elementy do {place}" +msgstr[2] "Przeniesiono {n} elementów do {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Utwórz katalog w bieżącym katalogu." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Nazwa katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "Utworzono „{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "Nie można utworzyć katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Wysyłanie plików" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Wysyłanie katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "Nie można wysłać" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Wysyłanie…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Wysyłanie {n} elementu…" +msgstr[1] "Wysyłanie {n} elementów…" +msgstr[2] "Wysyłanie {n} elementów…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "Wyświetl" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Przeniesiono do „{name}”" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d %b %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Odczytywanie tego katalogu." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Katalog jest niedostępny" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "Nie można otworzyć tego katalogu" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "Ten katalog jest pusty" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Można upuścić tutaj pliki, wysłać plik lub utworzyć katalog, aby zacząć." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Szukaj wszędzie" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Wyszukiwanie…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Wyszukiwanie „{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — wyświetlanie pierwszego {n} wyniku wyszukiwania" +msgstr[1] "{summary} — wyświetlanie pierwszych {n} wyników wyszukiwania" +msgstr[2] "{summary} — wyświetlanie pierwszych {n} wyników wyszukiwania" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — wyniki wyszukiwania" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "Brak wyników" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "Żadne pliki ani katalogi nie pasują do wyszukiwania." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} plik" +msgstr[1] "{n} pliki" +msgstr[2] "{n} plików" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "Ten komputer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "Komputer, jako który to urządzenie tworzy kopię zapasową." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Zmień nazwę tego komputera" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Inne komputery" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Inne komputery tworzące kopie zapasowe na tym koncie." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Odczytywanie komputerów." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Kopia zapasowa jako „{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Zmień nazwę tego komputera ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "Brak innych komputerów" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "" +"Tutaj pojawiają się aplikacje komputerowe synchronizujące z tym kontem." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Przywróć na tym komputerze…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Użyj tożsamości tego komputera…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Usuń komputer…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · ostatnia synchronizacja: {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · nigdy nie zsynchronizowano" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Otwórz synchronizację" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "Zarządzanie katalogami i punktem montowania tego komputera" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Przywróć katalogi…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "" +"Brak katalogów z kopią zapasową — można je dodać na stronie Synchronizacja." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} katalog z kopią zapasową" +msgstr[1] "{n} katalogi z kopią zapasową" +msgstr[2] "{n} katalogów z kopią zapasową" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · zarządzanie na stronie Synchronizacja" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} wymaga uwagi" +msgstr[1] "{folders} · {n} wymagają uwagi" +msgstr[2] "{folders} · {n} wymaga uwagi" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "synchronizowanie…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "błąd synchronizacji" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "wymaga uwagi" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "aktualne" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "sprawdzanie zmian…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "sprawdzanie zmian — {done} z {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "synchronizowanie {done} z {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "synchronizowanie {file} — {done} z {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Dodaj katalog do synchronizacji" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Synchronizowanie katalogu…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "Nie można dodać katalogu" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "Nie można wyświetlić listy katalogów do przywrócenia" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Należy zaznaczyć katalogi do synchronizacji z tym komputerem i dostosować " +"położenie każdego z nich." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Przywracanie katalogów" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Przywróć" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Przywracanie katalogów…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "Nie można przywrócić katalogów" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"Te katalogi mają kopię zapasową z komputera „{name}”. Przywrócone katalogi " +"nadal będą synchronizowane z kopią tego komputera." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "Te katalogi mają kopię zapasową w Proton Drive pod tym komputerem." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" +"Nie ma nic do przywrócenia — wszystkie katalogi komputera „{name}” są tutaj " +"synchronizowane." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" +"Nie ma nic do przywrócenia — wszystkie katalogi tego komputera są tutaj " +"synchronizowane." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "Katalog zostanie przełączony na tryb na żądanie" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "Katalog zostanie pobrany i będzie synchronizowany" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "Nie można zmienić trybu" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"Zatrzymać synchronizację „{path}”?\n" +"\n" +"Ten katalog działa w trybie na żądanie: jego pliki znajdują się w Proton " +"Drive, a nie na tym dysku, więc po odmontowaniu katalog będzie pusty. Aby " +"zachować lokalną kopię, należy anulować, wyłączyć tryb na żądanie i poczekać " +"na ukończenie pobierania przed usunięciem." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"Zatrzymać synchronizację „{path}”?\n" +"\n" +"Lokalne pliki pozostaną na tym dysku i po prostu przestaną być " +"synchronizowane. Można też usunąć kopię w Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Zatrzymanie synchronizacji katalogu" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Usuń także z Proton Drive" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Usuwa jedyną kopię tych plików." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "Lokalna kopia pozostanie bez zmian." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Zatrzymaj synchronizację" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "Zatrzymano synchronizację katalogu" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "Nie można zatrzymać synchronizacji katalogu" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Zmiana nazwy komputera" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "Proszę podać nową nazwę komputera „{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "Nie można zmienić nazwy komputera" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "Nazwa jest wymagana." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Zmieniono nazwę komputera" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Proszę wpisać „{name}”, aby potwierdzić" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Usuwanie komputera" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"Usunąć komputer „{name}” z tego konta?\n" +"\n" +"Wszystko, co miał w kopii zapasowej w Proton Drive, zostanie usunięte razem " +"z nim. Pliki na samym komputerze pozostaną nietknięte — ale tej operacji nie " +"można tutaj cofnąć." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Usuń" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Usunięto komputer" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "Nie można usunąć komputera" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Użycie tożsamości tego komputera" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"Traktować to urządzenie jako „{name}”?\n" +"\n" +"Nowe synchronizowane katalogi będą tworzone w Proton Drive pod tamtym " +"komputerem, a to urządzenie zachowa tę tożsamość nawet po zmianie nazwy " +"hosta. Katalogi już tutaj synchronizowane nie zostaną przeniesione.\n" +"\n" +"Następnie można użyć funkcji „Przywróć katalogi”, aby odzyskać to, co " +"synchronizował komputer „{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Użyj tożsamości" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Przejęto tożsamość" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "Nie można przejąć tożsamości tego komputera" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Dodaj katalog" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "" +"Kopia zapasowa lokalnego katalogu w urządzeniu tego komputera w Proton Drive" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Konflikty" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"Pliki zmienione w dwóch miejscach jednocześnie. Zachowano obie wersje; " +"należy wybrać, która pozostanie." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "Na tym komputerze" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"Położenie Proton Drive na tym komputerze. Katalogi synchronizowane " +"przechowują pełną kopię na tym dysku; katalogi na żądanie przechowują pliki " +"tylko w Proton Drive i pobierają je przy otwieraniu." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Synchronizacja" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "Wstrzymaj na 1 godzinę" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "Wstrzymaj na 8 godzin" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "Wstrzymaj na 24 godziny" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Wstrzymaj" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" +"Wstrzymuje wysyłanie do czasu wznowienia. Pliki nadal otwierają się " +"normalnie." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Wstrzymaj na jakiś czas" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Sprawdzanie…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Wznów" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "Wysyła wszystko, co czekało podczas wstrzymania synchronizacji" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "Nie można wstrzymać synchronizacji" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "Nie można wznowić synchronizacji" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Wznowiono synchronizację" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Wstrzymano synchronizację do czasu wznowienia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Wstrzymano synchronizację" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Ponów wszystko" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Ponawia teraz wszystkie nieudane zmiany" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "Oczekujące na wysłanie" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "" +"Zmiany wprowadzone na tym komputerze, których jeszcze nie ma w Proton Drive." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Zmiany wprowadzone na tym komputerze, których jeszcze nie ma w Proton Drive. " +"Wyświetlanie pierwszych {shown} z {n}." +msgstr[1] "" +"Zmiany wprowadzone na tym komputerze, których jeszcze nie ma w Proton Drive. " +"Wyświetlanie pierwszych {shown} z {n}." +msgstr[2] "" +"Zmiany wprowadzone na tym komputerze, których jeszcze nie ma w Proton Drive. " +"Wyświetlanie pierwszych {shown} z {n}." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Wysłanie zmian" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Wysłanie nowego pliku" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Utworzenie katalogu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Zmiana nazwy lub przeniesienie" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "Przeniesienie do kosza" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Zmiana" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "oczekiwanie, aż zapisujący program skończy" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "ponowienie {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "oczekiwanie na wznowienie synchronizacji" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "następne w kolejce" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "Niepowodzenie {n} raz: {error}" +msgstr[1] "Niepowodzenie {n} razy: {error}" +msgstr[2] "Niepowodzenie {n} razy: {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Ponów teraz" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Ponawianie…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "Nie można ponowić" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, zmieniono {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "Oryginał już nie istnieje; pozostała tylko ta kopia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Ta sama zawartość co oryginał" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Różni się od {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"Plik „{name}” został zmieniony tutaj i gdzie indziej w tym samym czasie.\n" +"\n" +"Oryginał: {original}\n" +"Kopia: {copy}\n" +"\n" +"To, co nie zostanie zachowane, trafi do kosza, skąd można to przywrócić." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"Oryginalny plik „{name}” już nie istnieje; pozostała tylko kopia ({copy}).\n" +"\n" +"Zachowanie kopii przywróci jej oryginalną nazwę." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Rozwiązanie konfliktu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Nazwa kopii, jeśli zachowane zostaną obie" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Zachowaj oryginał" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Zachowaj oba" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Zachowaj kopię" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "Nie można rozwiązać konfliktu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "Odczytywanie położeń Proton Drive tego komputera." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "Niedostępne" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "Brak położeń" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "Usługa montowania nie zgłosiła jeszcze punktu montowania." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Tylko do odczytu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Otwórz ten katalog" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Zmień" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Wybierz inny katalog do montowania Proton Drive" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Wznów synchronizację tego katalogu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Wstrzymaj synchronizację tego katalogu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Synchronizuj teraz ten katalog" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"Na żądanie: zwalnia miejsce na dysku, przechowując pliki tylko w Proton " +"Drive i pobierając każdy przy otwarciu. Wyłączenie pobiera je z powrotem i " +"zachowuje pełną lokalną kopię." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Zatrzymaj synchronizację tego katalogu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "Przełączyć katalog na tryb na żądanie?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"Pliki w {path} zostaną usunięte z tego komputera i będą przechowywane tylko " +"w Proton Drive. Każdy plik zostanie ponownie pobrany przy otwarciu." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Przełącz na tryb na żądanie" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "Nie można wstrzymać katalogu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "Nie można wznowić katalogu" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Wstrzymano katalog" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Wznowiono katalog" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "Nie można zsynchronizować" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Udostępniony katalog" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Przełączanie na tryb na żądanie" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Przełączanie na synchronizację" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "Na żądanie" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Synchronizowany" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "wstrzymany" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "niezamontowany" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Logowanie do Proton" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Proszę użyć konta Proton, aby połączyć Drive." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "Adres e-mail lub nazwa użytkownika" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Hasło" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Zaloguj się" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Utwórz konto" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "Nie pamiętasz hasła?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "Proszę podać adres e-mail i hasło." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Logowanie…" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Proszę ukończyć weryfikację, aby kontynuować…" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "anulowano logowanie" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "" +"Za dużo prób logowania. Proszę odczekać kilka minut i spróbować ponownie." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" +"Nie można połączyć się z Proton. Proszę sprawdzić połączenie z Internetem i " +"spróbować ponownie." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Zalogowano, ale nie można zapisać sesji w bazie kluczy systemu. Proszę się " +"upewnić, że baza kluczy (GNOME Keyring lub KWallet) jest uruchomiona i " +"odblokowana." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "Anulowano logowanie: nie wpisano kodu uwierzytelniania dwuetapowego." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Anulowano logowanie: weryfikacja nie została ukończona. Proszę zalogować się " +"ponownie, aby otrzymać nową." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Logowanie się nie powiodło: {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Uwierzytelnianie dwuetapowe" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" +"Proszę wpisać kod z aplikacji uwierzytelniającej lub jeden z kodów " +"odzyskiwania." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Kod uwierzytelniania" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Potwierdź" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "Wylogować się?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"Proton Drive rozłączy się i przestanie synchronizować do czasu ponownego " +"zalogowania. Pliki znajdujące się już na tym komputerze pozostaną na miejscu." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "Wyświetl {name}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "Wyświetl plik RAW" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "Wyświetl film" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "Wyświetl zdjęcie" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "Nie można wyświetlić tego zdjęcia." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +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:345 +msgid "Reading photo details…" +msgstr "Odczytywanie szczegółów zdjęcia…" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Rozmiar" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "To zdjęcie nie zawiera metadanych." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Wymiary" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Data wykonania" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Aparat" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Obiektyw" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Ekspozycja" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Miejsce" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Zapisz kopię" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "Zapisano „{name}”" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +msgid "Couldn't save the copy" +msgstr "Nie można zapisać kopii" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:666 +msgid "The copy was interrupted." +msgstr "Przerwano kopiowanie." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} z {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} z {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Zdjęcie" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Poprzednie (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Następne (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Dodaj do ulubionych" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Inne pliki tego zdjęcia" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Zapisz kopię…" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "Przenieś do kosza (Delete)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Zamknij (Esc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Wyświetl na mapie" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Ukryj szczegóły" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "Nie można zmienić stanu ulubionego" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Wyślij zdjęcia" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Przejdź do miesiąca" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Wróć do albumów" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Wyślij" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Importuj eksport Google Takeout z Google Photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Zaznacz zdjęcia" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Dodaj do albumu…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Zakończ zaznaczanie (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Wyświetlaj tylko ulubione" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "Wszystkie daty" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Oś czasu" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Albumy" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Importowanie z Google Photos…" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Wybór zdjęcia do wysłania" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Obrazy" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Wysłano zdjęcie" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "Nie można wysłać zdjęcia" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "Przenieść to zdjęcie do kosza?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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] "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:1551 +#, rust-format +msgid "Move {n} photo to Trash?" +msgid_plural "Move {n} photos to Trash?" +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:1558 +#, 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] "" +"Przenieść {n} zdjęcie do kosza? Jest przechowywane w {files} plikach." +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:1616 +msgid "The server refused." +msgstr "Serwer odmówił." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "Przeniesiono {n} zdjęcie do kosza" +msgstr[1] "Przeniesiono {n} zdjęcia do kosza" +msgstr[2] "Przeniesiono {n} zdjęć do kosza" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%Y-%m-%d %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Nieznana data" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Ulubione" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Zaznacz" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Usuń z albumu" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "Przenieś do kosza…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Dodano do ulubionych" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Usunięto z ulubionych" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Wczytywanie zdjęć…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Odczytywanie osi czasu Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Pusty album" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "Ten album nie zawiera żadnych zdjęć." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "Nie można wczytać więcej zdjęć" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "Nie można wczytać zdjęć" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "Dodaj zakładkę — zapisz publiczny odnośnik, aby otwierać go stąd" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Zaproszenia" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Akceptacja doda element do udostępnionych plików." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Zakładki" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Wstecz" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Udostępnione mi" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Odczytywanie udostępnionych elementów." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Odczytywanie tego udostępnionego katalogu." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "Nie można otworzyć udostępnionego katalogu" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Zaproszenia ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "Ten katalog jest pusty." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "Wyświetl w Moich plikach" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Opuść…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"Podpis zaproszenia nie zgadza się z kluczami nadawcy. Zaproszenie może nie " +"pochodzić od tej osoby." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Przeglądający" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Redaktor" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Administrator" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Może wyświetlać" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Może edytować" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Może zarządzać" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "Pobieranie „{name}”…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "Nic nie zostało udostępnione" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"Tutaj pojawiają się pliki i katalogi udostępnione przez inne osoby. Są tu " +"też przechowywane publiczne odnośniki zapisane jako zakładki." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Udostępnione mi" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "udostępniony element" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "Od {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Odrzuć" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Zaakceptuj" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "ten element" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "Odrzucić zaproszenie?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "" +"Dostęp do {name} nie będzie możliwy, chyba że zostanie ponownie udostępniony." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Udostępniony odnośnik" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Usuń zakładkę" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Otwórz w przeglądarce" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Zaakceptowano zaproszenie" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "Nie można zaakceptować zaproszenia" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Odrzucono zaproszenie" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "Nie można odrzucić zaproszenia" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Opuszczenie udostępnionego elementu" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "" +"Opuścić „{name}”? Dostęp zostanie utracony do czasu ponownego zaproszenia." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Opuść" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Opuszczono udostępniony element" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "Nie można opuścić udostępnionego elementu" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "Usunąć zakładkę „{name}”?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Usunięto zakładkę" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "Nie można usunąć zakładki" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Dodanie zakładki" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "Proszę wkleić publiczny odnośnik Proton Drive, aby go tutaj zapisać." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "Adres URL publicznego odnośnika" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Hasło (jeśli odnośnik je ma)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Dodaj" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "Nie można dodać zakładki" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "Adres URL jest wymagany." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Zapisano zakładkę" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "Nie można dodać zakładki" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Udostępnione przeze mnie" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Odczytywanie udostępnionych elementów." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "Nie można odczytać udostępnień" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Na razie nic nie udostępniono" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "" +"Tutaj pojawiają się elementy udostępnione innym osobom lub przez odnośnik." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Skopiuj odnośnik" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Otwórz odnośnik" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Zarządzaj dostępem…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Zakończ udostępnianie…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "Zakończyć udostępnianie?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Wszystkie zaproszone osoby stracą dostęp do „{name}”, oczekujące zaproszenia " +"zostaną wycofane, a publiczny odnośnik przestanie działać." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Zakończ udostępnianie" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "Zakończono udostępnianie {name}" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "Nie można zakończyć udostępniania" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} osoba" +msgstr[1] "{n} osoby" +msgstr[2] "{n} osób" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "oczekujące: {n}" +msgstr[1] "oczekujące: {n}" +msgstr[2] "oczekujące: {n}" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Publiczny odnośnik" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Udostępnione" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Uruchamianie" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Uruchamianie po zalogowaniu" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Automatyczne łączenie Proton Drive po zalogowaniu" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Katalog Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Zmień…" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Sieć" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" +"Ograniczenie szybkości przesyłania plików, wspólne dla wszystkich " +"transferów. 0 oznacza brak ograniczenia." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Ograniczenie wysyłania (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Ograniczenie pobierania (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Wygląd" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Fioletowy akcent Proton" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "Używanie koloru marki Proton zamiast systemowego koloru akcentu" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Ikona w obszarze powiadamiania" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "Stan synchronizacji i szybkie działania na panelu" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Pamięć podręczna" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "Przypięte i ostatnio otwierane pliki przechowywane na tym komputerze." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Ograniczenie rozmiaru pamięci podręcznej (GiB)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" +"Po przekroczeniu tego rozmiaru starsze pliki są usuwane; 0 oznacza brak " +"ograniczenia" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Wyczyszczenie pamięci podręcznej" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "Usuwa kopie w pamięci podręcznej. Pliki dostępne offline pozostają." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Wyczyść…" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "Pliki przechowywane na tym komputerze, dostępne nawet bez połączenia." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Miejsce" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Wyświetl stan synchronizacji" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Wyloguj się…" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Konto" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "Domyślny systemu" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Język" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Zmiana zostanie zastosowana przy następnym uruchomieniu Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Przesyłanie" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "Pliki przesyłane do i z Proton Drive." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Zaktualizowano rozmiar pamięci podręcznej" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "Nie można ustawić rozmiaru pamięci podręcznej" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Zaktualizowano ograniczenia przepustowości" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "Nie można ustawić ograniczeń przepustowości" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "Wyczyścić pamięć podręczną?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"Kopie w pamięci podręcznej zostaną usunięte z tego komputera i pobrane " +"ponownie przy otwarciu. Pliki dostępne offline pozostaną." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Wyczyść pamięć podręczną" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Wyczyszczono pamięć podręczną" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "Nie można wyczyścić pamięci podręcznej" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "Nie można zapisać koloru akcentu" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "Nie można zapisać ustawienia ikony w obszarze powiadamiania" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "Nie można zapisać języka" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Proszę ponownie uruchomić Proton Drive, aby użyć nowego języka" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Wybór katalogu punktu montowania" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "Nie można zapisać punktu montowania" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Wymagane ponowne uruchomienie" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" +"Punkt montowania to teraz „{path}”. Ponownie uruchomić montowanie Drive, aby " +"go użyć?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Później" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Uruchom ponownie teraz" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "Użyto {size}" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "Użyto {used} z {total} ({percent}%)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "Wolne: {size}" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "Wolne: {free} z {total} (użyto {percent}%)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Połączono z Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Dysk jest zamontowany i dostępny." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Rozłączono z Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" +"Usługa montowania została zatrzymana. Pliki będą niedostępne do czasu jej " +"ponownego uruchomienia." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Ukończono synchronizację" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "Ukończono przesyłanie {n} pliku." +msgstr[1] "Ukończono przesyłanie {n} plików." +msgstr[2] "Ukończono przesyłanie {n} plików." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title} — {done} z {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title} — {detail} ({done} z {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title}…" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title} — {detail}…" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name} — {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name} — {done} z {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · wznowienie {time}" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Wznowienie {time}" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Do czasu wznowienia" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} zmiana wymaga uwagi" +msgstr[1] "{n} zmiany wymagają uwagi" +msgstr[2] "{n} zmian wymaga uwagi" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Tylko pliki w pamięci podręcznej" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Synchronizowanie" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "Aktualne" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "Proton Drive nie jest uruchomiony" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "później" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "o %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "%a %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "%-d %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "Brak plików dostępnych offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "" +"Należy kliknąć plik prawym przyciskiem myszy i wybrać „Oznacz jako dostępne " +"offline”." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "Nie można oznaczyć jako tylko online" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Wyświetl mniej" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "Wyświetl {n} plik" +msgstr[1] "Wyświetl wszystkie {n} pliki" +msgstr[2] "Wyświetl wszystkie {n} plików" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Zdjęcia, które już są w Proton Photos, są rozpoznawane po nazwie i " +"zawartości i pomijane, więc ponowne uruchomienie przerwanego importu jest " +"bezpieczne." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Wróć do zdjęć" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "Dodaj eksport Google Takeout do osi czasu Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Upuść tutaj pliki .zip z Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Należy dodać wszystkie części eksportu naraz — zdjęcie i jego metadane " +"często znajdują się w różnych częściach." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Wybierz pliki…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Archiwa do zaimportowania" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Wyczyść" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Usuń wszystkie dodane archiwa" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Skanuj" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "Sprawdza archiwa i zgłasza, co zostałoby zaimportowane, bez wysyłania" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Importuj" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Zatrzymaj import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "" +"Dokończy wysyłane zdjęcie, zapisze to, co wysłano, a następnie zatrzyma" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Trwa importowanie" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Ostatni import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Wybór archiwów Google Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Archiwa Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "Zaimportować ten eksport?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"{n} archiwum zostanie wysłane do Proton Photos, a albumy zostaną utworzone " +"tak, jak w eksporcie. Może to potrwać wiele godzin; można to zatrzymać w " +"dowolnym momencie, a to, co już wysłano, pozostanie. Zdjęcia, które już są, " +"zostaną pominięte." +msgstr[1] "" +"{n} archiwa zostaną wysłane do Proton Photos, a albumy zostaną utworzone " +"tak, jak w eksporcie. Może to potrwać wiele godzin; można to zatrzymać w " +"dowolnym momencie, a to, co już wysłano, pozostanie. Zdjęcia, które już są, " +"zostaną pominięte." +msgstr[2] "" +"{n} archiwów zostanie wysłanych do Proton Photos, a albumy zostaną utworzone " +"tak, jak w eksporcie. Może to potrwać wiele godzin; można to zatrzymać w " +"dowolnym momencie, a to, co już wysłano, pozostanie. Zdjęcia, które już są, " +"zostaną pominięte." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Zatrzymywanie importu…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "Nie można zatrzymać importu" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Można importować tylko pliki .zip z Takeout — rozpakowane katalogi nie są " +"obsługiwane." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "Dodano {n} archiwum" +msgstr[1] "Dodano {n} archiwa" +msgstr[2] "Dodano {n} archiwów" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "Nie dodano jeszcze żadnych archiwów." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Usuń z tego importu" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} archiwum, łącznie {size}. {note}" +msgstr[1] "{n} archiwa, łącznie {size}. {note}" +msgstr[2] "{n} archiwów, łącznie {size}. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Odczytywanie archiwów…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Rozpoczynanie importu…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Skanowanie eksportu…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "Rozpoczęto import — można opuścić tę stronę, będzie on kontynuowany." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "Nie można rozpocząć importu" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Ukończono skanowanie" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Ukończono import" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "Dodano {n} zdjęcie, niepowodzenia: {failed}." +msgstr[1] "Dodano {n} zdjęcia, niepowodzenia: {failed}." +msgstr[2] "Dodano {n} zdjęć, niepowodzenia: {failed}." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Zatrzymano po {n} zdjęciu." +msgstr[1] "Zatrzymano po {n} zdjęciach." +msgstr[2] "Zatrzymano po {n} zdjęciach." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "Dodano {n} zdjęcie do Proton Photos." +msgstr[1] "Dodano {n} zdjęcia do Proton Photos." +msgstr[2] "Dodano {n} zdjęć do Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "Ukończono import z Google Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Wynik skanowania" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "Nic nie zostało wysłane — tak wyglądałby import." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Zatrzymano wcześniej. Wszystko, co już wysłano, jest na osi czasu; ponowne " +"uruchomienie będzie kontynuowane od miejsca przerwania." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Ukończono." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Zdjęcia w eksporcie" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "Do wysłania" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Wysłano" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Już w Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Albumy do utworzenia" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Utworzone albumy" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "Zdjęcia przypisane do albumów" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Pominięte (w koszu Google)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Dane do wysłania" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Wysłane dane" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Niepowodzenie" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} z {total} — {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Przetwarzanie…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Opróżnij kosz…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Trwale usuwa wszystko z kosza" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Przywróć" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Usuń trwale…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Przywróć do pierwotnego katalogu" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Usuń trwale" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Katalog" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "Zaznaczono {n} element" +msgstr[1] "Zaznaczono {n} elementy" +msgstr[2] "Zaznaczono {n} elementów" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "Odczytywanie kosza." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "Nie można odczytać kosza" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "Kosz jest pusty" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Tutaj pojawiają się elementy usunięte z Proton Drive." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} element" +msgstr[1] "{n} elementy" +msgstr[2] "{n} elementów" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "Przywrócono „{name}”" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "Przywrócono {n} element" +msgstr[1] "Przywrócono {n} elementy" +msgstr[2] "Przywrócono {n} elementów" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "Nie można przywrócić" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "Trwale usunąć „{name}”? Tej operacji nie można cofnąć." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "Trwale usunięto „{name}”" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "Trwale usunąć {n} element? Tej operacji nie można cofnąć." +msgstr[1] "Trwale usunąć {n} elementy? Tej operacji nie można cofnąć." +msgstr[2] "Trwale usunąć {n} elementów? Tej operacji nie można cofnąć." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "Trwale usunięto {n} element" +msgstr[1] "Trwale usunięto {n} elementy" +msgstr[2] "Trwale usunięto {n} elementów" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Usuń trwale" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "Nie można usunąć" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Opróżnij kosz" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "Trwale usunąć {n} element z kosza? Tej operacji nie można cofnąć." +msgstr[1] "" +"Trwale usunąć wszystkie {n} elementy z kosza? Tej operacji nie można cofnąć." +msgstr[2] "" +"Trwale usunąć wszystkie {n} elementów z kosza? Tej operacji nie można cofnąć." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Opróżniono kosz" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "Nie można opróżnić kosza" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Weryfikacja" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Szczegóły (Alt+Enter)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Zamknij szczegóły" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Informacje" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "" +"Przechowywanie kopii na tym komputerze, dostępnej nawet bez połączenia." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Udostępnianie" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Dostęp" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Wersje" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "Historia" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "Nie zaznaczono żadnego elementu" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Należy zaznaczyć plik lub katalog, aby wyświetlić jego szczegóły." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "Plik" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Otwórz katalog" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "Nie można wczytać udostępniania" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "Nie można wczytać wersji" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Tylko ja" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Każdy, kto ma odnośnik" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Udostępniono {n} osobie" +msgstr[1] "Udostępniono {n} osobom" +msgstr[2] "Udostępniono {n} osobom" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Udostępniono {n} osobie · publiczny odnośnik" +msgstr[1] "Udostępniono {n} osobom · publiczny odnośnik" +msgstr[2] "Udostępniono {n} osobom · publiczny odnośnik" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "Brak wcześniejszych wersji" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 wersja · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} wersja · najnowsza {date}" +msgstr[1] "{n} wersje · najnowsza {date}" +msgstr[2] "{n} wersji · najnowsza {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "Więcej" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Nigdy" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 dzień" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 dni" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 dni" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "Nie można udostępnić" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Udostępnij" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Zaproś osoby" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "" +"Adresy e-mail w Proton i poza nim, oddzielone spacjami lub przecinkami." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "Adresy e-mail" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Rola" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Wiadomość (opcjonalnie)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Wyślij zaproszenia" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "Osoby z dostępem" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "„{text}” nie jest adresem e-mail" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Wysłano zaproszenia" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "Nie można wysłać zaproszeń" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "Nikt inny nie ma jeszcze dostępu." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Członek" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Zaproszono (oczekuje)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Zaproszono (zewnętrzny, oczekuje)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Zaktualizowano rolę" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "Nie można zaktualizować roli" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Usuń dostęp" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "Usunąć dostęp?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} nie będzie już mieć możliwości otwarcia tego elementu." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Usunięto dostęp" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "Nie można usunąć dostępu" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Każdy, kto ma odnośnik ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "chroniony hasłem" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Usuń odnośnik" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "Usunąć publiczny odnośnik?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"Odnośnik przestanie działać dla wszystkich, którzy go mają. Nowy odnośnik " +"będzie miał inny adres." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Usuń odnośnik" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Usunięto publiczny odnośnik" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "Nie można usunąć odnośnika" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Rola odnośnika" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Hasło (opcjonalnie)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Wygasa" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Utwórz publiczny odnośnik" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Utworzono publiczny odnośnik" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "Nie można utworzyć odnośnika" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "wygasł" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "wygasa {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "Nie można wczytać wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "Brak wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Katalogi nie mają wersji." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Historia wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" +"Proton Drive przechowuje wcześniejsze wersje pliku do czasu ich usunięcia." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "Brak wcześniejszych wersji." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Bieżąca wersja" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Zapisz kopię…" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Przywróć tę wersję" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Trwale usuń tę wersję" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Przywrócenie wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"Uczynić tę wersję bieżącą zawartością „{name}”? Zastępowana wersja " +"pozostanie w historii." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Przywracanie tej wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "Nie można przywrócić tej wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Usunięcie wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "Trwale usunąć tę wersję? Jej zawartości nie można będzie odzyskać." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Usuń" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Usunięto wersję" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "Nie można usunąć tej wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Zapisanie wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "Nie można zapisać tej wersji" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "To położenie nie jest lokalnym plikiem." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Zapisano wersję" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive: {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Przeszukaj Drive › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(brak wyników dla „{query}”)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(brak przypiętych plików — zacznij pisać, aby wyszukać)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(nie można ustalić katalogów aplikacji)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} plik w kolejce do wysłania" +msgstr[1] "{n} pliki w kolejce do wysłania" +msgstr[2] "{n} plików w kolejce do wysłania" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} zmiana w kolejce" +msgstr[1] "{n} zmiany w kolejce" +msgstr[2] "{n} zmian w kolejce" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} plik do wysłania" +msgstr[1] "{n} pliki do wysłania" +msgstr[2] "{n} plików do wysłania" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} zmiana" +msgstr[1] "{n} zmiany" +msgstr[2] "{n} zmian" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "W kolejce: {uploads}, {changes}" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} plik w {dir}" +msgstr[1] "{n} pliki w {dir}" +msgstr[2] "{n} plików w {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} z {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ pobieranie: {n}" +msgstr[1] "↓ pobieranie: {n}" +msgstr[2] "↓ pobieranie: {n}" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ wysyłanie: {n}" +msgstr[1] "↑ wysyłanie: {n}" +msgstr[2] "↑ wysyłanie: {n}" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Zamontowano w {mountpoint} (przypięte: {n})" +msgstr[1] "Zamontowano w {mountpoint} (przypięte: {n})" +msgstr[2] "Zamontowano w {mountpoint} (przypięte: {n})" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Synchronizowanie — {queued} (przypięte: {n})" +msgstr[1] "Synchronizowanie — {queued} (przypięte: {n})" +msgstr[2] "Synchronizowanie — {queued} (przypięte: {n})" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})" +msgstr[1] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})" +msgstr[2] "Offline — tylko pliki w pamięci podręcznej (przypięte: {n})" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Offline — {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Montowanie: nieoczekiwana odpowiedź usługi" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Zalogowano jako {username} — niezamontowany" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Nie zalogowano" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Błąd: {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} problem — wyświetl" +msgstr[1] "{n} problemy — wyświetl" +msgstr[2] "{n} problemów — wyświetl" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Zaloguj się…" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Otwórz Proton Drive" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Otwórz katalog" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Wznów synchronizację" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Wstrzymaj synchronizację" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Połącz" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Ukryj ikonę w obszarze powiadamiania" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Zatrzymaj Proton Drive…" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Zakończ" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "Wszystko" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Katalogi" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "Dokumenty" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Multimedia" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "Moje pliki / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Przeszukaj Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "Wyszukiwanie w Drive i na tym komputerze" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Esc" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Najlepsze wyniki" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "Brak wyników" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "Proton Drive nie jest uruchomiony" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "Należy uruchomić usługę montowania, aby przeszukać Drive." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ nawigacja · ↵ otwarcie · Tab filtr" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Usługa jest offline" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "Przypięte w Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Przeszukaj Drive" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "Trwa indeksowanie tego komputera — lokalne wyniki wkrótce się pojawią." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Można spróbować innego wyszukiwania lub innego filtru." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" +"Można zacząć pisać, aby przeszukać Proton Drive i pliki na tym komputerze." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "Brak przypiętych plików" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} przypięty plik" +msgstr[1] "{n} przypięte pliki" +msgstr[2] "{n} przypiętych plików" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} w Drive · {local} na tym komputerze · indeksowanie…" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} w Drive · {local} na tym komputerze" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "Otwieranie {name}…" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "Nie można otworzyć: {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "Nie można połączyć się z usługą" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Katalog domowy" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Katalog domowy / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} GB" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} MB" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} kB" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} B" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "teraz" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count} min" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count} godz." + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count} dn." + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count} mies." + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count} r." + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "nie można połączyć się z usługą Proton Drive: {error}" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..6853330 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,4674 @@ +# Portuguese (Brazil) translation of Proton Drive for Linux. +# This file is distributed under the same license as the proton-drive-linux package. +# +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-09-23 08:01+0200\n" +"PO-Revision-Date: 2026-09-23 12:00+0200\n" +"Last-Translator: Proton Drive for Linux contributors\n" +"Language-Team: Portuguese (Brazil)\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: crates/pdfs-gui/src/app/main.rs:827 +#: crates/pdfs-gui/src/app/pages/locations.rs:1133 +#: crates/pdfs-gui/src/prompt.rs:169 +msgid "My files" +msgstr "Meus arquivos" + +#: crates/pdfs-gui/src/app/main.rs:830 crates/pdfs-gui/src/app/main.rs:1415 +#: crates/pdfs-gui/src/app/pages/albums.rs:623 +#: crates/pdfs-gui/src/app/pages/photos.rs:675 +msgid "Photos" +msgstr "Fotos" + +#: crates/pdfs-gui/src/app/main.rs:835 +msgid "Shared with me" +msgstr "Compartilhados comigo" + +#: crates/pdfs-gui/src/app/main.rs:840 +msgid "Shared by me" +msgstr "Compartilhados por mim" + +#: crates/pdfs-gui/src/app/main.rs:843 +#: crates/pdfs-gui/src/app/pages/devices.rs:109 +msgid "Computers" +msgstr "Computadores" + +#: crates/pdfs-gui/src/app/main.rs:844 +#: crates/pdfs-gui/src/app/pages/trash.rs:106 +msgid "Trash" +msgstr "Lixeira" + +#: crates/pdfs-gui/src/app/main.rs:848 +msgid "Sync" +msgstr "Sincronização" + +#: crates/pdfs-gui/src/app/main.rs:853 +#: crates/pdfs-gui/src/app/pages/activity.rs:153 +msgid "Activity" +msgstr "Atividade" + +#: crates/pdfs-gui/src/app/main.rs:999 +msgid "Refresh (F5)" +msgstr "Atualizar (F5)" + +#. Translators: a failed action's toast. {what} says what failed, such as +#. "Couldn't rename"; {detail} is the reason, usually untranslated text +#. from the mount service. +#: crates/pdfs-gui/src/app/main.rs:1173 +#, rust-format +msgid "{what}: {detail}" +msgstr "{what}: {detail}" + +#: crates/pdfs-gui/src/app/main.rs:1192 +msgid "You're offline" +msgstr "Você está offline" + +#: crates/pdfs-gui/src/app/main.rs:1193 +msgid "That's not there any more" +msgstr "Isso não existe mais" + +#: crates/pdfs-gui/src/app/main.rs:1194 +msgid "You don't have access to that" +msgstr "Você não tem acesso a isso" + +#: crates/pdfs-gui/src/app/main.rs:1195 +msgid "Something changed this first" +msgstr "Algo alterou isso antes" + +#: crates/pdfs-gui/src/app/main.rs:1196 +msgid "Your Proton Drive is full" +msgstr "Seu Proton Drive está cheio" + +#: crates/pdfs-gui/src/app/main.rs:1237 crates/pdfs-gui/src/app/main.rs:1397 +#: crates/pdfs-gui/src/app/pages/status.rs:353 +msgid "Preferences" +msgstr "Preferências" + +#: crates/pdfs-gui/src/app/main.rs:1238 crates/pdfs-gui/src/app/main.rs:1454 +msgid "Keyboard Shortcuts" +msgstr "Atalhos de teclado" + +#: crates/pdfs-gui/src/app/main.rs:1240 +msgid "About Proton Drive for Linux" +msgstr "Sobre o Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1245 +msgid "Main menu" +msgstr "Menu principal" + +#: crates/pdfs-gui/src/app/main.rs:1291 +msgid "Proton Drive for Linux" +msgstr "Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1298 +msgid "" +"Files-on-demand Proton Drive for the Linux desktop.\n" +"\n" +"Unofficial client — not affiliated with, endorsed by, or supported by Proton " +"AG." +msgstr "" +"Proton Drive com arquivos sob demanda para o desktop Linux.\n" +"\n" +"Cliente não oficial — sem afiliação, endosso ou suporte da Proton AG." + +#. Translators: replace with your name(s) and email address(es), one +#. per line, to be credited in the About dialog. +#: crates/pdfs-gui/src/app/main.rs:1304 +msgid "translator-credits" +msgstr "Colaboradores do Proton Drive for Linux" + +#: crates/pdfs-gui/src/app/main.rs:1335 +msgid "Stop Proton Drive?" +msgstr "Parar o Proton Drive?" + +#: crates/pdfs-gui/src/app/main.rs:1336 +msgid "" +"The drive unmounts and nothing syncs until you connect again. Proton Drive " +"starts again at your next login." +msgstr "" +"A unidade é desmontada e nada é sincronizado até você se conectar novamente. " +"O Proton Drive inicia novamente no seu próximo login." + +#: crates/pdfs-gui/src/app/main.rs:1338 crates/pdfs-gui/src/app/main.rs:1611 +#: crates/pdfs-gui/src/app/pages/albums.rs:242 +#: 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:2345 +#: crates/pdfs-gui/src/app/pages/browser.rs:2596 +#: crates/pdfs-gui/src/app/pages/devices.rs:586 +#: crates/pdfs-gui/src/app/pages/devices.rs:739 +#: crates/pdfs-gui/src/app/pages/devices.rs:777 +#: crates/pdfs-gui/src/app/pages/devices.rs:829 +#: crates/pdfs-gui/src/app/pages/devices.rs:872 +#: crates/pdfs-gui/src/app/pages/locations.rs:670 +#: crates/pdfs-gui/src/app/pages/locations.rs:1050 +#: crates/pdfs-gui/src/app/pages/login.rs:313 +#: crates/pdfs-gui/src/app/pages/photos.rs:1568 +#: 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:789 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:280 +#: crates/pdfs-gui/src/app/pages/status.rs:553 +#: crates/pdfs-gui/src/app/pages/takeout.rs:395 +#: crates/pdfs-gui/src/app/pages/trash.rs:457 +#: crates/pdfs-gui/src/app/pages/trash.rs:490 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:276 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:309 +msgid "Cancel" +msgstr "Cancelar" + +#: crates/pdfs-gui/src/app/main.rs:1339 +msgctxt "verb" +msgid "Stop" +msgstr "Parar" + +#: crates/pdfs-gui/src/app/main.rs:1356 +msgid "Couldn't stop Proton Drive" +msgstr "Não foi possível parar o Proton Drive" + +#: crates/pdfs-gui/src/app/main.rs:1357 +msgid "The mount service did not stop." +msgstr "O serviço de montagem não parou." + +#: crates/pdfs-gui/src/app/main.rs:1393 +#: crates/pdfs-gui/src/app/pages/status.rs:226 +msgid "General" +msgstr "Geral" + +#: crates/pdfs-gui/src/app/main.rs:1395 +#: crates/pdfs-gui/src/app/pages/browser.rs:270 +msgid "Search Drive" +msgstr "Pesquisar no Drive" + +#: crates/pdfs-gui/src/app/main.rs:1396 +#: crates/pdfs-gui/src/app/pages/browser.rs:1363 +msgid "Refresh" +msgstr "Atualizar" + +#: crates/pdfs-gui/src/app/main.rs:1398 +msgid "Keyboard shortcuts" +msgstr "Atalhos de teclado" + +#: crates/pdfs-gui/src/app/main.rs:1402 +msgid "Files" +msgstr "Arquivos" + +#: crates/pdfs-gui/src/app/main.rs:1404 +#: crates/pdfs-gui/src/app/pages/browser.rs:319 +#: crates/pdfs-gui/src/app/pages/browser.rs:2586 +msgid "New folder" +msgstr "Nova pasta" + +#: crates/pdfs-gui/src/app/main.rs:1405 +#: crates/pdfs-gui/src/app/pages/browser.rs:315 +msgid "Upload files" +msgstr "Enviar arquivos" + +#: crates/pdfs-gui/src/app/main.rs:1406 +msgid "Back / forward" +msgstr "Voltar / avançar" + +#: crates/pdfs-gui/src/app/main.rs:1407 +#: crates/pdfs-gui/src/app/pages/browser.rs:2320 +msgid "Parent folder" +msgstr "Pasta superior" + +#: crates/pdfs-gui/src/app/main.rs:1408 +msgid "Grid / list" +msgstr "Grade / lista" + +#: crates/pdfs-gui/src/app/main.rs:1409 +#: 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:2274 +#: crates/pdfs-gui/src/app/pages/devices.rs:778 +#: crates/pdfs-gui/src/app/widgets/details.rs:159 +msgid "Rename" +msgstr "Renomear" + +#: crates/pdfs-gui/src/app/main.rs:1410 crates/pdfs-gui/src/app/main.rs:1430 +#: 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:1338 +#: crates/pdfs-gui/src/app/pages/photos.rs:504 +#: crates/pdfs-gui/src/app/pages/photos.rs:1565 +#: crates/pdfs-gui/src/app/pages/photos.rs:1569 +#: crates/pdfs-gui/src/app/widgets/details.rs:162 +msgid "Move to Trash" +msgstr "Mover para a lixeira" + +#: crates/pdfs-gui/src/app/main.rs:1411 +msgid "Clear the selection" +msgstr "Limpar a seleção" + +#: crates/pdfs-gui/src/app/main.rs:1417 +msgid "Larger thumbnails" +msgstr "Miniaturas maiores" + +#: crates/pdfs-gui/src/app/main.rs:1418 +msgid "Smaller thumbnails" +msgstr "Miniaturas menores" + +#: crates/pdfs-gui/src/app/main.rs:1419 +msgid "Reset thumbnail size" +msgstr "Redefinir tamanho das miniaturas" + +#: crates/pdfs-gui/src/app/main.rs:1420 +msgid "Select all" +msgstr "Selecionar tudo" + +#: crates/pdfs-gui/src/app/main.rs:1424 +msgid "Photo Viewer" +msgstr "Visualizador de fotos" + +#: crates/pdfs-gui/src/app/main.rs:1426 +msgid "Previous / next photo" +msgstr "Foto anterior / próxima" + +#: crates/pdfs-gui/src/app/main.rs:1427 +msgid "First / last photo" +msgstr "Primeira / última foto" + +#: crates/pdfs-gui/src/app/main.rs:1428 +msgid "Show details" +msgstr "Mostrar detalhes" + +#: crates/pdfs-gui/src/app/main.rs:1429 +msgid "Fullscreen" +msgstr "Tela cheia" + +#: crates/pdfs-gui/src/app/main.rs:1431 +msgid "Close" +msgstr "Fechar" + +#: crates/pdfs-gui/src/app/main.rs:1534 +msgid "Select a single item to rename it" +msgstr "Selecione um único item para renomeá-lo" + +#: crates/pdfs-gui/src/app/pages/activity.rs:61 +msgctxt "activity filter" +msgid "All" +msgstr "Tudo" + +#: crates/pdfs-gui/src/app/pages/activity.rs:62 +msgctxt "activity filter" +msgid "Transfers" +msgstr "Transferências" + +#: crates/pdfs-gui/src/app/pages/activity.rs:63 +msgctxt "activity filter" +msgid "Changes" +msgstr "Alterações" + +#: crates/pdfs-gui/src/app/pages/activity.rs:64 +msgctxt "activity filter" +msgid "Sharing" +msgstr "Compartilhamento" + +#: crates/pdfs-gui/src/app/pages/activity.rs:65 +msgctxt "activity filter" +msgid "Problems" +msgstr "Problemas" + +#: crates/pdfs-gui/src/app/pages/activity.rs:109 +msgid "Needs attention" +msgstr "Requer atenção" + +#: crates/pdfs-gui/src/app/pages/activity.rs:134 +#: crates/pdfs-gui/src/app/pages/browser.rs:306 +#: crates/pdfs-gui/src/app/pages/devices.rs:84 +#: crates/pdfs-gui/src/app/pages/locations.rs:134 +#: crates/pdfs-gui/src/app/pages/photos.rs:383 +#: 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/trash.rs:57 crates/pdfs-gui/src/prompt.rs:593 +msgid "Retry" +msgstr "Tentar novamente" + +#: crates/pdfs-gui/src/app/pages/activity.rs:248 +#: crates/pdfs-gui/src/app/pages/browser.rs:443 +#: crates/pdfs-gui/src/app/pages/browser.rs:475 +#: crates/pdfs-gui/src/app/pages/browser.rs:2412 +#: crates/pdfs-gui/src/app/pages/browser.rs:2847 +#: crates/pdfs-gui/src/app/pages/browser.rs:2855 +#: crates/pdfs-gui/src/app/pages/devices.rs:161 +#: crates/pdfs-gui/src/app/pages/locations.rs:142 +#: crates/pdfs-gui/src/app/pages/locations.rs:778 +#: crates/pdfs-gui/src/app/pages/shared.rs:181 +#: crates/pdfs-gui/src/app/pages/shared.rs:234 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:112 +#: crates/pdfs-gui/src/app/pages/trash.rs:296 +msgid "Loading…" +msgstr "Carregando…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:249 +msgid "Reading recent activity." +msgstr "Lendo a atividade recente." + +#: crates/pdfs-gui/src/app/pages/activity.rs:267 +#: crates/pdfs-gui/src/app/pages/activity.rs:274 +msgid "Couldn't read activity" +msgstr "Não foi possível ler a atividade" + +#: crates/pdfs-gui/src/app/pages/activity.rs:275 +#: crates/pdfs-gui/src/app/pages/browser.rs:2880 +#: crates/pdfs-gui/src/app/pages/browser.rs:3066 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:292 +#: crates/pdfs-gui/src/app/pages/photos.rs:2703 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:139 +#: crates/pdfs-gui/src/app/pages/trash.rs:320 +msgid "Unexpected reply from the mount service." +msgstr "Resposta inesperada do serviço de montagem." + +#: crates/pdfs-gui/src/app/pages/activity.rs:289 +#: crates/pdfs-gui/src/app/pages/albums.rs:84 +#: crates/pdfs-gui/src/app/pages/browser.rs:2910 +#: crates/pdfs-gui/src/app/pages/browser.rs:2914 +#: crates/pdfs-gui/src/app/pages/devices.rs:209 +#: crates/pdfs-gui/src/app/pages/locations.rs:844 +#: crates/pdfs-gui/src/app/pages/photos.rs:2737 +#: 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/status.rs:1301 +#: crates/pdfs-gui/src/app/pages/trash.rs:335 +msgid "Not connected" +msgstr "Não conectado" + +#: crates/pdfs-gui/src/app/pages/activity.rs:290 +#: crates/pdfs-gui/src/app/pages/browser.rs:2915 +#: crates/pdfs-gui/src/app/pages/devices.rs:210 +#: crates/pdfs-gui/src/app/pages/locations.rs:845 +#: crates/pdfs-gui/src/app/pages/photos.rs:2738 +#: 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/trash.rs:336 +msgid "The Proton Drive mount service isn't running." +msgstr "O serviço de montagem do Proton Drive não está em execução." + +#: crates/pdfs-gui/src/app/pages/activity.rs:298 +#: crates/pdfs-gui/src/app/pages/browser.rs:2920 +#: crates/pdfs-gui/src/app/pages/browser.rs:2924 +#: crates/pdfs-gui/src/app/pages/devices.rs:218 +#: crates/pdfs-gui/src/app/pages/locations.rs:853 +#: crates/pdfs-gui/src/app/pages/photos.rs:2746 +#: 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/status.rs:305 +#: crates/pdfs-gui/src/app/pages/trash.rs:344 crates/pdfs-gui/src/main.rs:413 +#: crates/pdfs-gui/src/prompt.rs:614 crates/pdfs-gui/src/prompt.rs:866 +msgid "Connecting…" +msgstr "Conectando…" + +#: crates/pdfs-gui/src/app/pages/activity.rs:299 +#: crates/pdfs-gui/src/app/pages/browser.rs:2925 +#: crates/pdfs-gui/src/app/pages/devices.rs:219 +#: crates/pdfs-gui/src/app/pages/locations.rs:854 +#: crates/pdfs-gui/src/app/pages/photos.rs:2747 +#: 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/trash.rs:345 +msgid "Waiting for the Proton Drive mount service to come up." +msgstr "Aguardando o serviço de montagem do Proton Drive iniciar." + +#: crates/pdfs-gui/src/app/pages/activity.rs:419 +#: crates/pdfs-gui/src/app/pages/photos.rs:2172 +msgid "Today" +msgstr "Hoje" + +#: crates/pdfs-gui/src/app/pages/activity.rs:422 +#: crates/pdfs-gui/src/app/pages/photos.rs:2177 +msgid "Yesterday" +msgstr "Ontem" + +#. Translators: strftime format for a day heading in this year, such as "Wednesday, September 23". +#: crates/pdfs-gui/src/app/pages/activity.rs:428 +msgid "%A, %B %-d" +msgstr "%A, %-d de %B" + +#. Translators: strftime format for a day heading in an earlier year, such as "December 31, 2025". +#: crates/pdfs-gui/src/app/pages/activity.rs:431 +msgid "%B %-d, %Y" +msgstr "%-d de %B de %Y" + +#: crates/pdfs-gui/src/app/pages/activity.rs:454 +msgid "Nothing yet" +msgstr "Nada ainda" + +#: crates/pdfs-gui/src/app/pages/activity.rs:455 +msgid "Uploads, moves, shares and other changes appear here as they happen." +msgstr "" +"Envios, movimentações, compartilhamentos e outras alterações aparecem aqui à " +"medida que acontecem." + +#: crates/pdfs-gui/src/app/pages/activity.rs:469 +#, rust-format +msgid "A file was changed in two places at once. Choose which version to keep." +msgid_plural "" +"{n} files were changed in two places at once. Choose which versions to keep." +msgstr[0] "" +"Um arquivo foi alterado em dois lugares ao mesmo tempo. Escolha qual versão " +"manter." +msgstr[1] "" +"{n} arquivos foram alterados em dois lugares ao mesmo tempo. Escolha quais " +"versões manter." + +#: crates/pdfs-gui/src/app/pages/activity.rs:492 +msgid "No matching activity" +msgstr "Nenhuma atividade correspondente" + +#: crates/pdfs-gui/src/app/pages/activity.rs:493 +msgid "Nothing in the recent log fits this filter." +msgstr "Nada no registro recente corresponde a este filtro." + +#: crates/pdfs-gui/src/app/pages/activity.rs:544 +#, rust-format +msgid "{n} time since {time}" +msgid_plural "{n} times since {time}" +msgstr[0] "{n} vez desde {time}" +msgstr[1] "{n} vezes desde {time}" + +#: crates/pdfs-gui/src/app/pages/activity.rs:551 +msgctxt "state" +msgid "Resolved" +msgstr "Resolvido" + +#. 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". +#: crates/pdfs-gui/src/app/pages/activity.rs:580 +#: crates/pdfs-gui/src/app/pages/photos.rs:2216 +msgid "%H:%M" +msgstr "%H:%M" + +#: crates/pdfs-gui/src/app/pages/activity.rs:595 +msgid "Resolve…" +msgstr "Resolver…" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:612 +#, rust-format +msgid "Uploaded {name}" +msgstr "{name} enviado" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:614 +#, rust-format +msgid "Downloaded {name}" +msgstr "{name} baixado" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:616 +#, rust-format +msgid "Synced {name}" +msgstr "{name} sincronizado" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:618 +#, rust-format +msgid "Renamed {name}" +msgstr "{name} renomeado" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:620 +#, rust-format +msgid "Moved {name}" +msgstr "{name} movido" + +#. Translators: {name} is a folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:622 +#, rust-format +msgid "Created folder {name}" +msgstr "Pasta {name} criada" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:624 +#, rust-format +msgid "Trashed {name}" +msgstr "{name} movido para a lixeira" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:626 +#, rust-format +msgid "Restored {name}" +msgstr "{name} restaurado" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:628 +#, rust-format +msgid "Deleted {name}" +msgstr "{name} excluído" + +#. Translators: {count} is the number of items removed from the Trash. +#: crates/pdfs-gui/src/app/pages/activity.rs:631 +#, rust-format +msgid "Emptied Trash ({count})" +msgstr "Lixeira esvaziada ({count})" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:633 +#, rust-format +msgid "Shared {name}" +msgstr "{name} compartilhado" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:635 +#, rust-format +msgid "Created a link to {name}" +msgstr "Link para {name} criado" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/activity.rs:637 +#, rust-format +msgid "Unshared {name}" +msgstr "Compartilhamento de {name} removido" + +#. Translators: {name} is the name of the conflict copy. +#: crates/pdfs-gui/src/app/pages/activity.rs:639 +#, rust-format +msgid "Conflict {name}" +msgstr "Conflito {name}" + +#. Translators: strftime format for a date and time in the activity feed, such as "Sep 23, 14:05". +#: crates/pdfs-gui/src/app/pages/activity.rs:665 +msgid "%b %-d, %H:%M" +msgstr "%-d de %b, %H:%M" + +#: crates/pdfs-gui/src/app/pages/albums.rs:43 +msgid "Loading albums…" +msgstr "Carregando álbuns…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:44 +msgid "Reading your Proton Drive albums." +msgstr "Lendo seus álbuns do Proton Drive." + +#: crates/pdfs-gui/src/app/pages/albums.rs:59 +#: crates/pdfs-gui/src/app/pages/photos.rs:2618 +msgid "No photo library" +msgstr "Nenhuma biblioteca de fotos" + +#: crates/pdfs-gui/src/app/pages/albums.rs:60 +#: crates/pdfs-gui/src/app/pages/photos.rs:2619 +msgid "This Proton account doesn't have Photos enabled." +msgstr "Esta conta Proton não tem o Fotos ativado." + +#: crates/pdfs-gui/src/app/pages/albums.rs:65 +msgid "No albums" +msgstr "Nenhum álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:66 +msgid "Create one with New Album, or in Proton Photos." +msgstr "Crie um com Novo álbum ou no Proton Photos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:73 +#: crates/pdfs-gui/src/app/pages/albums.rs:77 +#: crates/pdfs-gui/src/app/pages/albums.rs:375 +#: crates/pdfs-gui/src/app/pages/albums.rs:381 +msgid "Couldn't load albums" +msgstr "Não foi possível carregar os álbuns" + +#: crates/pdfs-gui/src/app/pages/albums.rs:85 +msgid "The Proton Drive mount service didn't respond." +msgstr "O serviço de montagem do Proton Drive não respondeu." + +#: crates/pdfs-gui/src/app/pages/albums.rs:106 +#: crates/pdfs-gui/src/app/pages/albums.rs:674 +#, rust-format +msgid "{n} album" +msgid_plural "{n} albums" +msgstr[0] "{n} álbum" +msgstr[1] "{n} álbuns" + +#: crates/pdfs-gui/src/app/pages/albums.rs:205 +#: crates/pdfs-gui/src/app/pages/browser.rs:1246 +#: crates/pdfs-gui/src/app/pages/photos.rs:2477 +#: 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/widgets/details.rs:155 +#: crates/pdfs-gui/src/app/widgets/details.rs:395 +msgctxt "verb" +msgid "Open" +msgstr "Abrir" + +#: crates/pdfs-gui/src/app/pages/albums.rs:211 +#: crates/pdfs-gui/src/app/pages/browser.rs:1288 +#: crates/pdfs-gui/src/app/pages/devices.rs:305 +msgid "Rename…" +msgstr "Renomear…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:216 +msgid "Delete Album…" +msgstr "Excluir álbum…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:236 +msgid "Album name" +msgstr "Nome do álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +#: crates/pdfs-gui/src/app/pages/browser.rs:2597 +msgid "Create" +msgstr "Criar" + +#: crates/pdfs-gui/src/app/pages/albums.rs:264 +msgid "New Album" +msgstr "Novo álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:276 +msgid "Album created" +msgstr "Álbum criado" + +#: crates/pdfs-gui/src/app/pages/albums.rs:283 +#: crates/pdfs-gui/src/app/pages/albums.rs:287 +msgid "Couldn't create the album" +msgstr "Não foi possível criar o álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:288 +#: crates/pdfs-gui/src/app/pages/albums.rs:353 +#: crates/pdfs-gui/src/app/pages/albums.rs:382 +#: crates/pdfs-gui/src/app/pages/albums.rs:479 +#: crates/pdfs-gui/src/app/pages/albums.rs:551 +#: crates/pdfs-gui/src/app/pages/browser.rs:702 +#: crates/pdfs-gui/src/app/pages/browser.rs:786 +#: crates/pdfs-gui/src/app/pages/browser.rs:1430 +#: crates/pdfs-gui/src/app/pages/browser.rs:1538 +#: crates/pdfs-gui/src/app/pages/browser.rs:1584 +#: crates/pdfs-gui/src/app/pages/browser.rs:2006 +#: crates/pdfs-gui/src/app/pages/browser.rs:2044 +#: crates/pdfs-gui/src/app/pages/browser.rs:2230 +#: crates/pdfs-gui/src/app/pages/browser.rs:2530 +#: crates/pdfs-gui/src/app/pages/browser.rs:2706 +#: crates/pdfs-gui/src/app/pages/devices.rs:492 +#: crates/pdfs-gui/src/app/pages/devices.rs:532 +#: crates/pdfs-gui/src/app/pages/devices.rs:682 +#: crates/pdfs-gui/src/app/pages/devices.rs:912 +#: crates/pdfs-gui/src/app/pages/locations.rs:342 +#: crates/pdfs-gui/src/app/pages/locations.rs:516 +#: crates/pdfs-gui/src/app/pages/locations.rs:739 +#: crates/pdfs-gui/src/app/pages/locations.rs:1090 +#: crates/pdfs-gui/src/app/pages/locations.rs:1109 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1245 +#: crates/pdfs-gui/src/app/pages/photos.rs:1155 +#: crates/pdfs-gui/src/app/pages/photos.rs:1647 +#: crates/pdfs-gui/src/app/pages/photos.rs:2541 +#: crates/pdfs-gui/src/app/pages/photos.rs:2709 +#: crates/pdfs-gui/src/app/pages/shared.rs:510 +#: 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:1440 +#: crates/pdfs-gui/src/app/pages/takeout.rs:424 +#: crates/pdfs-gui/src/app/pages/takeout.rs:616 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:430 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:721 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:759 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:170 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:380 +msgid "The mount service didn't respond." +msgstr "O serviço de montagem não respondeu." + +#: crates/pdfs-gui/src/app/pages/albums.rs:297 +msgid "Rename Album" +msgstr "Renomear álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:305 +msgid "Album renamed" +msgstr "Álbum renomeado" + +#: crates/pdfs-gui/src/app/pages/albums.rs:306 +msgid "Couldn't rename the album" +msgstr "Não foi possível renomear o álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:316 +msgid "Delete Album?" +msgstr "Excluir álbum?" + +#: crates/pdfs-gui/src/app/pages/albums.rs:319 +#, rust-format +msgid "“{name}” is deleted. Its photos stay in your timeline." +msgstr "“{name}” será excluído. Suas fotos permanecem na sua linha do tempo." + +#: crates/pdfs-gui/src/app/pages/albums.rs:322 +msgid "Delete" +msgstr "Excluir" + +#: crates/pdfs-gui/src/app/pages/albums.rs:330 +msgid "Album deleted" +msgstr "Álbum excluído" + +#: crates/pdfs-gui/src/app/pages/albums.rs:331 +msgid "Couldn't delete the album" +msgstr "Não foi possível excluir o álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:411 +msgid "Add to Album" +msgstr "Adicionar ao álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:413 +msgid "Choose an album for this photo." +msgstr "Escolha um álbum para esta foto." + +#: crates/pdfs-gui/src/app/pages/albums.rs:415 +#, rust-format +msgid "Choose an album for {n} photo." +msgid_plural "Choose an album for {n} photos." +msgstr[0] "Escolha um álbum para {n} foto." +msgstr[1] "Escolha um álbum para {n} fotos." + +#: crates/pdfs-gui/src/app/pages/albums.rs:424 +#: crates/pdfs-gui/src/app/pages/photos.rs:641 +msgid "New Album…" +msgstr "Novo álbum…" + +#: crates/pdfs-gui/src/app/pages/albums.rs:457 +msgid "Some photos couldn't be added" +msgstr "Algumas fotos não puderam ser adicionadas" + +#: crates/pdfs-gui/src/app/pages/albums.rs:464 +#, rust-format +msgid "Added {n} photo to the album" +msgid_plural "Added {n} photos to the album" +msgstr[0] "{n} foto adicionada ao álbum" +msgstr[1] "{n} fotos adicionadas ao álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:474 +#: crates/pdfs-gui/src/app/pages/albums.rs:478 +msgid "Couldn't add to the album" +msgstr "Não foi possível adicionar ao álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:513 +msgid "Some photos couldn't be removed from the album" +msgstr "Algumas fotos não puderam ser removidas do álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:530 +#, rust-format +msgid "Removed {n} photo from the album" +msgid_plural "Removed {n} photos from the album" +msgstr[0] "{n} foto removida do álbum" +msgstr[1] "{n} fotos removidas do álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:541 +#: crates/pdfs-gui/src/app/pages/albums.rs:550 +msgid "Couldn't remove from the album" +msgstr "Não foi possível remover do álbum" + +#: crates/pdfs-gui/src/app/pages/albums.rs:563 +#, rust-format +msgid "{n} photo · shared with me" +msgid_plural "{n} photos · shared with me" +msgstr[0] "{n} foto · compartilhado comigo" +msgstr[1] "{n} fotos · compartilhado comigo" + +#: crates/pdfs-gui/src/app/pages/albums.rs:569 +#, rust-format +msgid "{n} photo" +msgid_plural "{n} photos" +msgstr[0] "{n} foto" +msgstr[1] "{n} fotos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:168 +msgid "Back (Alt+Left)" +msgstr "Voltar (Alt+Esquerda)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:175 +msgid "Forward (Alt+Right)" +msgstr "Avançar (Alt+Direita)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:199 +msgid "New Folder" +msgstr "Nova pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:201 +#: crates/pdfs-gui/src/app/pages/browser.rs:1354 +msgid "Upload Files…" +msgstr "Enviar arquivos…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:203 +#: crates/pdfs-gui/src/app/pages/browser.rs:1355 +msgid "Upload Folder…" +msgstr "Enviar pasta…" + +#. Translators: tooltip of the menu button that creates a folder or uploads files. +#: crates/pdfs-gui/src/app/pages/browser.rs:210 +msgctxt "create" +msgid "New" +msgstr "Novo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:219 +msgctxt "layout" +msgid "Grid" +msgstr "Grade" + +#: crates/pdfs-gui/src/app/pages/browser.rs:220 +msgctxt "layout" +msgid "List" +msgstr "Lista" + +#: crates/pdfs-gui/src/app/pages/browser.rs:223 +#: crates/pdfs-gui/src/app/pages/browser.rs:1078 +msgctxt "column" +msgid "Name" +msgstr "Nome" + +#: crates/pdfs-gui/src/app/pages/browser.rs:224 +#: crates/pdfs-gui/src/app/pages/browser.rs:989 +#: crates/pdfs-gui/src/app/widgets/details.rs:88 +msgctxt "column" +msgid "Size" +msgstr "Tamanho" + +#: crates/pdfs-gui/src/app/pages/browser.rs:226 +msgid "Last Modified" +msgstr "Última modificação" + +#: crates/pdfs-gui/src/app/pages/browser.rs:229 +msgid "Sort By" +msgstr "Ordenar por" + +#: crates/pdfs-gui/src/app/pages/browser.rs:231 +msgid "Reversed Order" +msgstr "Ordem inversa" + +#: crates/pdfs-gui/src/app/pages/browser.rs:232 +msgid "Folders First" +msgstr "Pastas primeiro" + +#: crates/pdfs-gui/src/app/pages/browser.rs:236 +#: crates/pdfs-gui/src/app/pages/browser.rs:1828 +msgid "Show as list (Ctrl+2)" +msgstr "Mostrar como lista (Ctrl+2)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:237 +msgid "Sort and view options" +msgstr "Opções de ordenação e visualização" + +#: crates/pdfs-gui/src/app/pages/browser.rs:246 +#: crates/pdfs-gui/src/app/pages/browser.rs:1365 +msgid "Open in File Manager" +msgstr "Abrir no gerenciador de arquivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:250 +msgid "Build Thumbnails" +msgstr "Gerar miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:255 +msgid "Folder actions" +msgstr "Ações da pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:264 +msgid "Cancel thumbnail build" +msgstr "Cancelar geração de miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:278 +#: crates/pdfs-gui/src/app/pages/browser.rs:3000 +msgid "Search this folder only" +msgstr "Pesquisar somente nesta pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:399 +msgid "Make available offline" +msgstr "Disponibilizar offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:404 +#: crates/pdfs-gui/src/app/pages/status.rs:1416 +msgid "Make online only" +msgstr "Tornar somente online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:409 +msgid "Move to…" +msgstr "Mover para…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:420 +msgid "Clear selection (Esc)" +msgstr "Limpar seleção (Esc)" + +#. Translators: label in front of the icon-size slider in the status bar. +#: crates/pdfs-gui/src/app/pages/browser.rs:450 +msgid "Zoom:" +msgstr "Zoom:" + +#: crates/pdfs-gui/src/app/pages/browser.rs:462 +#: crates/pdfs-gui/src/app/pages/browser.rs:883 +#, rust-format +msgid "Size: {n} pixel" +msgid_plural "Size: {n} pixels" +msgstr[0] "Tamanho: {n} pixel" +msgstr[1] "Tamanho: {n} pixels" + +#: crates/pdfs-gui/src/app/pages/browser.rs:472 +#: crates/pdfs-gui/src/app/pages/browser.rs:479 +msgid "Proton account storage" +msgstr "Armazenamento da conta Proton" + +#: crates/pdfs-gui/src/app/pages/browser.rs:531 +#: crates/pdfs-gui/src/app/pages/browser.rs:1090 +msgid "My Files" +msgstr "Meus arquivos" + +#. 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:1331 +#: crates/pdfs-gui/src/app/pages/photos.rs:1501 +#, rust-format +msgid "{n} selected" +msgid_plural "{n} selected" +msgstr[0] "{n} selecionado" +msgstr[1] "{n} selecionados" + +#: crates/pdfs-gui/src/app/pages/browser.rs:674 +#: crates/pdfs-gui/src/app/pages/browser.rs:709 +#: crates/pdfs-gui/src/app/pages/photos.rs:1640 +#: crates/pdfs-gui/src/app/pages/photos.rs:1646 +msgid "Couldn't move to Trash" +msgstr "Não foi possível mover para a lixeira" + +#: crates/pdfs-gui/src/app/pages/browser.rs:675 +#: crates/pdfs-gui/src/app/pages/browser.rs:1973 +#: crates/pdfs-gui/src/app/pages/browser.rs:2211 +#: crates/pdfs-gui/src/app/pages/browser.rs:2503 +#: crates/pdfs-gui/src/app/pages/browser.rs:2676 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:254 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:91 +msgid "Proton Drive isn't connected." +msgstr "O Proton Drive não está conectado." + +#: crates/pdfs-gui/src/app/pages/browser.rs:714 +#, rust-format +msgid "Moved {n} item to Trash — some couldn't be moved" +msgid_plural "Moved {n} items to Trash — some couldn't be moved" +msgstr[0] "{n} item movido para a lixeira — alguns não puderam ser movidos" +msgstr[1] "{n} itens movidos para a lixeira — alguns não puderam ser movidos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:719 +#, rust-format +msgid "Moved “{name}” to Trash" +msgstr "“{name}” movido para a lixeira" + +#: crates/pdfs-gui/src/app/pages/browser.rs:721 +#, rust-format +msgid "Moved {n} item to Trash" +msgid_plural "Moved {n} items to Trash" +msgstr[0] "{n} item movido para a lixeira" +msgstr[1] "{n} itens movidos para a lixeira" + +#: crates/pdfs-gui/src/app/pages/browser.rs:727 +#: crates/pdfs-gui/src/app/pages/photos.rs:1633 +msgid "Undo" +msgstr "Desfazer" + +#: crates/pdfs-gui/src/app/pages/browser.rs:741 +msgid "Restored from Trash" +msgstr "Restaurado da lixeira" + +#: crates/pdfs-gui/src/app/pages/browser.rs:744 +#, rust-format +msgid "Restored {n} item from Trash" +msgid_plural "Restored {n} items from Trash" +msgstr[0] "{n} item restaurado da lixeira" +msgstr[1] "{n} itens restaurados da lixeira" + +#: crates/pdfs-gui/src/app/pages/browser.rs:750 +msgid "Couldn't restore from Trash" +msgstr "Não foi possível restaurar da lixeira" + +#: crates/pdfs-gui/src/app/pages/browser.rs:794 +#: crates/pdfs-gui/src/app/pages/browser.rs:1562 +#: crates/pdfs-gui/src/app/pages/browser.rs:1583 +msgid "Couldn't change offline state" +msgstr "Não foi possível alterar o estado offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:801 +#, rust-format +msgid "{n} file is now available offline" +msgid_plural "{n} files are now available offline" +msgstr[0] "{n} arquivo agora está disponível offline" +msgstr[1] "{n} arquivos agora estão disponíveis offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:808 +#, rust-format +msgid "{n} file is now online only" +msgid_plural "{n} files are now online only" +msgstr[0] "{n} arquivo agora está somente online" +msgstr[1] "{n} arquivos agora estão somente online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:996 +#: crates/pdfs-gui/src/app/widgets/details.rs:93 +msgctxt "column" +msgid "Modified" +msgstr "Modificado" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1084 +#: crates/pdfs-gui/src/app/pages/status.rs:169 +#: crates/pdfs-gui/src/app/widgets/details.rs:98 +msgid "Location" +msgstr "Local" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1256 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:949 +msgid "Open With…" +msgstr "Abrir com…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1263 +#: crates/pdfs-gui/src/app/pages/photos.rs:2475 +msgctxt "verb" +msgid "Play" +msgstr "Reproduzir" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1271 +#: crates/pdfs-gui/src/app/pages/browser.rs:1322 +#: crates/pdfs-gui/src/app/pages/status.rs:283 +#: crates/pdfs-gui/src/app/widgets/details.rs:111 +msgid "Available offline" +msgstr "Disponível offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1278 +#: crates/pdfs-gui/src/app/widgets/details.rs:127 +msgid "Share…" +msgstr "Compartilhar…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1282 +#: crates/pdfs-gui/src/app/widgets/details.rs:128 +msgid "Copy Link" +msgstr "Copiar link" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1292 +#: crates/pdfs-gui/src/app/pages/browser.rs:1327 +msgid "Move To…" +msgstr "Mover para…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1297 +#: crates/pdfs-gui/src/app/widgets/details.rs:149 +msgid "Versions…" +msgstr "Versões…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1302 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:983 +msgid "Details" +msgstr "Detalhes" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1353 +msgid "New Folder…" +msgstr "Nova pasta…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1359 +msgid "Select All" +msgstr "Selecionar tudo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1378 +#: crates/pdfs-gui/src/app/pages/browser.rs:1393 +#: crates/pdfs-gui/src/app/pages/browser.rs:1533 +#: crates/pdfs-gui/src/app/pages/browser.rs:1537 +#: crates/pdfs-gui/src/app/pages/shared.rs:505 +#: crates/pdfs-gui/src/app/pages/shared.rs:509 +msgid "Couldn't open file" +msgstr "Não foi possível abrir o arquivo" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1379 +msgid "Open With needs the Proton Drive folder to be mounted." +msgstr "Abrir com requer que a pasta do Proton Drive esteja montada." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1421 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:222 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:585 +msgid "Link copied" +msgstr "Link copiado" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1425 +#: crates/pdfs-gui/src/app/pages/browser.rs:1429 +msgid "Couldn't copy link" +msgstr "Não foi possível copiar o link" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1461 +msgid "Couldn't play media" +msgstr "Não foi possível reproduzir a mídia" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1462 +msgid "The file path isn't valid UTF-8." +msgstr "O caminho do arquivo não é UTF-8 válido." + +#: crates/pdfs-gui/src/app/pages/browser.rs:1468 +#, rust-format +msgid "Streaming “{name}”…" +msgstr "Transmitindo “{name}”…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1574 +#, rust-format +msgid "“{name}” is now online only" +msgstr "“{name}” agora está somente online" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1576 +#, rust-format +msgid "“{name}” is now available offline" +msgstr "“{name}” agora está disponível offline" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1803 +msgid "Couldn't save the view" +msgstr "Não foi possível salvar a visualização" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1826 +msgid "Show as grid (Ctrl+1)" +msgstr "Mostrar como grade (Ctrl+1)" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1959 +msgid "Couldn't open the folder" +msgstr "Não foi possível abrir a pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1972 +#: crates/pdfs-gui/src/app/pages/browser.rs:2003 +#: crates/pdfs-gui/src/app/pages/browser.rs:2008 +msgid "Couldn't build thumbnails" +msgstr "Não foi possível gerar as miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:1987 +msgid "Starting thumbnail build…" +msgstr "Iniciando a geração de miniaturas…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2021 +msgid "Stopping thumbnail build…" +msgstr "Parando a geração de miniaturas…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2034 +#: crates/pdfs-gui/src/app/pages/browser.rs:2043 +msgid "Couldn't cancel thumbnail build" +msgstr "Não foi possível cancelar a geração de miniaturas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2074 +#: crates/pdfs-gui/src/app/pages/browser.rs:2080 +msgid "Thumbnail build stopped" +msgstr "Geração de miniaturas parada" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2081 +msgid "The mount service stopped reporting thumbnail progress." +msgstr "O serviço de montagem parou de informar o progresso das miniaturas." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2101 +#: crates/pdfs-gui/src/app/pages/browser.rs:3138 +#, rust-format +msgid "{n} folder" +msgid_plural "{n} folders" +msgstr[0] "{n} pasta" +msgstr[1] "{n} pastas" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2102 +#, rust-format +msgid "{n} image" +msgid_plural "{n} images" +msgstr[0] "{n} imagem" +msgstr[1] "{n} imagens" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2105 +#, rust-format +msgid "Scanning {root}… {folders}, {images}" +msgstr "Examinando {root}… {folders}, {images}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2119 +#, rust-format +msgid "Building thumbnails in {root}… {done} of {total}" +msgstr "Gerando miniaturas em {root}… {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2132 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}" +msgid_plural "Thumbnails ready for {n} images in {root}" +msgstr[0] "Miniaturas prontas para {n} imagem em {root}" +msgstr[1] "Miniaturas prontas para {n} imagens em {root}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2139 +#, rust-format +msgid "Thumbnails ready for {n} image in {root}; {failed} unavailable" +msgid_plural "Thumbnails ready for {n} images in {root}; {failed} unavailable" +msgstr[0] "" +"Miniaturas prontas para {n} imagem em {root}; {failed} indisponíveis" +msgstr[1] "" +"Miniaturas prontas para {n} imagens em {root}; {failed} indisponíveis" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2149 +#, rust-format +msgid "{status}. {message}" +msgstr "{status}. {message}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2256 +#: crates/pdfs-gui/src/app/pages/devices.rs:771 +msgid "New name" +msgstr "Novo nome" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2288 +#, rust-format +msgid "Renamed to “{name}”" +msgstr "Renomeado para “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2296 +msgid "Couldn't rename" +msgstr "Não foi possível renomear" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2310 +#, rust-format +msgid "Move “{name}”" +msgstr "Mover “{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2311 +#, rust-format +msgid "Move {n} item" +msgid_plural "Move {n} items" +msgstr[0] "Mover {n} item" +msgstr[1] "Mover {n} itens" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2315 +msgid "Choose the folder to move into." +msgstr "Escolha a pasta de destino." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2346 +msgid "Move Here" +msgstr "Mover para cá" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2431 +msgid "Couldn't read this folder." +msgstr "Não foi possível ler esta pasta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2461 +msgid "No folders here." +msgstr "Nenhuma pasta aqui." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2502 +#: crates/pdfs-gui/src/app/pages/browser.rs:2546 +#: crates/pdfs-gui/src/app/pages/browser.rs:2793 +msgid "Couldn't move" +msgstr "Não foi possível mover" + +#. Translators: a folder name in quotes, filled in as {place} in "Moved to {place}". +#: crates/pdfs-gui/src/app/pages/browser.rs:2541 +#, rust-format +msgid "“{name}”" +msgstr "“{name}”" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2553 +#, rust-format +msgid "Moved {n} item to {place}, but not all" +msgid_plural "Moved {n} items to {place}, but not all" +msgstr[0] "{n} item movido para {place}, mas não todos" +msgstr[1] "{n} itens movidos para {place}, mas não todos" + +#. Translators: {place} is a quoted folder name or "Proton Drive". +#: crates/pdfs-gui/src/app/pages/browser.rs:2561 +#, rust-format +msgid "Moved to {place}" +msgstr "Movido para {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2566 +#, rust-format +msgid "Moved {n} item to {place}" +msgid_plural "Moved {n} items to {place}" +msgstr[0] "{n} item movido para {place}" +msgstr[1] "{n} itens movidos para {place}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2587 +msgid "Create a folder in the current directory." +msgstr "Crie uma pasta no diretório atual." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2591 +msgid "Folder name" +msgstr "Nome da pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2611 +#, rust-format +msgid "Created “{name}”" +msgstr "“{name}” criada" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2619 +msgid "Couldn't create folder" +msgstr "Não foi possível criar a pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2631 +msgid "Upload Files" +msgstr "Enviar arquivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2652 +msgid "Upload Folder" +msgstr "Enviar pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2675 +#: crates/pdfs-gui/src/app/pages/browser.rs:2701 +#: crates/pdfs-gui/src/app/pages/browser.rs:2705 +msgid "Couldn't upload" +msgstr "Não foi possível enviar" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2691 +msgid "Uploading…" +msgstr "Enviando…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2693 +#, rust-format +msgid "Uploading {n} item…" +msgid_plural "Uploading {n} items…" +msgstr[0] "Enviando {n} item…" +msgstr[1] "Enviando {n} itens…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2696 +#: crates/pdfs-gui/src/app/pages/photos.rs:659 +msgctxt "verb" +msgid "View" +msgstr "Ver" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2785 +#, rust-format +msgid "Moved into “{name}”" +msgstr "Movido para “{name}”" + +#. Translators: strftime format for a modification date, such as "23 Sep 2026". +#: crates/pdfs-gui/src/app/pages/browser.rs:2831 +msgid "%-d %b %Y" +msgstr "%-d de %b de %Y" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2856 +msgid "Reading this folder." +msgstr "Lendo esta pasta." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2893 +msgid "Folder unavailable" +msgstr "Pasta indisponível" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2897 +msgid "Couldn't open this folder" +msgstr "Não foi possível abrir esta pasta" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2956 +msgid "This folder is empty" +msgstr "Esta pasta está vazia" + +#: crates/pdfs-gui/src/app/pages/browser.rs:2957 +msgid "Drop files here, or upload a file or create a folder to get started." +msgstr "" +"Solte arquivos aqui, ou envie um arquivo ou crie uma pasta para começar." + +#: crates/pdfs-gui/src/app/pages/browser.rs:2998 +msgid "Search everywhere" +msgstr "Pesquisar em todos os lugares" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3030 +#: crates/pdfs-gui/src/app/pages/browser.rs:3034 +msgid "Searching…" +msgstr "Pesquisando…" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3035 +#, rust-format +msgid "Looking for “{query}”." +msgstr "Procurando por “{query}”." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3093 +#, rust-format +msgid "{summary} — showing the first {n} search result" +msgid_plural "{summary} — showing the first {n} search results" +msgstr[0] "{summary} — mostrando o primeiro resultado da pesquisa" +msgstr[1] "{summary} — mostrando os primeiros {n} resultados da pesquisa" + +#. Translators: {summary} counts the hits, such as "2 folders, 5 files (3.0 MB)". +#: crates/pdfs-gui/src/app/pages/browser.rs:3100 +#, rust-format +msgid "{summary} — search results" +msgstr "{summary} — resultados da pesquisa" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3106 +msgid "No matches" +msgstr "Nenhuma correspondência" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3107 +msgid "No files or folders match that search." +msgstr "Nenhum arquivo ou pasta corresponde a essa pesquisa." + +#: crates/pdfs-gui/src/app/pages/browser.rs:3139 +#: crates/pdfs-gui/src/i18n.rs:198 +#, rust-format +msgid "{n} file" +msgid_plural "{n} files" +msgstr[0] "{n} arquivo" +msgstr[1] "{n} arquivos" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3145 +#, rust-format +msgid "{files} ({size})" +msgstr "{files} ({size})" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3150 +#, rust-format +msgid "{folders}, {files}" +msgstr "{folders}, {files}" + +#: crates/pdfs-gui/src/app/pages/browser.rs:3155 +#, rust-format +msgid "{folders}, {files} ({size})" +msgstr "{folders}, {files} ({size})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:55 +#: crates/pdfs-gui/src/app/pages/devices.rs:355 +#: crates/pdfs-gui/src/prompt.rs:566 +msgid "This computer" +msgstr "Este computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:56 +msgid "The computer this machine backs up as." +msgstr "O computador que esta máquina representa nos backups." + +#: crates/pdfs-gui/src/app/pages/devices.rs:63 +msgid "Rename this computer" +msgstr "Renomear este computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:70 +msgid "Other computers" +msgstr "Outros computadores" + +#: crates/pdfs-gui/src/app/pages/devices.rs:71 +msgid "Other computers backing up to this account." +msgstr "Outros computadores que fazem backup nesta conta." + +#: crates/pdfs-gui/src/app/pages/devices.rs:162 +msgid "Reading your computers." +msgstr "Lendo seus computadores." + +#: crates/pdfs-gui/src/app/pages/devices.rs:254 +#, rust-format +msgid "Backing up as “{name}”." +msgstr "Fazendo backup como “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:262 +#, rust-format +msgid "Rename this computer ({name})" +msgstr "Renomear este computador ({name})" + +#: crates/pdfs-gui/src/app/pages/devices.rs:274 +msgid "No other computers" +msgstr "Nenhum outro computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:275 +msgid "Desktop apps syncing to this account appear here." +msgstr "Aplicativos de desktop que sincronizam com esta conta aparecem aqui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:299 +msgid "Restore to This Computer…" +msgstr "Restaurar neste computador…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:309 +msgid "Use This Computer's Identity…" +msgstr "Usar a identidade deste computador…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:313 +msgid "Remove Computer…" +msgstr "Remover computador…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:330 +#, rust-format +msgid "{platform} · last synced {time}" +msgstr "{platform} · última sincronização em {time}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:338 +#, rust-format +msgid "{platform} · never synced" +msgstr "{platform} · nunca sincronizado" + +#: crates/pdfs-gui/src/app/pages/devices.rs:360 +msgid "Open Sync" +msgstr "Abrir Sincronização" + +#: crates/pdfs-gui/src/app/pages/devices.rs:361 +msgid "Manage this computer's folders and mountpoint" +msgstr "Gerenciar as pastas e o ponto de montagem deste computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:370 +msgid "Restore Folders…" +msgstr "Restaurar pastas…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:381 +msgid "No folders backed up yet — add one on the Sync page." +msgstr "Nenhuma pasta com backup ainda — adicione uma na página Sincronização." + +#: crates/pdfs-gui/src/app/pages/devices.rs:384 +#, rust-format +msgid "{n} folder backed up" +msgid_plural "{n} folders backed up" +msgstr[0] "{n} pasta com backup" +msgstr[1] "{n} pastas com backup" + +#: crates/pdfs-gui/src/app/pages/devices.rs:396 +#, rust-format +msgid "{folders} · manage them on the Sync page" +msgstr "{folders} · gerencie-as na página Sincronização" + +#: crates/pdfs-gui/src/app/pages/devices.rs:401 +#, rust-format +msgid "{folders} · {n} needs attention" +msgid_plural "{folders} · {n} need attention" +msgstr[0] "{folders} · {n} requer atenção" +msgstr[1] "{folders} · {n} requerem atenção" + +#: crates/pdfs-gui/src/app/pages/devices.rs:412 +msgid "syncing…" +msgstr "sincronizando…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:413 +msgid "sync error" +msgstr "erro de sincronização" + +#: crates/pdfs-gui/src/app/pages/devices.rs:414 +msgid "needs attention" +msgstr "requer atenção" + +#: crates/pdfs-gui/src/app/pages/devices.rs:415 +msgid "up to date" +msgstr "atualizado" + +#: crates/pdfs-gui/src/app/pages/devices.rs:427 +msgid "checking for changes…" +msgstr "verificando alterações…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:430 +#, rust-format +msgid "checking for changes — {done} of {total}" +msgstr "verificando alterações — {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:442 +#, rust-format +msgid "syncing {done} of {total}" +msgstr "sincronizando {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:448 +#, rust-format +msgid "syncing {file} — {done} of {total}" +msgstr "sincronizando {file} — {done} de {total}" + +#: crates/pdfs-gui/src/app/pages/devices.rs:460 +msgid "Add Folder to Sync" +msgstr "Adicionar pasta à sincronização" + +#: crates/pdfs-gui/src/app/pages/devices.rs:484 +#: crates/pdfs-gui/src/app/pages/locations.rs:1102 +msgid "Syncing folder…" +msgstr "Sincronizando pasta…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:487 +#: crates/pdfs-gui/src/app/pages/devices.rs:491 +msgid "Couldn't add folder" +msgstr "Não foi possível adicionar a pasta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:525 +#: crates/pdfs-gui/src/app/pages/devices.rs:531 +msgid "Couldn't list folders to restore" +msgstr "Não foi possível listar as pastas para restaurar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:557 +msgid "" +"Tick the folders to sync to this machine, and adjust where each one should " +"live." +msgstr "" +"Marque as pastas a sincronizar com esta máquina e ajuste onde cada uma deve " +"ficar." + +#: crates/pdfs-gui/src/app/pages/devices.rs:580 +msgid "Restore folders" +msgstr "Restaurar pastas" + +#: crates/pdfs-gui/src/app/pages/devices.rs:587 +msgid "Restore" +msgstr "Restaurar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:620 +msgid "Restoring folders…" +msgstr "Restaurando pastas…" + +#: crates/pdfs-gui/src/app/pages/devices.rs:621 +msgid "Couldn't restore folders" +msgstr "Não foi possível restaurar as pastas" + +#: crates/pdfs-gui/src/app/pages/devices.rs:632 +#, rust-format +msgid "" +"These folders are backed up from “{name}”. Restored folders keep syncing " +"with that computer's copy." +msgstr "" +"Estas pastas têm backup a partir de “{name}”. As pastas restauradas " +"continuam sincronizando com a cópia daquele computador." + +#: crates/pdfs-gui/src/app/pages/devices.rs:635 +msgid "These folders are backed up under this computer in Proton Drive." +msgstr "Estas pastas têm backup sob este computador no Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:644 +#, rust-format +msgid "Nothing to restore — “{name}”'s folders are all synced here." +msgstr "" +"Nada a restaurar — as pastas de “{name}” já estão todas sincronizadas aqui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:647 +msgid "Nothing to restore — this computer's folders are all synced here." +msgstr "" +"Nada a restaurar — as pastas deste computador já estão todas sincronizadas " +"aqui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:671 +msgid "Folder will switch to on-demand" +msgstr "A pasta passará para sob demanda" + +#: crates/pdfs-gui/src/app/pages/devices.rs:673 +msgid "Folder will download and stay synced" +msgstr "A pasta será baixada e permanecerá sincronizada" + +#: crates/pdfs-gui/src/app/pages/devices.rs:677 +#: crates/pdfs-gui/src/app/pages/devices.rs:681 +msgid "Couldn't change mode" +msgstr "Não foi possível alterar o modo" + +#: crates/pdfs-gui/src/app/pages/devices.rs:713 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"This folder is on-demand: its files live in Proton Drive, not on this disk, " +"so the folder will be empty once it is unmounted. To keep a local copy, " +"cancel, turn off On-demand, and wait for the download to finish before " +"removing it." +msgstr "" +"Parar de sincronizar “{path}”?\n" +"\n" +"Esta pasta é sob demanda: seus arquivos ficam no Proton Drive, não neste " +"disco, então a pasta ficará vazia depois de desmontada. Para manter uma " +"cópia local, cancele, desative Sob demanda e aguarde o download terminar " +"antes de removê-la." + +#: crates/pdfs-gui/src/app/pages/devices.rs:719 +#, rust-format +msgid "" +"Stop syncing “{path}”?\n" +"\n" +"The local files stay on this disk and simply stop being synced. Choose " +"whether to also delete the copy in Proton Drive." +msgstr "" +"Parar de sincronizar “{path}”?\n" +"\n" +"Os arquivos locais permanecem neste disco e simplesmente deixam de ser " +"sincronizados. Escolha se também deseja excluir a cópia no Proton Drive." + +#: crates/pdfs-gui/src/app/pages/devices.rs:724 +msgid "Stop syncing folder" +msgstr "Parar de sincronizar a pasta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:729 +msgid "Also delete from Proton Drive" +msgstr "Também excluir do Proton Drive" + +#: crates/pdfs-gui/src/app/pages/devices.rs:731 +msgid "Deletes the only copy of these files." +msgstr "Exclui a única cópia destes arquivos." + +#: crates/pdfs-gui/src/app/pages/devices.rs:733 +msgid "The local copy is unaffected." +msgstr "A cópia local não é afetada." + +#: crates/pdfs-gui/src/app/pages/devices.rs:740 +msgid "Stop Syncing" +msgstr "Parar de sincronizar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:753 +msgid "Stopped syncing folder" +msgstr "A pasta deixou de ser sincronizada" + +#: crates/pdfs-gui/src/app/pages/devices.rs:754 +msgid "Couldn't stop syncing the folder" +msgstr "Não foi possível parar de sincronizar a pasta" + +#: crates/pdfs-gui/src/app/pages/devices.rs:765 +msgid "Rename Computer" +msgstr "Renomear computador" + +#. Translators: {name} is the computer's current name. +#: crates/pdfs-gui/src/app/pages/devices.rs:767 +#, rust-format +msgid "Rename “{name}”." +msgstr "Renomear “{name}”." + +#: crates/pdfs-gui/src/app/pages/devices.rs:792 +#: crates/pdfs-gui/src/app/pages/devices.rs:804 +msgid "Couldn't rename the computer" +msgstr "Não foi possível renomear o computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:793 +msgid "A name is required." +msgstr "Um nome é obrigatório." + +#: crates/pdfs-gui/src/app/pages/devices.rs:803 +msgid "Computer renamed" +msgstr "Computador renomeado" + +#. Translators: {name} is the computer's name, which the user must type. +#: crates/pdfs-gui/src/app/pages/devices.rs:816 +#, rust-format +msgid "Type “{name}” to confirm" +msgstr "Digite “{name}” para confirmar" + +#: crates/pdfs-gui/src/app/pages/devices.rs:821 +msgid "Remove Computer" +msgstr "Remover computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:824 +#, rust-format +msgid "" +"Remove “{name}” from this account?\n" +"\n" +"Everything it backed up to Proton Drive is deleted along with it. The files " +"on that computer itself are not touched — but this cannot be undone from " +"here." +msgstr "" +"Remover “{name}” desta conta?\n" +"\n" +"Tudo o que ele salvou no Proton Drive será excluído junto. Os arquivos " +"naquele próprio computador não são tocados — mas isso não pode ser desfeito " +"daqui." + +#: crates/pdfs-gui/src/app/pages/devices.rs:830 +#: crates/pdfs-gui/src/app/pages/shared.rs:749 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:521 +msgid "Remove" +msgstr "Remover" + +#: crates/pdfs-gui/src/app/pages/devices.rs:847 +msgid "Computer removed" +msgstr "Computador removido" + +#: crates/pdfs-gui/src/app/pages/devices.rs:848 +msgid "Couldn't remove the computer" +msgstr "Não foi possível remover o computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:865 +msgid "Use this computer's identity" +msgstr "Usar a identidade deste computador" + +#: crates/pdfs-gui/src/app/pages/devices.rs:868 +#, rust-format +msgid "" +"Treat this machine as “{name}”?\n" +"\n" +"New synced folders are created under that computer in Proton Drive, and this " +"machine keeps that identity even if its hostname changes. Folders already " +"synced here are not moved.\n" +"\n" +"Use “Restore folders” afterwards to bring back what “{name}” was syncing." +msgstr "" +"Tratar esta máquina como “{name}”?\n" +"\n" +"Novas pastas sincronizadas são criadas sob aquele computador no Proton " +"Drive, e esta máquina mantém essa identidade mesmo que seu nome de host " +"mude. As pastas já sincronizadas aqui não são movidas.\n" +"\n" +"Use “Restaurar pastas” depois para trazer de volta o que “{name}” " +"sincronizava." + +#: crates/pdfs-gui/src/app/pages/devices.rs:873 +msgid "Use identity" +msgstr "Usar identidade" + +#: crates/pdfs-gui/src/app/pages/devices.rs:886 +msgid "Identity adopted" +msgstr "Identidade adotada" + +#: crates/pdfs-gui/src/app/pages/devices.rs:887 +msgid "Couldn't adopt that computer" +msgstr "Não foi possível adotar aquele computador" + +#: crates/pdfs-gui/src/app/pages/locations.rs:89 +msgid "Add Folder" +msgstr "Adicionar pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:94 +msgid "Back a local folder up to this computer's Proton Drive device" +msgstr "" +"Fazer backup de uma pasta local no dispositivo Proton Drive deste computador" + +#: crates/pdfs-gui/src/app/pages/locations.rs:102 +msgid "Conflicts" +msgstr "Conflitos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:104 +msgid "" +"Files changed in two places at once. Both versions were kept; choose which " +"one stays." +msgstr "" +"Arquivos alterados em dois lugares ao mesmo tempo. Ambas as versões foram " +"mantidas; escolha qual permanece." + +#: crates/pdfs-gui/src/app/pages/locations.rs:113 +msgid "On this computer" +msgstr "Neste computador" + +#: crates/pdfs-gui/src/app/pages/locations.rs:114 +msgid "" +"Where Proton Drive lives on this machine. Synced folders keep a full copy on " +"this disk; on-demand folders keep the files in Proton Drive only and fetch " +"them as you open them." +msgstr "" +"Onde o Proton Drive fica nesta máquina. Pastas sincronizadas mantêm uma " +"cópia completa neste disco; pastas sob demanda mantêm os arquivos somente no " +"Proton Drive e os buscam quando você os abre." + +#: crates/pdfs-gui/src/app/pages/locations.rs:165 +msgctxt "page" +msgid "Sync" +msgstr "Sincronização" + +#: crates/pdfs-gui/src/app/pages/locations.rs:220 +msgid "Pause for 1 Hour" +msgstr "Pausar por 1 hora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:224 +msgid "Pause for 8 Hours" +msgstr "Pausar por 8 horas" + +#: crates/pdfs-gui/src/app/pages/locations.rs:228 +msgid "Pause for 24 Hours" +msgstr "Pausar por 24 horas" + +#: crates/pdfs-gui/src/app/pages/locations.rs:232 +#: crates/pdfs-gui/src/app/pages/locations.rs:277 +msgctxt "verb" +msgid "Pause" +msgstr "Pausar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:236 +#: crates/pdfs-gui/src/app/pages/locations.rs:282 +msgid "Stop uploading until you resume. Files still open as usual." +msgstr "" +"Interrompe os envios até você retomar. Os arquivos continuam abrindo " +"normalmente." + +#: crates/pdfs-gui/src/app/pages/locations.rs:238 +msgid "Pause for a while" +msgstr "Pausar por um tempo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:241 +msgid "Checking…" +msgstr "Verificando…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:275 +msgctxt "verb" +msgid "Resume" +msgstr "Retomar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:280 +msgid "Upload everything that waited while sync was paused" +msgstr "Enviar tudo o que aguardou enquanto a sincronização estava pausada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:328 +msgid "Couldn't pause sync" +msgstr "Não foi possível pausar a sincronização" + +#: crates/pdfs-gui/src/app/pages/locations.rs:330 +msgid "Couldn't resume sync" +msgstr "Não foi possível retomar a sincronização" + +#: crates/pdfs-gui/src/app/pages/locations.rs:336 +msgid "Sync resumed" +msgstr "Sincronização retomada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:337 +msgid "Sync paused until you resume" +msgstr "Sincronização pausada até você retomar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:338 +#: crates/pdfs-gui/src/app/pages/status.rs:1254 crates/pdfs-gui/src/main.rs:166 +msgid "Sync paused" +msgstr "Sincronização pausada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:352 +msgid "Retry All" +msgstr "Tentar todos novamente" + +#: crates/pdfs-gui/src/app/pages/locations.rs:354 +msgid "Try every failed change again now" +msgstr "Tentar novamente agora todas as alterações que falharam" + +#: crates/pdfs-gui/src/app/pages/locations.rs:359 +msgid "Waiting to Upload" +msgstr "Aguardando envio" + +#: crates/pdfs-gui/src/app/pages/locations.rs:361 +#: crates/pdfs-gui/src/app/pages/locations.rs:420 +msgid "Changes made on this computer that are not on Proton Drive yet." +msgstr "" +"Alterações feitas neste computador que ainda não estão no Proton Drive." + +#. Translators: {shown} is how many rows are listed (50), {n} the total number of queued changes. +#: crates/pdfs-gui/src/app/pages/locations.rs:418 +#, rust-format +msgid "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgid_plural "" +"Changes made on this computer that are not on Proton Drive yet. Showing the " +"first {shown} of {n}." +msgstr[0] "" +"Alterações feitas neste computador que ainda não estão no Proton Drive. " +"Mostrando as primeiras {shown} de {n}." +msgstr[1] "" +"Alterações feitas neste computador que ainda não estão no Proton Drive. " +"Mostrando as primeiras {shown} de {n}." + +#: crates/pdfs-gui/src/app/pages/locations.rs:435 +msgid "Upload changes" +msgstr "Enviar alterações" + +#: crates/pdfs-gui/src/app/pages/locations.rs:436 +msgid "Upload new file" +msgstr "Enviar novo arquivo" + +#: crates/pdfs-gui/src/app/pages/locations.rs:437 +msgid "Create folder" +msgstr "Criar pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:438 +msgid "Rename or move" +msgstr "Renomear ou mover" + +#: crates/pdfs-gui/src/app/pages/locations.rs:439 +msgid "Move to trash" +msgstr "Mover para a lixeira" + +#. Translators: a queued change of an unknown kind. +#: crates/pdfs-gui/src/app/pages/locations.rs:441 +msgctxt "noun" +msgid "Change" +msgstr "Alteração" + +#: crates/pdfs-gui/src/app/pages/locations.rs:444 +msgid "waiting for the app writing it to finish" +msgstr "aguardando o aplicativo que o está gravando terminar" + +#. Translators: {time} is when the next attempt happens, such as "14:30". +#: crates/pdfs-gui/src/app/pages/locations.rs:447 +#, rust-format +msgid "retrying {time}" +msgstr "nova tentativa {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:449 +msgid "waiting for sync to resume" +msgstr "aguardando a sincronização ser retomada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:450 +msgid "up next" +msgstr "a seguir" + +#: crates/pdfs-gui/src/app/pages/locations.rs:454 +#, rust-format +msgid "{action} · {state}" +msgstr "{action} · {state}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:461 +#, rust-format +msgid "Failed {n} time: {error}" +msgid_plural "Failed {n} times: {error}" +msgstr[0] "Falhou {n} vez: {error}" +msgstr[1] "Falhou {n} vezes: {error}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:487 +msgid "Retry now" +msgstr "Tentar novamente agora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:506 +msgid "Retrying now…" +msgstr "Tentando novamente…" + +#: crates/pdfs-gui/src/app/pages/locations.rs:511 +#: crates/pdfs-gui/src/app/pages/locations.rs:515 +msgid "Couldn't retry" +msgstr "Não foi possível tentar novamente" + +#: crates/pdfs-gui/src/app/pages/locations.rs:589 +#, rust-format +msgid "{size}, changed {time}" +msgstr "{size}, alterado em {time}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:599 +msgid "The original is gone; only this copy is left" +msgstr "O original não existe mais; só resta esta cópia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:601 +msgid "Same content as the original" +msgstr "Mesmo conteúdo que o original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:605 +#, rust-format +msgid "Differs from {name}" +msgstr "Difere de {name}" + +#: crates/pdfs-gui/src/app/pages/locations.rs:642 +#, rust-format +msgid "" +"“{name}” was changed here and elsewhere at the same time.\n" +"\n" +"Original: {original}\n" +"Copy: {copy}\n" +"\n" +"Whatever is not kept goes to Trash, where it can be restored." +msgstr "" +"“{name}” foi alterado aqui e em outro lugar ao mesmo tempo.\n" +"\n" +"Original: {original}\n" +"Cópia: {copy}\n" +"\n" +"O que não for mantido vai para a lixeira, de onde pode ser restaurado." + +#: crates/pdfs-gui/src/app/pages/locations.rs:654 +#, rust-format +msgid "" +"The original “{name}” no longer exists; only the copy is left ({copy}).\n" +"\n" +"Keep the copy to give it the original name back." +msgstr "" +"O original “{name}” não existe mais; só resta a cópia ({copy}).\n" +"\n" +"Mantenha a cópia para devolver a ela o nome original." + +#: crates/pdfs-gui/src/app/pages/locations.rs:660 +msgid "Resolve conflict" +msgstr "Resolver conflito" + +#: crates/pdfs-gui/src/app/pages/locations.rs:665 +msgid "Name for the copy, if keeping both" +msgstr "Nome da cópia, se mantiver ambos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:672 +msgid "Keep Original" +msgstr "Manter original" + +#: crates/pdfs-gui/src/app/pages/locations.rs:673 +msgid "Keep Both" +msgstr "Manter ambos" + +#: crates/pdfs-gui/src/app/pages/locations.rs:675 +msgid "Keep Copy" +msgstr "Manter cópia" + +#: crates/pdfs-gui/src/app/pages/locations.rs:732 +#: crates/pdfs-gui/src/app/pages/locations.rs:738 +msgid "Couldn't resolve the conflict" +msgstr "Não foi possível resolver o conflito" + +#: crates/pdfs-gui/src/app/pages/locations.rs:779 +msgid "Reading this computer's Proton Drive locations." +msgstr "Lendo os locais do Proton Drive deste computador." + +#: crates/pdfs-gui/src/app/pages/locations.rs:800 +msgid "Unavailable" +msgstr "Indisponível" + +#: crates/pdfs-gui/src/app/pages/locations.rs:871 +msgid "No locations" +msgstr "Nenhum local" + +#: crates/pdfs-gui/src/app/pages/locations.rs:873 +msgid "The mount service hasn't reported a mountpoint yet." +msgstr "O serviço de montagem ainda não informou um ponto de montagem." + +#: crates/pdfs-gui/src/app/pages/locations.rs:898 +msgid "Read-only" +msgstr "Somente leitura" + +#: crates/pdfs-gui/src/app/pages/locations.rs:930 +msgid "Open this folder" +msgstr "Abrir esta pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:949 +msgctxt "verb" +msgid "Change" +msgstr "Alterar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:951 +#: crates/pdfs-gui/src/app/pages/status.rs:179 +msgid "Choose a different folder for the Proton Drive mount" +msgstr "Escolher uma pasta diferente para a montagem do Proton Drive" + +#: crates/pdfs-gui/src/app/pages/locations.rs:968 +msgid "Resume syncing this folder" +msgstr "Retomar a sincronização desta pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:972 +msgid "Pause syncing this folder" +msgstr "Pausar a sincronização desta pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:990 +msgid "Sync this folder now" +msgstr "Sincronizar esta pasta agora" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1005 +msgid "" +"On-demand: free this disk by keeping the files in Proton Drive only, " +"fetching each as you open it. Turn off to download them back and keep a full " +"local copy." +msgstr "" +"Sob demanda: libera espaço neste disco mantendo os arquivos somente no " +"Proton Drive e buscando cada um quando você o abre. Desative para baixá-los " +"de volta e manter uma cópia local completa." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1029 +msgid "Stop syncing this folder" +msgstr "Parar de sincronizar esta pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1046 +msgid "Make Folder On-Demand?" +msgstr "Tornar a pasta sob demanda?" + +#. Translators: {path} is a local folder path. +#: crates/pdfs-gui/src/app/pages/locations.rs:1048 +#, rust-format +msgid "" +"Files in {path} will be removed from this computer and kept in Proton Drive " +"only. Each file downloads again when you open it." +msgstr "" +"Os arquivos em {path} serão removidos deste computador e mantidos somente no " +"Proton Drive. Cada arquivo é baixado novamente quando você o abre." + +#: crates/pdfs-gui/src/app/pages/locations.rs:1051 +msgid "Make On-Demand" +msgstr "Tornar sob demanda" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1076 +msgid "Couldn't pause the folder" +msgstr "Não foi possível pausar a pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1077 +msgid "Couldn't resume the folder" +msgstr "Não foi possível retomar a pasta" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1083 +msgid "Folder paused" +msgstr "Pasta pausada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1084 +msgid "Folder resumed" +msgstr "Pasta retomada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1104 +#: crates/pdfs-gui/src/app/pages/locations.rs:1108 +msgid "Couldn't sync" +msgstr "Não foi possível sincronizar" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1134 +msgid "Shared folder" +msgstr "Pasta compartilhada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1136 +msgid "Going on-demand" +msgstr "Passando para sob demanda" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1137 +msgid "Switching to synced" +msgstr "Passando para sincronizada" + +#. Translators: a folder mode: files are kept online and fetched when opened. +#: crates/pdfs-gui/src/app/pages/locations.rs:1140 +msgctxt "folder mode" +msgid "On-demand" +msgstr "Sob demanda" + +#. Translators: a folder mode: a full copy is kept on this computer. +#: crates/pdfs-gui/src/app/pages/locations.rs:1143 +msgctxt "folder mode" +msgid "Synced" +msgstr "Sincronizada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1149 +msgctxt "state" +msgid "paused" +msgstr "pausada" + +#: crates/pdfs-gui/src/app/pages/locations.rs:1159 +msgid "not mounted" +msgstr "não montada" + +#: crates/pdfs-gui/src/app/pages/login.rs:24 +msgid "Sign in to Proton" +msgstr "Entrar no Proton" + +#: crates/pdfs-gui/src/app/pages/login.rs:25 +msgid "Use your Proton account to connect Drive." +msgstr "Use sua conta Proton para conectar o Drive." + +#: crates/pdfs-gui/src/app/pages/login.rs:29 +msgid "Email or username" +msgstr "E-mail ou nome de usuário" + +#: crates/pdfs-gui/src/app/pages/login.rs:32 +msgid "Password" +msgstr "Senha" + +#: crates/pdfs-gui/src/app/pages/login.rs:40 +msgid "Sign in" +msgstr "Entrar" + +#: crates/pdfs-gui/src/app/pages/login.rs:77 +msgid "Create account" +msgstr "Criar conta" + +#: crates/pdfs-gui/src/app/pages/login.rs:81 +msgid "Forgot password?" +msgstr "Esqueceu a senha?" + +#: crates/pdfs-gui/src/app/pages/login.rs:125 +msgid "Enter your email and password." +msgstr "Digite seu e-mail e senha." + +#: crates/pdfs-gui/src/app/pages/login.rs:130 +msgid "Signing in…" +msgstr "Entrando…" + +#: crates/pdfs-gui/src/app/pages/login.rs:155 +msgid "Complete the verification to continue…" +msgstr "Conclua a verificação para continuar…" + +#: crates/pdfs-gui/src/app/pages/login.rs:165 +msgid "login cancelled" +msgstr "login cancelado" + +#: crates/pdfs-gui/src/app/pages/login.rs:199 +msgid "Too many sign-in attempts. Wait a few minutes and try again." +msgstr "Muitas tentativas de entrar. Aguarde alguns minutos e tente novamente." + +#: crates/pdfs-gui/src/app/pages/login.rs:205 +msgid "Couldn't reach Proton. Check your internet connection and try again." +msgstr "" +"Não foi possível acessar o Proton. Verifique sua conexão com a internet e " +"tente novamente." + +#: crates/pdfs-gui/src/app/pages/login.rs:208 +msgid "" +"Signed in, but the session couldn't be saved to the system keyring. Make " +"sure a keyring (GNOME Keyring or KWallet) is running and unlocked." +msgstr "" +"Conectado, mas a sessão não pôde ser salva no chaveiro do sistema. " +"Certifique-se de que um chaveiro (GNOME Keyring ou KWallet) esteja em " +"execução e desbloqueado." + +#: crates/pdfs-gui/src/app/pages/login.rs:211 +msgid "Sign-in cancelled: no two-factor code was entered." +msgstr "Entrada cancelada: nenhum código de dois fatores foi digitado." + +#: crates/pdfs-gui/src/app/pages/login.rs:214 +msgid "" +"Sign-in cancelled: the verification wasn't completed. Sign in again to get a " +"new one." +msgstr "" +"Entrada cancelada: a verificação não foi concluída. Entre novamente para " +"receber uma nova." + +#. Translators: {error} is an error message, usually in English. +#: crates/pdfs-gui/src/app/pages/login.rs:219 +#, rust-format +msgid "Sign-in failed: {error}" +msgstr "Falha ao entrar: {error}" + +#: crates/pdfs-gui/src/app/pages/login.rs:299 +msgid "Two-factor authentication" +msgstr "Autenticação de dois fatores" + +#: crates/pdfs-gui/src/app/pages/login.rs:301 +msgid "" +"Enter the code from your authenticator app, or one of your recovery codes." +msgstr "" +"Digite o código do seu aplicativo autenticador ou um dos seus códigos de " +"recuperação." + +#: crates/pdfs-gui/src/app/pages/login.rs:307 +msgid "Authentication code" +msgstr "Código de autenticação" + +#: crates/pdfs-gui/src/app/pages/login.rs:314 +msgid "Confirm" +msgstr "Confirmar" + +#: crates/pdfs-gui/src/app/pages/login.rs:342 +msgid "Sign Out?" +msgstr "Sair?" + +#: crates/pdfs-gui/src/app/pages/login.rs:344 +msgid "" +"Proton Drive will disconnect and stop syncing until you sign in again. Files " +"already on this computer stay where they are." +msgstr "" +"O Proton Drive será desconectado e deixará de sincronizar até você entrar " +"novamente. Os arquivos que já estão neste computador permanecem onde estão." + +#: crates/pdfs-gui/src/app/pages/login.rs:346 +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:182 +#, rust-format +msgid "Show {name}" +msgstr "Mostrar {name}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:185 +msgid "Show the raw file" +msgstr "Mostrar o arquivo RAW" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:186 +msgid "Show the video" +msgstr "Mostrar o vídeo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:187 +msgid "Show the photo" +msgstr "Mostrar a foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:288 +msgid "Couldn't render this photo." +msgstr "Não foi possível renderizar esta foto." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:293 +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:345 +msgid "Reading photo details…" +msgstr "Lendo os detalhes da foto…" + +#. Translators: label of a photo's file size in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:362 +msgctxt "property" +msgid "Size" +msgstr "Tamanho" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:368 +msgid "This photo carries no metadata." +msgstr "Esta foto não contém metadados." + +#. Translators: a photo's pixel dimensions, such as "4032 × 3024". +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:426 +#, rust-format +msgid "{width} × {height}" +msgstr "{width} × {height}" + +#. Translators: label of a photo's pixel dimensions in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:429 +msgid "Dimensions" +msgstr "Dimensões" + +#. Translators: label of when a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:433 +msgctxt "photo property" +msgid "Taken" +msgstr "Tirada em" + +#. Translators: label of the camera model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:443 +msgid "Camera" +msgstr "Câmera" + +#. Translators: label of the lens model in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:447 +msgid "Lens" +msgstr "Lente" + +#. Translators: label of aperture, shutter speed, ISO and focal length in a photo's details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:461 +msgid "Exposure" +msgstr "Exposição" + +#. Translators: label of where a photo was taken, in the details panel. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:469 +msgctxt "photo property" +msgid "Location" +msgstr "Local" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:472 +#, rust-format +msgid "{latitude}, {longitude}" +msgstr "{latitude}, {longitude}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:639 +msgid "Save a Copy" +msgstr "Salvar uma cópia" + +#. Translators: {name} is the saved file's name. +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:660 +#, rust-format +msgid "Saved “{name}”" +msgstr "“{name}” salvo" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:662 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:665 +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:666 +msgid "The copy was interrupted." +msgstr "A cópia foi interrompida." + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:790 +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:795 +#, rust-format +msgid "{position} of {total}" +msgstr "{position} de {total}" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:800 +#, rust-format +msgid "{position} of {loaded}+" +msgstr "{position} de {loaded}+" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:828 +msgid "Photo" +msgstr "Foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:875 +msgid "Previous (←)" +msgstr "Anterior (←)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:889 +msgid "Next (→)" +msgstr "Próxima (→)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:927 +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:936 +msgctxt "verb" +msgid "Favorite" +msgstr "Favoritar" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:944 +msgid "Other files of this photo" +msgstr "Outros arquivos desta foto" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:947 +msgid "Save a Copy…" +msgstr "Salvar uma cópia…" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:948 +msgid "Move to Trash (Delete)" +msgstr "Mover para a lixeira (Delete)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:950 +msgid "Close (Esc)" +msgstr "Fechar (Esc)" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:973 +msgid "Show on map" +msgstr "Mostrar no mapa" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:991 +msgid "Hide details" +msgstr "Ocultar detalhes" + +#: crates/pdfs-gui/src/app/pages/photo_viewer.rs:1250 +#: crates/pdfs-gui/src/app/pages/photos.rs:2536 +#: crates/pdfs-gui/src/app/pages/photos.rs:2540 +msgid "Couldn't change the favorite" +msgstr "Não foi possível alterar o favorito" + +#: crates/pdfs-gui/src/app/pages/photos.rs:393 +#: crates/pdfs-gui/src/app/pages/photos.rs:471 +msgid "Upload photos" +msgstr "Enviar fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:398 +#: 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:438 +#: crates/pdfs-gui/src/app/pages/photos.rs:570 +msgid "Jump to a month" +msgstr "Ir para um mês" + +#: crates/pdfs-gui/src/app/pages/photos.rs:455 +msgid "Back to albums" +msgstr "Voltar aos álbuns" + +#: crates/pdfs-gui/src/app/pages/photos.rs:467 +msgctxt "verb" +msgid "Upload" +msgstr "Enviar" + +#: crates/pdfs-gui/src/app/pages/photos.rs:480 +msgid "Import a Google Photos Takeout export" +msgstr "Importar uma exportação do Google Takeout do Google Photos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:490 +#: crates/pdfs-gui/src/app/pages/photos.rs:499 +#: crates/pdfs-gui/src/app/pages/photos.rs:1499 +msgid "Select photos" +msgstr "Selecionar fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:510 +#: crates/pdfs-gui/src/app/pages/photos.rs:2493 +msgid "Add to Album…" +msgstr "Adicionar ao álbum…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:516 +msgid "Leave selection (Esc)" +msgstr "Sair da seleção (Esc)" + +#: crates/pdfs-gui/src/app/pages/photos.rs:561 +msgid "Show only favorites" +msgstr "Mostrar somente favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:568 +#: crates/pdfs-gui/src/app/pages/photos.rs:771 +msgid "All dates" +msgstr "Todas as datas" + +#: crates/pdfs-gui/src/app/pages/photos.rs:588 +msgid "Timeline" +msgstr "Linha do tempo" + +#: crates/pdfs-gui/src/app/pages/photos.rs:592 +msgid "Albums" +msgstr "Álbuns" + +#: crates/pdfs-gui/src/app/pages/photos.rs:658 +msgid "Importing from Google Photos…" +msgstr "Importando do Google Photos…" + +#. 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:747 +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:778 +#, rust-format +msgid "{month} ({count})" +msgstr "{month} ({count})" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1081 +msgid "Select Photo to Upload" +msgstr "Selecione a foto a enviar" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1085 +#: crates/pdfs-gui/src/prompt.rs:60 +msgid "Images" +msgstr "Imagens" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1141 +msgid "Photo uploaded" +msgstr "Foto enviada" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1146 +#: crates/pdfs-gui/src/app/pages/photos.rs:1154 +msgid "Couldn't upload photo" +msgstr "Não foi possível enviar a foto" + +#. Translators: badge on a photo tile whose shot includes a raw camera file. +#: crates/pdfs-gui/src/app/pages/photos.rs:1369 +msgid "RAW" +msgstr "RAW" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1543 +msgid "Move this photo to Trash?" +msgstr "Mover esta foto para a lixeira?" + +#: crates/pdfs-gui/src/app/pages/photos.rs:1545 +#, 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 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:1551 +#, 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:1558 +#, 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] "" +"Mover {n} foto para a lixeira? Ela está armazenada em {files} arquivos." +msgstr[1] "" +"Mover {n} fotos para a lixeira? Elas estão armazenadas em {files} arquivos." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1616 +msgid "The server refused." +msgstr "O servidor recusou." + +#: crates/pdfs-gui/src/app/pages/photos.rs:1619 +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:1628 +#, rust-format +msgid "Moved {n} photo to Trash" +msgid_plural "Moved {n} photos to Trash" +msgstr[0] "{n} foto movida para a lixeira" +msgstr[1] "{n} fotos movidas para a lixeira" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2163 +#: crates/pdfs-gui/src/app/pages/photos.rs:2184 +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:2181 +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:2202 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%d/%m/%Y %H:%M:%S" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2206 +#: crates/pdfs-gui/src/app/pages/photos.rs:2208 +msgid "Unknown Date" +msgstr "Data desconhecida" + +#. Translators: a check item in a photo's menu, on while the photo is a favorite. +#: crates/pdfs-gui/src/app/pages/photos.rs:2482 +msgctxt "state" +msgid "Favorite" +msgstr "Favorita" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2487 +msgctxt "verb" +msgid "Select" +msgstr "Selecionar" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2499 +msgid "Remove from Album" +msgstr "Remover do álbum" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2505 +msgid "Move to Trash…" +msgstr "Mover para a lixeira…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2529 +msgid "Added to Favorites" +msgstr "Adicionada aos favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2531 +msgid "Removed from Favorites" +msgstr "Removida dos favoritos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2560 +msgid "Loading photos…" +msgstr "Carregando fotos…" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2561 +msgid "Reading your Proton Drive timeline." +msgstr "Lendo sua linha do tempo do Proton Drive." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2648 +msgid "Empty album" +msgstr "Álbum vazio" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2649 +msgid "This album has no photos in it." +msgstr "Este álbum não tem fotos." + +#: crates/pdfs-gui/src/app/pages/photos.rs:2690 +#: crates/pdfs-gui/src/app/pages/photos.rs:2708 +msgid "Couldn't load more photos" +msgstr "Não foi possível carregar mais fotos" + +#: crates/pdfs-gui/src/app/pages/photos.rs:2695 +#: crates/pdfs-gui/src/app/pages/photos.rs:2702 +msgid "Couldn't load photos" +msgstr "Não foi possível carregar as fotos" + +#: crates/pdfs-gui/src/app/pages/shared.rs:52 +msgid "Add Bookmark — save a public link to open it from here" +msgstr "Adicionar marcador — salve um link público para abri-lo daqui" + +#: crates/pdfs-gui/src/app/pages/shared.rs:62 +#: crates/pdfs-gui/src/app/pages/shared.rs:280 +msgid "Invitations" +msgstr "Convites" + +#: crates/pdfs-gui/src/app/pages/shared.rs:63 +msgid "Accept to add the item to your shared files." +msgstr "Aceite para adicionar o item aos seus arquivos compartilhados." + +#: crates/pdfs-gui/src/app/pages/shared.rs:68 +msgid "Bookmarks" +msgstr "Marcadores" + +#: crates/pdfs-gui/src/app/pages/shared.rs:111 +msgid "Back" +msgstr "Voltar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:114 +msgid "Shared with Me" +msgstr "Compartilhados comigo" + +#: crates/pdfs-gui/src/app/pages/shared.rs:182 +msgid "Reading your shared items." +msgstr "Lendo seus itens compartilhados." + +#: crates/pdfs-gui/src/app/pages/shared.rs:235 +msgid "Reading this shared folder." +msgstr "Lendo esta pasta compartilhada." + +#: crates/pdfs-gui/src/app/pages/shared.rs:254 +msgid "Couldn't open shared folder" +msgstr "Não foi possível abrir a pasta compartilhada" + +#. Translators: the Invitations heading; {count} is the number of pending invitations (2 or more). +#: crates/pdfs-gui/src/app/pages/shared.rs:278 +#, rust-format +msgid "Invitations ({count})" +msgstr "Convites ({count})" + +#: crates/pdfs-gui/src/app/pages/shared.rs:305 +msgid "This folder is empty." +msgstr "Esta pasta está vazia." + +#: crates/pdfs-gui/src/app/pages/shared.rs:401 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:249 +msgid "Show in My Files" +msgstr "Mostrar em Meus arquivos" + +#: crates/pdfs-gui/src/app/pages/shared.rs:408 +msgid "Leave…" +msgstr "Sair…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:420 +msgid "" +"The invitation's signature doesn't match the sender's keys. It may not " +"really be from them." +msgstr "" +"A assinatura do convite não corresponde às chaves do remetente. Talvez ele " +"não tenha sido realmente enviado por essa pessoa." + +#: crates/pdfs-gui/src/app/pages/shared.rs:447 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:6 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Viewer" +msgstr "Leitor" + +#: crates/pdfs-gui/src/app/pages/shared.rs:448 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:7 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:625 +msgctxt "role" +msgid "Editor" +msgstr "Editor" + +#: crates/pdfs-gui/src/app/pages/shared.rs:449 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:8 +msgctxt "role" +msgid "Admin" +msgstr "Administrador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:458 +msgid "Can view" +msgstr "Pode ver" + +#: crates/pdfs-gui/src/app/pages/shared.rs:459 +msgid "Can edit" +msgstr "Pode editar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:460 +msgid "Can manage" +msgstr "Pode gerenciar" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/app/pages/shared.rs:486 +#, rust-format +msgid "Downloading “{name}”…" +msgstr "Baixando “{name}”…" + +#: crates/pdfs-gui/src/app/pages/shared.rs:563 +msgid "Nothing Shared with You" +msgstr "Nada compartilhado com você" + +#: crates/pdfs-gui/src/app/pages/shared.rs:565 +msgid "" +"Files and folders other people share with you appear here. Public links you " +"bookmark are kept here too." +msgstr "" +"Arquivos e pastas que outras pessoas compartilham com você aparecem aqui. " +"Links públicos que você salva como marcador também ficam aqui." + +#: crates/pdfs-gui/src/app/pages/shared.rs:583 +msgid "Shared with you" +msgstr "Compartilhados com você" + +#: crates/pdfs-gui/src/app/pages/shared.rs:598 +msgid "a shared item" +msgstr "um item compartilhado" + +#. Translators: {email} is the address of the person who sent the invitation. +#: crates/pdfs-gui/src/app/pages/shared.rs:602 +#, rust-format +msgid "From {email}" +msgstr "De {email}" + +#: crates/pdfs-gui/src/app/pages/shared.rs:611 +#: crates/pdfs-gui/src/app/pages/shared.rs:640 +msgid "Reject" +msgstr "Recusar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:616 +msgid "Accept" +msgstr "Aceitar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:628 +msgid "this item" +msgstr "este item" + +#: crates/pdfs-gui/src/app/pages/shared.rs:634 +msgid "Reject Invitation?" +msgstr "Recusar convite?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:637 +#, rust-format +msgid "You won't have access to {name} unless it is shared again." +msgstr "" +"Você não terá acesso a {name}, a menos que seja compartilhado novamente." + +#: crates/pdfs-gui/src/app/pages/shared.rs:652 +msgid "Shared link" +msgstr "Link compartilhado" + +#: crates/pdfs-gui/src/app/pages/shared.rs:660 +#: crates/pdfs-gui/src/app/pages/shared.rs:741 +msgid "Remove bookmark" +msgstr "Remover marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:666 +msgid "Open in browser" +msgstr "Abrir no navegador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:694 +msgid "Invitation accepted" +msgstr "Convite aceito" + +#: crates/pdfs-gui/src/app/pages/shared.rs:695 +msgid "Couldn't accept the invitation" +msgstr "Não foi possível aceitar o convite" + +#: crates/pdfs-gui/src/app/pages/shared.rs:699 +msgid "Invitation rejected" +msgstr "Convite recusado" + +#: crates/pdfs-gui/src/app/pages/shared.rs:700 +msgid "Couldn't reject the invitation" +msgstr "Não foi possível recusar o convite" + +#: crates/pdfs-gui/src/app/pages/shared.rs:710 +msgid "Leave shared item" +msgstr "Sair do item compartilhado" + +#: crates/pdfs-gui/src/app/pages/shared.rs:713 +#, rust-format +msgid "Leave “{name}”? You'll lose access until you're invited again." +msgstr "Sair de “{name}”? Você perderá o acesso até ser convidado novamente." + +#: crates/pdfs-gui/src/app/pages/shared.rs:718 +msgctxt "verb" +msgid "Leave" +msgstr "Sair" + +#: crates/pdfs-gui/src/app/pages/shared.rs:729 +msgid "Left shared item" +msgstr "Você saiu do item compartilhado" + +#: crates/pdfs-gui/src/app/pages/shared.rs:730 +msgid "Couldn't leave the shared item" +msgstr "Não foi possível sair do item compartilhado" + +#: crates/pdfs-gui/src/app/pages/shared.rs:744 +#, rust-format +msgid "Remove the bookmark for “{name}”?" +msgstr "Remover o marcador de “{name}”?" + +#: crates/pdfs-gui/src/app/pages/shared.rs:762 +msgid "Bookmark removed" +msgstr "Marcador removido" + +#: crates/pdfs-gui/src/app/pages/shared.rs:763 +msgid "Couldn't remove the bookmark" +msgstr "Não foi possível remover o marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:774 +msgid "Add bookmark" +msgstr "Adicionar marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:775 +msgid "Paste a Proton Drive public link to save it here." +msgstr "Cole um link público do Proton Drive para salvá-lo aqui." + +#: crates/pdfs-gui/src/app/pages/shared.rs:779 +msgid "Public link URL" +msgstr "URL do link público" + +#: crates/pdfs-gui/src/app/pages/shared.rs:783 +msgid "Password (if the link has one)" +msgstr "Senha (se o link tiver uma)" + +#: crates/pdfs-gui/src/app/pages/shared.rs:790 +msgid "Add" +msgstr "Adicionar" + +#: crates/pdfs-gui/src/app/pages/shared.rs:803 +msgid "Couldn't add bookmark" +msgstr "Não foi possível adicionar o marcador" + +#: crates/pdfs-gui/src/app/pages/shared.rs:804 +msgid "A URL is required." +msgstr "Uma URL é obrigatória." + +#: crates/pdfs-gui/src/app/pages/shared.rs:813 +msgid "Bookmark saved" +msgstr "Marcador salvo" + +#: crates/pdfs-gui/src/app/pages/shared.rs:814 +msgid "Couldn't add the bookmark" +msgstr "Não foi possível adicionar o marcador" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:63 +msgid "Shared by Me" +msgstr "Compartilhados por mim" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:113 +msgid "Reading what you've shared." +msgstr "Lendo o que você compartilhou." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:131 +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:138 +msgid "Couldn't read your shares" +msgstr "Não foi possível ler seus compartilhamentos" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:186 +msgid "Nothing shared yet" +msgstr "Nada compartilhado ainda" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:187 +msgid "Items you share with people or by link show up here." +msgstr "Itens que você compartilha com pessoas ou por link aparecem aqui." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:215 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:577 +msgid "Copy link" +msgstr "Copiar link" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:254 +msgid "Open Link" +msgstr "Abrir link" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:258 +msgid "Manage Access…" +msgstr "Gerenciar acesso…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:263 +msgid "Stop Sharing…" +msgstr "Parar de compartilhar…" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:273 +msgid "Stop sharing?" +msgstr "Parar de compartilhar?" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:276 +#, rust-format +msgid "" +"Everyone you invited loses access to “{name}”, pending invitations are " +"withdrawn and its public link stops working." +msgstr "" +"Todos que você convidou perdem o acesso a “{name}”, os convites pendentes " +"são retirados e seu link público deixa de funcionar." + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:281 +msgid "Stop Sharing" +msgstr "Parar de compartilhar" + +#. Translators: {name} is the item's name. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:293 +#, rust-format +msgid "Stopped sharing {name}" +msgstr "{name} deixou de ser compartilhado" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:294 +msgid "Couldn't stop sharing" +msgstr "Não foi possível parar de compartilhar" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:329 +#, rust-format +msgid "{n} person" +msgid_plural "{n} people" +msgstr[0] "{n} pessoa" +msgstr[1] "{n} pessoas" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:338 +#, rust-format +msgid "{n} pending" +msgid_plural "{n} pending" +msgstr[0] "{n} pendente" +msgstr[1] "{n} pendentes" + +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:345 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:315 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:566 +msgid "Public link" +msgstr "Link público" + +#. Translators: a shared item's summary when no people or link can be counted. +#: crates/pdfs-gui/src/app/pages/shared_by_me.rs:349 +msgctxt "state" +msgid "Shared" +msgstr "Compartilhado" + +#: crates/pdfs-gui/src/app/pages/status.rs:158 +msgid "Startup" +msgstr "Inicialização" + +#: crates/pdfs-gui/src/app/pages/status.rs:161 +msgid "Start on login" +msgstr "Iniciar ao entrar na sessão" + +#: crates/pdfs-gui/src/app/pages/status.rs:163 +msgid "Connect Proton Drive automatically when you log in" +msgstr "Conectar o Proton Drive automaticamente ao entrar na sessão" + +#: crates/pdfs-gui/src/app/pages/status.rs:172 +msgid "Proton Drive folder" +msgstr "Pasta do Proton Drive" + +#: crates/pdfs-gui/src/app/pages/status.rs:177 +msgid "Change…" +msgstr "Alterar…" + +#: crates/pdfs-gui/src/app/pages/status.rs:190 +msgid "Network" +msgstr "Rede" + +#: crates/pdfs-gui/src/app/pages/status.rs:192 +msgid "Limit how fast files move, shared by every transfer. 0 means no limit." +msgstr "" +"Limita a velocidade de transferência dos arquivos, compartilhada por todas " +"as transferências. 0 significa sem limite." + +#: crates/pdfs-gui/src/app/pages/status.rs:202 +msgid "Upload limit (MiB/s)" +msgstr "Limite de envio (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:203 +msgid "Download limit (MiB/s)" +msgstr "Limite de download (MiB/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:208 +msgid "Appearance" +msgstr "Aparência" + +#: crates/pdfs-gui/src/app/pages/status.rs:211 +msgid "Proton purple accent" +msgstr "Destaque roxo do Proton" + +#: crates/pdfs-gui/src/app/pages/status.rs:213 +msgid "Use the Proton brand color instead of the system accent color" +msgstr "Usar a cor da marca Proton em vez da cor de destaque do sistema" + +#: crates/pdfs-gui/src/app/pages/status.rs:218 +msgid "Show tray icon" +msgstr "Mostrar ícone na bandeja" + +#: crates/pdfs-gui/src/app/pages/status.rs:219 +msgid "Sync status and quick actions in the panel" +msgstr "Status da sincronização e ações rápidas no painel" + +#: crates/pdfs-gui/src/app/pages/status.rs:236 +msgid "Cache" +msgstr "Cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:238 +msgid "Pinned and recently opened files, kept on this computer." +msgstr "Arquivos fixados e abertos recentemente, mantidos neste computador." + +#: crates/pdfs-gui/src/app/pages/status.rs:261 +msgid "Cache size limit (GiB)" +msgstr "Limite de tamanho do cache (GiB)" + +#: crates/pdfs-gui/src/app/pages/status.rs:263 +msgid "Older files are removed past this size; 0 means no limit" +msgstr "" +"Arquivos mais antigos são removidos acima deste tamanho; 0 significa sem " +"limite" + +#: crates/pdfs-gui/src/app/pages/status.rs:270 +msgid "Clear cache" +msgstr "Limpar cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:271 +msgid "Remove cached copies. Files kept offline stay." +msgstr "Remove as cópias em cache. Os arquivos mantidos offline permanecem." + +#: crates/pdfs-gui/src/app/pages/status.rs:274 +msgid "Clear…" +msgstr "Limpar…" + +#: crates/pdfs-gui/src/app/pages/status.rs:285 +msgid "Files kept on this computer, even without a connection." +msgstr "Arquivos mantidos neste computador, mesmo sem conexão." + +#: crates/pdfs-gui/src/app/pages/status.rs:290 +msgid "Storage" +msgstr "Armazenamento" + +#: crates/pdfs-gui/src/app/pages/status.rs:326 +msgid "Show sync status" +msgstr "Mostrar status da sincronização" + +#: crates/pdfs-gui/src/app/pages/status.rs:355 +msgid "Sign Out…" +msgstr "Sair…" + +#: crates/pdfs-gui/src/app/pages/status.rs:359 +msgid "Account" +msgstr "Conta" + +#: crates/pdfs-gui/src/app/pages/status.rs:408 +msgid "System Default" +msgstr "Padrão do sistema" + +#: crates/pdfs-gui/src/app/pages/status.rs:413 +msgid "Language" +msgstr "Idioma" + +#: crates/pdfs-gui/src/app/pages/status.rs:414 +msgid "Takes effect the next time Proton Drive starts" +msgstr "Entra em vigor na próxima vez que o Proton Drive iniciar" + +#: crates/pdfs-gui/src/app/pages/status.rs:436 +msgid "Transfers" +msgstr "Transferências" + +#: crates/pdfs-gui/src/app/pages/status.rs:437 +msgid "Files moving to and from Proton Drive." +msgstr "Arquivos sendo transferidos para e do Proton Drive." + +#: crates/pdfs-gui/src/app/pages/status.rs:511 +msgid "Cache budget updated" +msgstr "Limite do cache atualizado" + +#: crates/pdfs-gui/src/app/pages/status.rs:512 +msgid "Couldn't set cache budget" +msgstr "Não foi possível definir o limite do cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:537 +msgid "Bandwidth limits updated" +msgstr "Limites de banda atualizados" + +#: crates/pdfs-gui/src/app/pages/status.rs:538 +msgid "Couldn't set bandwidth limits" +msgstr "Não foi possível definir os limites de banda" + +#: crates/pdfs-gui/src/app/pages/status.rs:550 +msgid "Clear Cache?" +msgstr "Limpar o cache?" + +#: crates/pdfs-gui/src/app/pages/status.rs:551 +msgid "" +"Cached copies are removed from this computer and download again when you " +"open them. Files kept available offline stay." +msgstr "" +"As cópias em cache são removidas deste computador e baixadas novamente " +"quando você as abre. Os arquivos mantidos disponíveis offline permanecem." + +#: crates/pdfs-gui/src/app/pages/status.rs:554 +msgid "Clear Cache" +msgstr "Limpar cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:563 +msgid "Cache cleared" +msgstr "Cache limpo" + +#: crates/pdfs-gui/src/app/pages/status.rs:564 +msgid "Couldn't clear the cache" +msgstr "Não foi possível limpar o cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:601 +msgid "Couldn't save the accent color" +msgstr "Não foi possível salvar a cor de destaque" + +#: crates/pdfs-gui/src/app/pages/status.rs:620 +msgid "Couldn't save the tray setting" +msgstr "Não foi possível salvar a configuração da bandeja" + +#: crates/pdfs-gui/src/app/pages/status.rs:644 +msgid "Couldn't save the language" +msgstr "Não foi possível salvar o idioma" + +#: crates/pdfs-gui/src/app/pages/status.rs:651 +msgid "Restart Proton Drive to use the new language" +msgstr "Reinicie o Proton Drive para usar o novo idioma" + +#: crates/pdfs-gui/src/app/pages/status.rs:682 +msgid "Choose mountpoint folder" +msgstr "Escolher a pasta do ponto de montagem" + +#: crates/pdfs-gui/src/app/pages/status.rs:694 +msgid "Couldn't save mountpoint" +msgstr "Não foi possível salvar o ponto de montagem" + +#: crates/pdfs-gui/src/app/pages/status.rs:707 +msgid "Restart to apply" +msgstr "Reiniciar para aplicar" + +#: crates/pdfs-gui/src/app/pages/status.rs:710 +#, rust-format +msgid "The mountpoint is now “{path}”. Restart the Drive mount to use it?" +msgstr "" +"O ponto de montagem agora é “{path}”. Reiniciar a montagem do Drive para usá-" +"lo?" + +#: crates/pdfs-gui/src/app/pages/status.rs:714 +msgid "Later" +msgstr "Mais tarde" + +#: crates/pdfs-gui/src/app/pages/status.rs:715 +msgid "Restart now" +msgstr "Reiniciar agora" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:869 +#, rust-format +msgid "{size} used" +msgstr "{size} usados" + +#: crates/pdfs-gui/src/app/pages/status.rs:880 +#, rust-format +msgid "{used} of {total} used ({percent}%)" +msgstr "{used} de {total} usados ({percent}%)" + +#. Translators: {size} is an amount of storage, such as "1.2 GiB". +#: crates/pdfs-gui/src/app/pages/status.rs:904 +#, rust-format +msgid "{size} free" +msgstr "{size} livres" + +#: crates/pdfs-gui/src/app/pages/status.rs:908 +#, rust-format +msgid "{free} free out of {total} ({percent}% used)" +msgstr "{free} livres de {total} ({percent}% usados)" + +#: crates/pdfs-gui/src/app/pages/status.rs:946 +msgid "Proton Drive connected" +msgstr "Proton Drive conectado" + +#: crates/pdfs-gui/src/app/pages/status.rs:947 +msgid "Your Drive is mounted and available." +msgstr "Seu Drive está montado e disponível." + +#: crates/pdfs-gui/src/app/pages/status.rs:952 +msgid "Proton Drive disconnected" +msgstr "Proton Drive desconectado" + +#: crates/pdfs-gui/src/app/pages/status.rs:953 +msgid "The mount service stopped. Files aren't available until it restarts." +msgstr "" +"O serviço de montagem parou. Os arquivos não estarão disponíveis até que ele " +"reinicie." + +#: crates/pdfs-gui/src/app/pages/status.rs:1005 +msgid "Sync complete" +msgstr "Sincronização concluída" + +#: crates/pdfs-gui/src/app/pages/status.rs:1007 +#, rust-format +msgid "{n} file finished transferring." +msgid_plural "{n} files finished transferring." +msgstr[0] "{n} arquivo terminou de ser transferido." +msgstr[1] "{n} arquivos terminaram de ser transferidos." + +#. Translators: a background job's progress. {title} is the job, such as +#. "Scanning Photos"; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1080 +#, rust-format +msgid "{title} — {done} of {total}" +msgstr "{title} — {done} de {total}" + +#. Translators: a background job's progress. {title} is the job, {detail} +#. what it is working on; {done} and {total} are counts. +#: crates/pdfs-gui/src/app/pages/status.rs:1083 +#, rust-format +msgid "{title} — {detail} ({done} of {total})" +msgstr "{title} — {detail} ({done} de {total})" + +#. Translators: a background job still running. {title} is the job. +#: crates/pdfs-gui/src/app/pages/status.rs:1085 +#, rust-format +msgid "{title}…" +msgstr "{title}…" + +#. Translators: a background job still running. {title} is the job, +#. {detail} what it is working on. +#: crates/pdfs-gui/src/app/pages/status.rs:1088 +#, rust-format +msgid "{title} — {detail}…" +msgstr "{title} — {detail}…" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} the size moved so far and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1117 +#, rust-format +msgid "{arrow} {name} — {done} ({speed}/s)" +msgstr "{arrow} {name} — {done} ({speed}/s)" + +#. Translators: a file being transferred. {arrow} is ↑ or ↓, {name} the +#. file name, {done} and {total} sizes and {speed} a size such as +#. "1.2 MiB"; "/s" means per second. +#: crates/pdfs-gui/src/app/pages/status.rs:1125 +#, rust-format +msgid "{arrow} {name} — {done} of {total} ({speed}/s)" +msgstr "{arrow} {name} — {done} de {total} ({speed}/s)" + +#: crates/pdfs-gui/src/app/pages/status.rs:1259 +#, rust-format +msgid "{queued} · resumes {time}" +msgstr "{queued} · retoma {time}" + +#. Translators: {time} is when syncing resumes, such as "at 14:30" +#. or "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1264 +#, rust-format +msgid "Resumes {time}" +msgstr "Retoma {time}" + +#: crates/pdfs-gui/src/app/pages/status.rs:1266 +msgid "Until you resume" +msgstr "Até você retomar" + +#: crates/pdfs-gui/src/app/pages/status.rs:1273 crates/pdfs-gui/src/main.rs:168 +#, rust-format +msgid "{n} change needs attention" +msgid_plural "{n} changes need attention" +msgstr[0] "{n} alteração requer atenção" +msgstr[1] "{n} alterações requerem atenção" + +#: crates/pdfs-gui/src/app/pages/status.rs:1283 +#: crates/pdfs-gui/src/app/widgets/details.rs:108 +msgctxt "state" +msgid "Offline" +msgstr "Offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1284 +msgid "Cached files only" +msgstr "Somente arquivos em cache" + +#: crates/pdfs-gui/src/app/pages/status.rs:1289 +msgctxt "state" +msgid "Syncing" +msgstr "Sincronizando" + +#: crates/pdfs-gui/src/app/pages/status.rs:1295 +msgid "Up to date" +msgstr "Atualizado" + +#: crates/pdfs-gui/src/app/pages/status.rs:1302 +msgid "Proton Drive isn't running" +msgstr "O Proton Drive não está em execução" + +#. Translators: stands in for a time that could not be read, as in +#. "Resumes later". +#: crates/pdfs-gui/src/app/pages/status.rs:1338 +#: crates/pdfs-gui/src/app/pages/status.rs:1353 +msgid "later" +msgstr "mais tarde" + +#. Translators: strftime format for a time later today, such as "at 14:30". +#: crates/pdfs-gui/src/app/pages/status.rs:1342 +msgid "at %H:%M" +msgstr "às %H:%M" + +#. Translators: strftime format for a time within the next week, such as +#. "Tue 09:00". +#: crates/pdfs-gui/src/app/pages/status.rs:1346 +msgid "%a %H:%M" +msgstr "%a às %H:%M" + +#. Translators: strftime format for a date further ahead, such as "23 Sep". +#: crates/pdfs-gui/src/app/pages/status.rs:1349 +msgid "%e %b" +msgstr "em %-d de %b" + +#: crates/pdfs-gui/src/app/pages/status.rs:1379 +msgid "No files kept offline" +msgstr "Nenhum arquivo mantido offline" + +#: crates/pdfs-gui/src/app/pages/status.rs:1381 +msgid "Right-click a file and choose “Make available offline”." +msgstr "" +"Clique com o botão direito em um arquivo e escolha “Disponibilizar offline”." + +#: crates/pdfs-gui/src/app/pages/status.rs:1432 +#: crates/pdfs-gui/src/app/pages/status.rs:1439 +msgid "Couldn't make it online only" +msgstr "Não foi possível torná-lo somente online" + +#: crates/pdfs-gui/src/app/pages/status.rs:1457 +msgid "Show fewer" +msgstr "Mostrar menos" + +#: crates/pdfs-gui/src/app/pages/status.rs:1460 +#, rust-format +msgid "Show all {n} file" +msgid_plural "Show all {n} files" +msgstr[0] "Mostrar {n} arquivo" +msgstr[1] "Mostrar todos os {n} arquivos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:75 +msgid "" +"Photos already in Proton Photos are matched by name and content and skipped, " +"so re-running an interrupted import is safe." +msgstr "" +"Fotos que já estão no Proton Photos são identificadas por nome e conteúdo e " +"ignoradas, então repetir uma importação interrompida é seguro." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:136 +msgid "Back to Photos" +msgstr "Voltar às fotos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:143 +msgid "Add a Google Takeout export to your Proton Photos timeline." +msgstr "" +"Adicione uma exportação do Google Takeout à sua linha do tempo do Proton " +"Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:160 +msgid "Drop your Takeout .zip files here" +msgstr "Solte aqui seus arquivos .zip do Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:164 +msgid "" +"Add every part of the export at once — a photo and its metadata often sit in " +"different parts." +msgstr "" +"Adicione todas as partes da exportação de uma vez — uma foto e seus " +"metadados muitas vezes ficam em partes diferentes." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:171 +msgid "Choose files…" +msgstr "Escolher arquivos…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:189 +msgid "Archives to import" +msgstr "Arquivos compactados a importar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:194 +msgid "Clear" +msgstr "Limpar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:195 +msgid "Remove every staged archive" +msgstr "Remover todos os arquivos compactados adicionados" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:203 +msgctxt "verb" +msgid "Scan" +msgstr "Examinar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:205 +msgid "Check the archives and report what would be imported, without uploading" +msgstr "" +"Verificar os arquivos compactados e informar o que seria importado, sem " +"enviar nada" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:210 +#: crates/pdfs-gui/src/app/pages/takeout.rs:396 +msgctxt "verb" +msgid "Import" +msgstr "Importar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:215 +msgid "Stop import" +msgstr "Parar importação" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:217 +msgid "Finish the photo on the wire, file what was uploaded, then stop" +msgstr "" +"Concluir a foto em transferência, organizar nos álbuns o que foi enviado e " +"então parar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:238 +msgid "Import in progress" +msgstr "Importação em andamento" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:260 +#: crates/pdfs-gui/src/app/pages/takeout.rs:700 +msgid "Last import" +msgstr "Última importação" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:344 +msgid "Select your Google Takeout archives" +msgstr "Selecione seus arquivos compactados do Google Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:347 +msgid "Takeout archives" +msgstr "Arquivos compactados do Takeout" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:387 +msgid "Import this export?" +msgstr "Importar esta exportação?" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:389 +#, rust-format +msgid "" +"{n} archive will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgid_plural "" +"{n} archives will be uploaded to Proton Photos, creating albums as they " +"appear in the export. This can take hours; you can stop it at any point and " +"what has been uploaded stays. Photos you already have are skipped." +msgstr[0] "" +"{n} arquivo compactado será enviado ao Proton Photos, criando os álbuns " +"conforme aparecem na exportação. Isso pode levar horas; você pode parar a " +"qualquer momento e o que já foi enviado permanece. Fotos que você já tem são " +"ignoradas." +msgstr[1] "" +"{n} arquivos compactados serão enviados ao Proton Photos, criando os álbuns " +"conforme aparecem na exportação. Isso pode levar horas; você pode parar a " +"qualquer momento e o que já foi enviado permanece. Fotos que você já tem são " +"ignoradas." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:417 +msgid "Stopping the import…" +msgstr "Parando a importação…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:419 +#: crates/pdfs-gui/src/app/pages/takeout.rs:423 +msgid "Couldn't stop the import" +msgstr "Não foi possível parar a importação" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:475 +msgid "" +"Only Takeout .zip files can be imported — extracted folders aren't supported." +msgstr "" +"Somente arquivos .zip do Takeout podem ser importados — pastas extraídas não " +"são suportadas." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:481 +#, rust-format +msgid "Added {n} archive" +msgid_plural "Added {n} archives" +msgstr[0] "{n} arquivo compactado adicionado" +msgstr[1] "{n} arquivos compactados adicionados" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:498 +msgid "No archives added yet." +msgstr "Nenhum arquivo compactado adicionado ainda." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:516 +msgid "Remove from this import" +msgstr "Remover desta importação" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:538 +#, rust-format +msgid "{n} archive, {size} in total. {note}" +msgid_plural "{n} archives, {size} in total. {note}" +msgstr[0] "{n} arquivo compactado, {size} no total. {note}" +msgstr[1] "{n} arquivos compactados, {size} no total. {note}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:596 +msgid "Reading archives…" +msgstr "Lendo os arquivos compactados…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:598 +msgid "Starting import…" +msgstr "Iniciando a importação…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:604 +msgid "Scanning the export…" +msgstr "Examinando a exportação…" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:606 +msgid "Import started — you can leave this page, it keeps running." +msgstr "" +"Importação iniciada — você pode sair desta página, ela continua em execução." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:611 +#: crates/pdfs-gui/src/app/pages/takeout.rs:615 +msgid "Couldn't start the import" +msgstr "Não foi possível iniciar a importação" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:649 +msgid "Scan finished" +msgstr "Exame concluído" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:651 +msgid "Import finished" +msgstr "Importação concluída" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:658 +#, rust-format +msgid "{n} photo added, {failed} failed." +msgid_plural "{n} photos added, {failed} failed." +msgstr[0] "{n} foto adicionada, {failed} com falha." +msgstr[1] "{n} fotos adicionadas, {failed} com falha." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:664 +#, rust-format +msgid "Stopped after {n} photo." +msgid_plural "Stopped after {n} photos." +msgstr[0] "Parado após {n} foto." +msgstr[1] "Parado após {n} fotos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:670 +#, rust-format +msgid "{n} photo added to Proton Photos." +msgid_plural "{n} photos added to Proton Photos." +msgstr[0] "{n} foto adicionada ao Proton Photos." +msgstr[1] "{n} fotos adicionadas ao Proton Photos." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:675 +msgid "The Google Photos import has finished." +msgstr "A importação do Google Photos foi concluída." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:698 +msgid "Scan result" +msgstr "Resultado do exame" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:703 +msgid "Nothing was uploaded — this is what an import would do." +msgstr "Nada foi enviado — isto é o que uma importação faria." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:705 +msgid "" +"Stopped early. Everything uploaded so far is in your timeline; run it again " +"to continue where it left off." +msgstr "" +"Parado antes do fim. Tudo o que foi enviado até agora está na sua linha do " +"tempo; execute novamente para continuar de onde parou." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:707 +msgid "Finished." +msgstr "Concluído." + +#: crates/pdfs-gui/src/app/pages/takeout.rs:713 +msgid "Photos in the export" +msgstr "Fotos na exportação" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:716 +msgid "Would upload" +msgstr "Seriam enviadas" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:718 +msgid "Uploaded" +msgstr "Enviadas" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:725 +msgid "Already in Proton Photos" +msgstr "Já no Proton Photos" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:732 +msgid "Albums to create" +msgstr "Álbuns a criar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:734 +msgid "Albums created" +msgstr "Álbuns criados" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:741 +msgid "Photos filed into albums" +msgstr "Fotos organizadas em álbuns" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:747 +msgid "Skipped (in Google's trash)" +msgstr "Ignoradas (na lixeira do Google)" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:754 +msgid "Data to upload" +msgstr "Dados a enviar" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:756 +msgid "Data uploaded" +msgstr "Dados enviados" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:762 +msgctxt "state" +msgid "Failed" +msgstr "Com falha" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:795 +#, rust-format +msgid "{done} of {total} — {detail}" +msgstr "{done} de {total} — {detail}" + +#: crates/pdfs-gui/src/app/pages/takeout.rs:804 +msgid "Working…" +msgstr "Trabalhando…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:50 +msgid "Empty Trash…" +msgstr "Esvaziar lixeira…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:51 +msgid "Permanently delete everything in the Trash" +msgstr "Excluir permanentemente tudo o que está na lixeira" + +#: crates/pdfs-gui/src/app/pages/trash.rs:93 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:277 +msgctxt "verb" +msgid "Restore" +msgstr "Restaurar" + +#: crates/pdfs-gui/src/app/pages/trash.rs:94 +msgid "Delete Permanently…" +msgstr "Excluir permanentemente…" + +#: crates/pdfs-gui/src/app/pages/trash.rs:157 +msgid "Restore to its original folder" +msgstr "Restaurar para a pasta original" + +#: crates/pdfs-gui/src/app/pages/trash.rs:163 +msgid "Delete permanently" +msgstr "Excluir permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:214 +#: crates/pdfs-gui/src/app/widgets/details.rs:365 +msgid "Folder" +msgstr "Pasta" + +#: crates/pdfs-gui/src/app/pages/trash.rs:221 +#, rust-format +msgid "{kind} · {modified}" +msgstr "{kind} · {modified}" + +#: crates/pdfs-gui/src/app/pages/trash.rs:269 +#, rust-format +msgid "{n} item selected" +msgid_plural "{n} items selected" +msgstr[0] "{n} item selecionado" +msgstr[1] "{n} itens selecionados" + +#: crates/pdfs-gui/src/app/pages/trash.rs:297 +msgid "Reading the trash." +msgstr "Lendo a lixeira." + +#: crates/pdfs-gui/src/app/pages/trash.rs:312 +#: crates/pdfs-gui/src/app/pages/trash.rs:319 +msgid "Couldn't read the trash" +msgstr "Não foi possível ler a lixeira" + +#: crates/pdfs-gui/src/app/pages/trash.rs:376 +msgid "Trash is empty" +msgstr "A lixeira está vazia" + +#: crates/pdfs-gui/src/app/pages/trash.rs:377 +msgid "Items you delete from Proton Drive show up here." +msgstr "Os itens que você exclui do Proton Drive aparecem aqui." + +#: crates/pdfs-gui/src/app/pages/trash.rs:384 +#, rust-format +msgid "{n} item" +msgid_plural "{n} items" +msgstr[0] "{n} item" +msgstr[1] "{n} itens" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:411 +#, rust-format +msgid "Restored “{name}”" +msgstr "“{name}” restaurado" + +#: crates/pdfs-gui/src/app/pages/trash.rs:413 +#, rust-format +msgid "Restored {n} item" +msgid_plural "Restored {n} items" +msgstr[0] "{n} item restaurado" +msgstr[1] "{n} itens restaurados" + +#: crates/pdfs-gui/src/app/pages/trash.rs:419 +msgid "Couldn't restore" +msgstr "Não foi possível restaurar" + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:433 +#, rust-format +msgid "Permanently delete “{name}”? This cannot be undone." +msgstr "Excluir permanentemente “{name}”? Isso não pode ser desfeito." + +#. Translators: {name} is a file or folder name. +#: crates/pdfs-gui/src/app/pages/trash.rs:435 +#, rust-format +msgid "Deleted “{name}” permanently" +msgstr "“{name}” excluído permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:440 +#, rust-format +msgid "Permanently delete {n} item? This cannot be undone." +msgid_plural "Permanently delete {n} items? This cannot be undone." +msgstr[0] "Excluir permanentemente {n} item? Isso não pode ser desfeito." +msgstr[1] "Excluir permanentemente {n} itens? Isso não pode ser desfeito." + +#: crates/pdfs-gui/src/app/pages/trash.rs:446 +#, rust-format +msgid "Deleted {n} item permanently" +msgid_plural "Deleted {n} items permanently" +msgstr[0] "{n} item excluído permanentemente" +msgstr[1] "{n} itens excluídos permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:454 +#: crates/pdfs-gui/src/app/pages/trash.rs:458 +msgid "Delete Permanently" +msgstr "Excluir permanentemente" + +#: crates/pdfs-gui/src/app/pages/trash.rs:470 +msgid "Couldn't delete" +msgstr "Não foi possível excluir" + +#: crates/pdfs-gui/src/app/pages/trash.rs:482 +#: crates/pdfs-gui/src/app/pages/trash.rs:491 +msgid "Empty Trash" +msgstr "Esvaziar lixeira" + +#: crates/pdfs-gui/src/app/pages/trash.rs:484 +#, rust-format +msgid "Permanently delete all {n} item in the trash? This cannot be undone." +msgid_plural "" +"Permanently delete all {n} items in the trash? This cannot be undone." +msgstr[0] "" +"Excluir permanentemente {n} item da lixeira? Isso não pode ser desfeito." +msgstr[1] "" +"Excluir permanentemente todos os {n} itens da lixeira? Isso não pode ser " +"desfeito." + +#: crates/pdfs-gui/src/app/pages/trash.rs:502 +msgid "Trash emptied" +msgstr "Lixeira esvaziada" + +#: crates/pdfs-gui/src/app/pages/trash.rs:503 +msgid "Couldn't empty the trash" +msgstr "Não foi possível esvaziar a lixeira" + +#: crates/pdfs-gui/src/app/pages/verify.rs:57 +msgid "Verification" +msgstr "Verificação" + +#: crates/pdfs-gui/src/app/widgets/details.rs:53 +msgid "Details (Alt+Enter)" +msgstr "Detalhes (Alt+Enter)" + +#: crates/pdfs-gui/src/app/widgets/details.rs:58 +#: crates/pdfs-gui/src/app/widgets/details.rs:195 +msgid "Close details" +msgstr "Fechar detalhes" + +#: crates/pdfs-gui/src/app/widgets/details.rs:85 +msgid "Info" +msgstr "Informações" + +#: crates/pdfs-gui/src/app/widgets/details.rs:113 +msgid "Keep a copy on this computer, even without a connection." +msgstr "Manter uma cópia neste computador, mesmo sem conexão." + +#: crates/pdfs-gui/src/app/widgets/details.rs:119 +msgid "Sharing" +msgstr "Compartilhamento" + +#: crates/pdfs-gui/src/app/widgets/details.rs:122 +msgid "Access" +msgstr "Acesso" + +#: crates/pdfs-gui/src/app/widgets/details.rs:140 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:112 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:139 +msgid "Versions" +msgstr "Versões" + +#: crates/pdfs-gui/src/app/widgets/details.rs:143 +msgid "History" +msgstr "Histórico" + +#: crates/pdfs-gui/src/app/widgets/details.rs:206 +msgid "No item selected" +msgstr "Nenhum item selecionado" + +#: crates/pdfs-gui/src/app/widgets/details.rs:207 +msgid "Select a file or folder to see its details." +msgstr "Selecione um arquivo ou pasta para ver seus detalhes." + +#: crates/pdfs-gui/src/app/widgets/details.rs:367 +msgid "File" +msgstr "Arquivo" + +#: crates/pdfs-gui/src/app/widgets/details.rs:383 +msgid "Proton Drive" +msgstr "Proton Drive" + +#: crates/pdfs-gui/src/app/widgets/details.rs:393 +msgid "Open folder" +msgstr "Abrir pasta" + +#: crates/pdfs-gui/src/app/widgets/details.rs:437 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:425 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:429 +msgid "Couldn't load sharing" +msgstr "Não foi possível carregar o compartilhamento" + +#: crates/pdfs-gui/src/app/widgets/details.rs:459 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:165 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:169 +msgid "Couldn't load versions" +msgstr "Não foi possível carregar as versões" + +#: crates/pdfs-gui/src/app/widgets/details.rs:479 +msgid "Only you" +msgstr "Somente você" + +#: crates/pdfs-gui/src/app/widgets/details.rs:480 +msgid "Anyone with the link" +msgstr "Qualquer pessoa com o link" + +#: crates/pdfs-gui/src/app/widgets/details.rs:481 +#, rust-format +msgid "Shared with {n} person" +msgid_plural "Shared with {n} people" +msgstr[0] "Compartilhado com {n} pessoa" +msgstr[1] "Compartilhado com {n} pessoas" + +#: crates/pdfs-gui/src/app/widgets/details.rs:483 +#, rust-format +msgid "Shared with {n} person · Public link" +msgid_plural "Shared with {n} people · Public link" +msgstr[0] "Compartilhado com {n} pessoa · Link público" +msgstr[1] "Compartilhado com {n} pessoas · Link público" + +#: crates/pdfs-gui/src/app/widgets/details.rs:495 +msgid "No earlier versions" +msgstr "Nenhuma versão anterior" + +#. Translators: {date} is the date of the only version. +#: crates/pdfs-gui/src/app/widgets/details.rs:497 +#, rust-format +msgid "1 version · {date}" +msgstr "1 versão · {date}" + +#: crates/pdfs-gui/src/app/widgets/details.rs:500 +#, rust-format +msgid "{n} version · latest {date}" +msgid_plural "{n} versions · latest {date}" +msgstr[0] "{n} versão · mais recente em {date}" +msgstr[1] "{n} versões · mais recente em {date}" + +#. Translators: tooltip of a button that opens a menu of further actions. +#: crates/pdfs-gui/src/app/widgets/menu.rs:124 +msgid "More" +msgstr "Mais" + +#. Translators: a public link that never expires. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:40 +msgid "Never" +msgstr "Nunca" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:41 +msgid "1 day" +msgstr "1 dia" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:42 +msgid "7 days" +msgstr "7 dias" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:43 +msgid "30 days" +msgstr "30 dias" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:253 +msgid "Can't share" +msgstr "Não é possível compartilhar" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:269 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:335 +msgctxt "verb" +msgid "Share" +msgstr "Compartilhar" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:276 +msgid "Invite people" +msgstr "Convidar pessoas" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:278 +msgid "Proton and non-Proton email addresses, separated by spaces or commas." +msgstr "" +"Endereços de e-mail Proton e não Proton, separados por espaços ou vírgulas." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:282 +msgid "Email addresses" +msgstr "Endereços de e-mail" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:290 +msgid "Role" +msgstr "Função" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:293 +msgid "Message (optional)" +msgstr "Mensagem (opcional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:296 +msgid "Send Invitations" +msgstr "Enviar convites" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:312 +msgid "People with access" +msgstr "Pessoas com acesso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:361 +#, rust-format +msgid "“{text}” isn't an email address" +msgstr "“{text}” não é um endereço de e-mail" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:400 +msgid "Invitations sent" +msgstr "Convites enviados" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:401 +msgid "Couldn't send invitations" +msgstr "Não foi possível enviar os convites" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:443 +msgid "No one else has access yet." +msgstr "Ninguém mais tem acesso ainda." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:451 +msgid "Member" +msgstr "Membro" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:452 +msgid "Invited (pending)" +msgstr "Convidado (pendente)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:453 +msgid "Invited (external, pending)" +msgstr "Convidado (externo, pendente)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:483 +msgid "Role updated" +msgstr "Função atualizada" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:484 +msgid "Couldn't update the role" +msgstr "Não foi possível atualizar a função" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:501 +msgid "Remove access" +msgstr "Remover acesso" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:515 +msgid "Remove Access?" +msgstr "Remover acesso?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:518 +#, rust-format +msgid "{email} will no longer be able to open this item." +msgstr "{email} não poderá mais abrir este item." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:526 +msgid "Access removed" +msgstr "Acesso removido" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:527 +msgid "Couldn't remove access" +msgstr "Não foi possível remover o acesso" + +#. Translators: {role} is the link's role, such as "Viewer". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:555 +#, rust-format +msgid "Anyone with the link ({role})" +msgstr "Qualquer pessoa com o link ({role})" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:558 +msgid "password-protected" +msgstr "protegido por senha" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:592 +msgid "Remove link" +msgstr "Remover link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:604 +msgid "Remove Public Link?" +msgstr "Remover link público?" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:605 +msgid "" +"The link stops working for everyone who has it. A new link will have a " +"different address." +msgstr "" +"O link deixa de funcionar para todos que o têm. Um novo link terá um " +"endereço diferente." + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:606 +msgid "Remove Link" +msgstr "Remover link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:611 +msgid "Public link removed" +msgstr "Link público removido" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:612 +msgid "Couldn't remove the link" +msgstr "Não foi possível remover o link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:632 +msgid "Link role" +msgstr "Função do link" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:636 +msgid "Password (optional)" +msgstr "Senha (opcional)" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:645 +msgid "Expires" +msgstr "Expira" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:648 +msgid "Create Public Link" +msgstr "Criar link público" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:712 +msgid "Public link created" +msgstr "Link público criado" + +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:716 +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:720 +msgid "Couldn't create the link" +msgstr "Não foi possível criar o link" + +#. Translators: a public link past its expiry date. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:772 +msgid "expired" +msgstr "expirado" + +#. Translators: strftime format for a link's expiry date; "%x" is the locale's date, such as "09/23/26". +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:775 +msgid "%x" +msgstr "%x" + +#. Translators: {date} is the date a public link stops working. +#: crates/pdfs-gui/src/app/widgets/share_dialog.rs:782 +#, rust-format +msgid "expires {date}" +msgstr "expira em {date}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:90 +msgid "Can't load versions" +msgstr "Não é possível carregar as versões" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:98 +msgid "No versions" +msgstr "Nenhuma versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:99 +msgid "Folders don't have versions." +msgstr "Pastas não têm versões." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:118 +msgid "Version history" +msgstr "Histórico de versões" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:120 +msgid "Proton Drive keeps earlier versions of a file until you delete them." +msgstr "" +"O Proton Drive mantém as versões anteriores de um arquivo até você excluí-" +"las." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:183 +msgid "No earlier versions." +msgstr "Nenhuma versão anterior." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:202 +msgid "Current version" +msgstr "Versão atual" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:205 +#, rust-format +msgid "{time} · {size}" +msgstr "{time} · {size}" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:226 +msgid "Save a copy…" +msgstr "Salvar uma cópia…" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:238 +msgid "Restore this version" +msgstr "Restaurar esta versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:249 +msgid "Delete this version permanently" +msgstr "Excluir esta versão permanentemente" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:269 +msgid "Restore version" +msgstr "Restaurar versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:272 +#, rust-format +msgid "" +"Make this version the current content of “{name}”? The version it replaces " +"stays in the history." +msgstr "" +"Tornar esta versão o conteúdo atual de “{name}”? A versão substituída " +"permanece no histórico." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:294 +msgid "Restoring that version" +msgstr "Restaurando essa versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:295 +msgid "Couldn't restore that version" +msgstr "Não foi possível restaurar essa versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:304 +msgid "Delete version" +msgstr "Excluir versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:306 +msgid "Delete this version permanently? Its content can't be recovered." +msgstr "" +"Excluir esta versão permanentemente? Seu conteúdo não poderá ser recuperado." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:310 +msgctxt "verb" +msgid "Delete" +msgstr "Excluir" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:325 +msgid "Version deleted" +msgstr "Versão excluída" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:326 +msgid "Couldn't delete that version" +msgstr "Não foi possível excluir essa versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:340 +msgid "Save version" +msgstr "Salvar versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:350 +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:359 +msgid "Couldn't save that version" +msgstr "Não foi possível salvar essa versão" + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:351 +msgid "That location isn't a local file." +msgstr "Esse local não é um arquivo local." + +#: crates/pdfs-gui/src/app/widgets/versions_dialog.rs:358 +msgid "Version saved" +msgstr "Versão salva" + +#. Translators: the launcher prompt while refining a search; {query} is the text searched for. Keep the trailing space. +#: crates/pdfs-gui/src/dmenu.rs:94 +#, rust-format +msgid "Drive: {query} › " +msgstr "Drive: {query} › " + +#. Translators: the launcher prompt; keep the trailing space, the input follows it directly. +#: crates/pdfs-gui/src/dmenu.rs:96 crates/pdfs-gui/src/fzf.rs:42 +msgid "Search Drive › " +msgstr "Pesquisar no Drive › " + +#. Translators: the only row of an empty launcher list; {query} is the text searched for. Keep the parentheses. +#: crates/pdfs-gui/src/dmenu.rs:113 +#, rust-format +msgid "(no matches for “{query}”)" +msgstr "(nenhuma correspondência para “{query}”)" + +#. Translators: the only row of an empty launcher list. Keep the parentheses, and avoid words that look like a file name. +#: crates/pdfs-gui/src/dmenu.rs:115 +msgid "(no pinned files — type to search)" +msgstr "(nenhum arquivo fixado — digite para pesquisar)" + +#. Translators: shown as a row in the search list. Keep the parentheses. +#: crates/pdfs-gui/src/fzf.rs:171 +msgid "(cannot resolve app dirs)" +msgstr "(não foi possível resolver os diretórios do aplicativo)" + +#: crates/pdfs-gui/src/i18n.rs:140 +#, rust-format +msgid "{n} upload queued" +msgid_plural "{n} uploads queued" +msgstr[0] "{n} envio na fila" +msgstr[1] "{n} envios na fila" + +#: crates/pdfs-gui/src/i18n.rs:146 +#, rust-format +msgid "{n} change queued" +msgid_plural "{n} changes queued" +msgstr[0] "{n} alteração na fila" +msgstr[1] "{n} alterações na fila" + +#: crates/pdfs-gui/src/i18n.rs:152 +#, rust-format +msgid "{n} upload" +msgid_plural "{n} uploads" +msgstr[0] "{n} envio" +msgstr[1] "{n} envios" + +#: crates/pdfs-gui/src/i18n.rs:153 +#, rust-format +msgid "{n} change" +msgid_plural "{n} changes" +msgstr[0] "{n} alteração" +msgstr[1] "{n} alterações" + +#: crates/pdfs-gui/src/i18n.rs:156 +#, rust-format +msgid "{uploads}, {changes} queued" +msgstr "{uploads}, {changes} na fila" + +#: crates/pdfs-gui/src/i18n.rs:201 +#, rust-format +msgid "{n} file in {dir}" +msgid_plural "{n} files in {dir}" +msgstr[0] "{n} arquivo em {dir}" +msgstr[1] "{n} arquivos em {dir}" + +#: crates/pdfs-gui/src/main.rs:97 +#, rust-format +msgid "{title} ({done} of {total})" +msgstr "{title} ({done} de {total})" + +#. Translators: {n} files are downloading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:124 +#, rust-format +msgid "↓ {n} downloading" +msgid_plural "↓ {n} downloading" +msgstr[0] "↓ {n} baixando" +msgstr[1] "↓ {n} baixando" + +#. Translators: {n} files are uploading; keep the arrow. +#: crates/pdfs-gui/src/main.rs:126 +#, rust-format +msgid "↑ {n} uploading" +msgid_plural "↑ {n} uploading" +msgstr[0] "↑ {n} enviando" +msgstr[1] "↑ {n} enviando" + +#: crates/pdfs-gui/src/main.rs:175 +#, rust-format +msgid "Mounted at {mountpoint} ({n} pinned)" +msgid_plural "Mounted at {mountpoint} ({n} pinned)" +msgstr[0] "Montado em {mountpoint} ({n} fixado)" +msgstr[1] "Montado em {mountpoint} ({n} fixados)" + +#: crates/pdfs-gui/src/main.rs:182 +#, rust-format +msgid "Syncing — {queued} ({n} pinned)" +msgid_plural "Syncing — {queued} ({n} pinned)" +msgstr[0] "Sincronizando — {queued} ({n} fixado)" +msgstr[1] "Sincronizando — {queued} ({n} fixados)" + +#: crates/pdfs-gui/src/main.rs:189 +#, rust-format +msgid "Offline — cached files only ({n} pinned)" +msgid_plural "Offline — cached files only ({n} pinned)" +msgstr[0] "Offline — somente arquivos em cache ({n} fixado)" +msgstr[1] "Offline — somente arquivos em cache ({n} fixados)" + +#. Translators: {queued} is a queue summary such as "3 uploads queued". +#: crates/pdfs-gui/src/main.rs:195 +#, rust-format +msgid "Offline — {queued}" +msgstr "Offline — {queued}" + +#: crates/pdfs-gui/src/main.rs:207 +msgid "Mount: unexpected daemon response" +msgstr "Montagem: resposta inesperada do daemon" + +#: crates/pdfs-gui/src/main.rs:221 +#, rust-format +msgid "Logged in as {username} — not mounted" +msgstr "Conectado como {username} — não montado" + +#: crates/pdfs-gui/src/main.rs:226 +msgid "Not signed in" +msgstr "Não conectado" + +#. Translators: {error} is an error message, in English. +#: crates/pdfs-gui/src/main.rs:229 +#, rust-format +msgid "Error: {error}" +msgstr "Erro: {error}" + +#. Translators: a menu item that opens the list of failing changes. +#: crates/pdfs-gui/src/main.rs:265 +#, rust-format +msgid "{n} issue — View" +msgid_plural "{n} issues — View" +msgstr[0] "{n} problema — Ver" +msgstr[1] "{n} problemas — Ver" + +#: crates/pdfs-gui/src/main.rs:371 +msgid "Sign In…" +msgstr "Entrar…" + +#: crates/pdfs-gui/src/main.rs:372 +msgid "Open Proton Drive" +msgstr "Abrir o Proton Drive" + +#: crates/pdfs-gui/src/main.rs:378 +msgid "Open Folder" +msgstr "Abrir pasta" + +#: crates/pdfs-gui/src/main.rs:390 +msgid "Resume Sync" +msgstr "Retomar sincronização" + +#: crates/pdfs-gui/src/main.rs:392 +msgid "Pause Sync" +msgstr "Pausar sincronização" + +#: crates/pdfs-gui/src/main.rs:411 +msgid "Connect" +msgstr "Conectar" + +#: crates/pdfs-gui/src/main.rs:418 +msgid "Hide Tray Icon" +msgstr "Ocultar ícone da bandeja" + +#: crates/pdfs-gui/src/main.rs:422 +msgid "Stop Proton Drive…" +msgstr "Parar o Proton Drive…" + +#: crates/pdfs-gui/src/main.rs:426 +msgid "Quit" +msgstr "Sair" + +#. Translators: a filter chip that shows every kind of result. +#: crates/pdfs-gui/src/prompt.rs:57 +msgid "All" +msgstr "Tudo" + +#: crates/pdfs-gui/src/prompt.rs:58 +msgid "Folders" +msgstr "Pastas" + +#: crates/pdfs-gui/src/prompt.rs:59 +msgid "Documents" +msgstr "Documentos" + +#. Translators: a filter chip for audio and video files. +#: crates/pdfs-gui/src/prompt.rs:62 +msgid "Media" +msgstr "Mídia" + +#: crates/pdfs-gui/src/prompt.rs:173 +#, rust-format +msgid "My files / {path}" +msgstr "Meus arquivos / {path}" + +#: crates/pdfs-gui/src/prompt.rs:518 +msgid "Search Proton Drive" +msgstr "Pesquisar no Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:539 +msgid "Search in Drive and on this computer" +msgstr "Pesquisar no Drive e neste computador" + +#. Translators: the Escape key, shown as a hint that it closes the window. +#: crates/pdfs-gui/src/prompt.rs:550 +msgid "Esc" +msgstr "Esc" + +#: crates/pdfs-gui/src/prompt.rs:564 crates/pdfs-gui/src/prompt.rs:1087 +msgid "Best matches" +msgstr "Melhores correspondências" + +#: crates/pdfs-gui/src/prompt.rs:580 crates/pdfs-gui/src/prompt.rs:1111 +msgid "No results" +msgstr "Nenhum resultado" + +#: crates/pdfs-gui/src/prompt.rs:588 +msgid "Proton Drive is not running" +msgstr "O Proton Drive não está em execução" + +#: crates/pdfs-gui/src/prompt.rs:589 +msgid "Start the mount daemon to search your Drive." +msgstr "Inicie o daemon de montagem para pesquisar no seu Drive." + +#. Translators: keyboard hints in the footer; keep the arrow and Enter symbols. +#: crates/pdfs-gui/src/prompt.rs:622 +msgid "↑↓ navigate · ↵ open · Tab filter" +msgstr "↑↓ navegar · ↵ abrir · Tab filtrar" + +#: crates/pdfs-gui/src/prompt.rs:879 crates/pdfs-gui/src/prompt.rs:893 +msgid "Daemon offline" +msgstr "Daemon offline" + +#: crates/pdfs-gui/src/prompt.rs:1098 +msgid "Pinned in Proton Drive" +msgstr "Fixado no Proton Drive" + +#: crates/pdfs-gui/src/prompt.rs:1113 +msgid "Search your Drive" +msgstr "Pesquisar no seu Drive" + +#: crates/pdfs-gui/src/prompt.rs:1118 +msgid "Still indexing this computer — local results will fill in shortly." +msgstr "" +"Ainda indexando este computador — os resultados locais aparecerão em breve." + +#: crates/pdfs-gui/src/prompt.rs:1120 +msgid "Try a different search, or another filter." +msgstr "Tente uma pesquisa diferente ou outro filtro." + +#: crates/pdfs-gui/src/prompt.rs:1122 +msgid "Start typing to search Proton Drive and the files on this computer." +msgstr "" +"Comece a digitar para pesquisar no Proton Drive e nos arquivos deste " +"computador." + +#: crates/pdfs-gui/src/prompt.rs:1148 +msgid "No pinned files" +msgstr "Nenhum arquivo fixado" + +#: crates/pdfs-gui/src/prompt.rs:1149 +#, rust-format +msgid "{n} pinned file" +msgid_plural "{n} pinned files" +msgstr[0] "{n} arquivo fixado" +msgstr[1] "{n} arquivos fixados" + +#: crates/pdfs-gui/src/prompt.rs:1158 +#, rust-format +msgid "{drive} in Drive · {local} on this computer · indexing…" +msgstr "{drive} no Drive · {local} neste computador · indexando…" + +#. Translators: result counts in the footer; {drive} and {local} are numbers. +#: crates/pdfs-gui/src/prompt.rs:1163 +#, rust-format +msgid "{drive} in Drive · {local} on this computer" +msgstr "{drive} no Drive · {local} neste computador" + +#. Translators: {name} is a file name. +#: crates/pdfs-gui/src/prompt.rs:1297 +#, rust-format +msgid "Opening {name}…" +msgstr "Abrindo {name}…" + +#: crates/pdfs-gui/src/prompt.rs:1321 +#, rust-format +msgid "Could not open: {message}" +msgstr "Não foi possível abrir: {message}" + +#: crates/pdfs-gui/src/prompt.rs:1325 +msgid "Could not reach the daemon" +msgstr "Não foi possível acessar o daemon" + +#. Translators: the user's home folder, as the location of a result. +#: crates/pdfs-gui/src/prompt.rs:1434 +msgid "Home" +msgstr "Pasta pessoal" + +#. Translators: {path} is a folder path inside the home folder, folder names separated by " / ". +#: crates/pdfs-gui/src/prompt.rs:1436 +#, rust-format +msgid "Home / {path}" +msgstr "Pasta pessoal / {path}" + +#. Translators: a file size in gigabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1451 +#, rust-format +msgid "{size} GB" +msgstr "{size} GB" + +#. Translators: a file size in megabytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1453 +#, rust-format +msgid "{size} MB" +msgstr "{size} MB" + +#. Translators: a file size in kilobytes; {size} is a number such as "4.2". +#: crates/pdfs-gui/src/prompt.rs:1455 +#, rust-format +msgid "{size} KB" +msgstr "{size} KB" + +#. Translators: a file size in bytes; {size} is a whole number. +#: crates/pdfs-gui/src/prompt.rs:1464 +#, rust-format +msgid "{size} B" +msgstr "{size} B" + +#. Translators: the age of a file modified under a minute ago. +#: crates/pdfs-gui/src/prompt.rs:1475 +msgctxt "age" +msgid "now" +msgstr "agora" + +#. Translators: a compact file age; {count} is a number of minutes. +#: crates/pdfs-gui/src/prompt.rs:1477 +#, rust-format +msgid "{count}m" +msgstr "{count} min" + +#. Translators: a compact file age; {count} is a number of hours. +#: crates/pdfs-gui/src/prompt.rs:1479 +#, rust-format +msgid "{count}h" +msgstr "{count} h" + +#. Translators: a compact file age; {count} is a number of days. +#: crates/pdfs-gui/src/prompt.rs:1481 +#, rust-format +msgid "{count}d" +msgstr "{count} d" + +#. Translators: a compact file age; {count} is a number of months. +#: crates/pdfs-gui/src/prompt.rs:1483 +#, rust-format +msgid "{count}mo" +msgstr "{count} m" + +#. Translators: a compact file age; {count} is a number of years. +#: crates/pdfs-gui/src/prompt.rs:1485 +#, rust-format +msgid "{count}y" +msgstr "{count} a" + +#: crates/pdfs-gui/src/query.rs:170 +#, rust-format +msgid "cannot reach the Proton Drive daemon: {error}" +msgstr "não foi possível acessar o daemon do Proton Drive: {error}" diff --git a/po/update.sh b/po/update.sh new file mode 100755 index 0000000..4260049 --- /dev/null +++ b/po/update.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Regenerate po/pdfs.pot from the sources listed in po/POTFILES.in, then merge +# the new template into every catalog in po/LINGUAS. Run from anywhere. +set -euo pipefail + +po_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$po_dir/.." + +version="$(grep -m1 '^version' Cargo.toml | cut -d'"' -f2)" + +xgettext \ + --language=Rust \ + --from-code=UTF-8 \ + --files-from=po/POTFILES.in \ + --output=po/pdfs.pot \ + --package-name=proton-drive-linux \ + --package-version="$version" \ + --msgid-bugs-address=https://github.com/narrrl/proton-drive-linux/issues \ + --add-comments=Translators: \ + --sort-by-file \ + --keyword= \ + --keyword=gettext \ + --keyword=gettext_f \ + --keyword=gettext_noop \ + --keyword=pgettext:1c,2 \ + --keyword=ngettext:1,2 \ + --keyword=ngettext_f:1,2 + +while read -r lang; do + [ -n "$lang" ] || continue + if [ -f "po/$lang.po" ]; then + msgmerge --quiet --update --backup=none --previous "po/$lang.po" po/pdfs.pot + else + msginit --no-translator --locale="$lang.UTF-8" --input=po/pdfs.pot --output-file="po/$lang.po" + fi +done < po/LINGUAS