From 9b87ca90dfd7ebc1317543b243238c61032871b3 Mon Sep 17 00:00:00 2001 From: eabdullin Date: Thu, 28 Mar 2024 10:44:57 +0000 Subject: [PATCH] import CS libdnf-0.69.0-8.el9 --- .../0004-Update-translations-RHEL-9.3.patch | 2788 +++++++++++++++++ ...nstalled_solvables-sort-RhBug2212838.patch | 37 + ...t_best_selectors-only-obsol-oflatest.patch | 84 + ...nstallonly-packages-marked-for-ERASE.patch | 99 + ...t-creation-SELinux-labels-on-GnuPG-d.patch | 338 ++ SPECS/libdnf.spec | 29 +- 6 files changed, 3372 insertions(+), 3 deletions(-) create mode 100644 SOURCES/0004-Update-translations-RHEL-9.3.patch create mode 100644 SOURCES/0005-filterAdvisory-installed_solvables-sort-RhBug2212838.patch create mode 100644 SOURCES/0006-hawkeysubject-get_best_selectors-only-obsol-oflatest.patch create mode 100644 SOURCES/0007-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch create mode 100644 SOURCES/0008-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch diff --git a/SOURCES/0004-Update-translations-RHEL-9.3.patch b/SOURCES/0004-Update-translations-RHEL-9.3.patch new file mode 100644 index 0000000..7fe2006 --- /dev/null +++ b/SOURCES/0004-Update-translations-RHEL-9.3.patch @@ -0,0 +1,2788 @@ +From 63a98296baeeafd93b70eb34e859a4bcf1191b62 Mon Sep 17 00:00:00 2001 +From: Marek Blaha +Date: Fri, 8 Sep 2023 13:31:16 +0200 +Subject: [PATCH] Update translations RHEL 9.3 + +--- + po/fr.po | 443 +++++++++++++++++++++++++++++----------------------- + po/ja.po | 399 +++++++++++++++++++++++++++------------------- + po/ko.po | 347 +++++++++++++++++++++++++--------------- + po/zh_CN.po | 290 +++++++++++++++++++++++----------- + 4 files changed, 907 insertions(+), 572 deletions(-) + +diff --git a/po/fr.po b/po/fr.po +index b0ef48aa..8bdec7d5 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -12,7 +12,7 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:24+0100\n" ++"POT-Creation-Date: 2023-08-29 13:26+0200\n" + "PO-Revision-Date: 2023-03-07 14:20+0000\n" + "Last-Translator: Transtats \n" + "Language-Team: French ' command. After you " + "reset the module, you can install the other stream." +-msgstr "" +-"Il n’est pas possible de basculer les flux actifs d’un module. \n" +-"Il est recommandé de retirer tout contenu installé par le module, et de " +-"réinitialiser le mode en utilisant la commande 'microdnf module reset " +-"’. Après la réinitialisation du module, vous pouvez installer " +-"les autres flux." ++msgstr "Il n’est pas possible de basculer les flux actifs d’un module. \n" ++"Il est recommandé de retirer tout contenu installé par le module, et de réinitialiser le mode en utilisant la commande 'microdnf module reset ’. Après la réinitialisation du module, vous pouvez installer les autres flux." + + #: libdnf/dnf-goal.cpp:107 + msgid "Could not depsolve transaction; " +@@ -277,9 +261,7 @@ msgstr " Problème : %s\n" + msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" +-msgstr "" +-"Aucune métadonnée modulaire n’est disponible pour le paquet modulaire " +-"« %s » ; impossible d’installer le paquet sur le système" ++msgstr "Aucune métadonnée modulaire n’est disponible pour le paquet modulaire « %s » ; impossible d’installer le paquet sur le système" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -366,9 +348,7 @@ msgstr "n’a pas pu ouvrir le fichier tmp : %s" + #: libdnf/dnf-sack.cpp:550 + #, c-format + msgid "While writing primary cache %s repowriter write failed: %i, error: %s" +-msgstr "" +-"Lors de l'écriture dans le cache primaire %s, l'écriture dans le repowriter " +-"a échoué : %i, erreur : %s" ++msgstr "Lors de l'écriture dans le cache primaire %s, l'écriture dans le repowriter a échoué : %i, erreur : %s" + + #: libdnf/dnf-sack.cpp:560 + #, c-format +@@ -394,16 +374,12 @@ msgstr "n’a pas pu créer le fichier temporaire %s" + #, c-format + msgid "" + "While writing extension cache %s (%d): repowriter write failed: %i, error: %s" +-msgstr "" +-"Lors de l'écriture du cache d'extension %s (%d) : écriture repowriter ayant " +-"échoué : %i, erreur : %s" ++msgstr "Lors de l'écriture du cache d'extension %s (%d) : écriture repowriter ayant échoué : %i, erreur : %s" + + #: libdnf/dnf-sack.cpp:676 + #, c-format + msgid "While writing extension cache (%d): cannot close temporary file: %s" +-msgstr "" +-"Lors de l'écriture du cache d'extension (%d) : impossible de fermer le " +-"fichier temporaire : %s" ++msgstr "Lors de l'écriture du cache d'extension (%d) : impossible de fermer le fichier temporaire : %s" + + #: libdnf/dnf-sack.cpp:692 + #, c-format +@@ -512,8 +488,7 @@ msgstr "Fichier téléchargé pour %s non trouvé" + #: libdnf/dnf-transaction.cpp:399 + #, c-format + msgid "package %1$s cannot be verified and repo %2$s is GPG enabled: %3$s" +-msgstr "" +-"le paquet %1$s ne peut être vérifié et le dépôt %2$s est activé GPG : %3$s" ++msgstr "le paquet %1$s ne peut être vérifié et le dépôt %2$s est activé GPG : %3$s" + + #: libdnf/dnf-transaction.cpp:833 libdnf/dnf-transaction.cpp:905 + msgid "Failed to get value for CacheDir" +@@ -522,8 +497,7 @@ msgstr "N’a pas pu obtenir la valeur de CacheDir" + #: libdnf/dnf-transaction.cpp:913 + #, c-format + msgid "Failed to get filesystem free size for %s: " +-msgstr "" +-"Échec de l’obtention de l’espace libre du système de fichiers pour %s : " ++msgstr "Échec de l’obtention de l’espace libre du système de fichiers pour %s : " + + #: libdnf/dnf-transaction.cpp:921 + #, c-format +@@ -533,8 +507,7 @@ msgstr "N’a pas pu obtenir la taille libre du système de fichiers pour %s" + #: libdnf/dnf-transaction.cpp:937 + #, c-format + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" +-msgstr "" +-"Pas suffisamment d’espace libre dans %1$s : a besoin de %2$s, disponible %3$s" ++msgstr "Pas suffisamment d’espace libre dans %1$s : a besoin de %2$s, disponible %3$s" + + #: libdnf/dnf-transaction.cpp:1196 + msgid "failed to set root" +@@ -552,9 +525,7 @@ msgstr "Erreur %i lors de l’ouverture de la base de données rpm" + + #: libdnf/dnf-transaction.cpp:1449 libdnf/dnf-transaction.cpp:1495 + msgid "The rpmdbCookie() function did not return cookie of rpm database." +-msgstr "" +-"La fonction rpmdbCookie() n'a pas retourné le cookie de la base de données " +-"rpm." ++msgstr "La fonction rpmdbCookie() n'a pas retourné le cookie de la base de données rpm." + + #: libdnf/dnf-transaction.cpp:1464 + #, c-format +@@ -564,9 +535,7 @@ msgstr "Erreur %i pendant la transaction" + #: libdnf/dnf-transaction.cpp:1480 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" +-msgstr "" +-"La transaction n’a pas pu opérer en phase d’écriture, mais a renvoyé « no " +-"error(%i) »" ++msgstr "La transaction n’a pas pu opérer en phase d’écriture, mais a renvoyé « no error(%i) »" + + #: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format +@@ -580,22 +549,21 @@ msgstr "n’a pas pu supprimer %s" + + #: libdnf/goal/Goal.cpp:78 + msgid "Ill-formed Selector, presence of multiple match objects in the filter" +-msgstr "" +-"Sélecteur Ill-formed, présence de plusieurs objets correspondants dans le " +-"filtre" ++msgstr "Sélecteur Ill-formed, présence de plusieurs objets correspondants dans le filtre" + + #: libdnf/goal/Goal.cpp:79 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" +-msgstr "" +-"Sélecteur Ill-formed utilisé pour l’opération, type de comparaison incorrecte" ++msgstr "Sélecteur Ill-formed utilisé pour l’opération, type de comparaison incorrecte" + +-#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 +-msgid " does not belong to a distupgrade repository" +-msgstr " n’appartient pas à un dépôt distupgrade" ++#: libdnf/goal/Goal.cpp:90 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s de %s n’appartient pas à un référentiel distupgrade" + +-#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 +-msgid " has inferior architecture" +-msgstr " a une architecture inférieure" ++#: libdnf/goal/Goal.cpp:91 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s de %s a une architecture inférieure" + + #: libdnf/goal/Goal.cpp:92 + msgid "problem with installed package " +@@ -636,69 +604,79 @@ msgstr "installation impossible du meilleur candidat pour la tâche" + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "le paquet %s a été filtré par filtrage modulaire" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "le paquet %s de %s a été filtré par filtrage modulaire" + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "le paquet %s n’a pas d’architecture compatible" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "le paquet %s de %s n’a pas d’architecture compatible" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s is not installable" +-msgstr "le paquet %s n’est pas installable" ++msgid "package %s from %s is not installable" ++msgstr "le paquet %s de %s n’est pas installable" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "le paquet %s a été filtré en excluant le filtrage" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "le paquet %s de %s a été filtré en excluant le filtrage" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "rien de fournit %s rendu nécessaire par %s" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "rien de fournit %s rendu nécessaire par %s de %s" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "installation impossible à la fois de %s et %s" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "impossible d’installer à la fois %s de %s et %s de %s" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "le paquet %s est en conflit avec %s fourni par %s" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "le paquet %s de %s entre en conflit avec %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "le paquet %s rend obsolète %s fourni par %s" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "le paquet %s de %s rend obsolète %sfourni par %s de %s" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "le paquet installé %s rend obsolète %s fourni par %s" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "le paquet installé %s rend obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:110 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "le paquet %s rend implicitement obsolète %s fourni par %s" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "le paquet %s de %s rend implicitement obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:111 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "" +-"le paquet %s nécessite %s, mais aucun fournisseur ne peut être installé" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" ++msgstr "le paquet %s de %s nécessite %s, mais aucun fournisseur ne peut être installé" + + #: libdnf/goal/Goal.cpp:112 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "le paquet %s est en conflit avec %s fourni par lui-même" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "le paquet %s de %s est en conflit avec%s fourni par lui-même" + + #: libdnf/goal/Goal.cpp:113 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "à la fois le paquet %s et %s rendent obsolète %s" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "les deux paquets %s de %s et %s de %s rendent %s obsolète" ++ ++#: libdnf/goal/Goal.cpp:117 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s de %s n’appartient pas à un référentiel distupgrade" ++ ++#: libdnf/goal/Goal.cpp:118 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s de %s a une architecture inférieure" + + #: libdnf/goal/Goal.cpp:119 + msgid "problem with installed module " +@@ -711,117 +689,113 @@ msgstr "le module %s n’existe pas" + + #: libdnf/goal/Goal.cpp:126 + msgid "cannot install the best update candidate for module " +-msgstr "" +-"installation impossible du meilleur candidat de mise à jour pour le module " ++msgstr "installation impossible du meilleur candidat de mise à jour pour le module " + + #: libdnf/goal/Goal.cpp:128 libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s is disabled" +-msgstr "le module %s est désactivé" ++msgid "module %s from %s is disabled" ++msgstr "module %s de %s désactivé" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "le module %s n’a pas d’architecture compatible" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "le module %s de %s n’a pas d’architecture compatible" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s is not installable" +-msgstr "le module %s n’est pas installable" ++msgid "module %s from %s is not installable" ++msgstr "le module %s de %s n’est pas installable" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "rien de fournit %s rendu nécessaire par le module %s" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "rien ne produit %s qui est requis par le module %s de %s" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "installation impossible à la fois des modules %s et %s" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "impossible d’installer à la fois les modules %s de %s et %s de %s" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "le module %s est en conflit avec %s fourni par %s" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "le module %s de %s entre en conflit avec %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "le module %s rend obsolète %s fourni par %s" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "le module %s de %s rend %s obsolète qui est fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "le module installé %s rend obsolète %s fourni par %s" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "le module installé %s rend obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:137 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "le module %s rend implicitement obsolète %s fourni par %s" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "le module %s de %s rend implicitement obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:138 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "" +-"le module %s nécessite %s, mais aucun fournisseur ne peut être installé" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" ++msgstr "le module %s de %s requiert %s, mais aucun fournisseur ne peut être installé" + + #: libdnf/goal/Goal.cpp:139 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "le module %s est en conflit avec %s fourni par lui-même" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "le module %s de %s entre en conflit avec %s fourni par lui-même" + + #: libdnf/goal/Goal.cpp:140 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "à la fois le module %s et %s rendent obsolète %s" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "les deux modules %s de %s et %s de %s rendent %s obsolète" + +-#: libdnf/goal/Goal.cpp:1157 ++#: libdnf/goal/Goal.cpp:1168 + msgid "no solver set" + msgstr "aucun solveur défini" + +-#: libdnf/goal/Goal.cpp:1162 ++#: libdnf/goal/Goal.cpp:1173 + #, c-format + msgid "failed to make %s absolute" + msgstr "n’a pas pu rendre %s absolu" + +-#: libdnf/goal/Goal.cpp:1169 ++#: libdnf/goal/Goal.cpp:1180 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "échec de l’écriture des debugdata dans %1$s : %2$s" + +-#: libdnf/goal/Goal.cpp:1181 ++#: libdnf/goal/Goal.cpp:1192 + msgid "no solv in the goal" + msgstr "pas de solv dans l’objectif" + +-#: libdnf/goal/Goal.cpp:1183 ++#: libdnf/goal/Goal.cpp:1194 + msgid "no solution, cannot remove protected package" + msgstr "aucune solution, n’a pas pu supprimer le package protégé" + +-#: libdnf/goal/Goal.cpp:1186 ++#: libdnf/goal/Goal.cpp:1197 + msgid "no solution possible" + msgstr "aucune solution n’est possible" + +-#: libdnf/goal/Goal.cpp:1312 ++#: libdnf/goal/Goal.cpp:1323 + msgid "Problem: " + msgstr "Problème : " + +-#: libdnf/goal/Goal.cpp:1317 ++#: libdnf/goal/Goal.cpp:1328 + #, c-format + msgid "Problem %d: " + msgstr "Probléme %d : " + +-#: libdnf/goal/Goal.cpp:1650 ++#: libdnf/goal/Goal.cpp:1661 + msgid "" + "The operation would result in removing the following protected packages: " +-msgstr "" +-"L’opération résulterait en la suppression des packages protégés suivants : " ++msgstr "L’opération résulterait en la suppression des packages protégés suivants : " + + #: libdnf/hy-iutil.cpp:181 + #, c-format + msgid "Libsolv's solv_toolversion is: %zu long but we expect max of: %zu" +-msgstr "" +-"La solv_toolversion de Libsolv est : %zu long mais nous attendons un maximum " +-"de : %zu" ++msgstr "La solv_toolversion de Libsolv est : %zu long mais nous attendons un maximum de : %zu" + + #: libdnf/hy-iutil.cpp:408 + #, c-format +@@ -850,14 +824,11 @@ msgstr "Format invalide du module de plateforme : %s" + + #: libdnf/module/ModulePackage.cpp:619 + msgid "Multiple module platforms provided by available packages\n" +-msgstr "" +-"De multiples modules de plateformes sont fournis par les paquets " +-"disponibles\n" ++msgstr "De multiples modules de plateformes sont fournis par les paquets disponibles\n" + + #: libdnf/module/ModulePackage.cpp:632 + msgid "Multiple module platforms provided by installed packages\n" +-msgstr "" +-"De multiples modules de plateformes sont fournis par les paquets installés\n" ++msgstr "De multiples modules de plateformes sont fournis par les paquets installés\n" + + #: libdnf/module/ModulePackage.cpp:659 + #, c-format +@@ -878,73 +849,66 @@ msgstr "Aucun identifiant de plateforme n'a été détecté" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "Impossible d’activer les flux pour le module « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:346 ++#: libdnf/module/ModulePackageContainer.cpp:339 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "Valeurs par défaut en conflit avec le dépôt « %s » : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:917 ++#: libdnf/module/ModulePackageContainer.cpp:923 + msgid "Installing module profiles:\n" + msgstr "Installation des profils de module :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:932 ++#: libdnf/module/ModulePackageContainer.cpp:938 + msgid "Disabling module profiles:\n" + msgstr "Désactivation des profils de module :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:947 ++#: libdnf/module/ModulePackageContainer.cpp:953 + msgid "Enabling module streams:\n" + msgstr "Activation des flux de modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:961 ++#: libdnf/module/ModulePackageContainer.cpp:967 + msgid "Switching module streams:\n" + msgstr "Basculement des flux de modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:979 ++#: libdnf/module/ModulePackageContainer.cpp:985 + msgid "Disabling modules:\n" + msgstr "Désactivation des modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:990 ++#: libdnf/module/ModulePackageContainer.cpp:996 + msgid "Resetting modules:\n" + msgstr "Réinitialisation des modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1704 ++#: libdnf/module/ModulePackageContainer.cpp:1710 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "Impossible de charger les données de sécurité à « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1710 ++#: libdnf/module/ModulePackageContainer.cpp:1716 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" +-msgstr "" +-"Impossible de charger les données de sécurité modulaires pour le module " +-"« %s : %s »" ++msgstr "Impossible de charger les données de sécurité modulaires pour le module « %s : %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1791 ++#: libdnf/module/ModulePackageContainer.cpp:1797 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" +-msgstr "" +-"Impossible de créer le dossier « %s » pour les données de sécurité " +-"modulaires : %s" ++msgstr "Impossible de créer le dossier « %s » pour les données de sécurité modulaires : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1807 ++#: libdnf/module/ModulePackageContainer.cpp:1813 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" +-msgstr "" +-"Impossible d’enregistrer les données de sécurité modulaires vers « %s »" ++msgstr "Impossible d’enregistrer les données de sécurité modulaires vers « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1830 ++#: libdnf/module/ModulePackageContainer.cpp:1836 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "Impossible de supprimer les données de sécurité modulaires dans « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1862 ++#: libdnf/module/ModulePackageContainer.cpp:1868 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " + "disabled" +-msgstr "" +-"Impossible d'appliquer les obsolètes modulaires à '%s:%s' car le module " +-"cible '%s' est désactivé" ++msgstr "Impossible d'appliquer les obsolètes modulaires à '%s:%s' car le module cible '%s' est désactivé" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format +@@ -959,8 +923,7 @@ msgstr "Échec de la résolution : %s" + #: libdnf/module/modulemd/ModuleMetadata.cpp:115 + #, c-format + msgid "There were errors while resolving modular defaults: %s" +-msgstr "" +-"Il y a eu des erreurs lors de la résolution des modulaires par défaut : %s" ++msgstr "Il y a eu des erreurs lors de la résolution des modulaires par défaut : %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:120 + #, c-format +@@ -975,9 +938,7 @@ msgstr "Échec de la mise à jour des flux : %s" + #: libdnf/module/modulemd/ModuleMetadata.cpp:221 + #, c-format + msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" +-msgstr "" +-"Impossible de récupérer les modules obsolètes car aucune correspondance de " +-"flux %s : %s" ++msgstr "Impossible de récupérer les modules obsolètes car aucune correspondance de flux %s : %s" + + #: libdnf/plugin/plugin.cpp:46 + #, c-format +@@ -1002,8 +963,7 @@ msgstr "Extension chargée, nom=« %s », version=« %s »" + + #: libdnf/plugin/plugin.cpp:96 + msgid "Plugins::loadPlugins() dirPath cannot be empty" +-msgstr "" +-"Le chemin du dossier (dirPath) Plugins::loadPlugins() ne peut pas être vide" ++msgstr "Le chemin du dossier (dirPath) Plugins::loadPlugins() ne peut pas être vide" + + #: libdnf/plugin/plugin.cpp:105 + #, c-format +@@ -1020,10 +980,7 @@ msgid "" + "Using '==' operator in reldeps can result in an undefined behavior. It is " + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." +-msgstr "" +-"L’utilisation de l’opérateur « == » dans reldeps peut entraîner un " +-"comportement indéfini. Il est déprécié et le support sera abandonné dans les " +-"prochaines versions. Utilisez plutôt l’opérateur « = »." ++msgstr "L’utilisation de l’opérateur « == » dans reldeps peut entraîner un comportement indéfini. Il est déprécié et le support sera abandonné dans les prochaines versions. Utilisez plutôt l’opérateur « = »." + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -1033,8 +990,7 @@ msgstr "Le dépôt %s n’a pas de miroir ou d’adresse de base." + #: libdnf/repo/Repo.cpp:330 + #, c-format + msgid "Repository '%s' has unsupported type: 'type=%s', skipping." +-msgstr "" +-"Le dépôt « %s » n’a pas de type pris en charge : « type=%s », passer outre." ++msgstr "Le dépôt « %s » n’a pas de type pris en charge : « type=%s », passer outre." + + #: libdnf/repo/Repo.cpp:491 libdnf/repo/Repo.cpp:612 libdnf/repo/Repo.cpp:643 + #: libdnf/repo/Repo.cpp:1407 +@@ -1046,9 +1002,7 @@ msgstr "repo '%s' : 'basecachedir' n'est pas fixé" + msgid "" + "Maximum download speed is lower than minimum. Please change configuration of " + "minrate or throttle" +-msgstr "" +-"La vitesse de téléchargement maximale est plus basse que le minimum. " +-"Veuillez modifier les paramètres minrate ou throttle" ++msgstr "La vitesse de téléchargement maximale est plus basse que le minimum. Veuillez modifier les paramètres minrate ou throttle" + + #: libdnf/repo/Repo.cpp:548 + #, c-format +@@ -1057,9 +1011,7 @@ msgstr "repo '%s' : 'proxy_username' est défini mais pas 'proxy_password'" + + #: libdnf/repo/Repo.cpp:550 + msgid "'proxy_username' is set but not 'proxy_password'" +-msgstr "" +-"Le nom d'utilisateur \"proxy_username\" est défini mais pas le mot de passe " +-"\"proxy_password\"" ++msgstr "Le nom d'utilisateur \"proxy_username\" est défini mais pas le mot de passe \"proxy_password\"" + + #: libdnf/repo/Repo.cpp:631 + #, c-format +@@ -1130,9 +1082,7 @@ msgstr "relance : échec pour « %s », la somme de %s ne correspond pas." + #: libdnf/repo/Repo.cpp:1231 + #, c-format + msgid "reviving: '%s' can be revived - metalink checksums match." +-msgstr "" +-"relance : « %s » peut être relancé - la somme de contrôle du méta-lien " +-"correspond." ++msgstr "relance : « %s » peut être relancé - la somme de contrôle du méta-lien correspond." + + #: libdnf/repo/Repo.cpp:1260 + #, c-format +@@ -1190,9 +1140,7 @@ msgstr "Impossible de créer le dossier persistant « %s » : %s" + + #: libdnf/repo/Repo.cpp:1800 + msgid "resume cannot be used simultaneously with the byterangestart param" +-msgstr "" +-"« resume » (reprise) ne peut pas être utilisé avec le paramètre " +-"byterangestart" ++msgstr "« resume » (reprise) ne peut pas être utilisé avec le paramètre byterangestart" + + #: libdnf/repo/Repo.cpp:1817 + #, c-format +@@ -1225,25 +1173,19 @@ msgstr "Aucune transaction n’est en cours" + + #: libdnf/transaction/TransactionItem.cpp:146 + msgid "Attempt to insert transaction item into completed transaction" +-msgstr "" +-"Tentative d’insérer un élément de transaction dans une transaction achevée" ++msgstr "Tentative d’insérer un élément de transaction dans une transaction achevée" + + #: libdnf/transaction/TransactionItem.cpp:217 + msgid "Attempt to update transaction item in completed transaction" +-msgstr "" +-"Tentative de mettre à jour un élément de transaction dans une transaction " +-"achevée" ++msgstr "Tentative de mettre à jour un élément de transaction dans une transaction achevée" + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" +-msgstr "" +-"Base de données corrompue : ligne « version » manquante dans le tableau " +-"« config »" ++msgstr "Base de données corrompue : ligne « version » manquante dans le tableau « config »" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +-msgstr "" +-"Transformer : n’a pu ouvrir le répertoire de persistance de l’historique" ++msgstr "Transformer : n’a pu ouvrir le répertoire de persistance de l’historique" + + #: libdnf/transaction/Transformer.cpp:694 + msgid "Couldn't find a history database" +@@ -1260,8 +1202,115 @@ msgstr "L’état du TransactionItem n’est pas défini : %s" + + #: libdnf/transaction/private/Transaction.cpp:243 + msgid "Can't add console output to unsaved transaction" +-msgstr "" +-"Ne peut pas ajouter une sortie de console à une transaction non enregistrée" ++msgstr "Ne peut pas ajouter une sortie de console à une transaction non enregistrée" ++ ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " n’appartient pas à un dépôt distupgrade" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " a une architecture inférieure" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "le paquet %s a été filtré par filtrage modulaire" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "le paquet %s n’a pas d’architecture compatible" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "le paquet %s n’est pas installable" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "le paquet %s a été filtré en excluant le filtrage" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "rien de fournit %s rendu nécessaire par %s" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "installation impossible à la fois de %s et %s" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "le paquet %s est en conflit avec %s fourni par %s" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "le paquet %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "le paquet installé %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "le paquet %s rend implicitement obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "" ++#~ "le paquet %s nécessite %s, mais aucun fournisseur ne peut être installé" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "le paquet %s est en conflit avec %s fourni par lui-même" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "à la fois le paquet %s et %s rendent obsolète %s" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "le module %s est désactivé" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "le module %s n’a pas d’architecture compatible" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "le module %s n’est pas installable" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "rien de fournit %s rendu nécessaire par le module %s" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "installation impossible à la fois des modules %s et %s" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "le module %s est en conflit avec %s fourni par %s" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "le module %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "le module installé %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "le module %s rend implicitement obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "" ++#~ "le module %s nécessite %s, mais aucun fournisseur ne peut être installé" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "le module %s est en conflit avec %s fourni par lui-même" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "à la fois le module %s et %s rendent obsolète %s" + + #~ msgid "failed to add solv" + #~ msgstr "n’a pu ajouter solv" +@@ -1281,5 +1330,3 @@ msgstr "" + #~ msgid "Failed to parse module artifact NEVRA '%s'" + #~ msgstr "Échec de l'analyse de l'artefact de module '%s'" + +-#~ msgid "Bad id for repo: %s, byte = %s %d" +-#~ msgstr "ID erroné pour le dépôt : %s, byte = %s %d" +diff --git a/po/ja.po b/po/ja.po +index f16abcb2..332bd4fa 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -7,7 +7,7 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:24+0100\n" ++"POT-Creation-Date: 2023-08-29 13:26+0200\n" + "PO-Revision-Date: 2023-03-07 14:20+0000\n" + "Last-Translator: Transtats \n" + "Language-Team: Japanese ' command. After you " + "reset the module, you can install the other stream." +-msgstr "" +-"有効化されたモジュールのストリームの切り替えはできません。\n" +-"モジュールからすべてのインストールされたコンテンツを削除し、'microdnf module " +-"reset ' コマンドを使用してモジュールをリセットすることを推奨しま" +-"す。モジュールのリセット後に、別のストリームをインストールできます。" ++msgstr "有効化されたモジュールのストリームの切り替えはできません。\n" ++"モジュールからすべてのインストールされたコンテンツを削除し、'microdnf module reset ' コマンドを使用してモジュールをリセットすることを推奨します。モジュールのリセット後に、別のストリームをインストールできます。" + + #: libdnf/dnf-goal.cpp:107 + msgid "Could not depsolve transaction; " +@@ -269,9 +255,7 @@ msgstr " 問題: %s\n" + msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" +-msgstr "" +-"モジュラーパッケージ '%s' のモジュラーメタデータは利用不可です; システムにイ" +-"ンストールはできません" ++msgstr "モジュラーパッケージ '%s' のモジュラーメタデータは利用不可です; システムにインストールはできません" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -310,8 +294,7 @@ msgstr "トランザクションの実行中にエラーが発生しました: % + + #: libdnf/dnf-rpmts.cpp:283 + msgid "Error running transaction and no problems were reported!" +-msgstr "" +-"トランザクションの実行中にエラーが発生しましたが、問題は報告されませんでした!" ++msgstr "トランザクションの実行中にエラーが発生しましたが、問題は報告されませんでした!" + + #: libdnf/dnf-rpmts.cpp:346 + msgid "Fatal error, run database recovery" +@@ -359,9 +342,7 @@ msgstr "tmp ファイルを開くことに失敗しました: %s" + #: libdnf/dnf-sack.cpp:550 + #, c-format + msgid "While writing primary cache %s repowriter write failed: %i, error: %s" +-msgstr "" +-"プライマリーキャッシュの %s repowriter 書き込み中に %i エラーが発生しました。" +-"エラー: %s" ++msgstr "プライマリーキャッシュの %s repowriter 書き込み中に %i エラーが発生しました。エラー: %s" + + #: libdnf/dnf-sack.cpp:560 + #, c-format +@@ -387,9 +368,7 @@ msgstr "一時ファイル %s を作成できません" + #, c-format + msgid "" + "While writing extension cache %s (%d): repowriter write failed: %i, error: %s" +-msgstr "" +-"拡張キャッシュ %s (%d) の書き込み中: repowriter の書き込みに失敗: %i、エ" +-"ラー: %s" ++msgstr "拡張キャッシュ %s (%d) の書き込み中: repowriter の書き込みに失敗: %i、エラー: %s" + + #: libdnf/dnf-sack.cpp:676 + #, c-format +@@ -489,9 +468,7 @@ msgstr "パッケージ %s を確実にしようとする場合、ソースは + #: libdnf/dnf-transaction.cpp:328 + #, c-format + msgid "Failed to ensure %1$s as repo %2$s not found(%3$i repos loaded)" +-msgstr "" +-"repo %2$s が見つからないため、%1$s を確実にすることに失敗しました (%3$i repo " +-"はロード済み)" ++msgstr "repo %2$s が見つからないため、%1$s を確実にすることに失敗しました (%3$i repo はロード済み)" + + #: libdnf/dnf-transaction.cpp:369 + msgid "Failed to check untrusted: " +@@ -505,8 +482,7 @@ msgstr "%s にダウンロードしたファイルが見つかりませんでし + #: libdnf/dnf-transaction.cpp:399 + #, c-format + msgid "package %1$s cannot be verified and repo %2$s is GPG enabled: %3$s" +-msgstr "" +-"パッケージ %1$s は確認できず、repo %2$s は GPG が有効になっています: %3$s" ++msgstr "パッケージ %1$s は確認できず、repo %2$s は GPG が有効になっています: %3$s" + + #: libdnf/dnf-transaction.cpp:833 libdnf/dnf-transaction.cpp:905 + msgid "Failed to get value for CacheDir" +@@ -525,8 +501,7 @@ msgstr "%s に filesystem をフリーサイズで取得することに失敗し + #: libdnf/dnf-transaction.cpp:937 + #, c-format + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" +-msgstr "" +-"%1$s に十分なスペースがありません: %2$s 必要で、利用可能なのは %3$s です" ++msgstr "%1$s に十分なスペースがありません: %2$s 必要で、利用可能なのは %3$s です" + + #: libdnf/dnf-transaction.cpp:1196 + msgid "failed to set root" +@@ -554,9 +529,7 @@ msgstr "トランザクションの実行中にエラー %i" + #: libdnf/dnf-transaction.cpp:1480 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" +-msgstr "" +-"トランザクションは書き込みフェーズまで行きませんでしたが、エラー(%i) は返しま" +-"せんでした" ++msgstr "トランザクションは書き込みフェーズまで行きませんでしたが、エラー(%i) は返しませんでした" + + #: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format +@@ -576,13 +549,15 @@ msgstr "不適格な Selector、フィルター内に複数の一致するオブ + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "操作に使用される不適格な Selector、間違った比較タイプ" + +-#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 +-msgid " does not belong to a distupgrade repository" +-msgstr " はdistupgradeレポジトリーに属していません" ++#: libdnf/goal/Goal.cpp:90 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s の %s はdistupgradeレポジトリーに属していません" + +-#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 +-msgid " has inferior architecture" +-msgstr " は下位アーキテクチャがあります" ++#: libdnf/goal/Goal.cpp:91 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s の %s は下位アーキテクチャがあります" + + #: libdnf/goal/Goal.cpp:92 + msgid "problem with installed package " +@@ -623,72 +598,79 @@ msgstr "ジョブの最良アップデート候補をインストールできま + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "パッケージ %s はモジュラーフィルタリングに一致しません" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "%s のパッケージ %s はモジュラーフィルタリングに一致しません" + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "パッケージ %s は互換性のあるアーキテクチャーがありません" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "%s のパッケージ %s は互換性のあるアーキテクチャーがありません" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s is not installable" +-msgstr "パッケージ %s はインストール不可です" ++msgid "package %s from %s is not installable" ++msgstr "%s のパッケージ %s はインストール不可です" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "パッケージ %s は除外フィルタリングに一致しません" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "%s のパッケージ %s は除外フィルタリングに一致しません" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "%s が提供されません %s に必要です" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "%s が提供されません。%s の %s に必要です" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "%s と %s どちらもインストールできません" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "%s の %s および %s の %s の両方をインストールすることはできません" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "パッケージ %s は %s と競合しています。これは %s により提供されます" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "%s のパッケージ %s は、%s の %s で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "パッケージ %s は %s を廃止しました。これは %s により提供されます" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "%s のパッケージ %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "" +-"インストール済パッケージ %s は %s を廃止しました。これは %s により提供されま" +-"す" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "インストール済パッケージ %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:110 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "パッケージ %s は %s を暗に廃止しました。これは %s により提供されます" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "%s のパッケージ %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:111 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "" +-"パッケージ %s には %s が必要ですが、どのプロバイダーからもインストールできま" +-"せん" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" ++msgstr "%s のパッケージ %s には、%s が必要ですが、どのプロバイダーからもインストールできません" + + #: libdnf/goal/Goal.cpp:112 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "パッケージ %s は自己提供される %s と競合しています" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "%s のパッケージ %s は、自身で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:113 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "パッケージ %s と %s 両方は %s を廃止しました" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "%s の %s パッケージと %s の %s パッケージにより、%s が廃止されました" ++ ++#: libdnf/goal/Goal.cpp:117 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s の %s は distupgrade レポジトリーに属していません" ++ ++#: libdnf/goal/Goal.cpp:118 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s の %s には、下位アーキテクチャーがあります" + + #: libdnf/goal/Goal.cpp:119 + msgid "problem with installed module " +@@ -705,104 +687,101 @@ msgstr "モジュールの最良アップデート候補をインストールで + + #: libdnf/goal/Goal.cpp:128 libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s is disabled" +-msgstr "モジュール %s は無効です" ++msgid "module %s from %s is disabled" ++msgstr "%s のモジュール %s が無効になっています" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "モジュール %s は互換性のあるアーキテクチャーがありません" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "%s のモジュール %s には、互換性のあるアーキテクチャーがありません" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s is not installable" +-msgstr "モジュール %s はインストール不可です" ++msgid "module %s from %s is not installable" ++msgstr "%s のモジュール %s はインストール不可です" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "%s が提供されませんモジュール %s に必要です" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "%s のモジュール %s が必要な %s は何も提供されません" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "モジュール %s と %s どちらもインストールできません" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "%s の %s および %s の %s の両方のモジュールをインストールすることはできません" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "モジュール %s は %s と競合しています。これは %s により提供されます" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "%s のモジュール %s は、%s の %s で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "モジュール %s は %s を廃止しました。これは %s により提供されます" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "%s のモジュール %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "" +-"インストール済モジュール %s は %s を廃止しました。これは %s により提供されま" +-"す" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "インストール済モジュール %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:137 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "モジュール %s は %s を暗に廃止しました。これは %s により提供されます" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "%s のモジュール %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:138 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "" +-"モジュール %s には %s が必要ですが、どのプロバイダーからもインストールできま" +-"せん" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" ++msgstr "%s のモジュール %s には、%s が必要ですが、どのプロバイダーからもインストールできません" + + #: libdnf/goal/Goal.cpp:139 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "モジュール %s は自己提供される %s と競合しています" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "%s のモジュール %s は、自身で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:140 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "モジュール %s と %s 両方は %s を廃止しました" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "%s の %s モジュールと %s の %s モジュールの両方により、%s が廃止されました" + +-#: libdnf/goal/Goal.cpp:1157 ++#: libdnf/goal/Goal.cpp:1168 + msgid "no solver set" + msgstr "設定されたソルバーはありません" + +-#: libdnf/goal/Goal.cpp:1162 ++#: libdnf/goal/Goal.cpp:1173 + #, c-format + msgid "failed to make %s absolute" + msgstr "%s を絶対的にすることに失敗しました" + +-#: libdnf/goal/Goal.cpp:1169 ++#: libdnf/goal/Goal.cpp:1180 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "debugdata を %1$s へ書き込むことに失敗しました: %2$s" + +-#: libdnf/goal/Goal.cpp:1181 ++#: libdnf/goal/Goal.cpp:1192 + msgid "no solv in the goal" + msgstr "目標に solv がありません" + +-#: libdnf/goal/Goal.cpp:1183 ++#: libdnf/goal/Goal.cpp:1194 + msgid "no solution, cannot remove protected package" + msgstr "ソリューションがなく、保護されたパッケージを削除できません" + +-#: libdnf/goal/Goal.cpp:1186 ++#: libdnf/goal/Goal.cpp:1197 + msgid "no solution possible" + msgstr "可能なソリューションがありません" + +-#: libdnf/goal/Goal.cpp:1312 ++#: libdnf/goal/Goal.cpp:1323 + msgid "Problem: " + msgstr "問題: " + +-#: libdnf/goal/Goal.cpp:1317 ++#: libdnf/goal/Goal.cpp:1328 + #, c-format + msgid "Problem %d: " + msgstr "問題 %d: " + +-#: libdnf/goal/Goal.cpp:1650 ++#: libdnf/goal/Goal.cpp:1661 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "操作は結果的に以下の保護されたパッケージを削除します: " +@@ -864,70 +843,66 @@ msgstr "有効な Platform ID が検出されませんでした" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "モジュール '%s' の複数ストリームを有効化できません" + +-#: libdnf/module/ModulePackageContainer.cpp:346 ++#: libdnf/module/ModulePackageContainer.cpp:339 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "repo '%s' のデフォルトが競合: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:917 ++#: libdnf/module/ModulePackageContainer.cpp:923 + msgid "Installing module profiles:\n" + msgstr "モジュールプロファイルのインストール中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:932 ++#: libdnf/module/ModulePackageContainer.cpp:938 + msgid "Disabling module profiles:\n" + msgstr "モジュールプロファイルの無効化中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:947 ++#: libdnf/module/ModulePackageContainer.cpp:953 + msgid "Enabling module streams:\n" + msgstr "モジュールストリームの有効化中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:961 ++#: libdnf/module/ModulePackageContainer.cpp:967 + msgid "Switching module streams:\n" + msgstr "モジュールストリームの切り替え中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:979 ++#: libdnf/module/ModulePackageContainer.cpp:985 + msgid "Disabling modules:\n" + msgstr "モジュールの無効化:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:990 ++#: libdnf/module/ModulePackageContainer.cpp:996 + msgid "Resetting modules:\n" + msgstr "モジュールの再設定中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1704 ++#: libdnf/module/ModulePackageContainer.cpp:1710 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータをロードできません" + +-#: libdnf/module/ModulePackageContainer.cpp:1710 ++#: libdnf/module/ModulePackageContainer.cpp:1716 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "モジュール '%s:%s' のモジュラーフェイルセーフデータをロードできません" + +-#: libdnf/module/ModulePackageContainer.cpp:1791 ++#: libdnf/module/ModulePackageContainer.cpp:1797 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" +-msgstr "" +-"ディレクトリー \"%s\" を作成できません。対象モジュラーフェイルセーフデータ: " +-"%s" ++msgstr "ディレクトリー \"%s\" を作成できません。対象モジュラーフェイルセーフデータ: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1807 ++#: libdnf/module/ModulePackageContainer.cpp:1813 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータを保存できません" + +-#: libdnf/module/ModulePackageContainer.cpp:1830 ++#: libdnf/module/ModulePackageContainer.cpp:1836 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータを削除できません" + +-#: libdnf/module/ModulePackageContainer.cpp:1862 ++#: libdnf/module/ModulePackageContainer.cpp:1868 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " + "disabled" +-msgstr "" +-"ターゲットモジュール '%s' が無効であるため、モジュラーの廃止を '%s:%s' に適用" +-"できません" ++msgstr "ターゲットモジュール '%s' が無効であるため、モジュラーの廃止を '%s:%s' に適用できません" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format +@@ -957,8 +932,7 @@ msgstr "ストリームのアップグレードに失敗しました: %s" + #: libdnf/module/modulemd/ModuleMetadata.cpp:221 + #, c-format + msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" +-msgstr "" +-"%s に一致するストリームがないため、モジュールの廃止を取得できません: %s" ++msgstr "%s に一致するストリームがないため、モジュールの廃止を取得できません: %s" + + #: libdnf/plugin/plugin.cpp:46 + #, c-format +@@ -1000,10 +974,7 @@ msgid "" + "Using '==' operator in reldeps can result in an undefined behavior. It is " + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." +-msgstr "" +-"reldeps で '==' 演算子を使用すると、未定義の動作が発生する可能性があります。" +-"これは非推奨で、将来のバージョンではサポートされなくなります。代わりに '=' 演" +-"算子を使用してください。" ++msgstr "reldeps で '==' 演算子を使用すると、未定義の動作が発生する可能性があります。これは非推奨で、将来のバージョンではサポートされなくなります。代わりに '=' 演算子を使用してください。" + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -1013,9 +984,7 @@ msgstr "リポジトリー %s にはミラーまたは baseurl セットがあ + #: libdnf/repo/Repo.cpp:330 + #, c-format + msgid "Repository '%s' has unsupported type: 'type=%s', skipping." +-msgstr "" +-"リポジトリー '%s' にはサポートされていないタイプがあります: 'type=%s'、スキッ" +-"ピング。" ++msgstr "リポジトリー '%s' にはサポートされていないタイプがあります: 'type=%s'、スキッピング。" + + #: libdnf/repo/Repo.cpp:491 libdnf/repo/Repo.cpp:612 libdnf/repo/Repo.cpp:643 + #: libdnf/repo/Repo.cpp:1407 +@@ -1027,21 +996,16 @@ msgstr "repo '%s': 'basecachedir' が設定されていません" + msgid "" + "Maximum download speed is lower than minimum. Please change configuration of " + "minrate or throttle" +-msgstr "" +-"ダウンロードの最高速度は、最低速度よりも低いです。minrate またはスロットルの" +-"設定を変更してください" ++msgstr "ダウンロードの最高速度は、最低速度よりも低いです。minrate またはスロットルの設定を変更してください" + + #: libdnf/repo/Repo.cpp:548 + #, c-format + msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" +-msgstr "" +-"repo '%s': 'proxy_username' は設定済みですが、'proxy_password' は設定されてい" +-"ません" ++msgstr "repo '%s': 'proxy_username' は設定済みですが、'proxy_password' は設定されていません" + + #: libdnf/repo/Repo.cpp:550 + msgid "'proxy_username' is set but not 'proxy_password'" +-msgstr "" +-"'proxy_username' は設定済みですが、'proxy_password' は設定されていません" ++msgstr "'proxy_username' は設定済みですが、'proxy_password' は設定されていません" + + #: libdnf/repo/Repo.cpp:631 + #, c-format +@@ -1102,8 +1066,7 @@ msgstr "復元中: repo '%s' はスキップされました、metalink はあり + #: libdnf/repo/Repo.cpp:1202 + #, c-format + msgid "reviving: repo '%s' skipped, no usable hash." +-msgstr "" +-"復元中: repo '%s' はスキップされました、使用可能なハッシュはありません。" ++msgstr "復元中: repo '%s' はスキップされました、使用可能なハッシュはありません。" + + #: libdnf/repo/Repo.cpp:1225 + #, c-format +@@ -1148,8 +1111,7 @@ msgstr "repo: キャッシュを使用: %s" + #: libdnf/repo/Repo.cpp:1358 + #, c-format + msgid "Cache-only enabled but no cache for '%s'" +-msgstr "" +-"キャッシュオンリーが有効になっていますが、'%s' に対するキャッシュはありません" ++msgstr "キャッシュオンリーが有効になっていますが、'%s' に対するキャッシュはありません" + + #: libdnf/repo/Repo.cpp:1362 + #, c-format +@@ -1213,8 +1175,7 @@ msgstr "完了したトランザクションにトランザクションアイテ + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" +-msgstr "" +-"データベースが破損しています。テーブル 'config' の行 'version' がありません" ++msgstr "データベースが破損しています。テーブル 'config' の行 'version' がありません" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +@@ -1237,6 +1198,122 @@ msgstr "TransactionItem の状態は設定されていません: %s" + msgid "Can't add console output to unsaved transaction" + msgstr "未保存のトランザクションにコンソールの出力を追加できません" + ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " はdistupgradeレポジトリーに属していません" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " は下位アーキテクチャがあります" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "パッケージ %s はモジュラーフィルタリングに一致しません" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "パッケージ %s は互換性のあるアーキテクチャーがありません" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "パッケージ %s はインストール不可です" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "パッケージ %s は除外フィルタリングに一致しません" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "%s が提供されません %s に必要です" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "%s と %s どちらもインストールできません" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "パッケージ %s は %s と競合しています。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "パッケージ %s は %s を廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "" ++#~ "インストール済パッケージ %s は %s を廃止しました。これは %s により提供され" ++#~ "ます" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "" ++#~ "パッケージ %s は %s を暗に廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "" ++#~ "パッケージ %s には %s が必要ですが、どのプロバイダーからもインストールでき" ++#~ "ません" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "パッケージ %s は自己提供される %s と競合しています" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "パッケージ %s と %s 両方は %s を廃止しました" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "モジュール %s は無効です" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "モジュール %s は互換性のあるアーキテクチャーがありません" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "モジュール %s はインストール不可です" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "%s が提供されませんモジュール %s に必要です" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "モジュール %s と %s どちらもインストールできません" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "モジュール %s は %s と競合しています。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "モジュール %s は %s を廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "" ++#~ "インストール済モジュール %s は %s を廃止しました。これは %s により提供され" ++#~ "ます" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "" ++#~ "モジュール %s は %s を暗に廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "" ++#~ "モジュール %s には %s が必要ですが、どのプロバイダーからもインストールでき" ++#~ "ません" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "モジュール %s は自己提供される %s と競合しています" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "モジュール %s と %s 両方は %s を廃止しました" ++ + #~ msgid "failed to add solv" + #~ msgstr "solv の追加に失敗しました" + +@@ -1256,5 +1333,3 @@ msgstr "未保存のトランザクションにコンソールの出力を追加 + #~ msgid "Failed to parse module artifact NEVRA '%s'" + #~ msgstr "モジュールアーティファクト NEVRA '%s' の解析に失敗しました" + +-#~ msgid "Bad id for repo: %s, byte = %s %d" +-#~ msgstr "repo に対する不正な id: %s, byte = %s %d" +diff --git a/po/ko.po b/po/ko.po +index 04ed2363..8db8173e 100644 +--- a/po/ko.po ++++ b/po/ko.po +@@ -9,7 +9,7 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:24+0100\n" ++"POT-Creation-Date: 2023-08-29 13:26+0200\n" + "PO-Revision-Date: 2023-03-02 22:20+0000\n" + "Last-Translator: 김인수 \n" + "Language-Team: Korean ' command. After you " + "reset the module, you can install the other stream." +-msgstr "" +-"활성화된 모듈 스트림을 전환 할 수 없습니다.\n" +-"설치된 모든 내용을 모듈에서 제거하고 ‘' 명령을 사용하여 모듈을 " +-"재설정하는 것이 좋습니다. 모듈을 재설정한 후, 다른 스트림을 설치 할 수 있습니" +-"다." ++msgstr "활성화된 모듈 스트림을 전환 할 수 없습니다.\n" ++"설치된 모든 내용을 모듈에서 제거하고 ‘' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후, 다른 스트림을 설치 할 수 있습니다." + + #: libdnf/dnf-goal.cpp:107 + msgid "Could not depsolve transaction; " +@@ -264,9 +257,7 @@ msgstr " 문제: %s\n" + msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" +-msgstr "" +-"모듈러 꾸러미 '%s'에 사용 가능한 모듈러 메타데이터가 없으며; 시스템에 설치 " +-"할 수 없습니다" ++msgstr "모듈러 패키지 '%s'에 사용 가능한 모듈러 메타데이터가 없으며; 시스템에 설치 할 수 없습니다" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -305,8 +296,7 @@ msgstr "연결 실행 오류 : %s" + + #: libdnf/dnf-rpmts.cpp:283 + msgid "Error running transaction and no problems were reported!" +-msgstr "" +-"연결을 실행하는 중 오류가 발생했으며 아무런 문제도 보고되지 않았습니다!" ++msgstr "연결을 실행하는 중 오류가 발생했으며 아무런 문제도 보고되지 않았습니다!" + + #: libdnf/dnf-rpmts.cpp:346 + msgid "Fatal error, run database recovery" +@@ -315,7 +305,7 @@ msgstr "치명적인 오류, 데이터베이스 복구 실행" + #: libdnf/dnf-rpmts.cpp:355 + #, c-format + msgid "failed to find package %s" +-msgstr "꾸러미를 찾지 못했습니다. %s" ++msgstr " 패키지를 찾지 못했습니다. %s" + + #: libdnf/dnf-rpmts.cpp:401 + #, c-format +@@ -475,7 +465,7 @@ msgstr "이미 100 %% 상태 [%s]" + #: libdnf/dnf-transaction.cpp:302 + #, c-format + msgid "Sources not set when trying to ensure package %s" +-msgstr "꾸러미 %s를 확인 하려고 할 때 원천이 설정되지 않았습니다" ++msgstr " 패키지 %s를 확인 하려고 할 때 원천이 설정되지 않았습니다" + + #: libdnf/dnf-transaction.cpp:328 + #, c-format +@@ -494,7 +484,7 @@ msgstr "에 대한 내려받기 파일 %s 찾을 수 없음" + #: libdnf/dnf-transaction.cpp:399 + #, c-format + msgid "package %1$s cannot be verified and repo %2$s is GPG enabled: %3$s" +-msgstr "꾸러미 %1$s 확인 및 복구 할 수 없습니다. %2$s GPG 사용 설정 됨 : %3$s" ++msgstr " 패키지 %1$s 확인 및 복구 할 수 없습니다. %2$s GPG 사용 설정 됨 : %3$s" + + #: libdnf/dnf-transaction.cpp:833 libdnf/dnf-transaction.cpp:905 + msgid "Failed to get value for CacheDir" +@@ -561,17 +551,19 @@ msgstr "잘못된 형식의 선택기, 필터에 일치하는 개체가 여러 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "조작에 잘못 형성된 선택자, 잘못된 비교 유형" + +-#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 +-msgid " does not belong to a distupgrade repository" +-msgstr " distupgrade 저장소에 속하지 않습니다" ++#: libdnf/goal/Goal.cpp:90 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s (%s에서)은/는 distupgrade 저장소에 속하지 않습니다" + +-#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 +-msgid " has inferior architecture" +-msgstr " 하위 구조" ++#: libdnf/goal/Goal.cpp:91 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s (%s에서)은/는 하위 아키텍처" + + #: libdnf/goal/Goal.cpp:92 + msgid "problem with installed package " +-msgstr "설치된 꾸러미 문제 " ++msgstr "설치된 패키지 문제 " + + #: libdnf/goal/Goal.cpp:93 libdnf/goal/Goal.cpp:120 + msgid "conflicting requests" +@@ -588,7 +580,7 @@ msgstr "요청이 없습니다 " + #: libdnf/goal/Goal.cpp:96 + #, c-format + msgid "package %s does not exist" +-msgstr "꾸러미 %s가 존재하지 않습니다" ++msgstr " 패키지 %s가 존재하지 않습니다" + + #: libdnf/goal/Goal.cpp:97 libdnf/goal/Goal.cpp:124 + msgid " is provided by the system" +@@ -600,7 +592,7 @@ msgstr "종속성 문제" + + #: libdnf/goal/Goal.cpp:99 + msgid "cannot install the best update candidate for package " +-msgstr "꾸러미에 가장 적합한 최신화 선택을 설치 할 수 없습니다 " ++msgstr " 패키지에 가장 적합한 최신화 선택을 설치 할 수 없습니다 " + + #: libdnf/goal/Goal.cpp:100 libdnf/goal/Goal.cpp:127 + msgid "cannot install the best candidate for the job" +@@ -608,68 +600,79 @@ msgstr "작업에 가장 적합한 선택을 설치 할 수 없습니다" + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "꾸러미 %s가 모듈식으로 걸러 제거됩니다" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "패키지 %s (%s에서)가 모듈식 필터링에 의해 필터링됩니다." + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "꾸러미 %s에 호환 구조가 없습니다" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "패키지 %s (%s에서)에 호환되는 구조가 없습니다" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s is not installable" +-msgstr "꾸러미 %s 가 설치 할 수 없습니다" ++msgid "package %s from %s is not installable" ++msgstr "패키지 %s (%s에서)를 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "꾸러미 %s가 걸러지는 것에서 제외되었습니다" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "패키지 %s (%s에서)가 제외 필터링을 통해 필터링됩니다" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "%s에 필요한 %s가 제공되지 않았습니다" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "%s (%s에서)에 필요한 %s이 제공되지 않습니다" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "%s 와 %s 모두 설치 할 수 없습니다" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "%s (%s에서) 및 %s (%s에서) 모두 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "꾸러미 %s은 %s에서 제공된 %s와 충돌합니다" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "패키지 %s (%s에서)가 %s (%s에서)에 의해 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "꾸러미 %s가 %s에의해 제공된 %s를 폐기합니다" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "패키지 %s (%s에서)가 %s (%s에서)에 의해 제공된 %s를 폐기합니다" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "설치된 꾸러미 %s는 %s에 의해 %s 폐기되었습니다" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "설치된 패키지 %s가 %s (%s에서)에 의해 제공된 %s를 폐기합니다" + + #: libdnf/goal/Goal.cpp:110 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "꾸러미 %s가 %s에 의해 %s가 암시적으로 폐기되었습니다" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "패키지 %s (%s에서)가 %s (%s에서)에 의해 제공된 %s를 암시적으로 폐기합니다" + + #: libdnf/goal/Goal.cpp:111 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "꾸러미 %s는 %s가 필요하지만, 공급자가 없어 설치 할 수 없습니다" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" ++msgstr "패키지 %s (%s에서)는 %s이 필요하지만, 공급자가 없어 설치 할 수 없습니다" + + #: libdnf/goal/Goal.cpp:112 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "꾸러미 %s가 자체적으로 제공된 %s와 충돌합니다" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "패키지 %s (%s에서)가 자체적으로 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:113 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "꾸러미 %s 와 %s 는 모두 %s에서 폐기되었습니다" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "패키지 %s (%s에서) 및 %s (%s에서) 모두 %s을/를 폐기합니다" ++ ++#: libdnf/goal/Goal.cpp:117 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s (%s에서)은/는 distupgrade 저장소에 속하지 않습니다" ++ ++#: libdnf/goal/Goal.cpp:118 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s (%s에서)은/는 하위 아키텍처" + + #: libdnf/goal/Goal.cpp:119 + msgid "problem with installed module " +@@ -686,103 +689,104 @@ msgstr "모듈에 가장 적합한 최신화 추천을 설치 할 수 없습니 + + #: libdnf/goal/Goal.cpp:128 libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s is disabled" +-msgstr "모듈 %s를 사용할 수 없습니다" ++msgid "module %s from %s is disabled" ++msgstr "모듈 %s (%s에서)이/가 비활성화됨" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "모듈 %s 에 호환되는 구조가 없습니다" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "패키지 %s (%s에서)에 호환되는 아키텍처가 없습니다" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s is not installable" +-msgstr "모듈 %s 를 설치 할 수 없습니다" ++msgid "module %s from %s is not installable" ++msgstr "패키지 %s (%s에서)를 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "모듈 %s 에 필요한 %s 가 제공되지 않았습니다" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "%s (%s에서)에 필요한 %s이 제공되지 않습니다" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "모듈 %s 와 %s를 모두 설치 할 수 없습니다" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "모듈 %s (%s에서) 및 %s (%s에서) 모두 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "모듈 %s가 %s에 의해 제공된 %s와 충돌합니다" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "모듈 %s (%s에서)이 %s (%s에서)에 의해 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "모듈 %s가 %s에 의해 제공된 %s를 폐기하였습니다" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "모듈 %s (%s에서)이 %s (%s에서)에 의해 제공된 %s를 폐기합니다" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "설치된 모듈 %s 가 %s의해 제공된 %s를 폐기합니다" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "설치된 모듈 %s 가 %s의해 제공된 %s (%s에서)를 폐기합니다" + + #: libdnf/goal/Goal.cpp:137 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "모듈 %s가 %s 에 의해 %s를 암시적으로 폐기되었습니다" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "모듈 %s (%s에서)이 %s (%s에서)에 의해 제공된 %s를 암시적으로 폐기합니다" + + #: libdnf/goal/Goal.cpp:138 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "모듈 %s 에 %s 가 필요하지만 공급 업체가 없어 설치 할 수 없습니다" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" ++msgstr "모듈 %s (%s에서)은 %s이 필요하지만, 공급자가 없어 설치 할 수 없습니다" + + #: libdnf/goal/Goal.cpp:139 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "모듈 %s가 자체적으로 제공된 %s와 충돌합니다" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "모듈 %s (%s에서)이 (에서)에 의해 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:140 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "모듈 %s와 %s가 %s에서 폐기되었습니다" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "모듈 %s (%s에서) 및 %s (%s에서) 모두 %s을/를 폐기합니다" + +-#: libdnf/goal/Goal.cpp:1157 ++#: libdnf/goal/Goal.cpp:1168 + msgid "no solver set" + msgstr "solver 설정 없음" + +-#: libdnf/goal/Goal.cpp:1162 ++#: libdnf/goal/Goal.cpp:1173 + #, c-format + msgid "failed to make %s absolute" + msgstr "%s 절대값을 생성을 실패하였습니다" + +-#: libdnf/goal/Goal.cpp:1169 ++#: libdnf/goal/Goal.cpp:1180 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "%1$s: %2$s에 디버그자료 쓰기를 실패했습니다" + +-#: libdnf/goal/Goal.cpp:1181 ++#: libdnf/goal/Goal.cpp:1192 + msgid "no solv in the goal" + msgstr "목표에 solv가 없다" + +-#: libdnf/goal/Goal.cpp:1183 ++#: libdnf/goal/Goal.cpp:1194 + msgid "no solution, cannot remove protected package" +-msgstr "해결책 없음, 보호 된 꾸러미를 제거 할 수 없음" ++msgstr "해결책 없음, 보호 된 패키지를 제거 할 수 없음" + +-#: libdnf/goal/Goal.cpp:1186 ++#: libdnf/goal/Goal.cpp:1197 + msgid "no solution possible" + msgstr "해결책 없음" + +-#: libdnf/goal/Goal.cpp:1312 ++#: libdnf/goal/Goal.cpp:1323 + msgid "Problem: " + msgstr "문제: " + +-#: libdnf/goal/Goal.cpp:1317 ++#: libdnf/goal/Goal.cpp:1328 + #, c-format + msgid "Problem %d: " + msgstr "문제 %d: " + +-#: libdnf/goal/Goal.cpp:1650 ++#: libdnf/goal/Goal.cpp:1661 + msgid "" + "The operation would result in removing the following protected packages: " +-msgstr "이 작업으로 인해 다음과 같은 보호 꾸러미가 제거됩니다. " ++msgstr "이 작업으로 인해 다음과 같은 보호 패키지가 제거됩니다. " + + #: libdnf/hy-iutil.cpp:181 + #, c-format +@@ -816,11 +820,11 @@ msgstr "잘못된 형식의 기반 모듈: %s" + + #: libdnf/module/ModulePackage.cpp:619 + msgid "Multiple module platforms provided by available packages\n" +-msgstr "사용 가능한 꾸러미로 제공되는 다중 모듈 기반\n" ++msgstr "사용 가능한 패키지로 제공되는 다중 모듈 기반\n" + + #: libdnf/module/ModulePackage.cpp:632 + msgid "Multiple module platforms provided by installed packages\n" +-msgstr "설치된 꾸러미로 제공되는 다중 모듈 기반\n" ++msgstr "설치된 패키지로 제공되는 다중 모듈 기반\n" + + #: libdnf/module/ModulePackage.cpp:659 + #, c-format +@@ -841,68 +845,66 @@ msgstr "유효한 기반(Platform) ID가 없습니다" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "모듈 '%s’를 위해 다중 스트림을 활성화 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:346 ++#: libdnf/module/ModulePackageContainer.cpp:339 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "저장소 '%s: %s'와 기본 설정이 충돌합니다" + +-#: libdnf/module/ModulePackageContainer.cpp:917 ++#: libdnf/module/ModulePackageContainer.cpp:923 + msgid "Installing module profiles:\n" + msgstr "모듈 프로파일 설치:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:932 ++#: libdnf/module/ModulePackageContainer.cpp:938 + msgid "Disabling module profiles:\n" + msgstr "모듈 프로파일 비활성화:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:947 ++#: libdnf/module/ModulePackageContainer.cpp:953 + msgid "Enabling module streams:\n" + msgstr "모듈 스트림 활성화:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:961 ++#: libdnf/module/ModulePackageContainer.cpp:967 + msgid "Switching module streams:\n" + msgstr "모듈 스트림 전환:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:979 ++#: libdnf/module/ModulePackageContainer.cpp:985 + msgid "Disabling modules:\n" + msgstr "모듈 비활성화:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:990 ++#: libdnf/module/ModulePackageContainer.cpp:996 + msgid "Resetting modules:\n" + msgstr "모듈 재설정:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1704 ++#: libdnf/module/ModulePackageContainer.cpp:1710 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "'%s'에서 모듈식 Fail-Safe 자료를 적재 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1710 ++#: libdnf/module/ModulePackageContainer.cpp:1716 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "모듈 '%s:%s'에 대해 모듈식 Fail-Safe 자료를 적재 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1791 ++#: libdnf/module/ModulePackageContainer.cpp:1797 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" + msgstr "모듈식 Fail-Safe 데이터에 대한 “%s\" 디렉토리를 만들 수 없습니다: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1807 ++#: libdnf/module/ModulePackageContainer.cpp:1813 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "모듈식 Fail Safe 자료를 '%s'에 저장 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1830 ++#: libdnf/module/ModulePackageContainer.cpp:1836 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "'%s'에서 모듈식 Fail Safe 자료를 제거 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1862 ++#: libdnf/module/ModulePackageContainer.cpp:1868 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " + "disabled" +-msgstr "" +-"'%s:%s'에 사용되지 않는 모듈을 적용할 수 없습니다(대상 모듈 '%s'가 비활성화 " +-"되어 있기 때문에)" ++msgstr "'%s:%s'에 사용되지 않는 모듈을 적용할 수 없습니다(대상 모듈 '%s'가 비활성화 되어 있기 때문에)" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format +@@ -974,10 +976,7 @@ msgid "" + "Using '==' operator in reldeps can result in an undefined behavior. It is " + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." +-msgstr "" +-"reldeps에 '=='연산자를 사용하면 정의되지 않은 동작이 발생할 수 있습니다. 이 " +-"연산자는 더 이상 사용되지 않으며, 향후 버전에서는 지원이 중단됩니다. 대신 " +-"'=' 연산자를 사용하세요." ++msgstr "reldeps에 '=='연산자를 사용하면 정의되지 않은 동작이 발생할 수 있습니다. 이 연산자는 더 이상 사용되지 않으며, 향후 버전에서는 지원이 중단됩니다. 대신 '=' 연산자를 사용하세요." + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -999,15 +998,12 @@ msgstr "repo '%s': 'basecachedir가 구성되어 있지 않습니다" + msgid "" + "Maximum download speed is lower than minimum. Please change configuration of " + "minrate or throttle" +-msgstr "" +-"최대 내려받기 속도는 최저보다 낮습니다. 최저속도나 변환 환경구성을 변경해 주" +-"세요" ++msgstr "최대 내려받기 속도는 최저보다 낮습니다. 최저속도나 변환 환경구성을 변경해 주세요" + + #: libdnf/repo/Repo.cpp:548 + #, c-format + msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" +-msgstr "" +-"repo '%s': 'proxy_username' 는 구성되어 있지만 'proxy_password'가 없습니다" ++msgstr "repo '%s': 'proxy_username' 는 구성되어 있지만 'proxy_password'가 없습니다" + + #: libdnf/repo/Repo.cpp:550 + msgid "'proxy_username' is set but not 'proxy_password'" +@@ -1181,8 +1177,7 @@ msgstr "완료된 연결에서 연결 항목 최신화를 시도합니다" + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" +-msgstr "" +-"데이타베이스가 오염되었습니다: 테이블 'config'에 'version' 행이 없습니다" ++msgstr "데이타베이스가 오염되었습니다: 테이블 'config'에 'version' 행이 없습니다" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +@@ -1205,6 +1200,112 @@ msgstr "TransactionItem 상태가 설정되지 않았습니다. %s" + msgid "Can't add console output to unsaved transaction" + msgstr "저장되지 않은 연결에 콘솔 출력을 추가 할 수 없습니다" + ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " distupgrade 저장소에 속하지 않습니다" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " 하위 구조" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "꾸러미 %s가 모듈식으로 걸러 제거됩니다" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "꾸러미 %s에 호환 구조가 없습니다" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "꾸러미 %s 가 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "꾸러미 %s가 걸러지는 것에서 제외되었습니다" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "%s에 필요한 %s가 제공되지 않았습니다" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "%s 와 %s 모두 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "꾸러미 %s은 %s에서 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "꾸러미 %s가 %s에의해 제공된 %s를 폐기합니다" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "설치된 꾸러미 %s는 %s에 의해 %s 폐기되었습니다" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "꾸러미 %s가 %s에 의해 %s가 암시적으로 폐기되었습니다" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "꾸러미 %s는 %s가 필요하지만, 공급자가 없어 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "꾸러미 %s가 자체적으로 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "꾸러미 %s 와 %s 는 모두 %s에서 폐기되었습니다" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "모듈 %s를 사용할 수 없습니다" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "모듈 %s 에 호환되는 구조가 없습니다" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "모듈 %s 를 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "모듈 %s 에 필요한 %s 가 제공되지 않았습니다" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "모듈 %s 와 %s를 모두 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "모듈 %s가 %s에 의해 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "모듈 %s가 %s에 의해 제공된 %s를 폐기하였습니다" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "설치된 모듈 %s 가 %s의해 제공된 %s를 폐기합니다" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "모듈 %s가 %s 에 의해 %s를 암시적으로 폐기되었습니다" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "모듈 %s 에 %s 가 필요하지만 공급 업체가 없어 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "모듈 %s가 자체적으로 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "모듈 %s와 %s가 %s에서 폐기되었습니다" ++ + #~ msgid "failed to add solv" + #~ msgstr "solv를 추가하지 못했습니다" + +@@ -1220,5 +1321,3 @@ msgstr "저장되지 않은 연결에 콘솔 출력을 추가 할 수 없습니 + #~ msgid "repo_add_repomdxml/rpmmd() has failed." + #~ msgstr "repo_add_repomdxml/rpmmd() 실패하였습니다." + +-#~ msgid "Failed to parse module artifact NEVRA '%s'" +-#~ msgstr "모듈 artifact NERVE '%s' 구분 분석에 실패함" +diff --git a/po/zh_CN.po b/po/zh_CN.po +index 6ca03861..ebdeb6ba 100644 +--- a/po/zh_CN.po ++++ b/po/zh_CN.po +@@ -6,7 +6,7 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:24+0100\n" ++"POT-Creation-Date: 2023-08-29 13:26+0200\n" + "PO-Revision-Date: 2023-03-07 14:20+0000\n" + "Last-Translator: Transtats \n" + "Language-Team: Chinese (Simplified) ' command. After you " + "reset the module, you can install the other stream." +-msgstr "" +-"无法切换一个模块已启用的流。 \n" +-"推荐从模块中删除所有已安装的内容,使用 'microdnf module reset ' " +-"命令重置模块。在重置模块后就可以安装其他流。" ++msgstr "无法切换一个模块已启用的流。 \n" ++"推荐从模块中删除所有已安装的内容,使用 'microdnf module reset ' 命令重置模块。在重置模块后就可以安装其他流。" + + #: libdnf/dnf-goal.cpp:107 + msgid "Could not depsolve transaction; " +@@ -550,13 +548,15 @@ msgstr "Ill-formed Selector,在过滤器中有多个匹配的对象" + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "这个操作使用了 Ill-formed Selector,不正确的比较类型" + +-#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 +-msgid " does not belong to a distupgrade repository" +-msgstr " 不属于 distupgrade 仓库" ++#: libdnf/goal/Goal.cpp:90 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "来自 %s 的 %s 不属于 distupgrade 仓库" + +-#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 +-msgid " has inferior architecture" +-msgstr " 有 inferior 架构" ++#: libdnf/goal/Goal.cpp:91 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "来自 %s 的 %s 具有 inferior 架构" + + #: libdnf/goal/Goal.cpp:92 + msgid "problem with installed package " +@@ -597,68 +597,79 @@ msgstr "无法为该任务安装最佳候选" + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "软件包 %s 被模块过滤过滤掉" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "来自 %s 的 %s 被模块过滤过滤掉" + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "软件包 %s 没有兼容的架构" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "来自 %s 的软件包 %s 没有兼容的架构" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s is not installable" +-msgstr "软件包 %s 不可安装" ++msgid "package %s from %s is not installable" ++msgstr "来自 %s 的软件包 %s 不可安装" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "软件包 %s 被排除过滤过滤掉" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "来自 %s 的软件包 %s 被排除过滤过滤掉" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "没有提供 %s 所需要的 %s" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "没有提供来自 %s 的 %s 所需的 %s" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "无法同时安装 %s 和 %s" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "不能同时安装来自 %s 的 %s 和来自 %s 的 %s" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "软件包 %s 与 %s(由 %s 提供)冲突" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "来自 %s 的软件包 %s 与来自 %s 的 %s 所提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "软件包 %s 淘汰了 %s 提供的 %s" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的软件包 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "已安装的软件包 %s 淘汰了 %s 提供的 %s" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "已安装的软件包 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:110 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "软件包 %s 隐式地淘汰了 %s 提供的 %s" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的软件包 %s 隐式地淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:111 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "软件包 %s 需要 %s,但没有提供者可以被安装" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" ++msgstr "来自 %s 的软件包 %s 需要 %s,但没有可以被安装的提供程序" + + #: libdnf/goal/Goal.cpp:112 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "软件包 %s 与自己提供的 %s 冲突" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "来自 %s 的软件包 %s 与来自自己提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:113 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "软件包 %s 和 %s 同时取代了 %s" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "来自 %s 的 %s 和来自 %s 的 %s 软件包都淘汰了 %s" ++ ++#: libdnf/goal/Goal.cpp:117 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "来自 %s 的 %s 不属于 distupgrade 仓库" ++ ++#: libdnf/goal/Goal.cpp:118 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "来自 %s 的 %s 具有 inferior 架构" + + #: libdnf/goal/Goal.cpp:119 + msgid "problem with installed module " +@@ -675,100 +686,101 @@ msgstr "无法为模块安装最佳更新候选 " + + #: libdnf/goal/Goal.cpp:128 libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s is disabled" +-msgstr "模块 %s 被禁用" ++msgid "module %s from %s is disabled" ++msgstr "来自 %s 的模块 %s 被禁用" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "模块 %s 没有兼容的架构" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "来自 %s 的模块 %s 没有兼容的架构" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s is not installable" +-msgstr "模块 %s 不可安装" ++msgid "module %s from %s is not installable" ++msgstr "来自 %s 的模块 %s 不可安装" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "没有提供模块 %s 所需要的 %s" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "没有提供来自 %s 的模块 %s 所需要的 %s" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "不能同时安装模块 %s 和 %s" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "不能同时安装来自 %s 的 %s 和来自 %s 的 %s 模块" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "模块 %s 与 %s 提供的 %s 冲突" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "来自 %s 的模块 %s 与来自 %s 的 %s 所提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "模块 %s 淘汰了 %s 提供的 %s" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的模块 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "已安装的模块 %s 淘汰了 %s 提供的 %s" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "已安装的模块 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:137 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "模块 %s 隐式地淘汰了 %s 提供的 %s" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的模块 %s 隐式地淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:138 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "模块 %s 需要 %s,但无法安装任何提供程序" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" ++msgstr "来自 %s 的模块 %s 需要 %s,但没有可以被安装的提供程序" + + #: libdnf/goal/Goal.cpp:139 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "模块 %s 与自己提供的 %s 冲突" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "来自 %s 的模块 %s 与自己提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:140 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "模块 %s 和 %s 同时取代了 %s" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "来自 %s 的 %s 和来自 %s 的 %s 软件包都淘汰了 %s" + +-#: libdnf/goal/Goal.cpp:1157 ++#: libdnf/goal/Goal.cpp:1168 + msgid "no solver set" + msgstr "无 solver 设置" + +-#: libdnf/goal/Goal.cpp:1162 ++#: libdnf/goal/Goal.cpp:1173 + #, c-format + msgid "failed to make %s absolute" + msgstr "无法使 %s 绝对" + +-#: libdnf/goal/Goal.cpp:1169 ++#: libdnf/goal/Goal.cpp:1180 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "把 debugdata 写入到 %1$s 失败: %2$s" + +-#: libdnf/goal/Goal.cpp:1181 ++#: libdnf/goal/Goal.cpp:1192 + msgid "no solv in the goal" + msgstr "在目标中没有 solv" + +-#: libdnf/goal/Goal.cpp:1183 ++#: libdnf/goal/Goal.cpp:1194 + msgid "no solution, cannot remove protected package" + msgstr "没有解决方案,不能删除保护的软件包" + +-#: libdnf/goal/Goal.cpp:1186 ++#: libdnf/goal/Goal.cpp:1197 + msgid "no solution possible" + msgstr "没有可能的解决方案" + +-#: libdnf/goal/Goal.cpp:1312 ++#: libdnf/goal/Goal.cpp:1323 + msgid "Problem: " + msgstr "问题: " + +-#: libdnf/goal/Goal.cpp:1317 ++#: libdnf/goal/Goal.cpp:1328 + #, c-format + msgid "Problem %d: " + msgstr "问题 %d: " + +-#: libdnf/goal/Goal.cpp:1650 ++#: libdnf/goal/Goal.cpp:1661 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "这个操作将会导致删除以下受保护的软件包: " +@@ -830,61 +842,61 @@ msgstr "没有检测到有效的 Platform ID" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "无法为模块 '%s' 启用多个流" + +-#: libdnf/module/ModulePackageContainer.cpp:346 ++#: libdnf/module/ModulePackageContainer.cpp:339 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "默认设置与存储库 '%s' 冲突 : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:917 ++#: libdnf/module/ModulePackageContainer.cpp:923 + msgid "Installing module profiles:\n" + msgstr "安装模块配置档案:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:932 ++#: libdnf/module/ModulePackageContainer.cpp:938 + msgid "Disabling module profiles:\n" + msgstr "禁用模块配置档案:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:947 ++#: libdnf/module/ModulePackageContainer.cpp:953 + msgid "Enabling module streams:\n" + msgstr "启用模块流:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:961 ++#: libdnf/module/ModulePackageContainer.cpp:967 + msgid "Switching module streams:\n" + msgstr "切换模块流:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:979 ++#: libdnf/module/ModulePackageContainer.cpp:985 + msgid "Disabling modules:\n" + msgstr "禁用模块:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:990 ++#: libdnf/module/ModulePackageContainer.cpp:996 + msgid "Resetting modules:\n" + msgstr "重置模块:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1704 ++#: libdnf/module/ModulePackageContainer.cpp:1710 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "无法加载位于 '%s' 的模块 Fail-Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1710 ++#: libdnf/module/ModulePackageContainer.cpp:1716 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "无法为模块 '%s:%s' 加载模块 Fail-Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1791 ++#: libdnf/module/ModulePackageContainer.cpp:1797 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" + msgstr "无法为模块 Fail Safe 数据创建目录 \"%s\" : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1807 ++#: libdnf/module/ModulePackageContainer.cpp:1813 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "无法把模块 Fail Safe 数据保存到 '%s'" + +-#: libdnf/module/ModulePackageContainer.cpp:1830 ++#: libdnf/module/ModulePackageContainer.cpp:1836 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "无法删除 '%s' 中的模块 Fail Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1862 ++#: libdnf/module/ModulePackageContainer.cpp:1868 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " +@@ -961,9 +973,7 @@ msgid "" + "Using '==' operator in reldeps can result in an undefined behavior. It is " + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." +-msgstr "" +-"在 reldeps 中使用 '==' 操作符可能导致一个未定义的行为。这个操作符已被废弃,并" +-"且在未来的版本中会取消对它的支持。请使用 '=' 操作符代替。" ++msgstr "在 reldeps 中使用 '==' 操作符可能导致一个未定义的行为。这个操作符已被废弃,并且在未来的版本中会取消对它的支持。请使用 '=' 操作符代替。" + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -1187,6 +1197,112 @@ msgstr "TransactionItem 状态没有设置:%s" + msgid "Can't add console output to unsaved transaction" + msgstr "无法向未保存的事务中添加控制台输出" + ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " 不属于 distupgrade 仓库" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " 有 inferior 架构" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "软件包 %s 被模块过滤过滤掉" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "软件包 %s 没有兼容的架构" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "软件包 %s 不可安装" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "软件包 %s 被排除过滤过滤掉" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "没有提供 %s 所需要的 %s" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "无法同时安装 %s 和 %s" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "软件包 %s 与 %s(由 %s 提供)冲突" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "软件包 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "已安装的软件包 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "软件包 %s 隐式地淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "软件包 %s 需要 %s,但没有提供者可以被安装" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "软件包 %s 与自己提供的 %s 冲突" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "软件包 %s 和 %s 同时取代了 %s" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "模块 %s 被禁用" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "模块 %s 没有兼容的架构" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "模块 %s 不可安装" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "没有提供模块 %s 所需要的 %s" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "不能同时安装模块 %s 和 %s" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "模块 %s 与 %s 提供的 %s 冲突" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "模块 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "已安装的模块 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "模块 %s 隐式地淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "模块 %s 需要 %s,但无法安装任何提供程序" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "模块 %s 与自己提供的 %s 冲突" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "模块 %s 和 %s 同时取代了 %s" ++ + #~ msgid "failed to add solv" + #~ msgstr "添加 solv 失败" + +@@ -1205,5 +1321,3 @@ msgstr "无法向未保存的事务中添加控制台输出" + #~ msgid "Failed to parse module artifact NEVRA '%s'" + #~ msgstr "无法解析模块工件 NEVRA '%s'" + +-#~ msgid "Bad id for repo: %s, byte = %s %d" +-#~ msgstr "repo 的 id 无效: %s, byte = %s %d" +-- +2.41.0 + diff --git a/SOURCES/0005-filterAdvisory-installed_solvables-sort-RhBug2212838.patch b/SOURCES/0005-filterAdvisory-installed_solvables-sort-RhBug2212838.patch new file mode 100644 index 0000000..8f1c548 --- /dev/null +++ b/SOURCES/0005-filterAdvisory-installed_solvables-sort-RhBug2212838.patch @@ -0,0 +1,37 @@ +From ccd66a3cb4ddb7a0f0d914ee06eed58121dbe7ce Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Tue, 27 Jun 2023 07:24:28 +0200 +Subject: [PATCH] filterAdvisory: match installed_solvables sort with lower_bound (RhBug:2212838) + +`std::lower_bound` expects that the range it operates on is sorted by +the provided comparator. + +`lower_bound()` is used on `installed_solvables` twice, first with +comparator `NameSolvableComparator` and later with +`SolvableCompareAdvisoryPkgNameArch` to cover both we need to sort +`installed_solvables` by name and arch. + +Otherwise this can lead to problems if multiple architectures of a pkg +are installed. + +For: https://bugzilla.redhat.com/show_bug.cgi?id=2212838 +--- + libdnf/sack/query.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdnf/sack/query.cpp b/libdnf/sack/query.cpp +index b7b1560..7937770 100644 +--- a/libdnf/sack/query.cpp ++++ b/libdnf/sack/query.cpp +@@ -1903,7 +1903,7 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + while ((installed_id = installed.pImpl->result->next(installed_id)) != -1) { + installed_solvables.push_back(pool_id2solvable(pool, installed_id)); + } +- std::sort(installed_solvables.begin(), installed_solvables.end(), NameSolvableComparator); ++ std::sort(installed_solvables.begin(), installed_solvables.end(), NameArchSolvableComparator); + + Query obsoletes(sack, ExcludeFlags::IGNORE_EXCLUDES); + obsoletes.addFilter(HY_PKG, HY_EQ, resultPset); +-- +libgit2 1.6.4 + diff --git a/SOURCES/0006-hawkeysubject-get_best_selectors-only-obsol-oflatest.patch b/SOURCES/0006-hawkeysubject-get_best_selectors-only-obsol-oflatest.patch new file mode 100644 index 0000000..07b865a --- /dev/null +++ b/SOURCES/0006-hawkeysubject-get_best_selectors-only-obsol-oflatest.patch @@ -0,0 +1,84 @@ +From dadfe65ce753ba8a8bdb5e38d7929135526edbd5 Mon Sep 17 00:00:00 2001 +From: Marek Blaha +Date: Thu, 31 Aug 2023 13:18:03 +0200 +Subject: [PATCH] hawkey.subject: get_best_selectors only obsoleters of latest + +In situation where a package exists in multiple versions and some older +version is being obsoleted, any of obsoleters was considered a valid +solution. + +The result could be really misleading. For example let's have this package set: + +systemd-udev-1.0 + +systemd-udev-2.0 +Obsoletes: systemd-udev < 2 + +systemd-boot-unsigned-2.0 +Obsoletes: systemd-udev < 2 + +In this case `dnf install systemd-udev` may lead to installation of +systemd-boot-unsigned which is probably not what the user expected. The +reason is the split in the upgrade-path created by obsolete and both +branches - systemd-udev-2.0 and systemd-boot-unsigned-2.0 are considered +valid. + +With this patch install command takes into account only obsoleters of +the best version of the package so the `dnf install systemd-udev` +results in correct installation of systemd-udev-2.0 package. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2183279 +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2176263 +--- + python/hawkey/__init__.py | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/python/hawkey/__init__.py b/python/hawkey/__init__.py +index 45bdc3a..1ec1ef4 100644 +--- a/python/hawkey/__init__.py ++++ b/python/hawkey/__init__.py +@@ -291,13 +291,13 @@ class Subject(_hawkey.Subject): + # after movement of base.install() or base.distro_sync() + return [] + ++ installed_query = q.installed() + if not self._filename_pattern and is_glob_pattern(self.pattern) \ + or solution['nevra'] and solution['nevra'].name is None: + with_obsoletes = False + + if obsoletes and solution['nevra'] and solution['nevra'].has_just_name(): + with_obsoletes = True +- installed_query = q.installed() + if reponame: + q = q.filter(reponame=reponame) + available_query = q.available() +@@ -309,13 +309,24 @@ class Subject(_hawkey.Subject): + sltrs = [] + for name, pkgs_list in q._name_dict().items(): + if with_obsoletes: ++ # If there is no installed package in the pkgs_list, add only ++ # obsoleters of the latest versions. Otherwise behave consistently ++ # with upgrade and add all obsoleters. ++ # See https://bugzilla.redhat.com/show_bug.cgi?id=2176263 ++ # for details of the problem. ++ obsoletes_query = base.sack.query().filterm(pkg=pkgs_list) ++ if not obsoletes_query.installed(): ++ obsoletes_query.filterm(latest_per_arch_by_priority=True) + pkgs_list = pkgs_list + base.sack.query().filter( +- obsoletes=pkgs_list).run() ++ obsoletes=obsoletes_query).run() + sltrs.append(self._list_or_query_to_selector(base.sack, pkgs_list)) + return sltrs + else: + if obsoletes and solution['nevra'] and solution['nevra'].has_just_name(): +- q = q.union(base.sack.query().filter(obsoletes=q)) ++ if installed_query: ++ q = q.union(base.sack.query().filter(obsoletes=q)) ++ else: ++ q = q.union(base.sack.query().filter(obsoletes=q.filter(latest_per_arch_by_priority=True))) + installed_query = q.installed() + + if reports: +-- +libgit2 1.6.4 + diff --git a/SOURCES/0007-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch b/SOURCES/0007-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch new file mode 100644 index 0000000..19c280b --- /dev/null +++ b/SOURCES/0007-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch @@ -0,0 +1,99 @@ +From 2ffe58595baa2a51700a1210b1d3a2124f805756 Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Mon, 25 Sep 2023 08:24:40 +0200 +Subject: [PATCH] Avoid reinstalling installonly packages marked for ERASE + +Without this patch reinstalling installonly pkg marked for ERASE might +be a valid smallest solution to our job. + +For example when user wants to install through a provide we select all +packages that provide it and put them inside a `job install oneof ...` +if one of the providers is also marked for ERASE due to installonly +limit libsolv might decide to reinstall it. + +To make sure it doesn't happen mark the available package also as ERASE. + +https://github.com/openSUSE/libsolv/issues/540 + +https://issues.redhat.com/browse/RHEL-1253 +(https://bugzilla.redhat.com/show_bug.cgi?id=2163474) +--- + libdnf/goal/Goal.cpp | 35 +++++++++++++++++++++++++++++++++-- + 1 file changed, 33 insertions(+), 2 deletions(-) + +diff --git a/libdnf/goal/Goal.cpp b/libdnf/goal/Goal.cpp +index 7def837..ba938e1 100644 +--- a/libdnf/goal/Goal.cpp ++++ b/libdnf/goal/Goal.cpp +@@ -643,6 +643,12 @@ erase_flags2libsolv(int flags) + return ret; + } + ++static bool ++NameSolvableComparator(const Solvable * first, const Solvable * second) ++{ ++ return first->name < second->name; ++} ++ + Goal::Goal(const Goal & goal_src) : pImpl(new Impl(*goal_src.pImpl)) {} + + Goal::Impl::Impl(const Goal::Impl & goal_src) +@@ -1436,10 +1442,24 @@ Goal::Impl::limitInstallonlyPackages(Solver *solv, Queue *job) + for (int i = 0; i < onlies->count; ++i) { + Id p, pp; + IdQueue q, installing; ++ std::vector available_unused_providers; + ++ // Add all providers of installonly provides that are marked for install ++ // to `q` IdQueue those that are not marked for install and are not already ++ // installed are added to available_unused_providers. + FOR_PKG_PROVIDES(p, pp, onlies->elements[i]) +- if (solver_get_decisionlevel(solv, p) > 0) ++ // According to libsolv-bindings the decision level is positive for installs ++ // and negative for conflicts (conflicts with another package or dependency ++ // conflicts = dependencies cannot be met). ++ if (solver_get_decisionlevel(solv, p) > 0) { + q.pushBack(p); ++ } else { ++ Solvable *s = pool_id2solvable(pool, p); ++ if (s->repo != pool->installed) { ++ available_unused_providers.push_back(s); ++ } ++ } ++ + if (q.size() <= (int) dnf_sack_get_installonly_limit(sack)) { + continue; + } +@@ -1457,17 +1477,28 @@ Goal::Impl::limitInstallonlyPackages(Solver *solv, Queue *job) + + struct InstallonliesSortCallback s_cb = {pool, dnf_sack_running_kernel(sack)}; + solv_sort(q.data(), q.size(), sizeof(q[0]), sort_packages, &s_cb); ++ std::sort(available_unused_providers.begin(), available_unused_providers.end(), NameSolvableComparator); + IdQueue same_names; + while (q.size() > 0) { + same_name_subqueue(pool, q.getQueue(), same_names.getQueue()); + if (same_names.size() <= (int) dnf_sack_get_installonly_limit(sack)) + continue; + reresolve = 1; + for (int j = 0; j < same_names.size(); ++j) { + Id id = same_names[j]; + Id action = SOLVER_ERASE; +- if (j < (int) dnf_sack_get_installonly_limit(sack)) ++ if (j < (int) dnf_sack_get_installonly_limit(sack)) { + action = SOLVER_INSTALL; ++ } else { ++ // We want to avoid reinstalling packages marked for ERASE, therefore ++ // if some unused provider is also available we need to mark it ERASE as well. ++ Solvable *s = pool_id2solvable(pool, id); ++ auto low = std::lower_bound(available_unused_providers.begin(), available_unused_providers.end(), s, NameSolvableComparator); ++ while (low != available_unused_providers.end() && (*low)->name == s->name) { ++ queue_push2(job, SOLVER_ERASE | SOLVER_SOLVABLE, pool_solvable2id(pool, *low)); ++ ++low; ++ } ++ } + queue_push2(job, action | SOLVER_SOLVABLE, id); + } + } +-- +libgit2 1.6.4 + diff --git a/SOURCES/0008-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch b/SOURCES/0008-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch new file mode 100644 index 0000000..9cfbb46 --- /dev/null +++ b/SOURCES/0008-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch @@ -0,0 +1,338 @@ +From 7529d06dbe7ac4c1cb41a4fb8e32e3b96be72075 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Wed, 4 Oct 2023 16:38:12 +0200 +Subject: [PATCH] PGP: Set a default creation SELinux labels on GnuPG + directories +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +libdnf used to precreate the directory in /run/user to make sure +a GnuPG agent executed by GPGME library places its socket there. + +The directories there are normally created and removed by systemd +(logind PAM session). libdnf created them for a case when a package +manager is invoked out of systemd session, before the super user logs +in. E.g. by a timer job to cache repository metadata. + +A problem was when this out-of-session process was a SELinux-confined +process creating files with its own SELinux label different from a DNF +program. Then the directory was created with a SELinux label different +from the one expected by systemd and when logging out a corresponding +user, the mismatching label clashed with systemd. + +The same issue was with temporary GnuPG home directories created by +libdnf under /tmp. + +This patch fixes both the isseus by restoring a SELinux label of those +directories to the label defined in a default SELinux file context +database. + +Obviously the database cannot have a record for a nonspecific +/tmp/tmpdir.XXXXXX (a mkdtemp() template) directory names. Therefore +I changed their names to more specific /tmp/libdnf.XXXXXX. Once +a SELinux policy updates the database, directories under /tmp will get +a correct label. + +There is yet another problem with accessing /var/cache/dnf/*/pubring, +but that seems to be pure SELinux policy problem. + +This patch adds a new -DENABLE_SELINUX=OFF CMake option to disable the +new dependency on libselinux. A default behavior is to support SELinux. + +Implementation details: + +I used selabel_lookup() + setfscreatecon() + mkdtemp() ++ setfscreatecon() sequence instead of mkdtemp() ++ selinux_restorecon() sequence because the later polutes stderr if +a SELinux policy does not define the default context. One could +supress stderr messages with selinux_set_callback(), but its effect +cannot be restored. + +I also kept the sequence in one function and reused it for creating +/run/user/$PID directories because the code is simpler than spliting +the function into three parts. + +https://issues.redhat.com/browse/RHEL-6421 +Signed-off-by: Petr Písař +--- + CMakeLists.txt | 7 +++ + libdnf.spec | 11 +++- + libdnf/CMakeLists.txt | 4 ++ + libdnf/repo/Repo.cpp | 124 ++++++++++++++++++++++++++++++++++++++---- + 4 files changed, 132 insertions(+), 14 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 405dc4e8..cc550ddb 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -35,6 +35,7 @@ option(WITH_ZCHUNK "Build with zchunk support" ON) + option(ENABLE_RHSM_SUPPORT "Build with Red Hat Subscription Manager support?" OFF) + option(ENABLE_SOLV_URPMREORDER "Build with support for URPM-like solution reordering?" OFF) + option(WITH_TESTS "Enables unit tests" ON) ++option(ENABLE_SELINUX "Restore SELinux labels on GnuPG directories" ON) + + + # build options - debugging +@@ -83,6 +84,12 @@ if(ENABLE_RHSM_SUPPORT) + include_directories(${RHSM_INCLUDE_DIRS}) + endif() + ++if(ENABLE_SELINUX) ++ pkg_check_modules(SELINUX REQUIRED libselinux) ++ include_directories(${SELINUX_INCLUDE_DIRS}) ++ add_definitions(-DENABLE_SELINUX=1) ++endif() ++ + + # glibc: check if fnmatch.h has FNM_CASEFOLD symbol + include(CheckSymbolExists) +diff --git a/libdnf.spec b/libdnf.spec +index 41df982c..09b5a89d 100644 +--- a/libdnf.spec ++++ b/libdnf.spec +@@ -42,6 +42,8 @@ + %bcond_with rhsm + %endif + ++%bcond_without selinux ++ + %if 0%{?rhel} + %bcond_with zchunk + %else +@@ -83,6 +85,9 @@ BuildRequires: pkgconfig(zck) >= 0.9.11 + BuildRequires: pkgconfig(sqlite3) + BuildRequires: pkgconfig(json-c) + BuildRequires: pkgconfig(cppunit) ++%if %{with selinux} ++BuildRequires: pkgconfig(libselinux) ++%endif + BuildRequires: pkgconfig(modulemd-2.0) >= %{libmodulemd_version} + BuildRequires: pkgconfig(smartcols) + BuildRequires: gettext +@@ -204,7 +209,8 @@ pushd build-py2 + %define __builddir build-py2 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} -DWITH_MAN=OFF ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ +- -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} ++ -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ ++ -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} + %make_build + popd + %endif +@@ -218,7 +224,8 @@ pushd build-py3 + %define __builddir build-py3 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} -DWITH_GIR=0 -DWITH_MAN=0 -Dgtkdoc=0 ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ +- -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} ++ -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ ++ -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} + %make_build + popd + %endif +diff --git a/libdnf/CMakeLists.txt b/libdnf/CMakeLists.txt +index 9e71d139..3c82ec3a 100644 +--- a/libdnf/CMakeLists.txt ++++ b/libdnf/CMakeLists.txt +@@ -88,6 +88,10 @@ if(ENABLE_RHSM_SUPPORT) + target_link_libraries(libdnf ${RHSM_LIBRARIES}) + endif() + ++if(ENABLE_SELINUX) ++ target_link_libraries(libdnf ${SELINUX_LIBRARIES}) ++endif() ++ + set(DNF_SO_VERSION 2) + set_target_properties(libdnf PROPERTIES OUTPUT_NAME "dnf") + set_target_properties(libdnf PROPERTIES SOVERSION ${DNF_SO_VERSION}) +diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp +index 9959a73a..16f15195 100644 +--- a/libdnf/repo/Repo.cpp ++++ b/libdnf/repo/Repo.cpp +@@ -51,6 +51,11 @@ + + #include + ++#if ENABLE_SELINUX ++#include ++#include ++#endif ++ + #include + #include + #include +@@ -651,6 +656,81 @@ std::unique_ptr Repo::Impl::lrHandleInitRemote(const char *destdir) + return h; + } + ++/* ++ * @brief Create a temporary directory. ++ * ++ * Creates a temporary directory with 0700 mode attempting to set a proper ++ * SELinux file context. Encountered errors are logged at debug level to ++ * a global logger. ++ * ++ * @param name_template As an input value it is a template according to ++ * mkdtemp(3). As an output value it will contain the created directory name. ++ * ++ * @return 0 if the directory was created, -1 if it wasn't. SELinux failures ++ * are not considered an error. ++ */ ++static int create_temporary_directory(char *name_template) { ++ auto logger(Log::getLogger()); ++ int saved_errno = errno; ++ int retval = 0; ++#if ENABLE_SELINUX ++ char *old_default_context = NULL; ++ char *new_default_context = NULL; ++ int old_default_context_was_retrieved = 0; ++ struct selabel_handle *labeling_handle = NULL; ++ ++ /* A purpose of this piece of code is to deal with applications whose ++ * security policy overrides a file context for temporary files but don't ++ * know that libdnf executes GnuPG which expects a default file context. */ ++ if (0 == getfscreatecon(&old_default_context)) { ++ old_default_context_was_retrieved = 1; ++ } else { ++ logger->debug(tfm::format("Failed to retrieve a default SELinux context")); ++ } ++ ++ labeling_handle = selabel_open(SELABEL_CTX_FILE, NULL, 0); ++ if (NULL == labeling_handle) { ++ logger->debug(tfm::format("Failed to open a SELinux labeling handle: %s", ++ strerror(errno))); ++ } else { ++ if (selabel_lookup(labeling_handle, &new_default_context, name_template, 0700)) { ++ /* Here we could hard-code "system_u:object_r:user_tmp_t:s0", but ++ * that value should be really defined in default file context ++ * SELinux policy. Only log that the policy is incpomplete. */ ++ logger->debug(tfm::format("Failed to look up a default SELinux label for \"%s\"", ++ name_template)); ++ } else { ++ if (setfscreatecon(new_default_context)) { ++ logger->debug(tfm::format("Failed to set default SELinux context to \"%s\"", ++ new_default_context)); ++ } ++ freecon(new_default_context); ++ } ++ selabel_close(labeling_handle); ++ } ++#endif ++ ++ /* mkdtemp() assures 0700 mode. */ ++ if (NULL == mkdtemp(name_template)) { ++ saved_errno = errno; ++ logger->debug(tfm::format("Failed to create a directory \"%s\": %s", ++ name_template, strerror(errno))); ++ retval = -1; ++ } ++ ++#if ENABLE_SELINUX ++ if (old_default_context_was_retrieved) { ++ if (setfscreatecon(old_default_context)) { ++ logger->debug(tfm::format("Failed to restore a default SELinux context")); ++ } ++ } ++ freecon(old_default_context); ++#endif ++ ++ errno = saved_errno; ++ return retval; ++} ++ + static void gpgImportKey(gpgme_ctx_t context, int keyFd) + { + auto logger(Log::getLogger()); +@@ -705,8 +785,8 @@ static std::vector rawkey2infos(int fd) { + std::unique_ptr::type> context(ctx); + + // set GPG home dir +- char tmpdir[] = "/tmp/tmpdir.XXXXXX"; +- if (!mkdtemp(tmpdir)) { ++ char tmpdir[] = "/tmp/libdnf.XXXXXX"; ++ if (create_temporary_directory(tmpdir)) { + const char * errTxt = strerror(errno); + throw RepoError(tfm::format(_("Cannot create repo temporary directory \"%s\": %s"), + tmpdir, errTxt)); +@@ -859,6 +939,13 @@ std::vector Repo::Impl::retrieve(const std::string & url) + * would cause a race condition with calling gpgme_release(), see [2], [3], + * [4]. + * ++ * Current solution precreating /run/user/$UID showed problematic when this ++ * library was used out of a systemd-logind session from a programm with an ++ * unexpected SELinux context. Then /run/user/$UID, normally maintained by ++ * systemd, was assigned a SELinux label unexpected by systemd causing errors ++ * on a user logout [5]. We remedy it by restoring the label according to ++ * a file context policy. ++ * + * Since the agent doesn't clean up its sockets properly, by creating this + * directory we make sure they are in a place that is not causing trouble with + * container images. +@@ -867,14 +954,27 @@ std::vector Repo::Impl::retrieve(const std::string & url) + * [2] https://bugzilla.redhat.com/show_bug.cgi?id=1769831 + * [3] https://github.com/rpm-software-management/microdnf/issues/50 + * [4] https://bugzilla.redhat.com/show_bug.cgi?id=1781601 ++ * [5] https://issues.redhat.com/browse/RHEL-6421 + */ + static void ensure_socket_dir_exists() { + auto logger(Log::getLogger()); ++ char tmpdir[] = "/run/user/libdnf.XXXXXX"; + std::string dirname = "/run/user/" + std::to_string(getuid()); +- int res = mkdir(dirname.c_str(), 0700); +- if (res != 0 && errno != EEXIST) { +- logger->debug(tfm::format("Failed to create directory \"%s\": %d - %s", +- dirname, errno, strerror(errno))); ++ ++ /* create_temporary_directory() assures 0700 mode and tries its best to ++ * correct a SELinux label. */ ++ if (create_temporary_directory(tmpdir)) { ++ return; ++ } ++ ++ /* Set the desired name. */ ++ if (rename(tmpdir, dirname.c_str())) { ++ if (errno != EEXIST && errno != ENOTEMPTY && errno != EBUSY) { ++ logger->debug(tfm::format("Failed to rename \"%s\" directory to \"%s\": %s", ++ tmpdir, dirname, strerror(errno))); ++ } ++ rmdir(tmpdir); ++ return; + } + } + +@@ -1163,8 +1263,8 @@ void Repo::Impl::addCountmeFlag(LrHandle *handle) { + bool Repo::Impl::isMetalinkInSync() + { + auto logger(Log::getLogger()); +- char tmpdir[] = "/tmp/tmpdir.XXXXXX"; +- if (!mkdtemp(tmpdir)) { ++ char tmpdir[] = "/tmp/libdnf.XXXXXX"; ++ if (create_temporary_directory(tmpdir)) { + const char * errTxt = strerror(errno); + throw RepoError(tfm::format(_("Cannot create repo temporary directory \"%s\": %s"), + tmpdir, errTxt)); +@@ -1237,8 +1337,8 @@ bool Repo::Impl::isRepomdInSync() + { + auto logger(Log::getLogger()); + LrYumRepo *yum_repo; +- char tmpdir[] = "/tmp/tmpdir.XXXXXX"; +- if (!mkdtemp(tmpdir)) { ++ char tmpdir[] = "/tmp/libdnf.XXXXXX"; ++ if (create_temporary_directory(tmpdir)) { + const char * errTxt = strerror(errno); + throw RepoError(tfm::format(_("Cannot create repo temporary directory \"%s\": %s"), + tmpdir, errTxt)); +@@ -1280,8 +1380,8 @@ void Repo::Impl::fetch(const std::string & destdir, std::unique_ptr && + throw RepoError(tfm::format(_("Cannot create repo destination directory \"%s\": %s"), + destdir, errTxt)); + } +- auto tmpdir = destdir + "/tmpdir.XXXXXX"; +- if (!mkdtemp(&tmpdir.front())) { ++ auto tmpdir = destdir + "/libdnf.XXXXXX"; ++ if (create_temporary_directory(&tmpdir.front())) { + const char * errTxt = strerror(errno); + throw RepoError(tfm::format(_("Cannot create repo temporary directory \"%s\": %s"), + tmpdir.c_str(), errTxt)); +-- +2.41.0 + diff --git a/SPECS/libdnf.spec b/SPECS/libdnf.spec index f9cd64b..f9e0177 100644 --- a/SPECS/libdnf.spec +++ b/SPECS/libdnf.spec @@ -42,6 +42,8 @@ %bcond_with rhsm %endif +%bcond_without selinux + %if 0%{?rhel} %bcond_with zchunk %else @@ -56,7 +58,7 @@ Name: libdnf Version: %{libdnf_major_version}.%{libdnf_minor_version}.%{libdnf_micro_version} -Release: 5%{?dist} +Release: 8%{?dist} Summary: Library providing simplified C and Python API to libsolv License: LGPLv2+ URL: https://github.com/rpm-software-management/libdnf @@ -64,6 +66,11 @@ Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz Patch1: 0001-Allow-change-of-arch-during-security-updates-with-no.patch Patch2: 0002-Add-repoid-to-solver-error-messages.patch Patch3: 0003-Update-translations-RHEL-9-2.patch +Patch4: 0004-Update-translations-RHEL-9.3.patch +Patch5: 0005-filterAdvisory-installed_solvables-sort-RhBug2212838.patch +Patch6: 0006-hawkeysubject-get_best_selectors-only-obsol-oflatest.patch +Patch7: 0007-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch +Patch8: 0008-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch BuildRequires: cmake @@ -87,6 +94,9 @@ BuildRequires: pkgconfig(zck) >= 0.9.11 BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgconfig(json-c) BuildRequires: pkgconfig(cppunit) +%if %{with selinux} +BuildRequires: pkgconfig(libselinux) +%endif BuildRequires: pkgconfig(modulemd-2.0) >= %{libmodulemd_version} BuildRequires: pkgconfig(smartcols) BuildRequires: gettext @@ -208,7 +218,8 @@ pushd build-py2 %define __builddir build-py2 %endif %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} -DWITH_MAN=OFF ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ - -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} + -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ + -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} %make_build popd %endif @@ -222,7 +233,8 @@ pushd build-py3 %define __builddir build-py3 %endif %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} -DWITH_GIR=0 -DWITH_MAN=0 -Dgtkdoc=0 ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ - -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} + -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ + -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} %make_build popd %endif @@ -308,6 +320,17 @@ popd %endif %changelog +* Wed Oct 25 2023 Petr Pisar - 0.69.0-8 +- Set default SELinux labels on GnuPG directories (RHEL-11238) + +* Wed Oct 25 2023 Jaroslav Rohel - 0.69.0-7 +- filterAdvisory: match installed_solvables sort with lower_bound (RhBug:2212838, RHEL-12123) +- hawkey.subject: get_best_selectors only obsoleters of latest (RhBug:2183279, RHEL-6304) +- Avoid reinstalling installonly packages marked for ERASE (RhBug:2163474, RHEL-12124) + +* Fri Sep 08 2023 Marek Blaha - 0.69.0-6 +- Update translations + * Mon May 22 2023 Nicola Sella - 0.69.0-5 - Fix specfile and bump release