From b511457458048e0776fee0f039d2940feba92d37 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Sun, 18 Oct 2026 12:48:10 -0400 Subject: [PATCH] fix(linux): tighten arch package self-update check, streamline hint message, and test deterministically --- crates/native/src/backend.rs | 2 +- crates/native/src/install.rs | 118 ++++++++++++++++++------------ crates/native/src/self_update.rs | 8 +- crates/ui-egui/src/i18n/cs.tsv | 4 +- crates/ui-egui/src/i18n/de.tsv | 4 +- crates/ui-egui/src/i18n/es.tsv | 4 +- crates/ui-egui/src/i18n/fr.tsv | 4 +- crates/ui-egui/src/i18n/hu.tsv | 4 +- crates/ui-egui/src/i18n/ja.tsv | 4 +- crates/ui-egui/src/i18n/pl.tsv | 4 +- crates/ui-egui/src/i18n/pt-BR.tsv | 4 +- crates/ui-egui/src/i18n/ru.tsv | 4 +- crates/ui-egui/src/i18n/zh-CN.tsv | 4 +- 13 files changed, 96 insertions(+), 72 deletions(-) diff --git a/crates/native/src/backend.rs b/crates/native/src/backend.rs index f220a95d..e8393455 100644 --- a/crates/native/src/backend.rs +++ b/crates/native/src/backend.rs @@ -633,7 +633,7 @@ fn planned_asset( } else if custom_linux { vec![artcraft_launcher_core::PackageKind::AppImage] } else { - install::choose_kinds(Some(app), existing, record, &options.kinds) + install::choose_kinds(app, existing, record, &options.kinds) }; pick_asset(release, &stems, platform, &kinds).map(|(a, k)| (a.clone(), k)) } diff --git a/crates/native/src/install.rs b/crates/native/src/install.rs index e102f447..a35d0c57 100644 --- a/crates/native/src/install.rs +++ b/crates/native/src/install.rs @@ -253,9 +253,23 @@ fn record(version: &str, kind: PackageKind, path: PathBuf, files: Vec, /// The package format to install `app` with: the format of the copy that's there (an update /// stays a `.deb` update), else the user's choice, else the best this system supports. -pub fn choose_kinds(app: Option<&CraftApp>, existing: Option<&Installed>, record: Option<&Record>, preferred: &[PackageKind]) -> Vec { +/// +/// Returns an empty `Vec` when `app` is already installed outside the launcher (such as an AUR +/// or repository Arch package) and must not be updated or replaced by the launcher. +pub fn choose_kinds(app: &CraftApp, existing: Option<&Installed>, record: Option<&Record>, preferred: &[PackageKind]) -> Vec { let available = available_kinds(); - let can_pacman = which("pacman").is_some(); + let can_pacman = available.contains(&PackageKind::ArchPkg) || can_pacman(); + choose_kinds_with(app, existing, record, preferred, &available, can_pacman) +} + +pub(crate) fn choose_kinds_with( + app: &CraftApp, + existing: Option<&Installed>, + record: Option<&Record>, + preferred: &[PackageKind], + available: &[PackageKind], + can_pacman: bool, +) -> Vec { if let Some(inst) = existing { let kind = match inst.source { InstallSource::Launcher => record.map(|r| r.kind), @@ -276,25 +290,30 @@ pub fn choose_kinds(app: Option<&CraftApp>, existing: Option<&Installed>, record return vec![k]; } } - let mut kinds: Vec = preferred.iter().copied().filter(|k| available.contains(k)).collect(); + let mut kinds: Vec = + preferred.iter().copied().filter(|k| available.contains(k) || (*k == PackageKind::ArchPkg && can_pacman)).collect(); for k in available { - if !kinds.contains(&k) { - kinds.push(k); + if !kinds.contains(k) { + kinds.push(*k); } } kinds } +/// Whether this system has a working pacman installation and pacman database. +fn can_pacman() -> bool { + #[cfg(target_os = "linux")] + return which("pacman").is_some() && crate::detect::linux::has_pacman_db(); + #[cfg(not(target_os = "linux"))] + return false; +} + /// Whether a pacman install is the release's own Arch package rather than an AUR build. The /// release names it by the bundle id (`ai.storyteller.`), which no AUR package uses /// (they are ``, `-bin` and `-git`), so an AUR helper never mistakes it /// for one of its own and rebuilds it from source. -pub fn is_release_arch_package(app: Option<&CraftApp>, installed: &Installed) -> bool { - installed.source == InstallSource::Pacman - && installed.package.as_deref().is_some_and(|p| match app { - Some(app) => p == app.bundle_id(), - None => p.starts_with("ai.storyteller."), - }) +pub fn is_release_arch_package(app: &CraftApp, installed: &Installed) -> bool { + installed.source == InstallSource::Pacman && installed.package.as_deref() == Some(&app.bundle_id()) } /// Package formats this machine can install, best first. @@ -355,10 +374,14 @@ fn published_checksum(release: &Release, asset: &Asset, http: &Http) -> Result Option { + managed_elsewhere_with(app, installed, uninstall, pacman_repo) +} + +fn managed_elsewhere_with(app: &CraftApp, installed: &Installed, uninstall: bool, repo_fn: impl Fn(&str) -> Option) -> Option { match installed.source { - InstallSource::Pacman if !uninstall && !is_release_arch_package(Some(app), installed) => { + InstallSource::Pacman if !uninstall && !is_release_arch_package(app, installed) => { let pkg = installed.package.clone().unwrap_or_else(|| app.id.to_string()); - Some(pacman_update_hint(app, &pkg, pacman_repo(&pkg).as_deref())) + Some(pacman_update_hint(app, &pkg, repo_fn(&pkg).as_deref())) } InstallSource::Binary => Some(format!("{} was installed outside the launcher. Update or remove it the way it was installed.", app.name)), _ => None, @@ -368,14 +391,14 @@ pub fn managed_elsewhere(app: &CraftApp, installed: &Installed, uninstall: bool) /// How to update an Arch package the launcher doesn't own: `repo` is the sync repository it /// comes from, or `None` for a foreign (AUR) package. fn pacman_update_hint(app: &CraftApp, pkg: &str, repo: Option<&str>) -> String { - if let Some(repo) = repo { - return format!("{} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu", app.name); - } let helper = ["paru", "yay"].into_iter().find(|h| which(h).is_some()); let cmd = match helper { Some(h) => format!("{h} -S {pkg}"), None => format!("your AUR helper (for example: yay -S {pkg})"), }; + if let Some(repo) = repo { + return format!("{} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu", app.name); + } format!("{} was installed from the AUR ({pkg}). Update it with {cmd}", app.name) } @@ -383,16 +406,13 @@ fn pacman_update_hint(app: &CraftApp, pkg: &str, repo: Option<&str>) -> String { /// `None` when no configured repository does (an AUR or locally built package) or pacman can't /// be asked. fn pacman_repo(pkg: &str) -> Option { - let pacman = which("pacman")?; - let t = std::time::Duration::from_secs(10); - // If the package is foreign (from the AUR or a local build), pacman -Qm succeeds: - // don't look it up in sync repositories. - let mut qm = process::command(&pacman); - qm.args(["-Qm", "--", pkg]).env("LC_ALL", "C"); - if process::run_command(qm, "pacman", t).is_ok() { + #[cfg(target_os = "linux")] + if !crate::detect::linux::has_pacman_db() { return None; } - // For native packages, ask pacman -Si which configured repository carries it. + let pacman = which("pacman")?; + let t = std::time::Duration::from_secs(5); + // For packages carried by a configured sync repository, ask pacman -Si which repo carries it. // pacman translates its field names; the C locale keeps "Repository" parseable. let mut si = process::command(&pacman); si.args(["-Si", "--", pkg]).env("LC_ALL", "C"); @@ -2130,16 +2150,17 @@ mod tests { #[test] fn updates_keep_the_installed_format() { let inst = |source| Installed { version: None, source, location: String::new(), package: None }; + let app = artcraft_launcher_core::CraftApp::by_id("photocraft").unwrap(); let available = available_kinds(); if let Some(first) = available.first() { - assert_eq!(choose_kinds(None, None, None, &[]).first(), Some(first)); + assert_eq!(choose_kinds(app, None, None, &[]).first(), Some(first)); } #[cfg(target_os = "macos")] - assert_eq!(choose_kinds(None, Some(&inst(InstallSource::MacApp)), None, &[]), [PackageKind::Dmg]); + assert_eq!(choose_kinds(app, Some(&inst(InstallSource::MacApp)), None, &[]), [PackageKind::Dmg]); #[cfg(windows)] - assert_eq!(choose_kinds(None, Some(&inst(InstallSource::Msi)), None, &[]), [PackageKind::Msi]); + assert_eq!(choose_kinds(app, Some(&inst(InstallSource::Msi)), None, &[]), [PackageKind::Msi]); #[cfg(target_os = "linux")] - assert_eq!(choose_kinds(None, Some(&inst(InstallSource::AppImage)), None, &[]), [PackageKind::AppImage]); + assert_eq!(choose_kinds(app, Some(&inst(InstallSource::AppImage)), None, &[]), [PackageKind::AppImage]); let _ = inst; } @@ -2147,24 +2168,23 @@ mod tests { fn only_the_release_arch_package_is_updated_by_the_launcher() { let pacman = |name: &str| Installed { version: None, source: InstallSource::Pacman, location: String::new(), package: Some(name.into()) }; let app = artcraft_launcher_core::CraftApp::by_id("wordcraft").unwrap(); - assert!(is_release_arch_package(Some(app), &pacman("ai.storyteller.wordcraft"))); - assert!(is_release_arch_package(None, &pacman("ai.storyteller.wordcraft"))); + assert!(is_release_arch_package(app, &pacman("ai.storyteller.wordcraft"))); for aur in ["wordcraft", "wordcraft-bin", "wordcraft-git"] { - assert!(!is_release_arch_package(Some(app), &pacman(aur)), "{aur}"); - assert!(!is_release_arch_package(None, &pacman(aur)), "{aur}"); + assert!(!is_release_arch_package(app, &pacman(aur)), "{aur}"); } - assert_eq!(managed_elsewhere(app, &pacman("ai.storyteller.wordcraft"), false), None); - assert_eq!(managed_elsewhere(app, &pacman("wordcraft-bin"), true), None); + assert_eq!(managed_elsewhere_with(app, &pacman("ai.storyteller.wordcraft"), false, |_| None), None); + assert_eq!(managed_elsewhere_with(app, &pacman("wordcraft-bin"), true, |_| None), None); } #[test] fn arch_packages_from_a_repository_are_updated_with_the_system() { let app = artcraft_launcher_core::CraftApp::by_id("wordcraft").unwrap(); - assert_eq!( - pacman_update_hint(app, "wordcraft-bin", Some("omarchy")), - "WordCraft was installed from the omarchy repository (wordcraft-bin). Update it with sudo pacman -Syu" - ); - assert!(pacman_update_hint(app, "wordcraft-bin", None).starts_with("WordCraft was installed from the AUR (wordcraft-bin).")); + let hint = pacman_update_hint(app, "wordcraft-bin", Some("omarchy")); + assert!(hint.starts_with("WordCraft was installed from the omarchy repository or the AUR (wordcraft-bin).")); + assert!(hint.ends_with("or sudo pacman -Syu")); + + let aur_hint = pacman_update_hint(app, "wordcraft-bin", None); + assert!(aur_hint.starts_with("WordCraft was installed from the AUR (wordcraft-bin).")); let si = "Repository : omarchy\nName : wordcraft-bin\nVersion : 0.6.1-1\n"; assert_eq!(parse_pacman_repo(si).as_deref(), Some("omarchy")); @@ -2177,9 +2197,9 @@ mod tests { let pacman = |name: &str| Installed { version: None, source: InstallSource::Pacman, location: String::new(), package: Some(name.into()) }; let app = artcraft_launcher_core::CraftApp::by_id("filmcraft").unwrap(); let installed = pacman("filmcraft-bin"); - assert!(managed_elsewhere(app, &installed, false).is_some()); - assert_eq!(choose_kinds(Some(app), Some(&installed), None, &[]), Vec::::new()); - assert_eq!(choose_kinds(Some(app), Some(&installed), None, &[PackageKind::ArchPkg]), Vec::::new()); + assert!(managed_elsewhere_with(app, &installed, false, |_| None).is_some()); + assert_eq!(choose_kinds_with(app, Some(&installed), None, &[], &[], false), Vec::::new()); + assert_eq!(choose_kinds_with(app, Some(&installed), None, &[PackageKind::ArchPkg], &[PackageKind::ArchPkg], true), Vec::::new()); } #[test] @@ -2187,10 +2207,16 @@ mod tests { let pacman = |name: &str| Installed { version: None, source: InstallSource::Pacman, location: String::new(), package: Some(name.into()) }; let app = artcraft_launcher_core::CraftApp::by_id("filmcraft").unwrap(); let installed = pacman("ai.storyteller.filmcraft"); - assert_eq!(managed_elsewhere(app, &installed, false), None); - if which("pacman").is_some() { - assert_eq!(choose_kinds(Some(app), Some(&installed), None, &[]), vec![PackageKind::ArchPkg]); - } + assert_eq!(managed_elsewhere_with(app, &installed, false, |_| None), None); + assert_eq!(choose_kinds_with(app, Some(&installed), None, &[], &[], true), vec![PackageKind::ArchPkg]); + assert_eq!(choose_kinds_with(app, Some(&installed), None, &[], &[PackageKind::ArchPkg], false), vec![PackageKind::ArchPkg]); + } + + #[test] + fn preferred_arch_package_honoured_when_can_pacman() { + let app = artcraft_launcher_core::CraftApp::by_id("filmcraft").unwrap(); + assert_eq!(choose_kinds_with(app, None, None, &[PackageKind::ArchPkg], &[], true), vec![PackageKind::ArchPkg]); + assert_eq!(choose_kinds_with(app, None, None, &[PackageKind::ArchPkg], &[], false), Vec::::new()); } #[test] diff --git a/crates/native/src/self_update.rs b/crates/native/src/self_update.rs index 74dd6844..f3860384 100644 --- a/crates/native/src/self_update.rs +++ b/crates/native/src/self_update.rs @@ -151,12 +151,10 @@ fn detect(exe: &Path) -> Option { if process::capture("rpm", &["-q", LAUNCHER.id], t).is_some() { return Some(Install::Package(PackageKind::Rpm, exe.to_path_buf())); } - // A pacman install of the launcher. We detect the release's own Arch package (by bundle id - // or short name). AUR builds (`artcraft-launcher-bin`, `artcraft-launcher-git`) are left to + // A pacman install of the launcher. We detect the release's own Arch package (by bundle id). + // AUR builds (`artcraft-launcher`, `artcraft-launcher-bin`, `artcraft-launcher-git`) are left to // pacman and the AUR helper. - if crate::detect::linux::has_pacman_db() - && (process::capture("pacman", &["-Q", &LAUNCHER.bundle_id()], t).is_some() || process::capture("pacman", &["-Q", LAUNCHER.id], t).is_some()) - { + if crate::detect::linux::has_pacman_db() && process::capture("pacman", &["-Q", &LAUNCHER.bundle_id()], t).is_some() { return Some(Install::Package(PackageKind::ArchPkg, exe.to_path_buf())); } None diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index fa909fac..541e3006 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -266,10 +266,10 @@ filter Installed Nainstalováno @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) Aplikace {name} byla nainstalována ve verzi {version} (toto vydání neobsahuje kontrolní součet, ověřena byla pouze velikost) @msg {name} was removed Aplikace {name} byla odebrána @msg {name} is running. Quit it, then try again. Aplikace {name} je spuštěná. Ukončete ji a zkuste to znovu. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu Aplikace {name} byla nainstalována z repozitáře {repo} ({pkg}). Aktualizujte ji příkazem sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu Aplikace {name} byla nainstalována z repozitáře {repo} nebo z AUR ({pkg}). Aktualizujte ji příkazem {cmd} nebo sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu Aplikace {name} byla nainstalována z repozitáře {repo} nebo z AUR ({pkg}). Aktualizujte ji pomocí pomocníka AUR (například: yay -S {pkg}) nebo příkazem sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} Aplikace {name} byla nainstalována z AUR ({pkg}). Aktualizujte ji příkazem {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) Aplikace {name} byla nainstalována z AUR ({pkg}). Aktualizujte ji pomocí pomocníka AUR (například: yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) pomocník AUR (například: yay -S {pkg}) @id app.install Nainstalovat @id app.update Aktualizovat na {v} @id app.open Otevřít diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index eb6f420a..7a9740e7 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -280,10 +280,10 @@ filter Installed Installiert @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} installiert: {version} (diese Version veröffentlicht keine Prüfsumme, daher wurde nur die Größe geprüft) @msg {name} was removed {name} wurde entfernt @msg {name} is running. Quit it, then try again. {name} läuft. Beende die App und versuche es erneut. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} wurde aus dem Repository {repo} installiert ({pkg}). Aktualisiere die App mit sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} wurde aus dem Repository {repo} oder dem AUR installiert ({pkg}). Aktualisiere die App mit {cmd} oder sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} wurde aus dem Repository {repo} oder dem AUR installiert ({pkg}). Aktualisiere die App mit deinem AUR-Hilfsprogramm (zum Beispiel: yay -S {pkg}) oder sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} wurde aus dem AUR installiert ({pkg}). Aktualisiere die App mit {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} wurde aus dem AUR installiert ({pkg}). Aktualisiere die App mit deinem AUR-Hilfsprogramm (zum Beispiel: yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) dein AUR-Hilfsprogramm (zum Beispiel: yay -S {pkg}) # Command IDs for menu items (@id) # Format: @idcommand_idtranslation diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index a1933675..0f2cd004 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -279,10 +279,10 @@ filter Installed Instaladas @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} instalada: {version} (esta versión no publica la suma de comprobación, así que solo se comprobó su tamaño) @msg {name} was removed Se quitó {name} @msg {name} is running. Quit it, then try again. {name} está abierta. Ciérrala y vuelve a intentarlo. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} se instaló desde el repositorio {repo} ({pkg}). Actualízala con sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} se instaló desde el repositorio {repo} o AUR ({pkg}). Actualízala con {cmd} o con sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} se instaló desde el repositorio {repo} o AUR ({pkg}). Actualízala con tu asistente de AUR (por ejemplo: yay -S {pkg}) o con sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} se instaló desde AUR ({pkg}). Actualízala con {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} se instaló desde AUR ({pkg}). Actualízala con tu asistente de AUR (por ejemplo: yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) tu asistente de AUR (por ejemplo: yay -S {pkg}) @id app.install Instalar @id app.update Actualizar a {v} @id app.open Abrir diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index d754a124..ed94c09a 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -278,10 +278,10 @@ filter Installed Installées @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} installé : {version} (cette version ne publie pas de somme de contrôle : seule sa taille a été vérifiée) @msg {name} was removed {name} a été supprimé @msg {name} is running. Quit it, then try again. {name} est en cours d'exécution. Quittez-le, puis réessayez. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} a été installé depuis le dépôt {repo} ({pkg}). Mettez-le à jour avec sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} a été installé depuis le dépôt {repo} ou l'AUR ({pkg}). Mettez-le à jour avec {cmd} ou avec sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} a été installé depuis le dépôt {repo} ou l'AUR ({pkg}). Mettez-le à jour avec votre assistant AUR (par exemple : yay -S {pkg}) ou avec sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} a été installé depuis l'AUR ({pkg}). Mettez-le à jour avec {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} a été installé depuis l'AUR ({pkg}). Mettez-le à jour avec votre assistant AUR (par exemple : yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) votre assistant AUR (par exemple : yay -S {pkg}) # Command IDs for menu items (@id) # Format: @idcommand_idtranslation diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index 6119161e..9ab6f3e8 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -294,10 +294,10 @@ filter Installed Telepítve @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} telepítve: {version} (ehhez a kiadáshoz nem adtak meg ellenőrzőösszeget, ezért csak a fájl méretét ellenőriztük) @msg {name} was removed {name} eltávolítva @msg {name} is running. Quit it, then try again. {name} fut. Zárd be, majd próbáld újra. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} a(z) {repo} tárolóból lett telepítve ({pkg}). Frissítsd ezzel: sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} a(z) {repo} tárolóból vagy az AUR-ból lett telepítve ({pkg}). Frissítsd ezzel: {cmd} vagy sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} a(z) {repo} tárolóból vagy az AUR-ból lett telepítve ({pkg}). Frissítsd az AUR-segédeddel (például: yay -S {pkg}) vagy ezzel: sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} az AUR-ból lett telepítve ({pkg}). Frissítsd ezzel: {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} az AUR-ból lett telepítve ({pkg}). Frissítsd az AUR-segédeddel (például: yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) az AUR-segéded (például: yay -S {pkg}) # Command IDs for menu items (@id) # Format: @idcommand_idtranslation diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index fb7ba278..5851919a 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -296,10 +296,10 @@ filter Installed インストール済み @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} をインストールしました: {version}(このリリースはチェックサムを公開していないため、サイズのみ確認しました) @msg {name} was removed {name} をアンインストールしました @msg {name} is running. Quit it, then try again. {name} が実行中です。終了してから再試行してください。 -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} は {repo} リポジトリからインストールされています ({pkg})。sudo pacman -Syu で更新してください。 +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} は {repo} リポジトリまたは AUR からインストールされています ({pkg})。{cmd} または sudo pacman -Syu で更新してください。 +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} は {repo} リポジトリまたは AUR からインストールされています ({pkg})。AUR ヘルパー (例: yay -S {pkg}) または sudo pacman -Syu で更新してください。 @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} は AUR からインストールされています ({pkg})。{cmd} で更新してください。 @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} は AUR からインストールされています ({pkg})。AUR ヘルパー (例: yay -S {pkg}) で更新してください。 -@msg your AUR helper (for example: yay -S {pkg}) AUR ヘルパー (例: yay -S {pkg}) # Command IDs for menu items (@id) # Format: @idcommand_idtranslation diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index d6799f93..8bf3898b 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -295,10 +295,10 @@ filter Installed Zainstalowane @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) Zainstalowano {name} w wersji {version} (to wydanie nie zawiera sumy kontrolnej, więc sprawdzono tylko rozmiar) @msg {name} was removed Usunięto {name} @msg {name} is running. Quit it, then try again. {name} jest uruchomiona. Zamknij ją i spróbuj ponownie. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} została zainstalowana z repozytorium {repo} ({pkg}). Zaktualizuj ją poleceniem sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} została zainstalowana z repozytorium {repo} lub AUR ({pkg}). Zaktualizuj ją poleceniem {cmd} lub sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} została zainstalowana z repozytorium {repo} lub AUR ({pkg}). Zaktualizuj ją za pomocą swojego pomocnika AUR (na przykład: yay -S {pkg}) lub poleceniem sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} została zainstalowana z AUR ({pkg}). Zaktualizuj ją poleceniem {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} została zainstalowana z AUR ({pkg}). Zaktualizuj ją za pomocą swojego pomocnika AUR (na przykład: yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) twój pomocnik AUR (na przykład: yay -S {pkg}) # Command IDs for menu items (@id) # Format: @idcommand_idtranslation diff --git a/crates/ui-egui/src/i18n/pt-BR.tsv b/crates/ui-egui/src/i18n/pt-BR.tsv index a85017cf..56c85e43 100644 --- a/crates/ui-egui/src/i18n/pt-BR.tsv +++ b/crates/ui-egui/src/i18n/pt-BR.tsv @@ -268,10 +268,10 @@ filter Installed Instalados @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} instalado: {version} (este lançamento não publica soma de verificação, então apenas o tamanho foi verificado) @msg {name} was removed {name} foi removido @msg {name} is running. Quit it, then try again. {name} está em execução. Feche-o e tente novamente. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} foi instalado pelo repositório {repo} ({pkg}). Atualize-o com sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} foi instalado pelo repositório {repo} ou pelo AUR ({pkg}). Atualize-o com {cmd} ou com sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} foi instalado pelo repositório {repo} ou pelo AUR ({pkg}). Atualize-o com seu assistente do AUR (por exemplo: yay -S {pkg}) ou com sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} foi instalado pelo AUR ({pkg}). Atualize-o com {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} foi instalado pelo AUR ({pkg}). Atualize-o com seu assistente do AUR (por exemplo: yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) seu assistente do AUR (por exemplo: yay -S {pkg}) # Command IDs for menu items (@id) # Format: @idcommand_idtranslation diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 52f7bb57..336b310a 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -277,10 +277,10 @@ filter Installed Установлены @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) Приложение {name} установлено: {version} (в этом релизе нет контрольных сумм, поэтому проверен только размер) @msg {name} was removed Приложение {name} удалено @msg {name} is running. Quit it, then try again. Приложение {name} запущено. Закройте его и попробуйте снова. -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu Приложение {name} установлено из репозитория {repo} ({pkg}). Обновите его командой sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu Приложение {name} установлено из репозитория {repo} или из AUR ({pkg}). Обновите его командой {cmd} или sudo pacman -Syu +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu Приложение {name} установлено из репозитория {repo} или из AUR ({pkg}). Обновите его с помощью вашего помощника AUR (например: yay -S {pkg}) или командой sudo pacman -Syu @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} Приложение {name} установлено из AUR ({pkg}). Обновите его командой {cmd} @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) Приложение {name} установлено из AUR ({pkg}). Обновите его с помощью вашего помощника AUR (например: yay -S {pkg}) -@msg your AUR helper (for example: yay -S {pkg}) помощник AUR (например: yay -S {pkg}) # Command IDs for menu items (@id) # Format: @idcommand_idtranslation diff --git a/crates/ui-egui/src/i18n/zh-CN.tsv b/crates/ui-egui/src/i18n/zh-CN.tsv index 5dda75fe..984d008d 100644 --- a/crates/ui-egui/src/i18n/zh-CN.tsv +++ b/crates/ui-egui/src/i18n/zh-CN.tsv @@ -314,10 +314,10 @@ figcraft Interface design and prototyping 界面设计与原型制作 @msg {name} installed: {version} (this release publishes no checksum, so only its size was checked) {name} 已安装:{version}(此版本未发布校验和,因此只检查了文件大小) @msg {name} was removed {name} 已卸载 @msg {name} is running. Quit it, then try again. {name} 正在运行。请先退出,然后重试。 -@msg {name} was installed from the {repo} repository ({pkg}). Update it with sudo pacman -Syu {name} 是从 {repo} 软件仓库安装的({pkg})。请使用 sudo pacman -Syu 更新。 +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with {cmd} or sudo pacman -Syu {name} 是从 {repo} 软件仓库或 AUR 安装的({pkg})。请使用 {cmd} 或 sudo pacman -Syu 更新。 +@msg {name} was installed from the {repo} repository or the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) or sudo pacman -Syu {name} 是从 {repo} 软件仓库或 AUR 安装的({pkg})。请使用您的 AUR 助手(例如:yay -S {pkg})或 sudo pacman -Syu 更新。 @msg {name} was installed from the AUR ({pkg}). Update it with {cmd} {name} 是从 AUR 安装的({pkg})。请使用 {cmd} 更新。 @msg {name} was installed from the AUR ({pkg}). Update it with your AUR helper (for example: yay -S {pkg}) {name} 是从 AUR 安装的({pkg})。请使用您的 AUR 助手(例如:yay -S {pkg})更新。 -@msg your AUR helper (for example: yay -S {pkg}) 您的 AUR 助手(例如:yay -S {pkg}) Install folder 安装文件夹 Default install folder 默认安装文件夹 System default 系统默认