diff --git a/.dnf.metadata b/.dnf.metadata
index 9125cc8..8fa9d1a 100644
--- a/.dnf.metadata
+++ b/.dnf.metadata
@@ -1 +1 @@
-5941a49cfd466aeed4ec882a33647912c2a89245 SOURCES/dnf-4.4.2.tar.gz
+f9c31cf46094c4bbf021e1872a9eb72d8a3f2136 SOURCES/dnf-4.7.0.tar.gz
diff --git a/.gitignore b/.gitignore
index 378380e..912e1fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/dnf-4.4.2.tar.gz
+SOURCES/dnf-4.7.0.tar.gz
diff --git a/SOURCES/0001-Set-top-level-directory-for-unittest.patch b/SOURCES/0001-Set-top-level-directory-for-unittest.patch
new file mode 100644
index 0000000..7bb4f80
--- /dev/null
+++ b/SOURCES/0001-Set-top-level-directory-for-unittest.patch
@@ -0,0 +1,26 @@
+From 6eff0fe7850624791f049a17a41d779915f30f94 Mon Sep 17 00:00:00 2001
+From: Pavla Kratochvilova <pkratoch@redhat.com>
+Date: Wed, 19 May 2021 12:58:30 +0200
+Subject: [PATCH] Set top-level directory for unittest
+
+In some build environments, the top-level directory is not added to
+the sys.path and the tests fail. This fixes the issue.
+---
+ tests/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
+index 77a4894..b7f4031 100644
+--- a/tests/CMakeLists.txt
++++ b/tests/CMakeLists.txt
+@@ -1,6 +1,6 @@
+ ADD_TEST(
+     NAME test
+-    COMMAND ${PYTHON_EXECUTABLE} -m unittest discover -s tests
++    COMMAND ${PYTHON_EXECUTABLE} -m unittest discover -s tests -t ${PROJECT_SOURCE_DIR}
+     WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
+ 
+ # For libdnf built with sanitizers, has no effect otherwise.
+--
+libgit2 1.0.1
+
diff --git a/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch b/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch
deleted file mode 100644
index 39780f4..0000000
--- a/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 66e08009b8254462cb2c454ff2320355633c20d6 Mon Sep 17 00:00:00 2001
-From: Nicola Sella <nsella@redhat.com>
-Date: Tue, 10 Nov 2020 12:11:17 +0100
-Subject: [PATCH 1/1] [tests] SQL write a readonly folder
-
-fixes on rhel8.4 for test_dnf_base and test_dnf_db_group
-libdnf._error.Error: SQLite error on "/var/lib/dnf/history.sqlite":
-Executing an SQL statement failed: attempt to write a readonly
-database
-
-=changelog=
-msg: fixes SQL write a readonly folder
-type: bugfix
----
- tests/api/test_dnf_base.py     | 1 +
- tests/api/test_dnf_db_group.py | 1 +
- 2 files changed, 2 insertions(+)
-
-diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py
-index b1cf49fb..ca71b75c 100644
---- a/tests/api/test_dnf_base.py
-+++ b/tests/api/test_dnf_base.py
-@@ -14,6 +14,7 @@ from .common import TOUR_4_4
- class DnfBaseApiTest(TestCase):
-     def setUp(self):
-         self.base = dnf.Base(dnf.conf.Conf())
-+        self.base.conf.persistdir = "/tmp/tests"
- 
-     def tearDown(self):
-         self.base.close()
-diff --git a/tests/api/test_dnf_db_group.py b/tests/api/test_dnf_db_group.py
-index 447fd121..e1828cb4 100644
---- a/tests/api/test_dnf_db_group.py
-+++ b/tests/api/test_dnf_db_group.py
-@@ -12,6 +12,7 @@ from .common import TestCase
- class DnfRPMTransactionApiTest(TestCase):
-     def setUp(self):
-         self.base = dnf.Base(dnf.conf.Conf())
-+        self.base.conf.persistdir = "/tmp/tests"
-         self.base.fill_sack(False, False)
-         self.base.resolve()
-         self.rpmTrans = self.base.transaction
--- 
-2.26.2
-
diff --git a/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch b/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch
deleted file mode 100644
index a844311..0000000
--- a/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From c2e4901cec947e5be2e5ff5afa22691841d00bdc Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Tue, 10 Nov 2020 13:46:57 +0100
-Subject: [PATCH] Revert "Fix --setopt=cachedir writing outside of installroot"
-
-This reverts commit 70fffff61f7a006d406b46adc592d21a685c12a8.
-
-The commit breaks resetting excludes with an empty --exclude= CLI switch
-if the excludes were set in the config file.
----
- dnf/cli/cli.py | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
-index b5f7bca07b..5878c2aa15 100644
---- a/dnf/cli/cli.py
-+++ b/dnf/cli/cli.py
-@@ -974,6 +974,8 @@ def configure(self, args, option_parser=None):
- 
-         self.base.configure_plugins()
- 
-+        self.base.conf._configure_from_options(opts)
-+
-         self.command.configure()
- 
-         if self.base.conf.destdir:
diff --git a/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch b/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch
deleted file mode 100644
index d34928f..0000000
--- a/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch
+++ /dev/null
@@ -1,567 +0,0 @@
-From 9ed390d08a9f2b66f4e352532fa526fc64e329d4 Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Tue, 28 Jul 2020 09:50:10 +0200
-Subject: [PATCH 1/3] Remove unused loops attribute from
- DepSolveProgressCallBack
-
----
- dnf/cli/output.py | 5 -----
- 1 file changed, 5 deletions(-)
-
-diff --git a/dnf/cli/output.py b/dnf/cli/output.py
-index de188ffbd1..44d5f8b89f 100644
---- a/dnf/cli/output.py
-+++ b/dnf/cli/output.py
-@@ -1987,10 +1987,6 @@ def historyInfoCmdPkgsAltered(self, old, pats=[]):
- class DepSolveProgressCallBack(dnf.callback.Depsolve):
-     """Provides text output callback functions for Dependency Solver callback."""
- 
--    def __init__(self):
--        """requires yum-cli log and errorlog functions as arguments"""
--        self.loops = 0
--
-     def pkg_added(self, pkg, mode):
-         """Print information about a package being added to the
-         transaction set.
-@@ -2037,7 +2033,6 @@ def start(self):
-         process.
-         """
-         logger.debug(_('--> Starting dependency resolution'))
--        self.loops += 1
- 
-     def end(self):
-         """Output a message stating that dependency resolution has finished."""
-
-From 0ee646f4965c597f2832ed3df9d9f0e6546dcc54 Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Wed, 21 Oct 2020 11:47:43 +0200
-Subject: [PATCH 2/3] Remove unused parameter of _make_lists()
-
----
- dnf/cli/output.py | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/dnf/cli/output.py b/dnf/cli/output.py
-index 44d5f8b89f..af8a968770 100644
---- a/dnf/cli/output.py
-+++ b/dnf/cli/output.py
-@@ -52,7 +52,8 @@
- 
- logger = logging.getLogger('dnf')
- 
--def _make_lists(transaction, goal):
-+
-+def _make_lists(transaction):
-     b = dnf.util.Bunch({
-         'downgraded': [],
-         'erased': [],
-@@ -1101,7 +1102,7 @@ def list_transaction(self, transaction, total_width=None):
-             # in order to display module changes when RPM transaction is empty
-             transaction = []
- 
--        list_bunch = _make_lists(transaction, self.base._goal)
-+        list_bunch = _make_lists(transaction)
-         pkglist_lines = []
-         data = {'n' : {}, 'v' : {}, 'r' : {}}
-         a_wid = 0 # Arch can't get "that big" ... so always use the max.
-@@ -1488,7 +1489,7 @@ def _tsi_or_pkg_nevra_cmp(item1, item2):
-             return (item1.arch > item2.arch) - (item1.arch < item2.arch)
- 
-         out = ''
--        list_bunch = _make_lists(transaction, self.base._goal)
-+        list_bunch = _make_lists(transaction)
- 
-         skipped_conflicts, skipped_broken = self._skipped_packages(
-             report_problems=False, transaction=transaction)
-
-From 865b7183453684de6a25e77fddf5a2d11fbffba8 Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Wed, 21 Oct 2020 17:59:46 +0200
-Subject: [PATCH 3/3] Post transaction summary is logged for API users
- (RhBug:1855158)
-
-Post transaction summary is always logged into /var/log/dnf.log.
-When transaction is called from cli, the summary is also printed to
-stdout in columns (as previously).
-
-= changelog =
-msg:           Packages installed/removed via DNF API are logged into dnf.log
-type:          enhancement
-resolves:      https://bugzilla.redhat.com/show_bug.cgi?id=1855158
----
- dnf/base.py       |  46 ++++++++++++-
- dnf/cli/cli.py    |   8 ++-
- dnf/cli/output.py | 167 ++++++++--------------------------------------
- dnf/util.py       | 102 +++++++++++++++++++++++++++-
- 4 files changed, 177 insertions(+), 146 deletions(-)
-
-diff --git a/dnf/base.py b/dnf/base.py
-index 075e74265a..c0d7712605 100644
---- a/dnf/base.py
-+++ b/dnf/base.py
-@@ -28,12 +28,12 @@
- import dnf
- import libdnf.transaction
- 
-+from copy import deepcopy
- from dnf.comps import CompsQuery
- from dnf.i18n import _, P_, ucd
- from dnf.util import _parse_specs
- from dnf.db.history import SwdbInterface
- from dnf.yum import misc
--from functools import reduce
- try:
-     from collections.abc import Sequence
- except ImportError:
-@@ -549,7 +549,7 @@ def _ts(self):
-         if self.conf.ignorearch:
-             self._rpm_probfilter.add(rpm.RPMPROB_FILTER_IGNOREARCH)
- 
--        probfilter = reduce(operator.or_, self._rpm_probfilter, 0)
-+        probfilter = functools.reduce(operator.or_, self._rpm_probfilter, 0)
-         self._priv_ts.setProbFilter(probfilter)
-         return self._priv_ts
- 
-@@ -890,6 +890,15 @@ def do_transaction(self, display=()):
-         self._plugins.unload_removed_plugins(self.transaction)
-         self._plugins.run_transaction()
- 
-+        # log post transaction summary
-+        def _pto_callback(action, tsis):
-+            msgs = []
-+            for tsi in tsis:
-+                msgs.append('{}: {}'.format(action, str(tsi)))
-+            return msgs
-+        for msg in dnf.util._post_transaction_output(self, self.transaction, _pto_callback):
-+            logger.debug(msg)
-+
-         return tid
- 
-     def _trans_error_summary(self, errstring):
-@@ -1311,7 +1320,7 @@ def _do_package_lists(self, pkgnarrow='all', patterns=None, showdups=None,
-         if patterns is None or len(patterns) == 0:
-             return list_fn(None)
-         yghs = map(list_fn, patterns)
--        return reduce(lambda a, b: a.merge_lists(b), yghs)
-+        return functools.reduce(lambda a, b: a.merge_lists(b), yghs)
- 
-     def _list_pattern(self, pkgnarrow, pattern, showdups, ignore_case,
-                       reponame=None):
-@@ -2579,6 +2588,37 @@ def setup_loggers(self):
-         """
-         self._logging._setup_from_dnf_conf(self.conf, file_loggers_only=True)
- 
-+    def _skipped_packages(self, report_problems, transaction):
-+        """returns set of conflicting packages and set of packages with broken dependency that would
-+        be additionally installed when --best and --allowerasing"""
-+        if self._goal.actions & (hawkey.INSTALL | hawkey.UPGRADE | hawkey.UPGRADE_ALL):
-+            best = True
-+        else:
-+            best = False
-+        ng = deepcopy(self._goal)
-+        params = {"allow_uninstall": self._allow_erasing,
-+                  "force_best": best,
-+                  "ignore_weak": True}
-+        ret = ng.run(**params)
-+        if not ret and report_problems:
-+            msg = dnf.util._format_resolve_problems(ng.problem_rules())
-+            logger.warning(msg)
-+        problem_conflicts = set(ng.problem_conflicts(available=True))
-+        problem_dependency = set(ng.problem_broken_dependency(available=True)) - problem_conflicts
-+
-+        def _nevra(item):
-+            return hawkey.NEVRA(name=item.name, epoch=item.epoch, version=item.version,
-+                                release=item.release, arch=item.arch)
-+
-+        # Sometimes, pkg is not in transaction item, therefore, comparing by nevra
-+        transaction_nevras = [_nevra(tsi) for tsi in transaction]
-+        skipped_conflicts = set(
-+            [pkg for pkg in problem_conflicts if _nevra(pkg) not in transaction_nevras])
-+        skipped_dependency = set(
-+            [pkg for pkg in problem_dependency if _nevra(pkg) not in transaction_nevras])
-+
-+        return skipped_conflicts, skipped_dependency
-+
- 
- def _msg_installed(pkg):
-     name = ucd(pkg)
-diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
-index 0bc2c119d0..334000362c 100644
---- a/dnf/cli/cli.py
-+++ b/dnf/cli/cli.py
-@@ -252,8 +252,12 @@ def do_transaction(self, display=()):
-             trans = None
- 
-         if trans:
--            msg = self.output.post_transaction_output(trans)
--            logger.info(msg)
-+            # the post transaction summary is already written to log during
-+            # Base.do_transaction() so here only print the messages to the
-+            # user arranged in columns
-+            print()
-+            print('\n'.join(self.output.post_transaction_output(trans)))
-+            print()
-             for tsi in trans:
-                 if tsi.state == libdnf.transaction.TransactionItemState_ERROR:
-                     raise dnf.exceptions.Error(_('Transaction failed'))
-diff --git a/dnf/cli/output.py b/dnf/cli/output.py
-index af8a968770..6d729b63ba 100644
---- a/dnf/cli/output.py
-+++ b/dnf/cli/output.py
-@@ -21,9 +21,7 @@
- from __future__ import print_function
- from __future__ import unicode_literals
- 
--from copy import deepcopy
- import fnmatch
--import functools
- import hawkey
- import itertools
- import libdnf.transaction
-@@ -53,51 +51,6 @@
- logger = logging.getLogger('dnf')
- 
- 
--def _make_lists(transaction):
--    b = dnf.util.Bunch({
--        'downgraded': [],
--        'erased': [],
--        'erased_clean': [],
--        'erased_dep': [],
--        'installed': [],
--        'installed_group': [],
--        'installed_dep': [],
--        'installed_weak': [],
--        'reinstalled': [],
--        'upgraded': [],
--        'failed': [],
--    })
--
--    for tsi in transaction:
--        if tsi.state == libdnf.transaction.TransactionItemState_ERROR:
--            b.failed.append(tsi)
--        elif tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADE:
--            b.downgraded.append(tsi)
--        elif tsi.action == libdnf.transaction.TransactionItemAction_INSTALL:
--            if tsi.reason == libdnf.transaction.TransactionItemReason_GROUP:
--                b.installed_group.append(tsi)
--            elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY:
--                b.installed_dep.append(tsi)
--            elif tsi.reason == libdnf.transaction.TransactionItemReason_WEAK_DEPENDENCY:
--                b.installed_weak.append(tsi)
--            else:
--                # TransactionItemReason_USER
--                b.installed.append(tsi)
--        elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALL:
--            b.reinstalled.append(tsi)
--        elif tsi.action == libdnf.transaction.TransactionItemAction_REMOVE:
--            if tsi.reason == libdnf.transaction.TransactionItemReason_CLEAN:
--                b.erased_clean.append(tsi)
--            elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY:
--                b.erased_dep.append(tsi)
--            else:
--                b.erased.append(tsi)
--        elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADE:
--            b.upgraded.append(tsi)
--
--    return b
--
--
- def _spread_in_columns(cols_count, label, lst):
-     left = itertools.chain((label,), itertools.repeat(''))
-     lst_length = len(lst)
-@@ -1057,37 +1010,6 @@ def list_group_transaction(self, comps, history, diff):
-             out[0:0] = self._banner(col_data, (_('Group'), _('Packages'), '', ''))
-         return '\n'.join(out)
- 
--    def _skipped_packages(self, report_problems, transaction):
--        """returns set of conflicting packages and set of packages with broken dependency that would
--        be additionally installed when --best and --allowerasing"""
--        if self.base._goal.actions & (hawkey.INSTALL | hawkey.UPGRADE | hawkey.UPGRADE_ALL):
--            best = True
--        else:
--            best = False
--        ng = deepcopy(self.base._goal)
--        params = {"allow_uninstall": self.base._allow_erasing,
--                  "force_best": best,
--                  "ignore_weak": True}
--        ret = ng.run(**params)
--        if not ret and report_problems:
--            msg = dnf.util._format_resolve_problems(ng.problem_rules())
--            logger.warning(msg)
--        problem_conflicts = set(ng.problem_conflicts(available=True))
--        problem_dependency = set(ng.problem_broken_dependency(available=True)) - problem_conflicts
--
--        def _nevra(item):
--            return hawkey.NEVRA(name=item.name, epoch=item.epoch, version=item.version,
--                                release=item.release, arch=item.arch)
--
--        # Sometimes, pkg is not in transaction item, therefore, comparing by nevra
--        transaction_nevras = [_nevra(tsi) for tsi in transaction]
--        skipped_conflicts = set(
--            [pkg for pkg in problem_conflicts if _nevra(pkg) not in transaction_nevras])
--        skipped_dependency = set(
--            [pkg for pkg in problem_dependency if _nevra(pkg) not in transaction_nevras])
--
--        return skipped_conflicts, skipped_dependency
--
-     def list_transaction(self, transaction, total_width=None):
-         """Return a string representation of the transaction in an
-         easy-to-read format.
-@@ -1102,7 +1024,7 @@ def list_transaction(self, transaction, total_width=None):
-             # in order to display module changes when RPM transaction is empty
-             transaction = []
- 
--        list_bunch = _make_lists(transaction)
-+        list_bunch = dnf.util._make_lists(transaction)
-         pkglist_lines = []
-         data = {'n' : {}, 'v' : {}, 'r' : {}}
-         a_wid = 0 # Arch can't get "that big" ... so always use the max.
-@@ -1271,7 +1193,7 @@ def format_line(group):
-         # show skipped conflicting packages
-         if not self.conf.best and self.base._goal.actions & forward_actions:
-             lines = []
--            skipped_conflicts, skipped_broken = self._skipped_packages(
-+            skipped_conflicts, skipped_broken = self.base._skipped_packages(
-                 report_problems=True, transaction=transaction)
-             skipped_broken = dict((str(pkg), pkg) for pkg in skipped_broken)
-             for pkg in sorted(skipped_conflicts):
-@@ -1436,13 +1358,8 @@ def format_line(group):
-                                   max_msg_count, count, msg_pkgs))
-         return ''.join(out)
- 
--    def post_transaction_output(self, transaction):
--        """Returns a human-readable summary of the results of the
--        transaction.
- 
--        :return: a string containing a human-readable summary of the
--           results of the transaction
--        """
-+    def _pto_callback(self, action, tsis):
-         #  Works a bit like calcColumns, but we never overflow a column we just
-         # have a dynamic number of columns.
-         def _fits_in_cols(msgs, num):
-@@ -1472,61 +1389,33 @@ def _fits_in_cols(msgs, num):
-                 col_lens[col] *= -1
-             return col_lens
- 
--        def _tsi_or_pkg_nevra_cmp(item1, item2):
--            """Compares two transaction items or packages by nevra.
--               Used as a fallback when tsi does not contain package object.
--            """
--            ret = (item1.name > item2.name) - (item1.name < item2.name)
--            if ret != 0:
--                return ret
--            nevra1 = hawkey.NEVRA(name=item1.name, epoch=item1.epoch, version=item1.version,
--                                  release=item1.release, arch=item1.arch)
--            nevra2 = hawkey.NEVRA(name=item2.name, epoch=item2.epoch, version=item2.version,
--                                  release=item2.release, arch=item2.arch)
--            ret = nevra1.evr_cmp(nevra2, self.sack)
--            if ret != 0:
--                return ret
--            return (item1.arch > item2.arch) - (item1.arch < item2.arch)
--
--        out = ''
--        list_bunch = _make_lists(transaction)
--
--        skipped_conflicts, skipped_broken = self._skipped_packages(
--            report_problems=False, transaction=transaction)
--        skipped = skipped_conflicts.union(skipped_broken)
--
--        for (action, tsis) in [(_('Upgraded'), list_bunch.upgraded),
--                               (_('Downgraded'), list_bunch.downgraded),
--                               (_('Installed'), list_bunch.installed +
--                                list_bunch.installed_group +
--                                list_bunch.installed_weak +
--                                list_bunch.installed_dep),
--                               (_('Reinstalled'), list_bunch.reinstalled),
--                               (_('Skipped'), skipped),
--                               (_('Removed'), list_bunch.erased +
--                                   list_bunch.erased_dep +
--                                   list_bunch.erased_clean),
--                               (_('Failed'), list_bunch.failed)]:
--            if not tsis:
--                continue
--            msgs = []
--            out += '\n%s:\n' % action
--            for tsi in sorted(tsis, key=functools.cmp_to_key(_tsi_or_pkg_nevra_cmp)):
--                msgs.append(str(tsi))
--            for num in (8, 7, 6, 5, 4, 3, 2):
--                cols = _fits_in_cols(msgs, num)
--                if cols:
--                    break
--            if not cols:
--                cols = [-(self.term.columns - 2)]
--            while msgs:
--                current_msgs = msgs[:len(cols)]
--                out += '  '
--                out += self.fmtColumns(zip(current_msgs, cols), end=u'\n')
--                msgs = msgs[len(cols):]
--
-+        if not tsis:
-+            return ''
-+        out = []
-+        msgs = []
-+        out.append('{}:'.format(action))
-+        for tsi in tsis:
-+            msgs.append(str(tsi))
-+        for num in (8, 7, 6, 5, 4, 3, 2):
-+            cols = _fits_in_cols(msgs, num)
-+            if cols:
-+                break
-+        if not cols:
-+            cols = [-(self.term.columns - 2)]
-+        while msgs:
-+            current_msgs = msgs[:len(cols)]
-+            out.append('  {}'.format(self.fmtColumns(zip(current_msgs, cols))))
-+            msgs = msgs[len(cols):]
-         return out
- 
-+
-+    def post_transaction_output(self, transaction):
-+        """
-+        Return a human-readable summary of the transaction. Packages in sections
-+        are arranged to columns.
-+        """
-+        return dnf.util._post_transaction_output(self.base, transaction, self._pto_callback)
-+
-     def setup_progress_callbacks(self):
-         """Set up the progress callbacks and various
-            output bars based on debug level.
-diff --git a/dnf/util.py b/dnf/util.py
-index 8cf362706d..0beb04424d 100644
---- a/dnf/util.py
-+++ b/dnf/util.py
-@@ -24,13 +24,14 @@
- 
- from .pycomp import PY3, basestring
- from dnf.i18n import _, ucd
--from functools import reduce
- import argparse
- import dnf
- import dnf.callback
- import dnf.const
- import dnf.pycomp
- import errno
-+import functools
-+import hawkey
- import itertools
- import locale
- import logging
-@@ -41,6 +42,7 @@
- import tempfile
- import time
- import libdnf.repo
-+import libdnf.transaction
- 
- logger = logging.getLogger('dnf')
- 
-@@ -195,7 +197,7 @@ def group_by_filter(fn, iterable):
-     def splitter(acc, item):
-         acc[not bool(fn(item))].append(item)
-         return acc
--    return reduce(splitter, iterable, ([], []))
-+    return functools.reduce(splitter, iterable, ([], []))
- 
- def insert_if(item, iterable, condition):
-     """Insert an item into an iterable by a condition."""
-@@ -504,3 +506,99 @@ def __setattr__(self, what, val):
-         def setter(item):
-             setattr(item, what, val)
-         return list(map(setter, self))
-+
-+
-+def _make_lists(transaction):
-+    b = Bunch({
-+        'downgraded': [],
-+        'erased': [],
-+        'erased_clean': [],
-+        'erased_dep': [],
-+        'installed': [],
-+        'installed_group': [],
-+        'installed_dep': [],
-+        'installed_weak': [],
-+        'reinstalled': [],
-+        'upgraded': [],
-+        'failed': [],
-+    })
-+
-+    for tsi in transaction:
-+        if tsi.state == libdnf.transaction.TransactionItemState_ERROR:
-+            b.failed.append(tsi)
-+        elif tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADE:
-+            b.downgraded.append(tsi)
-+        elif tsi.action == libdnf.transaction.TransactionItemAction_INSTALL:
-+            if tsi.reason == libdnf.transaction.TransactionItemReason_GROUP:
-+                b.installed_group.append(tsi)
-+            elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY:
-+                b.installed_dep.append(tsi)
-+            elif tsi.reason == libdnf.transaction.TransactionItemReason_WEAK_DEPENDENCY:
-+                b.installed_weak.append(tsi)
-+            else:
-+                # TransactionItemReason_USER
-+                b.installed.append(tsi)
-+        elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALL:
-+            b.reinstalled.append(tsi)
-+        elif tsi.action == libdnf.transaction.TransactionItemAction_REMOVE:
-+            if tsi.reason == libdnf.transaction.TransactionItemReason_CLEAN:
-+                b.erased_clean.append(tsi)
-+            elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY:
-+                b.erased_dep.append(tsi)
-+            else:
-+                b.erased.append(tsi)
-+        elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADE:
-+            b.upgraded.append(tsi)
-+
-+    return b
-+
-+
-+def _post_transaction_output(base, transaction, action_callback):
-+    """Returns a human-readable summary of the results of the
-+    transaction.
-+
-+    :param action_callback: function generating output for specific action. It
-+       takes two parameters - action as a string and list of affected packages for
-+       this action
-+    :return: a list of lines containing a human-readable summary of the
-+       results of the transaction
-+    """
-+    def _tsi_or_pkg_nevra_cmp(item1, item2):
-+        """Compares two transaction items or packages by nevra.
-+           Used as a fallback when tsi does not contain package object.
-+        """
-+        ret = (item1.name > item2.name) - (item1.name < item2.name)
-+        if ret != 0:
-+            return ret
-+        nevra1 = hawkey.NEVRA(name=item1.name, epoch=item1.epoch, version=item1.version,
-+                              release=item1.release, arch=item1.arch)
-+        nevra2 = hawkey.NEVRA(name=item2.name, epoch=item2.epoch, version=item2.version,
-+                              release=item2.release, arch=item2.arch)
-+        ret = nevra1.evr_cmp(nevra2, base.sack)
-+        if ret != 0:
-+            return ret
-+        return (item1.arch > item2.arch) - (item1.arch < item2.arch)
-+
-+    list_bunch = dnf.util._make_lists(transaction)
-+
-+    skipped_conflicts, skipped_broken = base._skipped_packages(
-+        report_problems=False, transaction=transaction)
-+    skipped = skipped_conflicts.union(skipped_broken)
-+
-+    out = []
-+    for (action, tsis) in [(_('Upgraded'), list_bunch.upgraded),
-+                           (_('Downgraded'), list_bunch.downgraded),
-+                           (_('Installed'), list_bunch.installed +
-+                            list_bunch.installed_group +
-+                            list_bunch.installed_weak +
-+                            list_bunch.installed_dep),
-+                           (_('Reinstalled'), list_bunch.reinstalled),
-+                           (_('Skipped'), skipped),
-+                           (_('Removed'), list_bunch.erased +
-+                               list_bunch.erased_dep +
-+                               list_bunch.erased_clean),
-+                           (_('Failed'), list_bunch.failed)]:
-+        out.extend(action_callback(
-+            action, sorted(tsis, key=functools.cmp_to_key(_tsi_or_pkg_nevra_cmp))))
-+
-+    return out
diff --git a/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch b/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch
deleted file mode 100644
index 8447353..0000000
--- a/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From df64fd36d7fefe39a96fea3f41e35785bebd37ec Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Wed, 2 Dec 2020 16:33:26 +0100
-Subject: [PATCH 1/2] Log scriptlets output also for API users (RhBug:1847340)
-
-Messages logged into /var/log/dnf.rpm.log are now the same for both
-command line and API usage.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1847340
----
- dnf/cli/output.py   | 7 +------
- dnf/yum/rpmtrans.py | 9 ++++++++-
- 2 files changed, 9 insertions(+), 7 deletions(-)
-
-diff --git a/dnf/cli/output.py b/dnf/cli/output.py
-index 51d6829ca6..86260661fc 100644
---- a/dnf/cli/output.py
-+++ b/dnf/cli/output.py
-@@ -2151,12 +2151,7 @@ def error(self, message):
-         pass
- 
-     def scriptout(self, msgs):
--        """Print messages originating from a package script.
--
--        :param msgs: the messages coming from the script
--        """
--        if msgs:
--            self.rpm_logger.info(ucd(msgs))
-+        pass
- 
-     def _makefmt(self, percent, ts_done, ts_total, progress=True,
-                  pkgname=None, wid1=15):
-diff --git a/dnf/yum/rpmtrans.py b/dnf/yum/rpmtrans.py
-index 447639a476..d6c549d2ed 100644
---- a/dnf/yum/rpmtrans.py
-+++ b/dnf/yum/rpmtrans.py
-@@ -113,7 +113,10 @@ def progress(self, package, action, ti_done, ti_total, ts_done, ts_total):
-         pass
- 
-     def scriptout(self, msgs):
--        """msgs is the messages that were output (if any)."""
-+        """Hook for reporting an rpm scriptlet output.
-+
-+        :param msgs: the scriptlet output
-+        """
-         pass
- 
-     def error(self, message):
-@@ -156,6 +159,10 @@ def filelog(self, package, action):
-         msg = '%s: %s' % (action_str, package)
-         self.rpm_logger.log(dnf.logging.SUBDEBUG, msg)
- 
-+    def scriptout(self, msgs):
-+        if msgs:
-+            self.rpm_logger.info(ucd(msgs))
-+
- 
- class RPMTransaction(object):
-     def __init__(self, base, test=False, displays=()):
-
-From ee6ffcf640180b2b08d2db50b4b81d2bdefb1f2f Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Thu, 3 Dec 2020 10:08:09 +0100
-Subject: [PATCH 2/2] Straighten inheritance of *Display classes
-
----
- dnf/cli/output.py   | 15 +++------------
- dnf/yum/rpmtrans.py |  2 +-
- 2 files changed, 4 insertions(+), 13 deletions(-)
-
-diff --git a/dnf/cli/output.py b/dnf/cli/output.py
-index 86260661fc..de188ffbd1 100644
---- a/dnf/cli/output.py
-+++ b/dnf/cli/output.py
-@@ -37,7 +37,7 @@
- from dnf.cli.format import format_number, format_time
- from dnf.i18n import _, C_, P_, ucd, fill_exact_width, textwrap_fill, exact_width, select_short_long
- from dnf.pycomp import xrange, basestring, long, unicode, sys_maxsize
--from dnf.yum.rpmtrans import LoggingTransactionDisplay
-+from dnf.yum.rpmtrans import TransactionDisplay
- from dnf.db.history import MergedTransactionWrapper
- import dnf.base
- import dnf.callback
-@@ -2071,7 +2071,7 @@ def short_id(id):
-         return self.output.userconfirm()
- 
- 
--class CliTransactionDisplay(LoggingTransactionDisplay):
-+class CliTransactionDisplay(TransactionDisplay):
-     """A YUM specific callback class for RPM operations."""
- 
-     width = property(lambda self: dnf.cli.term._term_width())
-@@ -2093,7 +2093,7 @@ def progress(self, package, action, ti_done, ti_total, ts_done, ts_total):
-         :param package: the package involved in the event
-         :param action: the type of action that is taking place.  Valid
-            values are given by
--           :func:`rpmtrans.LoggingTransactionDisplay.action.keys()`
-+           :func:`rpmtrans.TransactionDisplay.action.keys()`
-         :param ti_done: a number representing the amount of work
-            already done in the current transaction
-         :param ti_total: a number representing the total amount of work
-@@ -2144,15 +2144,6 @@ def _out_progress(self, ti_done, ti_total, ts_done, ts_total,
-                 if ti_done == ti_total:
-                     print(" ")
- 
--    def filelog(self, package, action):
--        pass
--
--    def error(self, message):
--        pass
--
--    def scriptout(self, msgs):
--        pass
--
-     def _makefmt(self, percent, ts_done, ts_total, progress=True,
-                  pkgname=None, wid1=15):
-         l = len(str(ts_total))
-diff --git a/dnf/yum/rpmtrans.py b/dnf/yum/rpmtrans.py
-index d6c549d2ed..51fa921d3e 100644
---- a/dnf/yum/rpmtrans.py
-+++ b/dnf/yum/rpmtrans.py
-@@ -143,7 +143,7 @@ def error(self, message):
-         dnf.util._terminal_messenger('print', message, sys.stderr)
- 
- 
--class LoggingTransactionDisplay(ErrorTransactionDisplay):
-+class LoggingTransactionDisplay(TransactionDisplay):
-     '''
-     Base class for a RPMTransaction display callback class
-     '''
diff --git a/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch b/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch
deleted file mode 100644
index 233a2fc..0000000
--- a/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch
+++ /dev/null
@@ -1,1411 +0,0 @@
-From b9a8226185f3ab58e3551b315af2b11a8b2f2ebe Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Tue, 8 Sep 2020 17:02:59 +0200
-Subject: [PATCH 01/17] Add a get_current() method to SwdbInterface
-
-The method returns the transaction that is currently being created in
-Swdb, before it is stored to sqlite.
----
- VERSION.cmake     | 2 +-
- dnf.spec          | 2 +-
- dnf/db/history.py | 3 +++
- 3 files changed, 5 insertions(+), 2 deletions(-)
-
-diff --git a/dnf/db/history.py b/dnf/db/history.py
-index 4d355f95..994cdb01 100644
---- a/dnf/db/history.py
-+++ b/dnf/db/history.py
-@@ -381,6 +381,9 @@ class SwdbInterface(object):
-                 prev_trans.altered_gt_rpmdb = True
-         return result[::-1]
- 
-+    def get_current(self):
-+        return TransactionWrapper(self.swdb.getCurrent())
-+
-     def set_reason(self, pkg, reason):
-         """Set reason for package"""
-         rpm_item = self.rpm._pkg_to_swdb_rpm_item(pkg)
--- 
-2.26.2
-
-
-From 3bcf90aadfea98da1397b570fcb3ecc20a89c15d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Fri, 2 Oct 2020 15:52:19 +0200
-Subject: [PATCH 02/17] transaction-sr: Prefer installing from the original
- transaction repository
-
-In case a package exists in the same repo_id as from which it was
-originally installed, prefer the package from that repo when replaying
-the transaction.
-
-Makes a difference in e.g. the system-upgrade plugin, where it ensures
-the package is installed from the same repo from which it was downloaded
-during the download step.
----
- dnf/transaction_sr.py | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
-
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index 9b9b0749..45ca2ef7 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -257,6 +257,7 @@ class TransactionReplay(object):
-         try:
-             action = pkg_data["action"]
-             nevra = pkg_data["nevra"]
-+            repo_id = pkg_data["repo_id"]
-             reason = libdnf.transaction.StringToTransactionItemReason(pkg_data["reason"])
-         except KeyError as e:
-             raise TransactionError(
-@@ -282,6 +283,18 @@ class TransactionReplay(object):
-         epoch = parsed_nevra.epoch if parsed_nevra.epoch is not None else 0
-         query = query_na.filter(epoch=epoch, version=parsed_nevra.version, release=parsed_nevra.release)
- 
-+        # In case the package is found in the same repo as in the original
-+        # transaction, limit the query to that plus installed packages. IOW
-+        # remove packages with the same NEVRA in case they are found in
-+        # multiple repos and the repo the package came from originally is one
-+        # of them.
-+        # This can e.g. make a difference in the system-upgrade plugin, in case
-+        # the same NEVRA is in two repos, this makes sure the same repo is used
-+        # for both download and upgrade steps of the plugin.
-+        query_repo = query.filter(reponame=repo_id)
-+        if query_repo:
-+            query = query_repo.union(query.installed())
-+
-         if not query:
-             self._raise_or_warn(self._skip_unavailable, _('Cannot find rpm nevra "{nevra}".').format(nevra=nevra))
-             return
--- 
-2.26.2
-
-
-From acfd6310131769f33165c8de1d064889a80fc259 Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Tue, 24 Nov 2020 10:57:21 +0100
-Subject: [PATCH 03/17] transaction_sr: Enable loading transactions from dict
-
----
- dnf/cli/commands/history.py |  2 +-
- dnf/transaction_sr.py       | 42 +++++++++++++++++++++++++------------
- 2 files changed, 30 insertions(+), 14 deletions(-)
-
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index e381f902..0a6dad9b 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -270,7 +270,7 @@ class HistoryCommand(commands.Command):
- 
-             self.replay = TransactionReplay(
-                 self.base,
--                self.opts.transaction_filename,
-+                filename=self.opts.transaction_filename,
-                 ignore_installed = self.opts.ignore_installed,
-                 ignore_extras = self.opts.ignore_extras,
-                 skip_unavailable = self.opts.skip_unavailable
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index 45ca2ef7..e6b06665 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -187,21 +187,23 @@ class TransactionReplay(object):
-     def __init__(
-         self,
-         base,
--        fn,
-+        filename="",
-+        data=None,
-         ignore_extras=False,
-         ignore_installed=False,
-         skip_unavailable=False
-     ):
-         """
-         :param base: the dnf base
--        :param fn: the filename to load the transaction from
-+        :param filename: the filename to load the transaction from (conflicts with the 'data' argument)
-+        :param data: the dictionary to load the transaction from (conflicts with the 'filename' argument)
-         :param ignore_extras: whether to ignore extra package pulled into the transaction
-         :param ignore_installed: whether to ignore installed versions of packages
-         :param skip_unavailable: whether to skip transaction packages that aren't available
-         """
- 
-         self._base = base
--        self._filename = fn
-+        self._filename = filename
-         self._ignore_installed = ignore_installed
-         self._ignore_extras = ignore_extras
-         self._skip_unavailable = skip_unavailable
-@@ -213,25 +215,39 @@ class TransactionReplay(object):
-         self._nevra_reason_cache = {}
-         self._warnings = []
- 
-+        if filename and data:
-+            raise ValueError(_("Conflicting TransactionReplay arguments have been specified: filename, data"))
-+        elif filename:
-+            self._load_from_file(filename)
-+        else:
-+            self._load_from_data(data)
-+
-+
-+    def _load_from_file(self, fn):
-+        self._filename = fn
-         with open(fn, "r") as f:
-             try:
--                self._replay_data = json.load(f)
-+                replay_data = json.load(f)
-             except json.decoder.JSONDecodeError as e:
-                 raise TransactionFileError(fn, str(e) + ".")
- 
-         try:
--            self._verify_toplevel_json(self._replay_data)
-+            self._load_from_data(replay_data)
-+        except TransactionError as e:
-+            raise TransactionFileError(fn, e)
- 
--            self._rpms = self._replay_data.get("rpms", [])
--            self._assert_type(self._rpms, list, "rpms", "array")
-+    def _load_from_data(self, data):
-+        self._replay_data = data
-+        self._verify_toplevel_json(self._replay_data)
- 
--            self._groups = self._replay_data.get("groups", [])
--            self._assert_type(self._groups, list, "groups", "array")
-+        self._rpms = self._replay_data.get("rpms", [])
-+        self._assert_type(self._rpms, list, "rpms", "array")
- 
--            self._environments = self._replay_data.get("environments", [])
--            self._assert_type(self._environments, list, "environments", "array")
--        except TransactionError as e:
--            raise TransactionFileError(fn, e)
-+        self._groups = self._replay_data.get("groups", [])
-+        self._assert_type(self._groups, list, "groups", "array")
-+
-+        self._environments = self._replay_data.get("environments", [])
-+        self._assert_type(self._environments, list, "environments", "array")
- 
-     def _raise_or_warn(self, warn_only, msg):
-         if warn_only:
--- 
-2.26.2
-
-
-From 90d4a2fd72b30b295adcb6da66b8043a70561b33 Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Fri, 20 Nov 2020 19:36:49 +0100
-Subject: [PATCH 04/17] transaction_sr: Store exception attributes for future
- use
-
----
- dnf/transaction_sr.py | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index e6b06665..36787de4 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -55,6 +55,10 @@ class TransactionFileError(dnf.exceptions.Error):
-         :param errors: a list of error classes or a string with an error description
-         """
- 
-+        # store args in case someone wants to read them from a caught exception
-+        self.filename = filename
-+        self.errors = errors
-+
-         if isinstance(errors, (list, tuple)):
-             if len(errors) > 1:
-                 msg = _('Errors in "{filename}":').format(filename=filename)
--- 
-2.26.2
-
-
-From 0ffa7ed9ea73035acaec2c4f916d967701fddda2 Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Fri, 20 Nov 2020 19:04:59 +0100
-Subject: [PATCH 05/17] transaction_sr: Handle serialize_transaction(None)
-
----
- dnf/transaction_sr.py | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index 36787de4..41ddee1f 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -120,6 +120,9 @@ def serialize_transaction(transaction):
-     groups = []
-     environments = []
- 
-+    if transaction is None:
-+        return data
-+
-     for tsi in transaction.packages():
-         if tsi.is_package():
-             rpms.append({
--- 
-2.26.2
-
-
-From c4bae459caef1d5128bd7ed43fcbb749608449f4 Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Mon, 23 Nov 2020 16:23:53 +0100
-Subject: [PATCH 06/17] transaction_sr: Skip preferred repo lookup if repoid is
- empty
-
----
- dnf/transaction_sr.py | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index 41ddee1f..9926bebd 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -314,9 +314,10 @@ class TransactionReplay(object):
-         # This can e.g. make a difference in the system-upgrade plugin, in case
-         # the same NEVRA is in two repos, this makes sure the same repo is used
-         # for both download and upgrade steps of the plugin.
--        query_repo = query.filter(reponame=repo_id)
--        if query_repo:
--            query = query_repo.union(query.installed())
-+        if repo_id:
-+            query_repo = query.filter(reponame=repo_id)
-+            if query_repo:
-+                query = query_repo.union(query.installed())
- 
-         if not query:
-             self._raise_or_warn(self._skip_unavailable, _('Cannot find rpm nevra "{nevra}".').format(nevra=nevra))
--- 
-2.26.2
-
-
-From 3f82f871170be871ce8ec9d509306d751890ac9e Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Fri, 20 Nov 2020 17:44:28 +0100
-Subject: [PATCH 07/17] history: Refactor redo code to use transaction
- store/replay
-
-= changelog =
-msg: Support comps groups in history redo
-type: enhancement
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1657123
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809565
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809639
----
- dnf/cli/commands/history.py | 40 +++++++++++++++----------------------
- 1 file changed, 16 insertions(+), 24 deletions(-)
-
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index 0a6dad9b..c28a136a 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -120,6 +120,10 @@ class HistoryCommand(commands.Command):
-             if not self.opts.transactions:
-                 raise dnf.cli.CliError(_('No transaction ID or package name given.'))
-         elif self.opts.transactions_action in ['redo', 'undo', 'rollback']:
-+            demands.available_repos = True
-+            demands.resolving = True
-+            demands.root_user = True
-+
-             self._require_one_transaction_id = True
-             if not self.opts.transactions:
-                 msg = _('No transaction ID or package name given.')
-@@ -157,28 +161,16 @@ class HistoryCommand(commands.Command):
-         old = self.base.history_get_transaction(extcmds)
-         if old is None:
-             return 1, ['Failed history redo']
--        tm = dnf.util.normalize_time(old.beg_timestamp)
--        print('Repeating transaction %u, from %s' % (old.tid, tm))
--        self.output.historyInfoCmdPkgsAltered(old)
--
--        for i in old.packages():
--            pkgs = list(self.base.sack.query().filter(nevra=str(i), reponame=i.from_repo))
--            if i.action in dnf.transaction.FORWARD_ACTIONS:
--                if not pkgs:
--                    logger.info(_('No package %s available.'),
--                    self.output.term.bold(ucd(str(i))))
--                    return 1, ['An operation cannot be redone']
--                pkg = pkgs[0]
--                self.base.install(str(pkg))
--            elif i.action == libdnf.transaction.TransactionItemAction_REMOVE:
--                if not pkgs:
--                    # package was removed already, we can skip removing it again
--                    continue
--                pkg = pkgs[0]
--                self.base.remove(str(pkg))
--
--        self.base.resolve()
--        self.base.do_transaction()
-+
-+        data = serialize_transaction(old)
-+        self.replay = TransactionReplay(
-+            self.base,
-+            data=data,
-+            ignore_installed=True,
-+            ignore_extras=True,
-+            skip_unavailable=self.opts.skip_unavailable
-+        )
-+        self.replay.run()
- 
-     def _hcmd_undo(self, extcmds):
-         try:
-@@ -326,13 +318,13 @@ class HistoryCommand(commands.Command):
-             raise dnf.exceptions.Error(strs[0])
- 
-     def run_resolved(self):
--        if self.opts.transactions_action != "replay":
-+        if self.opts.transactions_action not in ("replay", "redo"):
-             return
- 
-         self.replay.post_transaction()
- 
-     def run_transaction(self):
--        if self.opts.transactions_action != "replay":
-+        if self.opts.transactions_action not in ("replay", "redo"):
-             return
- 
-         warnings = self.replay.get_warnings()
--- 
-2.26.2
-
-
-From d1b78ba8449b319121b5208c5b39609b1c6b61de Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Fri, 20 Nov 2020 19:07:50 +0100
-Subject: [PATCH 08/17] history: Refactor rollback code to use transaction
- store/replay
-
-= changelog =
-msg: Support comps groups in history rollback
-type: enhancement
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1657123
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809565
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809639
----
- dnf/cli/cli.py              | 56 -----------------------------
- dnf/cli/commands/history.py | 72 ++++++++++++++++++++++++++++++++++---
- 2 files changed, 67 insertions(+), 61 deletions(-)
-
-diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
-index cd720a97..36671fd8 100644
---- a/dnf/cli/cli.py
-+++ b/dnf/cli/cli.py
-@@ -627,62 +627,6 @@ class BaseCli(dnf.Base):
-             logger.critical(_('Found more than one transaction ID!'))
-         return old[0]
- 
--    def history_rollback_transaction(self, extcmd):
--        """Rollback given transaction."""
--        old = self.history_get_transaction((extcmd,))
--        if old is None:
--            return 1, ['Failed history rollback, no transaction']
--        last = self.history.last()
--        if last is None:
--            return 1, ['Failed history rollback, no last?']
--        if old.tid == last.tid:
--            return 0, ['Rollback to current, nothing to do']
--
--        mobj = None
--        for trans in self.history.old(list(range(old.tid + 1, last.tid + 1))):
--            if trans.altered_lt_rpmdb:
--                logger.warning(_('Transaction history is incomplete, before %u.'), trans.tid)
--            elif trans.altered_gt_rpmdb:
--                logger.warning(_('Transaction history is incomplete, after %u.'), trans.tid)
--
--            if mobj is None:
--                mobj = dnf.db.history.MergedTransactionWrapper(trans)
--            else:
--                mobj.merge(trans)
--
--        tm = dnf.util.normalize_time(old.beg_timestamp)
--        print("Rollback to transaction %u, from %s" % (old.tid, tm))
--        print(self.output.fmtKeyValFill("  Undoing the following transactions: ",
--                                        ", ".join((str(x) for x in mobj.tids()))))
--        self.output.historyInfoCmdPkgsAltered(mobj)  # :todo
--
--#        history = dnf.history.open_history(self.history)  # :todo
--#        m = libdnf.transaction.MergedTransaction()
--
--#        return
--
--#        operations = dnf.history.NEVRAOperations()
--#        for id_ in range(old.tid + 1, last.tid + 1):
--#            operations += history.transaction_nevra_ops(id_)
--
--        try:
--            self._history_undo_operations(mobj, old.tid + 1, True, strict=self.conf.strict)
--        except dnf.exceptions.PackagesNotInstalledError as err:
--            raise
--            logger.info(_('No package %s installed.'),
--                        self.output.term.bold(ucd(err.pkg_spec)))
--            return 1, ['A transaction cannot be undone']
--        except dnf.exceptions.PackagesNotAvailableError as err:
--            raise
--            logger.info(_('No package %s available.'),
--                        self.output.term.bold(ucd(err.pkg_spec)))
--            return 1, ['A transaction cannot be undone']
--        except dnf.exceptions.MarkingError:
--            raise
--            assert False
--        else:
--            return 2, ["Rollback to transaction %u" % (old.tid,)]
--
-     def history_undo_transaction(self, extcmd):
-         """Undo given transaction."""
-         old = self.history_get_transaction((extcmd,))
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index c28a136a..a450aaab 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -20,6 +20,7 @@ from __future__ import print_function
- from __future__ import unicode_literals
- 
- import libdnf
-+import hawkey
- 
- from dnf.i18n import _, ucd
- from dnf.cli import commands
-@@ -33,6 +34,7 @@ import dnf.util
- import json
- import logging
- import os
-+import sys
- 
- 
- logger = logging.getLogger('dnf')
-@@ -179,10 +181,70 @@ class HistoryCommand(commands.Command):
-             return 1, [str(err)]
- 
-     def _hcmd_rollback(self, extcmds):
-+        old = self.base.history_get_transaction(extcmds)
-+        if old is None:
-+            return 1, ['Failed history rollback']
-+        last = self.base.history.last()
-+
-+        merged_trans = None
-+        if old.tid != last.tid:
-+            # history.old([]) returns all transactions and we don't want that
-+            # so skip merging the transactions when trying to rollback to the last transaction
-+            # which is the current system state and rollback is not applicable
-+            for trans in self.base.history.old(list(range(old.tid + 1, last.tid + 1))):
-+                if trans.altered_lt_rpmdb:
-+                    logger.warning(_('Transaction history is incomplete, before %u.'), trans.tid)
-+                elif trans.altered_gt_rpmdb:
-+                    logger.warning(_('Transaction history is incomplete, after %u.'), trans.tid)
-+
-+                if merged_trans is None:
-+                    merged_trans = dnf.db.history.MergedTransactionWrapper(trans)
-+                else:
-+                    merged_trans.merge(trans)
-+
-+        return self._revert_transaction(merged_trans)
-+
-+    def _revert_transaction(self, trans):
-+        action_map = {
-+            "Install": "Removed",
-+            "Removed": "Install",
-+            "Upgrade": "Downgraded",
-+            "Upgraded": "Downgrade",
-+            "Downgrade": "Upgraded",
-+            "Downgraded": "Upgrade",
-+            "Reinstalled": "Reinstall",
-+            "Reinstall": "Reinstalled",
-+            "Obsoleted": "Install",
-+            "Obsolete": "Obsoleted",
-+        }
-+
-+        data = serialize_transaction(trans)
-+
-+        # revert actions in the serialized transaction data to perform rollback/undo
-+        for content_type in ("rpms", "groups", "environments"):
-+            for ti in data.get(content_type, []):
-+                ti["action"] = action_map[ti["action"]]
-+
-+                if ti["action"] == "Install" and ti.get("reason", None) == "clean":
-+                    ti["reason"] = "dependency"
-+
-+                if ti.get("repo_id") == hawkey.SYSTEM_REPO_NAME:
-+                    # erase repo_id, because it's not possible to perform forward actions from the @System repo
-+                    ti["repo_id"] = None
-+
-+        self.replay = TransactionReplay(
-+            self.base,
-+            data=data,
-+            ignore_installed=True,
-+            ignore_extras=True,
-+            skip_unavailable=self.opts.skip_unavailable
-+        )
-         try:
--            return self.base.history_rollback_transaction(extcmds[0])
--        except dnf.exceptions.Error as err:
--            return 1, [str(err)]
-+            self.replay.run()
-+        except dnf.transaction_sr.TransactionFileError as ex:
-+            for error in ex.errors:
-+                print(str(error), file=sys.stderr)
-+            raise dnf.exceptions.PackageNotFoundError(_('no package matched'))
- 
-     def _hcmd_userinstalled(self):
-         """Execute history userinstalled command."""
-@@ -318,13 +380,13 @@ class HistoryCommand(commands.Command):
-             raise dnf.exceptions.Error(strs[0])
- 
-     def run_resolved(self):
--        if self.opts.transactions_action not in ("replay", "redo"):
-+        if self.opts.transactions_action not in ("replay", "redo", "rollback"):
-             return
- 
-         self.replay.post_transaction()
- 
-     def run_transaction(self):
--        if self.opts.transactions_action not in ("replay", "redo"):
-+        if self.opts.transactions_action not in ("replay", "redo", "rollback"):
-             return
- 
-         warnings = self.replay.get_warnings()
--- 
-2.26.2
-
-
-From a59a57ce456682e85e86ee362aab4eecc19dbc81 Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Thu, 3 Dec 2020 15:56:52 +0100
-Subject: [PATCH 09/17] history: Refactor undo code to use transaction
- store/replay
-
-= changelog =
-msg: Support comps groups in history undo
-type: enhancement
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1657123
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809565
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809639
----
- dnf/cli/cli.py              | 28 ----------------------------
- dnf/cli/commands/history.py | 12 ++++++------
- 2 files changed, 6 insertions(+), 34 deletions(-)
-
-diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
-index 36671fd8..e4fd39c6 100644
---- a/dnf/cli/cli.py
-+++ b/dnf/cli/cli.py
-@@ -627,34 +627,6 @@ class BaseCli(dnf.Base):
-             logger.critical(_('Found more than one transaction ID!'))
-         return old[0]
- 
--    def history_undo_transaction(self, extcmd):
--        """Undo given transaction."""
--        old = self.history_get_transaction((extcmd,))
--        if old is None:
--            return 1, ['Failed history undo']
--
--        tm = dnf.util.normalize_time(old.beg_timestamp)
--        msg = _("Undoing transaction {}, from {}").format(old.tid, ucd(tm))
--        logger.info(msg)
--        self.output.historyInfoCmdPkgsAltered(old)  # :todo
--
--
--        mobj = dnf.db.history.MergedTransactionWrapper(old)
--
--        try:
--            self._history_undo_operations(mobj, old.tid, strict=self.conf.strict)
--        except dnf.exceptions.PackagesNotInstalledError as err:
--            logger.info(_('No package %s installed.'),
--                        self.output.term.bold(ucd(err.pkg_spec)))
--            return 1, ['An operation cannot be undone']
--        except dnf.exceptions.PackagesNotAvailableError as err:
--            logger.info(_('No package %s available.'),
--                        self.output.term.bold(ucd(err.pkg_spec)))
--            return 1, ['An operation cannot be undone']
--        except dnf.exceptions.MarkingError:
--            raise
--        else:
--            return 2, ["Undoing transaction %u" % (old.tid,)]
- 
- class Cli(object):
-     def __init__(self, base):
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index a450aaab..d60d3f25 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -175,10 +175,10 @@ class HistoryCommand(commands.Command):
-         self.replay.run()
- 
-     def _hcmd_undo(self, extcmds):
--        try:
--            return self.base.history_undo_transaction(extcmds[0])
--        except dnf.exceptions.Error as err:
--            return 1, [str(err)]
-+        old = self.base.history_get_transaction(extcmds)
-+        if old is None:
-+            return 1, ['Failed history undo']
-+        return self._revert_transaction(old)
- 
-     def _hcmd_rollback(self, extcmds):
-         old = self.base.history_get_transaction(extcmds)
-@@ -380,13 +380,13 @@ class HistoryCommand(commands.Command):
-             raise dnf.exceptions.Error(strs[0])
- 
-     def run_resolved(self):
--        if self.opts.transactions_action not in ("replay", "redo", "rollback"):
-+        if self.opts.transactions_action not in ("replay", "redo", "rollback", "undo"):
-             return
- 
-         self.replay.post_transaction()
- 
-     def run_transaction(self):
--        if self.opts.transactions_action not in ("replay", "redo", "rollback"):
-+        if self.opts.transactions_action not in ("replay", "redo", "rollback", "undo"):
-             return
- 
-         warnings = self.replay.get_warnings()
--- 
-2.26.2
-
-
-From 5a0b6cc00420fd6559a1fd611de1417ea90b1bfc Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Fri, 20 Nov 2020 19:54:54 +0100
-Subject: [PATCH 10/17] Remove Base._history_undo_operations() as it was
- replaced with transaction_sr code
-
----
- dnf/base.py | 59 -----------------------------------------------------
- 1 file changed, 59 deletions(-)
-
-diff --git a/dnf/base.py b/dnf/base.py
-index ec41ab01..a2955051 100644
---- a/dnf/base.py
-+++ b/dnf/base.py
-@@ -2218,65 +2218,6 @@ class Base(object):
-                                for prefix in ['/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/']]
-         return self.sack.query().filterm(file__glob=binary_provides), binary_provides
- 
--    def _history_undo_operations(self, operations, first_trans, rollback=False, strict=True):
--        """Undo the operations on packages by their NEVRAs.
--
--        :param operations: a NEVRAOperations to be undone
--        :param first_trans: first transaction id being undone
--        :param rollback: True if transaction is performing a rollback
--        :param strict: if True, raise an exception on any errors
--        """
--
--        # map actions to their opposites
--        action_map = {
--            libdnf.transaction.TransactionItemAction_DOWNGRADE: None,
--            libdnf.transaction.TransactionItemAction_DOWNGRADED: libdnf.transaction.TransactionItemAction_UPGRADE,
--            libdnf.transaction.TransactionItemAction_INSTALL: libdnf.transaction.TransactionItemAction_REMOVE,
--            libdnf.transaction.TransactionItemAction_OBSOLETE: None,
--            libdnf.transaction.TransactionItemAction_OBSOLETED: libdnf.transaction.TransactionItemAction_INSTALL,
--            libdnf.transaction.TransactionItemAction_REINSTALL: None,
--            # reinstalls are skipped as they are considered as no-operation from history perspective
--            libdnf.transaction.TransactionItemAction_REINSTALLED: None,
--            libdnf.transaction.TransactionItemAction_REMOVE: libdnf.transaction.TransactionItemAction_INSTALL,
--            libdnf.transaction.TransactionItemAction_UPGRADE: None,
--            libdnf.transaction.TransactionItemAction_UPGRADED: libdnf.transaction.TransactionItemAction_DOWNGRADE,
--            libdnf.transaction.TransactionItemAction_REASON_CHANGE: None,
--        }
--
--        failed = False
--        for ti in operations.packages():
--            try:
--                action = action_map[ti.action]
--            except KeyError:
--                raise RuntimeError(_("Action not handled: {}".format(action)))
--
--            if action is None:
--                continue
--
--            if action == libdnf.transaction.TransactionItemAction_REMOVE:
--                query = self.sack.query().installed().filterm(nevra_strict=str(ti))
--                if not query:
--                    logger.error(_('No package %s installed.'), ucd(str(ti)))
--                    failed = True
--                    continue
--            else:
--                query = self.sack.query().filterm(nevra_strict=str(ti))
--                if not query:
--                    logger.error(_('No package %s available.'), ucd(str(ti)))
--                    failed = True
--                    continue
--
--            if action == libdnf.transaction.TransactionItemAction_REMOVE:
--                for pkg in query:
--                    self._goal.erase(pkg)
--            else:
--                selector = dnf.selector.Selector(self.sack)
--                selector.set(pkg=query)
--                self._goal.install(select=selector, optional=(not strict))
--
--        if strict and failed:
--            raise dnf.exceptions.PackageNotFoundError(_('no package matched'))
--
-     def _merge_update_filters(self, q, pkg_spec=None, warning=True):
-         """
-         Merge Queries in _update_filters and return intersection with q Query
--- 
-2.26.2
-
-
-From c5a02f21d1a7b3be9ace78364ce234d853118574 Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Wed, 2 Dec 2020 08:57:15 +0100
-Subject: [PATCH 11/17] history: Move history methods from BaseCli to
- HistoryCommand
-
----
- dnf/cli/cli.py              | 19 -------------
- dnf/cli/commands/history.py | 53 +++++++++++++++----------------------
- 2 files changed, 22 insertions(+), 50 deletions(-)
-
-diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
-index e4fd39c6..3080ae64 100644
---- a/dnf/cli/cli.py
-+++ b/dnf/cli/cli.py
-@@ -608,25 +608,6 @@ class BaseCli(dnf.Base):
-             return False
-         return True
- 
--    def _history_get_transactions(self, extcmds):
--        if not extcmds:
--            logger.critical(_('No transaction ID given'))
--            return None
--
--        old = self.history.old(extcmds)
--        if not old:
--            logger.critical(_('Not found given transaction ID'))
--            return None
--        return old
--
--    def history_get_transaction(self, extcmds):
--        old = self._history_get_transactions(extcmds)
--        if old is None:
--            return None
--        if len(old) > 1:
--            logger.critical(_('Found more than one transaction ID!'))
--        return old[0]
--
- 
- class Cli(object):
-     def __init__(self, base):
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index d60d3f25..dfd954ee 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -34,7 +34,6 @@ import dnf.util
- import json
- import logging
- import os
--import sys
- 
- 
- logger = logging.getLogger('dnf')
-@@ -160,10 +159,7 @@ class HistoryCommand(commands.Command):
-         return dnf.cli.commands.Command.get_error_output(self, error)
- 
-     def _hcmd_redo(self, extcmds):
--        old = self.base.history_get_transaction(extcmds)
--        if old is None:
--            return 1, ['Failed history redo']
--
-+        old = self._history_get_transaction(extcmds)
-         data = serialize_transaction(old)
-         self.replay = TransactionReplay(
-             self.base,
-@@ -174,16 +170,27 @@ class HistoryCommand(commands.Command):
-         )
-         self.replay.run()
- 
-+    def _history_get_transactions(self, extcmds):
-+        if not extcmds:
-+            raise dnf.cli.CliError(_('No transaction ID given'))
-+
-+        old = self.base.history.old(extcmds)
-+        if not old:
-+            raise dnf.cli.CliError(_('Transaction ID "{0}" not found.').format(extcmds[0]))
-+        return old
-+
-+    def _history_get_transaction(self, extcmds):
-+        old = self._history_get_transactions(extcmds)
-+        if len(old) > 1:
-+            raise dnf.cli.CliError(_('Found more than one transaction ID!'))
-+        return old[0]
-+
-     def _hcmd_undo(self, extcmds):
--        old = self.base.history_get_transaction(extcmds)
--        if old is None:
--            return 1, ['Failed history undo']
-+        old = self._history_get_transaction(extcmds)
-         return self._revert_transaction(old)
- 
-     def _hcmd_rollback(self, extcmds):
--        old = self.base.history_get_transaction(extcmds)
--        if old is None:
--            return 1, ['Failed history rollback']
-+        old = self._history_get_transaction(extcmds)
-         last = self.base.history.last()
- 
-         merged_trans = None
-@@ -239,12 +246,7 @@ class HistoryCommand(commands.Command):
-             ignore_extras=True,
-             skip_unavailable=self.opts.skip_unavailable
-         )
--        try:
--            self.replay.run()
--        except dnf.transaction_sr.TransactionFileError as ex:
--            for error in ex.errors:
--                print(str(error), file=sys.stderr)
--            raise dnf.exceptions.PackageNotFoundError(_('no package matched'))
-+        self.replay.run()
- 
-     def _hcmd_userinstalled(self):
-         """Execute history userinstalled command."""
-@@ -346,11 +348,8 @@ class HistoryCommand(commands.Command):
-             elif vcmd == 'userinstalled':
-                 ret = self._hcmd_userinstalled()
-             elif vcmd == 'store':
--                transactions = self.output.history.old(tids)
--                if not transactions:
--                    raise dnf.cli.CliError(_('Transaction ID "{id}" not found.').format(id=tids[0]))
--
--                data = serialize_transaction(transactions[0])
-+                tid = self._history_get_transaction(tids)
-+                data = serialize_transaction(tid)
-                 try:
-                     filename = self.opts.output if self.opts.output is not None else "transaction.json"
- 
-@@ -371,14 +370,6 @@ class HistoryCommand(commands.Command):
-                 except OSError as e:
-                     raise dnf.cli.CliError(_('Error storing transaction: {}').format(str(e)))
- 
--        if ret is None:
--            return
--        (code, strs) = ret
--        if code == 2:
--            self.cli.demands.resolving = True
--        elif code != 0:
--            raise dnf.exceptions.Error(strs[0])
--
-     def run_resolved(self):
-         if self.opts.transactions_action not in ("replay", "redo", "rollback", "undo"):
-             return
-@@ -393,7 +384,7 @@ class HistoryCommand(commands.Command):
-         if warnings:
-             logger.log(
-                 dnf.logging.WARNING,
--                _("Warning, the following problems occurred while replaying the transaction:")
-+                _("Warning, the following problems occurred while running a transaction:")
-             )
-             for w in warnings:
-                 logger.log(dnf.logging.WARNING, "  " + w)
--- 
-2.26.2
-
-
-From 917f9f3b0fc418492293e08fa7db053b0c490d8f Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Thu, 10 Dec 2020 13:36:52 +0100
-Subject: [PATCH 12/17] transaction_sr: Simplify error reporting, unify with
- history
-
----
- dnf/transaction_sr.py | 20 +++++++++-----------
- 1 file changed, 9 insertions(+), 11 deletions(-)
-
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index 9926bebd..2122aba4 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -57,21 +57,19 @@ class TransactionFileError(dnf.exceptions.Error):
- 
-         # store args in case someone wants to read them from a caught exception
-         self.filename = filename
--        self.errors = errors
--
-         if isinstance(errors, (list, tuple)):
--            if len(errors) > 1:
--                msg = _('Errors in "{filename}":').format(filename=filename)
--                for error in errors:
--                    msg += "\n  " + str(error)
-+            self.errors = errors
-+        else:
-+            self.errors = [errors]
- 
--                super(TransactionFileError, self).__init__(msg)
--                return
-+        if filename:
-+            msg = _('The following problems occurred while replaying the transaction from file "{filename}":').format(filename=filename)
-+        else:
-+            msg = _('The following problems occurred while running a transaction:')
- 
--            else:
--                errors = str(errors[0])
-+        for error in self.errors:
-+            msg += "\n  " + str(error)
- 
--        msg = _('Error in "{filename}": {error}').format(filename=filename, error=errors)
-         super(TransactionFileError, self).__init__(msg)
- 
- 
--- 
-2.26.2
-
-
-From d2fb741829445efee3187553cf7960f7bc2f643e Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Thu, 17 Dec 2020 16:37:01 +0100
-Subject: [PATCH 13/17] transaction_sr: TransactionFileError exception to
- TransactionReplayError
-
----
- dnf/transaction_sr.py | 20 ++++++++++----------
- 1 file changed, 10 insertions(+), 10 deletions(-)
-
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index 2122aba4..e4974eb9 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -48,7 +48,7 @@ class TransactionError(dnf.exceptions.Error):
-         super(TransactionError, self).__init__(msg)
- 
- 
--class TransactionFileError(dnf.exceptions.Error):
-+class TransactionReplayError(dnf.exceptions.Error):
-     def __init__(self, filename, errors):
-         """
-         :param filename: The name of the transaction file being replayed
-@@ -70,10 +70,10 @@ class TransactionFileError(dnf.exceptions.Error):
-         for error in self.errors:
-             msg += "\n  " + str(error)
- 
--        super(TransactionFileError, self).__init__(msg)
-+        super(TransactionReplayError, self).__init__(msg)
- 
- 
--class IncompatibleTransactionVersionError(TransactionFileError):
-+class IncompatibleTransactionVersionError(TransactionReplayError):
-     def __init__(self, filename, msg):
-         super(IncompatibleTransactionVersionError, self).__init__(filename, msg)
- 
-@@ -84,7 +84,7 @@ def _check_version(version, filename):
-     try:
-         major = int(major)
-     except ValueError as e:
--        raise TransactionFileError(
-+        raise TransactionReplayError(
-             filename,
-             _('Invalid major version "{major}", number expected.').format(major=major)
-         )
-@@ -92,7 +92,7 @@ def _check_version(version, filename):
-     try:
-         int(minor)  # minor is unused, just check it's a number
-     except ValueError as e:
--        raise TransactionFileError(
-+        raise TransactionReplayError(
-             filename,
-             _('Invalid minor version "{minor}", number expected.').format(minor=minor)
-         )
-@@ -234,12 +234,12 @@ class TransactionReplay(object):
-             try:
-                 replay_data = json.load(f)
-             except json.decoder.JSONDecodeError as e:
--                raise TransactionFileError(fn, str(e) + ".")
-+                raise TransactionReplayError(fn, str(e) + ".")
- 
-         try:
-             self._load_from_data(replay_data)
-         except TransactionError as e:
--            raise TransactionFileError(fn, e)
-+            raise TransactionReplayError(fn, e)
- 
-     def _load_from_data(self, data):
-         self._replay_data = data
-@@ -268,7 +268,7 @@ class TransactionReplay(object):
-         fn = self._filename
- 
-         if "version" not in replay_data:
--            raise TransactionFileError(fn, _('Missing key "{key}".'.format(key="version")))
-+            raise TransactionReplayError(fn, _('Missing key "{key}".'.format(key="version")))
- 
-         self._assert_type(replay_data["version"], str, "version", "string")
- 
-@@ -580,7 +580,7 @@ class TransactionReplay(object):
-                 errors.append(e)
- 
-         if errors:
--            raise TransactionFileError(fn, errors)
-+            raise TransactionReplayError(fn, errors)
- 
-     def post_transaction(self):
-         """
-@@ -635,4 +635,4 @@ class TransactionReplay(object):
-                 pass
- 
-         if errors:
--            raise TransactionFileError(self._filename, errors)
-+            raise TransactionReplayError(self._filename, errors)
--- 
-2.26.2
-
-
-From 1182143e58d4fda530d5dfd19f0d9c9406e8eff3 Mon Sep 17 00:00:00 2001
-From: Daniel Mach <dmach@redhat.com>
-Date: Thu, 17 Dec 2020 16:55:39 +0100
-Subject: [PATCH 14/17] transaction_sr: Don't return if there's a mismatch in
- actions
-
-When _ignore_installed == True, then an exception is raised anyway.
-When _ignore_installed == False, get the requested package to the system
-regardless the action.
----
- dnf/transaction_sr.py | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py
-index e4974eb9..dae8d300 100644
---- a/dnf/transaction_sr.py
-+++ b/dnf/transaction_sr.py
-@@ -334,7 +334,6 @@ class TransactionReplay(object):
-             if action == "Install" and query_na.installed() and not self._base._get_installonly_query(query_na):
-                 self._raise_or_warn(self._ignore_installed,
-                     _('Package "{na}" is already installed for action "{action}".').format(na=na, action=action))
--                return
- 
-             sltr = dnf.selector.Selector(self._base.sack).set(pkg=query)
-             self._base.goal.install(select=sltr, optional=not self._base.conf.strict)
--- 
-2.26.2
-
-
-From ff32a3c68fa853b53084a1a4947f345062056f23 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Fri, 8 Jan 2021 13:37:45 +0100
-Subject: [PATCH 15/17] cli/output: Return number of listed packages from
- listPkgs()
-
-Instead of an error status and message.
----
- dnf/cli/cli.py              |  5 ++---
- dnf/cli/commands/history.py |  4 +++-
- dnf/cli/output.py           | 14 ++------------
- 3 files changed, 7 insertions(+), 16 deletions(-)
-
-diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
-index 3080ae64..be737ed3 100644
---- a/dnf/cli/cli.py
-+++ b/dnf/cli/cli.py
-@@ -505,7 +505,7 @@ class BaseCli(dnf.Base):
-             # XXX put this into the ListCommand at some point
-             if len(ypl.obsoletes) > 0 and basecmd == 'list':
-             # if we've looked up obsolete lists and it's a list request
--                rop = [0, '']
-+                rop = len(ypl.obsoletes)
-                 print(_('Obsoleting Packages'))
-                 for obtup in sorted(ypl.obsoletesTuples,
-                                     key=operator.itemgetter(0)):
-@@ -517,8 +517,7 @@ class BaseCli(dnf.Base):
-             rrap = self.output.listPkgs(ypl.recent, _('Recently Added Packages'),
-                                  basecmd, columns=columns)
-             if len(patterns) and \
--                rrap[0] and rop[0] and rup[0] and rep[0] and rap[0] and \
--                raep[0] and rip[0]:
-+                    rrap == 0 and rop == 0 and rup == 0 and rep == 0 and rap == 0 and raep == 0 and rip == 0:
-                 raise dnf.exceptions.Error(_('No matching Packages to list'))
- 
-     def returnPkgLists(self, pkgnarrow='all', patterns=None,
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index dfd954ee..e9b91d0f 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -251,7 +251,9 @@ class HistoryCommand(commands.Command):
-     def _hcmd_userinstalled(self):
-         """Execute history userinstalled command."""
-         pkgs = tuple(self.base.iter_userinstalled())
--        return self.output.listPkgs(pkgs, 'Packages installed by user', 'nevra')
-+        n_listed = self.output.listPkgs(pkgs, 'Packages installed by user', 'nevra')
-+        if n_listed == 0:
-+            raise dnf.cli.CliError(_('No packages to list'))
- 
-     def _args2transaction_ids(self):
-         """Convert commandline arguments to transaction ids"""
-diff --git a/dnf/cli/output.py b/dnf/cli/output.py
-index 6d729b63..6cfc9e22 100644
---- a/dnf/cli/output.py
-+++ b/dnf/cli/output.py
-@@ -597,18 +597,10 @@ class Output(object):
-                        number
-                  '>' - highlighting used when the package has a higher version
-                        number
--        :return: (exit_code, [errors])
--
--        exit_code is::
--
--            0 = we're done, exit
--            1 = we've errored, exit with error string
--
-+        :return: number of packages listed
-         """
-         if outputType in ['list', 'info', 'name', 'nevra']:
--            thingslisted = 0
-             if len(lst) > 0:
--                thingslisted = 1
-                 print('%s' % description)
-                 info_set = set()
-                 if outputType == 'list':
-@@ -645,9 +637,7 @@ class Output(object):
-                 if info_set:
-                     print("\n".join(sorted(info_set)))
- 
--            if thingslisted == 0:
--                return 1, [_('No packages to list')]
--            return 0, []
-+            return len(lst)
- 
-     def userconfirm(self, msg=None, defaultyes_msg=None):
-         """Get a yes or no from the user, and default to No
--- 
-2.26.2
-
-
-From 0226da7351eb97cd9c4c6739725b1f77d445764e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Fri, 8 Jan 2021 13:44:27 +0100
-Subject: [PATCH 16/17] Clean up history command error handling
-
-The removal of `ret` value error handling which was removed previously was not
-complete. Most of it is was no-op as no errors were really propagated through
-it, but the `history userinstalled` command was still relying on it.
-
-The commit removes the last bit and replaces it with raising an exception.
----
- dnf/cli/commands/history.py | 17 ++++++++---------
- 1 file changed, 8 insertions(+), 9 deletions(-)
-
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index e9b91d0f..7b38cb60 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -187,7 +187,7 @@ class HistoryCommand(commands.Command):
- 
-     def _hcmd_undo(self, extcmds):
-         old = self._history_get_transaction(extcmds)
--        return self._revert_transaction(old)
-+        self._revert_transaction(old)
- 
-     def _hcmd_rollback(self, extcmds):
-         old = self._history_get_transaction(extcmds)
-@@ -209,7 +209,7 @@ class HistoryCommand(commands.Command):
-                 else:
-                     merged_trans.merge(trans)
- 
--        return self._revert_transaction(merged_trans)
-+        self._revert_transaction(merged_trans)
- 
-     def _revert_transaction(self, trans):
-         action_map = {
-@@ -321,7 +321,6 @@ class HistoryCommand(commands.Command):
- 
-     def run(self):
-         vcmd = self.opts.transactions_action
--        ret = None
- 
-         if vcmd == 'replay':
-             self.base.read_comps(arch_filter=True)
-@@ -338,17 +337,17 @@ class HistoryCommand(commands.Command):
-             tids, merged_tids = self._args2transaction_ids()
- 
-             if vcmd == 'list' and (tids or not self.opts.transactions):
--                ret = self.output.historyListCmd(tids, reverse=self.opts.reverse)
-+                self.output.historyListCmd(tids, reverse=self.opts.reverse)
-             elif vcmd == 'info' and (tids or not self.opts.transactions):
--                ret = self.output.historyInfoCmd(tids, self.opts.transactions, merged_tids)
-+                self.output.historyInfoCmd(tids, self.opts.transactions, merged_tids)
-             elif vcmd == 'undo':
--                ret = self._hcmd_undo(tids)
-+                self._hcmd_undo(tids)
-             elif vcmd == 'redo':
--                ret = self._hcmd_redo(tids)
-+                self._hcmd_redo(tids)
-             elif vcmd == 'rollback':
--                ret = self._hcmd_rollback(tids)
-+                self._hcmd_rollback(tids)
-             elif vcmd == 'userinstalled':
--                ret = self._hcmd_userinstalled()
-+                self._hcmd_userinstalled()
-             elif vcmd == 'store':
-                 tid = self._history_get_transaction(tids)
-                 data = serialize_transaction(tid)
--- 
-2.26.2
-
-
-From 7e862711b3d7b9b444d966594630b49bf3761faf Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Mon, 23 Nov 2020 16:32:16 +0100
-Subject: [PATCH 17/17] Lazy-load base.comps instead of explicitly
-
-Loading base.comps was done by calling a method at arbitrary places in
-the code, this is hard to maintain and get right. The method could be
-inadvertedly called multiple times per dnf run too.
-
-Instead load the comps data lazily on first access. In case of the
-shell, using "repo enable/disable" can cause the comps data to change
-mid-run. Instead of explicitly reloading, clear the comps attribute and
-let it be lazy-loaded again when needed.
-
-Closes: #1690
-Approved by: j-mracek
----
- dnf/base.py                   | 4 ++--
- dnf/cli/commands/group.py     | 5 -----
- dnf/cli/commands/history.py   | 2 --
- dnf/cli/commands/install.py   | 1 -
- dnf/cli/commands/remove.py    | 1 -
- dnf/cli/commands/repoquery.py | 1 -
- dnf/cli/commands/shell.py     | 3 +++
- dnf/cli/commands/upgrade.py   | 1 -
- tests/api/test_dnf_base.py    | 4 +---
- 9 files changed, 6 insertions(+), 16 deletions(-)
-
-diff --git a/dnf/base.py b/dnf/base.py
-index a2955051..39c21c33 100644
---- a/dnf/base.py
-+++ b/dnf/base.py
-@@ -242,6 +242,8 @@ class Base(object):
-     @property
-     def comps(self):
-         # :api
-+        if self._comps is None:
-+            self.read_comps(arch_filter=True)
-         return self._comps
- 
-     @property
-@@ -1881,7 +1883,6 @@ class Base(object):
-             no_match_module_specs = install_specs.grp_specs
- 
-         if no_match_module_specs:
--            self.read_comps(arch_filter=True)
-             exclude_specs.grp_specs = self._expand_groups(exclude_specs.grp_specs)
-             self._install_groups(no_match_module_specs, exclude_specs, no_match_group_specs, strict)
- 
-@@ -2084,7 +2085,6 @@ class Base(object):
-                     msg = _('Not a valid form: %s')
-                     logger.warning(msg, grp_spec)
-             elif grp_specs:
--                self.read_comps(arch_filter=True)
-                 if self.env_group_remove(grp_specs):
-                     done = True
- 
-diff --git a/dnf/cli/commands/group.py b/dnf/cli/commands/group.py
-index bd17f80f..cf542799 100644
---- a/dnf/cli/commands/group.py
-+++ b/dnf/cli/commands/group.py
-@@ -110,9 +110,6 @@ class GroupCommand(commands.Command):
- 
-         return installed, available
- 
--    def _grp_setup(self):
--        self.base.read_comps(arch_filter=True)
--
-     def _info(self, userlist):
-         for strng in userlist:
-             group_matched = False
-@@ -370,8 +367,6 @@ class GroupCommand(commands.Command):
-         cmd = self.opts.subcmd
-         extcmds = self.opts.args
- 
--        self._grp_setup()
--
-         if cmd == 'summary':
-             return self._summary(extcmds)
-         if cmd == 'list':
-diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py
-index 7b38cb60..293d93fc 100644
---- a/dnf/cli/commands/history.py
-+++ b/dnf/cli/commands/history.py
-@@ -323,8 +323,6 @@ class HistoryCommand(commands.Command):
-         vcmd = self.opts.transactions_action
- 
-         if vcmd == 'replay':
--            self.base.read_comps(arch_filter=True)
--
-             self.replay = TransactionReplay(
-                 self.base,
-                 filename=self.opts.transaction_filename,
-diff --git a/dnf/cli/commands/install.py b/dnf/cli/commands/install.py
-index 38a90b61..b637af0b 100644
---- a/dnf/cli/commands/install.py
-+++ b/dnf/cli/commands/install.py
-@@ -151,7 +151,6 @@ class InstallCommand(commands.Command):
-         return err_pkgs
- 
-     def _install_groups(self, grp_specs):
--        self.base.read_comps(arch_filter=True)
-         try:
-             self.base.env_group_install(grp_specs,
-                                         tuple(self.base.conf.group_package_types),
-diff --git a/dnf/cli/commands/remove.py b/dnf/cli/commands/remove.py
-index f50dbd91..e455ba6e 100644
---- a/dnf/cli/commands/remove.py
-+++ b/dnf/cli/commands/remove.py
-@@ -142,7 +142,6 @@ class RemoveCommand(commands.Command):
-                 skipped_grps = self.opts.grp_specs
- 
-             if skipped_grps:
--                self.base.read_comps(arch_filter=True)
-                 for group in skipped_grps:
-                     try:
-                         if self.base.env_group_remove([group]):
-diff --git a/dnf/cli/commands/repoquery.py b/dnf/cli/commands/repoquery.py
-index 099a9312..b0d06a90 100644
---- a/dnf/cli/commands/repoquery.py
-+++ b/dnf/cli/commands/repoquery.py
-@@ -632,7 +632,6 @@ class RepoQueryCommand(commands.Command):
-                 print("\n".join(sorted(pkgs)))
- 
-     def _group_member_report(self, query):
--        self.base.read_comps(arch_filter=True)
-         package_conf_dict = {}
-         for group in self.base.comps.groups:
-             package_conf_dict[group.id] = set([pkg.name for pkg in group.packages_iter()])
-diff --git a/dnf/cli/commands/shell.py b/dnf/cli/commands/shell.py
-index 431fe502..18c886ff 100644
---- a/dnf/cli/commands/shell.py
-+++ b/dnf/cli/commands/shell.py
-@@ -239,6 +239,9 @@ exit (or quit)           exit the shell""")
-             if fill_sack:
-                 self.base.fill_sack()
- 
-+            # reset base._comps, as it has changed due to changing the repos
-+            self.base._comps = None
-+
-         else:
-             self._help('repo')
- 
-diff --git a/dnf/cli/commands/upgrade.py b/dnf/cli/commands/upgrade.py
-index 44789c9a..f62cfcc1 100644
---- a/dnf/cli/commands/upgrade.py
-+++ b/dnf/cli/commands/upgrade.py
-@@ -124,7 +124,6 @@ class UpgradeCommand(commands.Command):
- 
-     def _update_groups(self):
-         if self.skipped_grp_specs:
--            self.base.read_comps(arch_filter=True)
-             self.base.env_group_upgrade(self.skipped_grp_specs)
-             return True
-         return False
-diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py
-index ca71b75c..656bd225 100644
---- a/tests/api/test_dnf_base.py
-+++ b/tests/api/test_dnf_base.py
-@@ -34,9 +34,7 @@ class DnfBaseApiTest(TestCase):
-     def test_comps(self):
-         # Base.comps
-         self.assertHasAttr(self.base, "comps")
--
--        # blank initially
--        self.assertEqual(self.base.comps, None)
-+        self.assertHasType(self.base.comps, dnf.comps.Comps)
- 
-         self.base.read_comps()
-         self.assertHasType(self.base.comps, dnf.comps.Comps)
--- 
-2.26.2
-
diff --git a/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch b/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch
deleted file mode 100644
index 1ef5a4e..0000000
--- a/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch
+++ /dev/null
@@ -1,150 +0,0 @@
-From 8f3ce4868ac009976da7323ea39ebcd9a062e32d Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Mon, 23 Nov 2020 17:00:01 +0100
-Subject: [PATCH 1/3] Remove source packages from install/upgrade set
- (RhBug:1898548)
-
-It prevents Error: Will not install a source rpm package ()
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1898548
----
- dnf/module/module_base.py | 16 ++++++++++------
- 1 file changed, 10 insertions(+), 6 deletions(-)
-
-diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py
-index 04701b9d..49c871c4 100644
---- a/dnf/module/module_base.py
-+++ b/dnf/module/module_base.py
-@@ -140,20 +140,21 @@ class ModuleBase(object):
-         if fail_safe_repo_used:
-             raise dnf.exceptions.Error(_(
-                 "Installing module from Fail-Safe repository is not allowed"))
--        install_base_query = self.base.sack.query().filterm(
--            nevra_strict=install_set_artefacts).apply()
-+        #  Remove source packages they cannot be installed or upgraded
-+        base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply()
-+        install_base_query = base_no_source_query.filter(nevra_strict=install_set_artefacts)
- 
-         # add hot-fix packages
-         hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes]
--        hotfix_packages = self.base.sack.query().filterm(reponame=hot_fix_repos).filterm(
--            name=install_dict.keys())
-+        hotfix_packages = base_no_source_query.filter(
-+            reponame=hot_fix_repos, name=install_dict.keys())
-         install_base_query = install_base_query.union(hotfix_packages)
- 
-         for pkg_name, set_specs in install_dict.items():
-             query = install_base_query.filter(name=pkg_name)
-             if not query:
-                 # package can also be non-modular or part of another stream
--                query = self.base.sack.query().filterm(name=pkg_name)
-+                query = base_no_source_query.filter(name=pkg_name)
-                 if not query:
-                     for spec in set_specs:
-                         logger.error(_("Unable to resolve argument {}").format(spec))
-@@ -182,6 +183,9 @@ class ModuleBase(object):
-         fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME
-         fail_safe_repo_used = False
- 
-+        #  Remove source packages they cannot be installed or upgraded
-+        base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply()
-+
-         for spec in module_specs:
-             module_list, nsvcap = self._get_modules(spec)
-             if not module_list:
-@@ -221,7 +225,7 @@ class ModuleBase(object):
- 
-             if not upgrade_package_set:
-                 logger.error(_("Unable to match profile in argument {}").format(spec))
--            query = self.base.sack.query().filterm(name=upgrade_package_set)
-+            query = base_no_source_query.filter(name=upgrade_package_set)
-             if query:
-                 sltr = dnf.selector.Selector(self.base.sack)
-                 sltr.set(pkg=query)
--- 
-2.26.2
-
-
-From c42680b292b2cca38b24fb18f46f06f800c1934f Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Mon, 23 Nov 2020 17:04:05 +0100
-Subject: [PATCH 2/3] Remove all source packages from query
-
----
- dnf/base.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/dnf/base.py b/dnf/base.py
-index a2955051..a3d9b63f 100644
---- a/dnf/base.py
-+++ b/dnf/base.py
-@@ -1550,7 +1550,7 @@ class Base(object):
-                 if (comps_pkg.basearchonly):
-                     query_args.update({'arch': basearch})
-                 q = self.sack.query().filterm(**query_args).apply()
--                q.filterm(arch__neq="src")
-+                q.filterm(arch__neq=["src", "nosrc"])
-                 if not q:
-                     package_string = comps_pkg.name
-                     if comps_pkg.basearchonly:
--- 
-2.26.2
-
-
-From 1f68fa6dc59fb350e71a24e787135475f3fb5b4c Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Mon, 23 Nov 2020 17:29:45 +0100
-Subject: [PATCH 3/3] Run tests with sack in tmp directory
-
----
- tests/api/test_dnf_module_base.py | 17 +++++++++++------
- 1 file changed, 11 insertions(+), 6 deletions(-)
-
-diff --git a/tests/api/test_dnf_module_base.py b/tests/api/test_dnf_module_base.py
-index aa47555b..18dd080d 100644
---- a/tests/api/test_dnf_module_base.py
-+++ b/tests/api/test_dnf_module_base.py
-@@ -7,16 +7,26 @@ from __future__ import unicode_literals
- import dnf
- import dnf.module.module_base
- 
-+import os
-+import shutil
-+import tempfile
-+
- from .common import TestCase
- 
- 
- class DnfModuleBaseApiTest(TestCase):
-     def setUp(self):
-         self.base = dnf.Base(dnf.conf.Conf())
-+        self._installroot = tempfile.mkdtemp(prefix="dnf_test_installroot_")
-+        self.base.conf.installroot = self._installroot
-+        self.base.conf.cachedir = os.path.join(self._installroot, "var/cache/dnf")
-+        self.base._sack = dnf.sack._build_sack(self.base)
-         self.moduleBase = dnf.module.module_base.ModuleBase(self.base)
- 
-     def tearDown(self):
-         self.base.close()
-+        if self._installroot.startswith("/tmp/"):
-+            shutil.rmtree(self._installroot)
- 
-     def test_init(self):
-         moduleBase = dnf.module.module_base.ModuleBase(self.base)
-@@ -51,12 +61,7 @@ class DnfModuleBaseApiTest(TestCase):
-     def test_install(self):
-         # ModuleBase.install()
-         self.assertHasAttr(self.moduleBase, "install")
--        self.assertRaises(
--            AttributeError,
--            self.moduleBase.install,
--            module_specs=[],
--            strict=False,
--        )
-+        self.moduleBase.install(module_specs=[], strict=False)
- 
-     def test_remove(self):
-         # ModuleBase.remove()
--- 
-2.26.2
-
diff --git a/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch b/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch
deleted file mode 100644
index 2daa3b2..0000000
--- a/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From f3c254581bcb0591a543aee0c7e031c3c9d0a9a1 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Mon, 11 Jan 2021 16:43:25 +0100
-Subject: [PATCH] Fix documentation of globs not supporting curly brackets
-
-= changelog =
-msg: Fix documentation of globs not supporting curly brackets
-type: bugfix
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1913418
----
- doc/command_ref.rst | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/doc/command_ref.rst b/doc/command_ref.rst
-index bbce3ddcf4..d11e8dd502 100644
---- a/doc/command_ref.rst
-+++ b/doc/command_ref.rst
-@@ -1763,8 +1763,10 @@ The following patterns are supported:
-     those two characters, inclusive, is matched. If the first character
-     following the ``[`` is a ``!`` or a ``^`` then any character not enclosed
-     is matched.
--``{}``
--    Matches any of the comma separated list of enclosed strings.
-+
-+Note: Curly brackets (``{}``) are not supported. You can still use them in
-+shells that support them and let the shell do the expansion, but if quoted or
-+escaped, dnf will not expand them.
- 
- --------------
- NEVRA Matching
diff --git a/SOURCES/0008-Module-switch-command.patch b/SOURCES/0008-Module-switch-command.patch
deleted file mode 100644
index f464e15..0000000
--- a/SOURCES/0008-Module-switch-command.patch
+++ /dev/null
@@ -1,507 +0,0 @@
-From 6ed0458744090ab307da9d9118690372b2e66ca8 Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Wed, 11 Nov 2020 12:47:21 +0100
-Subject: [PATCH 1/5] Make module_base better industrialized for method reuse
-
-It will allow to use internal for module switch command.
----
- dnf/module/module_base.py | 29 ++++++++++++++++++++---------
- 1 file changed, 20 insertions(+), 9 deletions(-)
-
-diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py
-index 49c871c4..0da4fab1 100644
---- a/dnf/module/module_base.py
-+++ b/dnf/module/module_base.py
-@@ -323,7 +323,7 @@ class ModuleBase(object):
-             assert len(streamDict) == 1
-         return moduleDict
- 
--    def _resolve_specs_enable_update_sack(self, module_specs):
-+    def _resolve_specs_enable(self, module_specs):
-         no_match_specs = []
-         error_spec = []
-         module_dicts = {}
-@@ -339,6 +339,9 @@ class ModuleBase(object):
-                 error_spec.append(spec)
-                 logger.error(ucd(e))
-                 logger.error(_("Unable to resolve argument {}").format(spec))
-+        return no_match_specs, error_spec, module_dicts
-+
-+    def _update_sack(self):
-         hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes]
-         try:
-             solver_errors = self.base.sack.filter_modules(
-@@ -347,6 +350,10 @@ class ModuleBase(object):
-                 debugsolver=self.base.conf.debug_solver)
-         except hawkey.Exception as e:
-             raise dnf.exceptions.Error(ucd(e))
-+        return solver_errors
-+
-+    def _enable_dependencies(self, module_dicts):
-+        error_spec = []
-         for spec, (nsvcap, moduleDict) in module_dicts.items():
-             for streamDict in moduleDict.values():
-                 for modules in streamDict.values():
-@@ -357,6 +364,17 @@ class ModuleBase(object):
-                         error_spec.append(spec)
-                         logger.error(ucd(e))
-                         logger.error(_("Unable to resolve argument {}").format(spec))
-+        return error_spec
-+
-+    def _resolve_specs_enable_update_sack(self, module_specs):
-+        no_match_specs, error_spec, module_dicts = self._resolve_specs_enable(module_specs)
-+
-+        solver_errors = self._update_sack()
-+
-+        dependency_error_spec = self._enable_dependencies(module_dicts)
-+        if dependency_error_spec:
-+            error_spec.extend(dependency_error_spec)
-+
-         return no_match_specs, error_spec, solver_errors, module_dicts
- 
-     def _modules_reset_or_disable(self, module_specs, to_state):
-@@ -379,14 +397,7 @@ class ModuleBase(object):
-                 if to_state == STATE_DISABLED:
-                     self.base._moduleContainer.disable(name)
- 
--        hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes]
--        try:
--            solver_errors = self.base.sack.filter_modules(
--                self.base._moduleContainer, hot_fix_repos, self.base.conf.installroot,
--                self.base.conf.module_platform_id, update_only=True,
--                debugsolver=self.base.conf.debug_solver)
--        except hawkey.Exception as e:
--            raise dnf.exceptions.Error(ucd(e))
-+        solver_errors = self._update_sack()
-         return no_match_specs, solver_errors
- 
-     def _get_package_name_set_and_remove_profiles(self, module_list, nsvcap, remove=False):
--- 
-2.26.2
-
-
-From e6473f4e6f17bb635e023b8905f29b318b8795bf Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Wed, 11 Nov 2020 17:09:16 +0100
-Subject: [PATCH 2/5] Add module switch-to support (RhBug:1792020)
-
-It is a combination of module rpm distrosync, module profile switch and
-module stream switch.
-
-= changelog =
-msg:           Add new `module switch-to` command for switching content
-of module streams
-type:          enhancement
-resolves:      https://bugzilla.redhat.com/show_bug.cgi?id=1792020
----
- VERSION.cmake              |   2 +-
- dnf.spec                   |   2 +-
- dnf/cli/commands/module.py |  24 ++++-
- dnf/module/module_base.py  | 182 ++++++++++++++++++++++++++++++++-----
- 4 files changed, 185 insertions(+), 25 deletions(-)
-
-diff --git a/dnf/cli/commands/module.py b/dnf/cli/commands/module.py
-index 5a6c0069..4cdc915e 100644
---- a/dnf/cli/commands/module.py
-+++ b/dnf/cli/commands/module.py
-@@ -271,6 +271,28 @@ class ModuleCommand(commands.Command):
- 
-             logger.error(dnf.exceptions.MarkingErrors(no_match_group_specs=skipped_groups))
- 
-+    class SwitchToSubCommand(SubCommand):
-+
-+        aliases = ('switch-to',)
-+        summary = _('switch a module to a stream and distrosync rpm packages')
-+
-+        def configure(self):
-+            demands = self.cli.demands
-+            demands.available_repos = True
-+            demands.sack_activation = True
-+            demands.resolving = True
-+            demands.root_user = True
-+            self.base.conf.module_stream_switch = True
-+
-+        def run_on_module(self):
-+            try:
-+                self.module_base.switch_to(self.opts.module_spec, strict=self.base.conf.strict)
-+            except dnf.exceptions.MarkingErrors as e:
-+                if self.base.conf.strict:
-+                    if e.no_match_group_specs or e.error_group_specs:
-+                        raise e
-+                logger.error(str(e))
-+
-     class ProvidesSubCommand(SubCommand):
- 
-         aliases = ("provides", )
-@@ -319,7 +341,7 @@ class ModuleCommand(commands.Command):
- 
-     SUBCMDS = {ListSubCommand, InfoSubCommand, EnableSubCommand,
-                DisableSubCommand, ResetSubCommand, InstallSubCommand, UpdateSubCommand,
--               RemoveSubCommand, ProvidesSubCommand, RepoquerySubCommand}
-+               RemoveSubCommand, SwitchToSubCommand, ProvidesSubCommand, RepoquerySubCommand}
- 
-     SUBCMDS_NOT_REQUIRED_ARG = {ListSubCommand}
- 
-diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py
-index 0da4fab1..03d54f72 100644
---- a/dnf/module/module_base.py
-+++ b/dnf/module/module_base.py
-@@ -140,31 +140,140 @@ class ModuleBase(object):
-         if fail_safe_repo_used:
-             raise dnf.exceptions.Error(_(
-                 "Installing module from Fail-Safe repository is not allowed"))
--        #  Remove source packages they cannot be installed or upgraded
--        base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply()
--        install_base_query = base_no_source_query.filter(nevra_strict=install_set_artefacts)
-+        __, profiles_errors = self._install_profiles_internal(
-+            install_set_artefacts, install_dict, strict)
-+        if profiles_errors:
-+            error_specs.extend(profiles_errors)
- 
--        # add hot-fix packages
--        hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes]
--        hotfix_packages = base_no_source_query.filter(
--            reponame=hot_fix_repos, name=install_dict.keys())
--        install_base_query = install_base_query.union(hotfix_packages)
-+        if no_match_specs or error_specs or solver_errors:
-+            raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs,
-+                                               error_group_specs=error_specs,
-+                                               module_depsolv_errors=solver_errors)
- 
--        for pkg_name, set_specs in install_dict.items():
--            query = install_base_query.filter(name=pkg_name)
--            if not query:
--                # package can also be non-modular or part of another stream
--                query = base_no_source_query.filter(name=pkg_name)
--                if not query:
--                    for spec in set_specs:
--                        logger.error(_("Unable to resolve argument {}").format(spec))
--                    logger.error(_("No match for package {}").format(pkg_name))
--                    error_specs.extend(set_specs)
--                    continue
--            self.base._goal.group_members.add(pkg_name)
-+    def switch_to(self, module_specs, strict=True):
-+        # :api
-+        no_match_specs, error_specs, module_dicts = self._resolve_specs_enable(module_specs)
-+        # collect name of artifacts from new modules for distrosync
-+        new_artifacts_names = set()
-+        # collect name of artifacts from active modules for distrosync before sack update
-+        active_artifacts_names = set()
-+        src_arches = {"nosrc", "src"}
-+        for spec, (nsvcap, moduledict) in module_dicts.items():
-+            for name in moduledict.keys():
-+                for module in self.base._moduleContainer.query(name, "", "", "", ""):
-+                    if self.base._moduleContainer.isModuleActive(module):
-+                        for artifact in module.getArtifacts():
-+                            arch = artifact.rsplit(".", 1)[1]
-+                            if arch in src_arches:
-+                                continue
-+                            pkg_name = artifact.rsplit("-", 2)[0]
-+                            active_artifacts_names.add(pkg_name)
-+
-+        solver_errors = self._update_sack()
-+
-+        dependency_error_spec = self._enable_dependencies(module_dicts)
-+        if dependency_error_spec:
-+            error_specs.extend(dependency_error_spec)
-+
-+        # <package_name, set_of_spec>
-+        fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME
-+        install_dict = {}
-+        install_set_artifacts = set()
-+        fail_safe_repo_used = False
-+
-+        # list of name: [profiles] for module profiles being removed
-+        removed_profiles = self.base._moduleContainer.getRemovedProfiles()
-+
-+        for spec, (nsvcap, moduledict) in module_dicts.items():
-+            for name, streamdict in moduledict.items():
-+                for stream, module_list in streamdict.items():
-+                    install_module_list = [x for x in module_list
-+                                           if self.base._moduleContainer.isModuleActive(x.getId())]
-+                    if not install_module_list:
-+                        "No active matches for argument '{0}' in module '{1}:{2}'"
-+                        logger.error(_("No active matches for argument '{0}' in module "
-+                                       "'{1}:{2}'").format(spec, name, stream))
-+                        error_specs.append(spec)
-+                        continue
-+                    profiles = []
-+                    latest_module = self._get_latest(install_module_list)
-+                    if latest_module.getRepoID() == fail_safe_repo:
-+                        msg = _(
-+                            "Installing module '{0}' from Fail-Safe repository {1} is not allowed")
-+                        logger.critical(msg.format(latest_module.getNameStream(), fail_safe_repo))
-+                        fail_safe_repo_used = True
-+                    if nsvcap.profile:
-+                        profiles.extend(latest_module.getProfiles(nsvcap.profile))
-+                        if not profiles:
-+                            available_profiles = latest_module.getProfiles()
-+                            if available_profiles:
-+                                profile_names = ", ".join(sorted(
-+                                    [profile.getName() for profile in available_profiles]))
-+                                msg = _("Unable to match profile for argument {}. Available "
-+                                        "profiles for '{}:{}': {}").format(
-+                                    spec, name, stream, profile_names)
-+                            else:
-+                                msg = _("Unable to match profile for argument {}").format(spec)
-+                            logger.error(msg)
-+                            no_match_specs.append(spec)
-+                            continue
-+                    elif name in removed_profiles:
-+
-+                        for profile in removed_profiles[name]:
-+                            module_profiles = latest_module.getProfiles(profile)
-+                            if not module_profiles:
-+                                logger.warning(
-+                                    _("Installed profile '{0}' is not available in module "
-+                                      "'{1}' stream '{2}'").format(profile, name, stream))
-+                                continue
-+                            profiles.extend(module_profiles)
-+                    for profile in profiles:
-+                        self.base._moduleContainer.install(latest_module, profile.getName())
-+                        for pkg_name in profile.getContent():
-+                            install_dict.setdefault(pkg_name, set()).add(spec)
-+                    for module in install_module_list:
-+                        artifacts = module.getArtifacts()
-+                        install_set_artifacts.update(artifacts)
-+                        for artifact in artifacts:
-+                            arch = artifact.rsplit(".", 1)[1]
-+                            if arch in src_arches:
-+                                continue
-+                            pkg_name = artifact.rsplit("-", 2)[0]
-+                            new_artifacts_names.add(pkg_name)
-+        if fail_safe_repo_used:
-+            raise dnf.exceptions.Error(_(
-+                "Installing module from Fail-Safe repository is not allowed"))
-+        install_base_query, profiles_errors = self._install_profiles_internal(
-+            install_set_artifacts, install_dict, strict)
-+        if profiles_errors:
-+            error_specs.extend(profiles_errors)
-+
-+        # distrosync module name
-+        all_names = set()
-+        all_names.update(new_artifacts_names)
-+        all_names.update(active_artifacts_names)
-+        remove_query = self.base.sack.query().filterm(empty=True)
-+        for pkg_name in all_names:
-+            query = self.base.sack.query().filterm(name=pkg_name)
-+            installed = query.installed()
-+            if not installed:
-+                continue
-+            available = query.available()
-+            if not available:
-+                logger.warning(_("No packages available to distrosync for package name "
-+                                 "'{}'").format(pkg_name))
-+                if pkg_name not in new_artifacts_names:
-+                    remove_query = remove_query.union(query)
-+                continue
-+
-+            only_new_module = query.intersection(install_base_query)
-+            if only_new_module:
-+                query = only_new_module
-             sltr = dnf.selector.Selector(self.base.sack)
-             sltr.set(pkg=query)
--            self.base._goal.install(select=sltr, optional=(not strict))
-+            self.base._goal.distupgrade(select=sltr)
-+        self.base._remove_if_unneeded(remove_query)
-+
-         if no_match_specs or error_specs or solver_errors:
-             raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs,
-                                                error_group_specs=error_specs,
-@@ -183,7 +292,7 @@ class ModuleBase(object):
-         fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME
-         fail_safe_repo_used = False
- 
--        #  Remove source packages they cannot be installed or upgraded
-+        #  Remove source packages because they cannot be installed or upgraded
-         base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply()
- 
-         for spec in module_specs:
-@@ -694,6 +803,35 @@ class ModuleBase(object):
-     def _format_repoid(self, repo_name):
-         return "{}\n".format(self.base.output.term.bold(repo_name))
- 
-+    def _install_profiles_internal(self, install_set_artifacts, install_dict, strict):
-+        #  Remove source packages because they cannot be installed or upgraded
-+        base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply()
-+        install_base_query = base_no_source_query.filter(nevra_strict=install_set_artifacts)
-+        error_specs = []
-+
-+        # add hot-fix packages
-+        hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes]
-+        hotfix_packages = base_no_source_query.filter(
-+            reponame=hot_fix_repos, name=install_dict.keys())
-+        install_base_query = install_base_query.union(hotfix_packages)
-+
-+        for pkg_name, set_specs in install_dict.items():
-+            query = install_base_query.filter(name=pkg_name)
-+            if not query:
-+                # package can also be non-modular or part of another stream
-+                query = base_no_source_query.filter(name=pkg_name)
-+                if not query:
-+                    for spec in set_specs:
-+                        logger.error(_("Unable to resolve argument {}").format(spec))
-+                    logger.error(_("No match for package {}").format(pkg_name))
-+                    error_specs.extend(set_specs)
-+                    continue
-+            self.base._goal.group_members.add(pkg_name)
-+            sltr = dnf.selector.Selector(self.base.sack)
-+            sltr.set(pkg=query)
-+            self.base._goal.install(select=sltr, optional=(not strict))
-+        return install_base_query, error_specs
-+
- 
- def format_modular_solver_errors(errors):
-     msg = dnf.util._format_resolve_problems(errors)
--- 
-2.26.2
-
-
-From df8c74679193bf27db584b3ad225997b2f5f4b87 Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Thu, 12 Nov 2020 13:51:02 +0100
-Subject: [PATCH 3/5] [minor] Rename all variables with artefact to artifact
-
----
- dnf/module/module_base.py | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py
-index 03d54f72..7298c9a3 100644
---- a/dnf/module/module_base.py
-+++ b/dnf/module/module_base.py
-@@ -73,7 +73,7 @@ class ModuleBase(object):
-         # <package_name, set_of_spec>
-         fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME
-         install_dict = {}
--        install_set_artefacts = set()
-+        install_set_artifacts = set()
-         fail_safe_repo_used = False
-         for spec, (nsvcap, moduledict) in module_dicts.items():
-             for name, streamdict in moduledict.items():
-@@ -136,12 +136,12 @@ class ModuleBase(object):
-                         for pkg_name in profile.getContent():
-                             install_dict.setdefault(pkg_name, set()).add(spec)
-                     for module in install_module_list:
--                        install_set_artefacts.update(module.getArtifacts())
-+                        install_set_artifacts.update(module.getArtifacts())
-         if fail_safe_repo_used:
-             raise dnf.exceptions.Error(_(
-                 "Installing module from Fail-Safe repository is not allowed"))
-         __, profiles_errors = self._install_profiles_internal(
--            install_set_artefacts, install_dict, strict)
-+            install_set_artifacts, install_dict, strict)
-         if profiles_errors:
-             error_specs.extend(profiles_errors)
- 
-@@ -326,8 +326,8 @@ class ModuleBase(object):
-                     else:
-                         for profile in latest_module.getProfiles():
-                             upgrade_package_set.update(profile.getContent())
--                        for artefact in latest_module.getArtifacts():
--                            subj = hawkey.Subject(artefact)
-+                        for artifact in latest_module.getArtifacts():
-+                            subj = hawkey.Subject(artifact)
-                             for nevra_obj in subj.get_nevra_possibilities(
-                                     forms=[hawkey.FORM_NEVRA]):
-                                 upgrade_package_set.add(nevra_obj.name)
--- 
-2.26.2
-
-
-From 0818bb80fc0846f602f338a2119671be97c47217 Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Thu, 12 Nov 2020 15:11:29 +0100
-Subject: [PATCH 4/5] [doc] Add description of dnf module switch-to
-
----
- doc/command_ref.rst | 30 ++++++++++++++++++++++--------
- 1 file changed, 22 insertions(+), 8 deletions(-)
-
-diff --git a/doc/command_ref.rst b/doc/command_ref.rst
-index 83879013..c12837ea 100644
---- a/doc/command_ref.rst
-+++ b/doc/command_ref.rst
-@@ -979,15 +979,31 @@ Module subcommands take :ref:`\<module-spec>\ <specifying_modules-label>`... arg
-     In case no profile was provided, all default profiles get installed.
-     Module streams get enabled accordingly.
- 
--    This command cannot be used for switching module streams. It is recommended to remove all
--    installed content from the module and reset the module using the
--    :ref:`reset <module_reset_command-label>` command. After you reset the module, you can install
--    the other stream.
-+    This command cannot be used for switching module streams. Use the
-+    :ref:`dnf module switch-to <module_switch_to_command-label>` command for that.
- 
- ``dnf [options] module update <module-spec>...``
-     Update packages associated with an active module stream, optionally restricted to a profile.
-     If the `profile_name` is provided, only the packages referenced by that profile will be updated.
- 
-+.. _module_switch_to_command-label:
-+
-+``dnf [options] module switch-to <module-spec>...``
-+    Switch to or enable a module stream, change versions of installed packages to versions provided
-+    by the new stream, and remove packages from the old stream that are no longer available. It also
-+    updates installed profiles if they are available for the new stream. When a profile was
-+    provided, it installs that profile and does not update any already installed profiles.
-+
-+    This command can be used as a stronger version of the
-+    :ref:`dnf module enable <module_enable_command-label>` command, which not only enables modules,
-+    but also does a `distrosync` to all modular packages in the enabled modules.
-+
-+    It can also be used as a stronger version of the
-+    :ref:`dnf module install <module_install_command-label>` command, but it requires to specify
-+    profiles that are supposed to be installed, because `switch-to` command does not use `default
-+    profiles`. The `switch-to` command doesn't only install profiles, it also makes a `distrosync`
-+    to all modular packages in the installed module.
-+
- ``dnf [options] module remove <module-spec>...``
-     Remove installed module profiles, including packages that were installed with the
-     :ref:`dnf module install <module_install_command-label>` command. Will not remove packages
-@@ -1010,10 +1026,8 @@ Module subcommands take :ref:`\<module-spec>\ <specifying_modules-label>`... arg
-     of modular dependency issue the operation will be rejected. To perform the action anyway please use
-     \-\ :ref:`-skip-broken <skip-broken_option-label>` option.
- 
--    This command cannot be used for switching module streams. It is recommended to remove all
--    installed content from the module, and reset the module using the
--    :ref:`reset <module_reset_command-label>` command. After you reset the module, you can enable
--    the other stream.
-+    This command cannot be used for switching module streams. Use the
-+    :ref:`dnf module switch-to <module_switch_to_command-label>` command for that.
- 
- .. _module_disable_command-label:
- 
--- 
-2.26.2
-
-
-From 6b0b2b99e40c20706145e774626658825f5bc55d Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Wed, 25 Nov 2020 12:34:30 +0100
-Subject: [PATCH 5/5] Do not use source rpms for module switch
-
-It prevents misleading message from libsolv that it tries to install
-source rpm.
----
- dnf/module/module_base.py | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py
-index 7298c9a3..02d5d5a3 100644
---- a/dnf/module/module_base.py
-+++ b/dnf/module/module_base.py
-@@ -253,8 +253,10 @@ class ModuleBase(object):
-         all_names.update(new_artifacts_names)
-         all_names.update(active_artifacts_names)
-         remove_query = self.base.sack.query().filterm(empty=True)
-+        base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply()
-+
-         for pkg_name in all_names:
--            query = self.base.sack.query().filterm(name=pkg_name)
-+            query = base_no_source_query.filter(name=pkg_name)
-             installed = query.installed()
-             if not installed:
-                 continue
--- 
-2.26.2
-
diff --git a/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch b/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch
deleted file mode 100644
index 240495d..0000000
--- a/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From de8bbccc4e035a9a9b5baa3aeb0dbf0cb12f1fe2 Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Wed, 9 Dec 2020 13:45:46 +0100
-Subject: [PATCH 1/1] yum.misc.decompress() to handle uncompressed files
- (RhBug:1895059)
-
-The underlying libdnf function is capable to handle even uncompressed
-files - so now uncompressed files are just copied to the destination.
-Also unused fn_only parameter of the function was removed.
-
-This fixes issue with "reposync -m" command when the group metadata file
-in the repository is a plain xml file (not compressed).
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1895059
----
- dnf/yum/misc.py | 60 +++++++++++++++++++++++++++----------------------
- 1 file changed, 33 insertions(+), 27 deletions(-)
-
-diff --git a/dnf/yum/misc.py b/dnf/yum/misc.py
-index 0f922350..3e3905fe 100644
---- a/dnf/yum/misc.py
-+++ b/dnf/yum/misc.py
-@@ -386,34 +386,39 @@ def getloginuid():
-         _cached_getloginuid = _getloginuid()
-     return _cached_getloginuid
- 
--def decompress(filename, dest=None, fn_only=False, check_timestamps=False):
--    """take a filename and decompress it into the same relative location.
--       if the file is not compressed just return the file"""
--
--    ztype = None
--    out = filename  # If the file is not compressed, it returns the same file
- 
--    dot_pos = filename.rfind('.')
--    if dot_pos > 0:
--        ext = filename[dot_pos:]
--        if ext in ('.zck', '.xz', '.bz2', '.gz'):
--            ztype = ext
--            out = dest if dest else filename[:dot_pos]
--
--    if ztype and not fn_only:
--        if check_timestamps:
--            fi = stat_f(filename)
--            fo = stat_f(out)
--            if fi and fo and fo.st_mtime == fi.st_mtime:
--                return out
-+def decompress(filename, dest=None, check_timestamps=False):
-+    """take a filename and decompress it into the same relative location.
-+       When the compression type is not recognized (or file is not compressed),
-+       the content of the file is copied to the destination"""
-+
-+    if dest:
-+        out = dest
-+    else:
-+        out = None
-+        dot_pos = filename.rfind('.')
-+        if dot_pos > 0:
-+            ext = filename[dot_pos:]
-+            if ext in ('.zck', '.xz', '.bz2', '.gz', '.lzma', '.zst'):
-+                out = filename[:dot_pos]
-+        if out is None:
-+            raise dnf.exceptions.MiscError("Could not determine destination filename")
-+
-+    if check_timestamps:
-+        fi = stat_f(filename)
-+        fo = stat_f(out)
-+        if fi and fo and fo.st_mtime == fi.st_mtime:
-+            return out
- 
--        try:
--            libdnf.utils.decompress(filename, out, 0o644, ztype)
--        except RuntimeError as e:
--            raise dnf.exceptions.MiscError(str(e))
-+    try:
-+        # libdnf.utils.decompress either decompress file to the destination or
-+        # copy the content if the compression type is not recognized
-+        libdnf.utils.decompress(filename, out, 0o644)
-+    except RuntimeError as e:
-+        raise dnf.exceptions.MiscError(str(e))
- 
--        if check_timestamps and fi:
--            os.utime(out, (fi.st_mtime, fi.st_mtime))
-+    if check_timestamps and fi:
-+        os.utime(out, (fi.st_mtime, fi.st_mtime))
- 
-     return out
- 
-@@ -424,13 +429,14 @@ def calculate_repo_gen_dest(filename, generated_name):
-         os.makedirs(dest, mode=0o755)
-     return dest + '/' + generated_name
- 
--def repo_gen_decompress(filename, generated_name, cached=False):
-+
-+def repo_gen_decompress(filename, generated_name):
-     """ This is a wrapper around decompress, where we work out a cached
-         generated name, and use check_timestamps. filename _must_ be from
-         a repo. and generated_name is the type of the file. """
- 
-     dest = calculate_repo_gen_dest(filename, generated_name)
--    return decompress(filename, dest=dest, check_timestamps=True, fn_only=cached)
-+    return decompress(filename, dest=dest, check_timestamps=True)
- 
- def read_in_items_from_dot_dir(thisglob, line_as_list=True):
-     """ Takes a glob of a dir (like /etc/foo.d/\\*.foo) returns a list of all
--- 
-2.26.2
-
diff --git a/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch b/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch
deleted file mode 100644
index 3bfdafb..0000000
--- a/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 04b1a90bb24b7e98d4e001c44f8b3f563ad5f0f6 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Tue, 24 Nov 2020 14:31:21 +0100
-Subject: [PATCH] Make rotated log file (mode, owner, group) match previous log
- settings (RhBug:1894344)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1894344
----
- etc/logrotate.d/dnf | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/etc/logrotate.d/dnf b/etc/logrotate.d/dnf
-index b96c6ff9b4..0ce2629f1b 100644
---- a/etc/logrotate.d/dnf
-+++ b/etc/logrotate.d/dnf
-@@ -3,5 +3,5 @@
-     notifempty
-     rotate 4
-     weekly
--    create 0600 root root
-+    create
- }
diff --git a/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch b/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch
deleted file mode 100644
index 49c2a1a..0000000
--- a/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-From eb2aa8c14208da7a567a0d79a8baa9f5201640cd Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Tue, 24 Nov 2020 09:17:41 +0100
-Subject: [PATCH 1/3] Add `from_repo` attribute for Package class
- (RhBug:1898968,1879168)
-
-It as an alias for private attribute _from_repo.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1898968
-https://bugzilla.redhat.com/show_bug.cgi?id=1879168
----
- dnf/cli/commands/repoquery.py | 2 +-
- dnf/package.py                | 7 +++++--
- doc/api_package.rst           | 6 ++++++
- 3 files changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/dnf/cli/commands/repoquery.py b/dnf/cli/commands/repoquery.py
-index 099a9312d9..a11b440525 100644
---- a/dnf/cli/commands/repoquery.py
-+++ b/dnf/cli/commands/repoquery.py
-@@ -44,7 +44,7 @@
- QFORMAT_MATCH = re.compile(r'%(-?\d*?){([:.\w]+?)}')
- 
- QUERY_TAGS = """\
--name, arch, epoch, version, release, reponame (repoid), evr,
-+name, arch, epoch, version, release, reponame (repoid), from_repo, evr,
- debug_name, source_name, source_debug_name,
- installtime, buildtime, size, downloadsize, installsize,
- provides, requires, obsoletes, conflicts, sourcerpm,
-diff --git a/dnf/package.py b/dnf/package.py
-index d44ce6706c..f647df6bff 100644
---- a/dnf/package.py
-+++ b/dnf/package.py
-@@ -76,12 +76,15 @@ def _from_repo(self):
-         pkgrepo = None
-         if self._from_system:
-             pkgrepo = self.base.history.repo(self)
--        else:
--            pkgrepo = {}
-         if pkgrepo:
-             return '@' + pkgrepo
-         return self.reponame
- 
-+    @property
-+    def from_repo(self):
-+        # :api
-+        return self._from_repo
-+
-     @property
-     def _header(self):
-         return dnf.rpm._header(self.localPkg())
-diff --git a/doc/api_package.rst b/doc/api_package.rst
-index 95df5d4b23..48ef8f1d22 100644
---- a/doc/api_package.rst
-+++ b/doc/api_package.rst
-@@ -74,6 +74,12 @@
- 
-     Files the package provides (list of strings).
- 
-+  .. attribute:: from_repo
-+
-+    For installed packages returns id of repository from which the package was installed prefixed
-+    with '@' (if such information is available in the history database). Otherwise returns id of
-+    repository the package belongs to (@System for installed packages of unknown origin) (string).
-+
-   .. attribute:: group
- 
-     Group of the package (string).
-
-From 1a933f8e036cd704fa6e7f77a8448263e93e540f Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Tue, 24 Nov 2020 09:19:42 +0100
-Subject: [PATCH 2/3] Correct description of Package().reponane attribute
-
----
- doc/api_package.rst | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/doc/api_package.rst b/doc/api_package.rst
-index 48ef8f1d22..a78897babe 100644
---- a/doc/api_package.rst
-+++ b/doc/api_package.rst
-@@ -138,7 +138,7 @@
- 
-   .. attribute:: reponame
- 
--    Id of repository the package was installed from (string).
-+    Id of repository the package belongs to (@System for installed packages) (string).
- 
-   .. attribute:: requires
- 
-
-From 24cdb68776507fdae25bed0e82d80df3018aecfc Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Tue, 24 Nov 2020 09:22:07 +0100
-Subject: [PATCH 3/3] Add unittest for new API
-
----
- tests/api/test_dnf_package.py | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/tests/api/test_dnf_package.py b/tests/api/test_dnf_package.py
-index 04cddc7ecc..5952352bb5 100644
---- a/tests/api/test_dnf_package.py
-+++ b/tests/api/test_dnf_package.py
-@@ -163,6 +163,11 @@ def test_reponame(self):
-         self.assertHasAttr(self.package, "reponame")
-         self.assertHasType(self.package.reponame, str)
- 
-+    def test_from_repo(self):
-+        # Package.reponame
-+        self.assertHasAttr(self.package, "from_repo")
-+        self.assertHasType(self.package.from_repo, str)
-+
-     def test_requires(self):
-         # Package.requires
-         self.assertHasAttr(self.package, "requires")
diff --git a/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch b/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch
deleted file mode 100644
index b81646b..0000000
--- a/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From ca06d200d738fd6b23cb05b9776c9fd29288665f Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Wed, 25 Nov 2020 13:00:22 +0100
-Subject: [PATCH 1/2] Change behaviour of Package().from_repo
-
-The change makes a difference between private attribute _from_repo and
-API attribute. _from_repo is required for `dnf info` and we have to keep
-it, but for API the magic handling behind could be confusing.
----
- dnf/package.py      | 8 +++++++-
- doc/api_package.rst | 5 ++---
- 2 files changed, 9 insertions(+), 4 deletions(-)
-
-diff --git a/dnf/package.py b/dnf/package.py
-index f647df6bff..28ca5ef760 100644
---- a/dnf/package.py
-+++ b/dnf/package.py
-@@ -73,6 +73,12 @@ def _from_system(self):
- 
-     @property
-     def _from_repo(self):
-+        """
-+        For installed packages returns id of repository from which the package was installed
-+        prefixed with '@' (if such information is available in the history database). Otherwise
-+        returns id of repository the package belongs to (@System for installed packages of unknown
-+        origin)
-+        """
-         pkgrepo = None
-         if self._from_system:
-             pkgrepo = self.base.history.repo(self)
-@@ -83,7 +89,7 @@ def _from_repo(self):
-     @property
-     def from_repo(self):
-         # :api
--        return self._from_repo
-+        return self.base.history.repo(self)
- 
-     @property
-     def _header(self):
-diff --git a/doc/api_package.rst b/doc/api_package.rst
-index a78897babe..634f504ca6 100644
---- a/doc/api_package.rst
-+++ b/doc/api_package.rst
-@@ -76,9 +76,8 @@
- 
-   .. attribute:: from_repo
- 
--    For installed packages returns id of repository from which the package was installed prefixed
--    with '@' (if such information is available in the history database). Otherwise returns id of
--    repository the package belongs to (@System for installed packages of unknown origin) (string).
-+    For installed packages returns id of repository from which the package was installed if such
-+    information is available in the history database. Otherwise returns an empty string (string).
- 
-   .. attribute:: group
- 
-
-From 895e61a1281db753dd28f01c20816e83c5316cdd Mon Sep 17 00:00:00 2001
-From: Jaroslav Mracek <jmracek@redhat.com>
-Date: Thu, 26 Nov 2020 10:02:08 +0100
-Subject: [PATCH 2/2] fixup! Change behaviour of Package().from_repo
-
----
- dnf/package.py | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/dnf/package.py b/dnf/package.py
-index 28ca5ef760..baef04fa5b 100644
---- a/dnf/package.py
-+++ b/dnf/package.py
-@@ -89,7 +89,9 @@ def _from_repo(self):
-     @property
-     def from_repo(self):
-         # :api
--        return self.base.history.repo(self)
-+        if self._from_system:
-+            return self.base.history.repo(self)
-+        return ""
- 
-     @property
-     def _header(self):
diff --git a/SOURCES/0013-Package-add-a-get-header--method.patch b/SOURCES/0013-Package-add-a-get-header--method.patch
deleted file mode 100644
index a5f8478..0000000
--- a/SOURCES/0013-Package-add-a-get-header--method.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From 38cc67385fb1b36aa0881bc5982bc58d75dac464 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= <lhrazky@redhat.com>
-Date: Wed, 11 Nov 2020 18:45:11 +0100
-Subject: [PATCH] Package: add a get_header() method (RhBug:1876606)
-
-Adds get_header() method to the Package class, which returns the rpm
-header of an installed package.
-
-= changelog =
-msg: Add get_header() method to the Package class
-type: enhancement
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1876606
----
- dnf/package.py        | 24 ++++++++++++++++++++++++
- tests/test_package.py | 12 ++++++++++++
- 2 files changed, 36 insertions(+)
-
-diff --git a/dnf/package.py b/dnf/package.py
-index baef04fa5b..836e0e4989 100644
---- a/dnf/package.py
-+++ b/dnf/package.py
-@@ -26,11 +26,13 @@
- from dnf.i18n import _
- 
- import binascii
-+import dnf.exceptions
- import dnf.rpm
- import dnf.yum.misc
- import hawkey
- import logging
- import os
-+import rpm
- 
- logger = logging.getLogger("dnf")
- 
-@@ -95,6 +97,11 @@ def from_repo(self):
- 
-     @property
-     def _header(self):
-+        """
-+        Returns the header of a locally present rpm package file. As opposed to
-+        self.get_header(), which retrieves the header of an installed package
-+        from rpmdb.
-+        """
-         return dnf.rpm._header(self.localPkg())
- 
-     @property
-@@ -164,6 +171,23 @@ def debugsource_name(self):
-         src_name = self.source_name if self.source_name is not None else self.name
-         return src_name + self.DEBUGSOURCE_SUFFIX
- 
-+    def get_header(self):
-+        """
-+        Returns the rpm header of the package if it is installed. If not
-+        installed, returns None. The header is not cached, it is retrieved from
-+        rpmdb on every call. In case of a failure (e.g. when the rpmdb changes
-+        between loading the data and calling this method), raises an instance
-+        of PackageNotFoundError.
-+        """
-+        if not self._from_system:
-+            return None
-+
-+        try:
-+            # RPMDBI_PACKAGES stands for the header of the package
-+            return next(self.base._ts.dbMatch(rpm.RPMDBI_PACKAGES, self.rpmdbid))
-+        except StopIteration:
-+            raise dnf.exceptions.PackageNotFoundError("Package not found when attempting to retrieve header", str(self))
-+
-     @property
-     def source_debug_name(self):
-         # :api
-diff --git a/tests/test_package.py b/tests/test_package.py
-index cd4872e631..514e5bf099 100644
---- a/tests/test_package.py
-+++ b/tests/test_package.py
-@@ -68,6 +68,18 @@ def fn_getter():
-             with self.assertRaises(IOError):
-                 pkg._header
- 
-+    # rpm.hdr() is not easy to construct with custom data, we just return a string
-+    # instead, as we don't actually need an instance of rpm.hdr for the test
-+    @mock.patch("rpm.TransactionSet.dbMatch", lambda self, a, b: iter(["package_header_test_data"]))
-+    def test_get_header(self):
-+        pkg = self.sack.query().installed().filter(name="pepper")[0]
-+        header = pkg.get_header()
-+        self.assertEqual(header, "package_header_test_data")
-+
-+        pkg = self.sack.query().available().filter(name="pepper")[0]
-+        header = pkg.get_header()
-+        self.assertEqual(header, None)
-+
-     @mock.patch("dnf.package.Package.rpmdbid", long(3))
-     def test_idx(self):
-         """ pkg.idx is an int. """
diff --git a/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch b/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch
deleted file mode 100644
index d912d69..0000000
--- a/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From b3542a96c6f77e5cc0b5217e586fcc56fde074d8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Wed, 2 Dec 2020 15:27:13 +0100
-Subject: [PATCH 1/2] Add api function: fill_sack_from_repos_in_cache
- (RhBug:1865803)
-
-= changelog =
-msg: Add api function fill_sack_from_repos_in_cache to allow loading a repo cache with repomd and (solv file or primary xml) only
-type: enhancement
-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1865803
----
- dnf.spec    |  2 +-
- dnf/base.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 63 insertions(+), 1 deletion(-)
-
-diff --git a/dnf/base.py b/dnf/base.py
-index 075e74265a..a10b837340 100644
---- a/dnf/base.py
-+++ b/dnf/base.py
-@@ -425,6 +425,68 @@ def fill_sack(self, load_system_repo=True, load_available_repos=True):
-         self._plugins.run_sack()
-         return self._sack
- 
-+    def fill_sack_from_repos_in_cache(self, load_system_repo=True):
-+        # :api
-+        """
-+        Prepare Sack and Goal objects and also load all enabled repositories from cache only,
-+        it doesn't download anything and it doesn't check if metadata are expired.
-+        If there is not enough metadata present (repond.xml or both primary.xml and solv file
-+        are missing) given repo is either skipped or it throws a RepoError exception depending
-+        on skip_if_unavailable configuration.
-+        """
-+        timer = dnf.logging.Timer('sack setup')
-+        self.reset(sack=True, goal=True)
-+        self._sack = dnf.sack._build_sack(self)
-+        lock = dnf.lock.build_metadata_lock(self.conf.cachedir, self.conf.exit_on_lock)
-+        with lock:
-+            if load_system_repo is not False:
-+                try:
-+                    # FIXME: If build_cache=True, @System.solv is incorrectly updated in install-
-+                    # remove loops
-+                    self._sack.load_system_repo(build_cache=False)
-+                except IOError:
-+                    if load_system_repo != 'auto':
-+                        raise
-+
-+            error_repos = []
-+            # Iterate over installed GPG keys and check their validity using DNSSEC
-+            if self.conf.gpgkey_dns_verification:
-+                dnf.dnssec.RpmImportedKeys.check_imported_keys_validity()
-+            for repo in self.repos.iter_enabled():
-+                try:
-+                    repo._repo.loadCache(throwExcept=True, ignoreMissing=True)
-+                    mdload_flags = dict(load_filelists=True,
-+                                        load_presto=repo.deltarpm,
-+                                        load_updateinfo=True)
-+                    if repo.load_metadata_other:
-+                        mdload_flags["load_other"] = True
-+
-+                    self._sack.load_repo(repo._repo, **mdload_flags)
-+
-+                    logger.debug(_("%s: using metadata from %s."), repo.id,
-+                                 dnf.util.normalize_time(
-+                                     repo._repo.getMaxTimestamp()))
-+                except (RuntimeError, hawkey.Exception) as e:
-+                    if repo.skip_if_unavailable is False:
-+                        raise dnf.exceptions.RepoError(
-+                            _("loading repo '{}' failure: {}").format(repo.id, e))
-+                    else:
-+                        logger.debug(_("loading repo '{}' failure: {}").format(repo.id, e))
-+                    error_repos.append(repo.id)
-+                    repo.disable()
-+            if error_repos:
-+                logger.warning(
-+                    _("Ignoring repositories: %s"), ', '.join(error_repos))
-+
-+        conf = self.conf
-+        self._sack._configure(conf.installonlypkgs, conf.installonly_limit, conf.allow_vendor_change)
-+        self._setup_excludes_includes()
-+        timer()
-+        self._goal = dnf.goal.Goal(self._sack)
-+        self._goal.protect_running_kernel = conf.protect_running_kernel
-+        self._plugins.run_sack()
-+        return self._sack
-+
-     def _finalize_base(self):
-         self._tempfile_persistor = dnf.persistor.TempfilePersistor(
-             self.conf.cachedir)
-
-From 29ae53918d4a0b65a917aca2f8f43416fee15dfd Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Thu, 10 Dec 2020 14:54:16 +0100
-Subject: [PATCH 2/2] Add api test for new fill_sack_from_repos_in_cache
-
----
- tests/api/test_dnf_base.py | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py
-index 656bd22584..335981897e 100644
---- a/tests/api/test_dnf_base.py
-+++ b/tests/api/test_dnf_base.py
-@@ -107,6 +107,12 @@ def test_fill_sack(self):
- 
-         self.base.fill_sack(load_system_repo=False, load_available_repos=False)
- 
-+    def test_fill_sack_from_repos_in_cache(self):
-+        # Base.fill_sack_from_repos_in_cache(self, load_system_repo=True):
-+        self.assertHasAttr(self.base, "fill_sack_from_repos_in_cache")
-+
-+        self.base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-     def test_close(self):
-         # Base.close()
-         self.assertHasAttr(self.base, "close")
diff --git a/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch b/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch
deleted file mode 100644
index 30dbab6..0000000
--- a/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch
+++ /dev/null
@@ -1,366 +0,0 @@
-From a777ff01c79d5e0e2cf3ae7b0652795577253bc3 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Thu, 14 Jan 2021 09:58:30 +0100
-Subject: [PATCH 1/3] Fix recreate script
-
----
- tests/repos/rpm/recreate | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/tests/repos/rpm/recreate b/tests/repos/rpm/recreate
-index da348d9799..0fbb9396bd 100755
---- a/tests/repos/rpm/recreate
-+++ b/tests/repos/rpm/recreate
-@@ -1,6 +1,6 @@
- #!/bin/bash
- 
--THISDIR="$( readlink -f "$( dirname "$0 )" )"
-+THISDIR="$( readlink -f "$( dirname "$0" )" )"
- cd "$THISDIR"
- git rm -rf repodata/
- createrepo --no-database -o . ..
-
-From 5d4c0266f6967c7cd5f0e675b13fa3e9b395e4dd Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Thu, 14 Jan 2021 10:28:53 +0100
-Subject: [PATCH 2/3] Add unit test for fill_sack_from_repos_in_cache
- (RhBug:1865803)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1865803
----
- tests/test_fill_sack_from_repos_in_cache.py | 262 ++++++++++++++++++++
- 1 file changed, 262 insertions(+)
- create mode 100644 tests/test_fill_sack_from_repos_in_cache.py
-
-diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py
-new file mode 100644
-index 0000000000..24b0d4598d
---- /dev/null
-+++ b/tests/test_fill_sack_from_repos_in_cache.py
-@@ -0,0 +1,262 @@
-+# -*- coding: utf-8 -*-
-+
-+# Copyright (C) 2012-2021 Red Hat, Inc.
-+#
-+# This copyrighted material is made available to anyone wishing to use,
-+# modify, copy, or redistribute it subject to the terms and conditions of
-+# the GNU General Public License v.2, or (at your option) any later version.
-+# This program is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY expressed or implied, including the implied warranties of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
-+# Public License for more details.  You should have received a copy of the
-+# GNU General Public License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-+# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
-+# source code or documentation are not subject to the GNU General Public
-+# License and may only be used or replicated with the express permission of
-+# Red Hat, Inc.
-+#
-+
-+from __future__ import absolute_import
-+from __future__ import unicode_literals
-+
-+import os
-+import tempfile
-+import glob
-+import shutil
-+import unittest
-+
-+import dnf.exceptions
-+import dnf.repo
-+import dnf.sack
-+
-+import hawkey
-+
-+import tests.support
-+from tests.support import mock
-+
-+TEST_REPO_NAME = "test-repo"
-+
-+
-+class FillSackFromReposInCacheTest(unittest.TestCase):
-+    def _create_cache_for_repo(self, repopath, tmpdir):
-+        conf = dnf.conf.MainConf()
-+        conf.cachedir = os.path.join(tmpdir, "cache")
-+
-+        base = dnf.Base(conf=conf)
-+
-+        repoconf = dnf.repo.Repo(TEST_REPO_NAME, base.conf)
-+        repoconf.baseurl = repopath
-+        repoconf.enable()
-+
-+        base.repos.add(repoconf)
-+
-+        base.fill_sack(load_system_repo=False)
-+        base.close()
-+
-+    def _setUp_from_repo_path(self, original_repo_path):
-+        self.tmpdir = tempfile.mkdtemp(prefix="dnf_test_")
-+
-+        self.repo_copy_path = os.path.join(self.tmpdir, "repo")
-+        shutil.copytree(original_repo_path, self.repo_copy_path)
-+
-+        self._create_cache_for_repo(self.repo_copy_path, self.tmpdir)
-+
-+        # Just to be sure remove repo (it shouldn't be used)
-+        shutil.rmtree(self.repo_copy_path)
-+
-+        # Prepare base for the actual test
-+        conf = dnf.conf.MainConf()
-+        conf.cachedir = os.path.join(self.tmpdir, "cache")
-+        self.test_base = dnf.Base(conf=conf)
-+        repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf)
-+        repoconf.baseurl = self.repo_copy_path
-+        repoconf.enable()
-+        self.test_base.repos.add(repoconf)
-+
-+    def tearDown(self):
-+        self.test_base.close()
-+        shutil.rmtree(self.tmpdir)
-+
-+    def test_with_solv_solvx_repomd(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm"))
-+
-+        # Remove xml metadata except repomd
-+        # repomd.xml is not compressed and doesn't end with .gz
-+        repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz"))
-+        for f in repodata_without_repomd:
-+            os.remove(f)
-+
-+        # Now we only have cache with just solv, solvx files and repomd.xml
-+
-+        self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+        q = self.test_base.sack.query()
-+        packages = q.run()
-+        self.assertEqual(len(packages), 9)
-+        self.assertEqual(packages[0].evr, "4-4")
-+
-+        # Use *-updateinfo.solvx
-+        adv_pkgs = q.get_advisory_pkgs(hawkey.LT | hawkey.EQ | hawkey.GT)
-+        adv_titles = set()
-+        for pkg in adv_pkgs:
-+            adv_titles.add(pkg.get_advisory(self.test_base.sack).title)
-+        self.assertEqual(len(adv_titles), 3)
-+
-+    def test_with_just_solv_repomd(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm"))
-+
-+        # Remove xml metadata except repomd
-+        # repomd.xml is not compressed and doesn't end with .gz
-+        repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz"))
-+        for f in repodata_without_repomd:
-+            os.remove(f)
-+
-+        # Remove solvx files
-+        solvx = glob.glob(os.path.join(self.tmpdir, "cache/*.solvx"))
-+        for f in solvx:
-+            os.remove(f)
-+
-+        # Now we only have cache with just solv files and repomd.xml
-+
-+        self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+        q = self.test_base.sack.query()
-+        packages = q.run()
-+        self.assertEqual(len(packages), 9)
-+        self.assertEqual(packages[0].evr, "4-4")
-+
-+        # No *-updateinfo.solvx -> we get no advisory packages
-+        adv_pkgs = q.get_advisory_pkgs(hawkey.LT | hawkey.EQ | hawkey.GT)
-+        self.assertEqual(len(adv_pkgs), 0)
-+
-+    def test_with_xml_metadata(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm"))
-+
-+        # Remove all solv and solvx files
-+        solvx = glob.glob(os.path.join(self.tmpdir, "cache/*.solv*"))
-+        for f in solvx:
-+            os.remove(f)
-+
-+        # Now we only have cache with just xml metadata
-+
-+        self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+        q = self.test_base.sack.query()
-+        packages = q.run()
-+        self.assertEqual(len(packages), 9)
-+        self.assertEqual(packages[0].evr, "4-4")
-+
-+    def test_exception_without_repomd(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm"))
-+
-+        # Remove xml metadata
-+        repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*"))
-+        for f in repodata_without_repomd:
-+            os.remove(f)
-+
-+        # Now we only have cache with just solv and solvx files
-+        # Since we don't have repomd we cannot verify checksums -> fail (exception)
-+
-+        self.assertRaises(dnf.exceptions.RepoError,
-+                          self.test_base.fill_sack_from_repos_in_cache, load_system_repo=False)
-+
-+    def test_exception_with_just_repomd(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm"))
-+
-+        # Remove xml metadata except repomd
-+        # repomd.xml is not compressed and doesn't end with .gz
-+        repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz"))
-+        for f in repodata_without_repomd:
-+            os.remove(f)
-+
-+        # Remove all solv and solvx files
-+        solvx = glob.glob(os.path.join(self.tmpdir, "cache/*.solv*"))
-+        for f in solvx:
-+            os.remove(f)
-+
-+        # Now we only have cache with just repomd
-+        # repomd is not enough, it doesn't contain the metadata it self -> fail (exception)
-+
-+        self.assertRaises(dnf.exceptions.RepoError,
-+                          self.test_base.fill_sack_from_repos_in_cache, load_system_repo=False)
-+
-+    def test_exception_with_checksum_mismatch_and_only_repomd(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm"))
-+
-+        # Remove xml metadata except repomd
-+        # repomd.xml is not compressed and doesn't end with .gz
-+        repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz"))
-+        for f in repodata_without_repomd:
-+            os.remove(f)
-+
-+        # Modify checksum of solv file so it doesn't match with repomd
-+        solv = glob.glob(os.path.join(self.tmpdir, "cache/*.solv"))[0]
-+        with open(solv, "a") as opensolv:
-+            opensolv.write("appended text to change checksum")
-+
-+        # Now we only have cache with solvx, modified solv file and just repomd
-+        # Since we don't have original xml metadata we cannot regenerate solv -> fail (exception)
-+
-+        self.assertRaises(dnf.exceptions.RepoError,
-+                          self.test_base.fill_sack_from_repos_in_cache, load_system_repo=False)
-+
-+    def test_checksum_mistmatch_regenerates_solv(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm"))
-+
-+        # Modify checksum of solv file so it doesn't match with repomd
-+        solv = glob.glob(os.path.join(self.tmpdir, "cache/*.solv"))[0]
-+        with open(solv, "a") as opensolv:
-+            opensolv.write("appended text to change checksum")
-+
-+        # Now we only have cache with solvx, modified solv file and xml metadata.
-+        # Checksum mistmatch causes regeneration of solv file and repo works.
-+
-+        self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+        q = self.test_base.sack.query()
-+        packages = q.run()
-+        self.assertEqual(len(packages), 9)
-+        self.assertEqual(packages[0].evr, "4-4")
-+
-+    def test_with_modules_yaml(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)),
-+                                                "modules/modules/_all/x86_64"))
-+
-+        # Now we have full cache (also with modules.yaml)
-+
-+        self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+        q = self.test_base.sack.query()
-+        packages = q.run()
-+        self.assertEqual(len(packages), 8)
-+        self.assertEqual(packages[0].evr, "2.02-0.40")
-+
-+        self.module_base = dnf.module.module_base.ModuleBase(self.test_base)
-+        modules, _ = self.module_base._get_modules("base-runtime*")
-+        self.assertEqual(len(modules), 3)
-+        self.assertEqual(modules[0].getFullIdentifier(), "base-runtime:f26:1::")
-+
-+    def test_with_modular_repo_without_modules_yaml(self):
-+        self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)),
-+                                                "modules/modules/_all/x86_64"))
-+
-+        # Remove xml and yaml metadata except repomd
-+        # repomd.xml is not compressed and doesn't end with .gz
-+        repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz"))
-+        for f in repodata_without_repomd:
-+            os.remove(f)
-+
-+        # Now we have just solv, *-filenames.solvx and repomd.xml (modules.yaml are not processed into *-modules.solvx)
-+
-+        self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+        q = self.test_base.sack.query()
-+        packages = q.run()
-+        # We have many more packages because they are not hidden by modules
-+        self.assertEqual(len(packages), 44)
-+        self.assertEqual(packages[0].evr, "10.0-7")
-+
-+        self.module_base = dnf.module.module_base.ModuleBase(self.test_base)
-+        modules, _ = self.module_base._get_modules("base-runtime*")
-+        self.assertEqual(len(modules), 0)
-
-From de6177dba3dc20191e275eec14672570a0c4f4a8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Thu, 14 Jan 2021 12:29:06 +0100
-Subject: [PATCH 3/3] Add docs and examples for fill_sack_from_repos_in_cache
- (RhBug:1865803)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1865803
----
- doc/api_base.rst | 41 +++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 41 insertions(+)
-
-diff --git a/doc/api_base.rst b/doc/api_base.rst
-index 24ecb50e43..f0b1992e88 100644
---- a/doc/api_base.rst
-+++ b/doc/api_base.rst
-@@ -111,6 +111,47 @@
-             print("id: {}".format(repo.id))
-             print("baseurl: {}".format(repo.baseurl))
- 
-+  .. method:: fill_sack_from_repos_in_cache(load_system_repo=True)
-+
-+    Prepare Sack and Goal objects and load all enabled repositories from cache only, it doesn't download anything and it doesn't check if metadata are expired.
-+    To successfully load a repository cache it requires repond.xml plus metadata (xml, yaml) or repond.xml plus generated cache files (solv, solvx).
-+    If there is not enough metadata given repo is either skipped or it throws a :exc:`dnf.exceptions.RepoError` exception depending on :attr:`dnf.conf.Conf.skip_if_unavailable` configuration.
-+
-+    All additional metadata are loaded if present but are not generally required. Note that some metadata like updateinfo.xml get processed into a solvx cache file and its sufficient to have either xml or solvx. Module metadata represented by modules.yaml are not processed therefore they are needed when they are defined in repomd.xml.
-+
-+    Example of loading all configured repositories from cache and printing available packages' names::
-+
-+        #!/usr/bin/python3
-+        import dnf
-+
-+        with dnf.Base() as base:
-+            base.read_all_repos()
-+
-+            base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+            query = base.sack.query().available()
-+            for pkg in query.run():
-+                print(pkg.name)
-+
-+    Example of loading a single repository and printing available packages' names without reading repository configuration::
-+
-+        #!/usr/bin/python3
-+        import dnf
-+
-+        with dnf.Base() as base:
-+            repo = dnf.repo.Repo("rawhide", base.conf)
-+
-+            # Repository cache is also identified by its source therefore to find it you need to
-+            # set metalink, mirrorlist or baseurl to the same value from which it was created.
-+            repo.metalink = "https://mirrors.fedoraproject.org/metalink?repo=rawhide&arch=x86_64"
-+
-+            base.repos.add(repo)
-+
-+            base.fill_sack_from_repos_in_cache(load_system_repo=False)
-+
-+            query = base.sack.query().available()
-+            for pkg in query.run():
-+                print(pkg.name)
- 
-   .. method:: do_transaction([display])
- 
diff --git a/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch b/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch
deleted file mode 100644
index 2c8f13b..0000000
--- a/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 291071a937a1de398641f02002413678398e473c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Mon, 8 Feb 2021 08:25:46 +0100
-Subject: [PATCH] Run tests for fill_sack_from_repos_in_cache in installroot
- (RhBug:1865803)
-
-This prevents loading data (like failsafe) from host.
-
-It also allows testing that there are no modules in the installroot not just
-no base-runtime* in test_with_modular_repo_without_modules_yaml.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1865803
----
- tests/test_fill_sack_from_repos_in_cache.py | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py
-index 24b0d4598d..f27235bf84 100644
---- a/tests/test_fill_sack_from_repos_in_cache.py
-+++ b/tests/test_fill_sack_from_repos_in_cache.py
-@@ -42,6 +42,7 @@ class FillSackFromReposInCacheTest(unittest.TestCase):
-     def _create_cache_for_repo(self, repopath, tmpdir):
-         conf = dnf.conf.MainConf()
-         conf.cachedir = os.path.join(tmpdir, "cache")
-+        conf.installroot = os.path.join(tmpdir)
- 
-         base = dnf.Base(conf=conf)
- 
-@@ -68,6 +69,7 @@ def _setUp_from_repo_path(self, original_repo_path):
-         # Prepare base for the actual test
-         conf = dnf.conf.MainConf()
-         conf.cachedir = os.path.join(self.tmpdir, "cache")
-+        conf.installroot = os.path.join(self.tmpdir)
-         self.test_base = dnf.Base(conf=conf)
-         repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf)
-         repoconf.baseurl = self.repo_copy_path
-@@ -258,5 +260,5 @@ def test_with_modular_repo_without_modules_yaml(self):
-         self.assertEqual(packages[0].evr, "10.0-7")
- 
-         self.module_base = dnf.module.module_base.ModuleBase(self.test_base)
--        modules, _ = self.module_base._get_modules("base-runtime*")
-+        modules, _ = self.module_base._get_modules("*")
-         self.assertEqual(len(modules), 0)
diff --git a/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch b/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch
deleted file mode 100644
index b6dee78..0000000
--- a/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 40e762da5cd2d876b6424f4c25b77e8dc2422a0f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Mon, 8 Feb 2021 08:25:46 +0100
-Subject: [PATCH] Set persistdir and substitutions for
- fill_sack_from_repos_in_cache tests (RhBug:1865803)
-
-Setting just installroot is not enough because persistdir is not
-automatically prepended with installroot if set via API.
-
-Also assert exact package names which is more useful output in case the
-test fails.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1865803
----
- tests/test_fill_sack_from_repos_in_cache.py | 19 +++++++++++++++----
- 1 file changed, 15 insertions(+), 4 deletions(-)
-
-diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py
-index f27235bf84..23fd2a4337 100644
---- a/tests/test_fill_sack_from_repos_in_cache.py
-+++ b/tests/test_fill_sack_from_repos_in_cache.py
-@@ -42,7 +42,10 @@ class FillSackFromReposInCacheTest(unittest.TestCase):
-     def _create_cache_for_repo(self, repopath, tmpdir):
-         conf = dnf.conf.MainConf()
-         conf.cachedir = os.path.join(tmpdir, "cache")
--        conf.installroot = os.path.join(tmpdir)
-+        conf.installroot = tmpdir
-+        conf.persistdir = os.path.join(conf.installroot, conf.persistdir.lstrip("/"))
-+        conf.substitutions["arch"] = "x86_64"
-+        conf.substitutions["basearch"] = dnf.rpm.basearch(conf.substitutions["arch"])
- 
-         base = dnf.Base(conf=conf)
- 
-@@ -69,7 +72,10 @@ def _setUp_from_repo_path(self, original_repo_path):
-         # Prepare base for the actual test
-         conf = dnf.conf.MainConf()
-         conf.cachedir = os.path.join(self.tmpdir, "cache")
--        conf.installroot = os.path.join(self.tmpdir)
-+        conf.installroot = self.tmpdir
-+        conf.persistdir = os.path.join(conf.installroot, conf.persistdir.lstrip("/"))
-+        conf.substitutions["arch"] = "x86_64"
-+        conf.substitutions["basearch"] = dnf.rpm.basearch(conf.substitutions["arch"])
-         self.test_base = dnf.Base(conf=conf)
-         repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf)
-         repoconf.baseurl = self.repo_copy_path
-@@ -231,8 +237,13 @@ def test_with_modules_yaml(self):
- 
-         q = self.test_base.sack.query()
-         packages = q.run()
--        self.assertEqual(len(packages), 8)
--        self.assertEqual(packages[0].evr, "2.02-0.40")
-+
-+        pkg_names = []
-+        for pkg in packages:
-+            pkg_names.append(pkg.name)
-+
-+        self.assertEqual(pkg_names, ['grub2', 'httpd', 'httpd', 'httpd-doc', 'httpd-doc', 'httpd-provides-name-doc',
-+                                     'httpd-provides-name-version-release-doc', 'libnghttp2'])
- 
-         self.module_base = dnf.module.module_base.ModuleBase(self.test_base)
-         modules, _ = self.module_base._get_modules("base-runtime*")
diff --git a/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch b/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch
deleted file mode 100644
index 0fd4828..0000000
--- a/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 9ceb74f77479910f7844a9a87d4b7623687076be Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Fri, 24 Jul 2020 07:59:38 +0200
-Subject: [PATCH] Allow stream switching if option enabled
-
-= changelog =
-msg: New config option module_allow_stream_switch allows switching enabled streams
-type: enhancement
----
- dnf.spec       |  2 +-
- dnf/cli/cli.py | 19 ++++++++++---------
- 2 files changed, 11 insertions(+), 10 deletions(-)
-
-diff --git a/dnf.spec b/dnf.spec
-index 0e63b2b422..04f6f104c7 100644
---- a/dnf.spec
-+++ b/dnf.spec
-@@ -2,7 +2,7 @@
- %undefine __cmake_in_source_build
- 
- # default dependencies
--%global hawkey_version 0.54.4
-+%global hawkey_version 0.55.0
- %global libcomps_version 0.1.8
- %global libmodulemd_version 1.4.0
- %global rpm_version 4.14.0
-diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
-index be737ed3b7..29d7373fa3 100644
---- a/dnf/cli/cli.py
-+++ b/dnf/cli/cli.py
-@@ -166,15 +166,16 @@ def do_transaction(self, display=()):
-         :return: history database transaction ID or None
-         """
-         if dnf.base.WITH_MODULES:
--            switchedModules = dict(self._moduleContainer.getSwitchedStreams())
--            if switchedModules:
--                report_module_switch(switchedModules)
--                msg = _("It is not possible to switch enabled streams of a module.\n"
--                        "It is recommended to remove all installed content from the module, and "
--                        "reset the module using '{prog} module reset <module_name>' command. After "
--                        "you reset the module, you can install the other stream.").format(
--                    prog=dnf.util.MAIN_PROG)
--                raise dnf.exceptions.Error(msg)
-+            if not self.conf.module_stream_switch:
-+                switchedModules = dict(self._moduleContainer.getSwitchedStreams())
-+                if switchedModules:
-+                    report_module_switch(switchedModules)
-+                    msg = _("It is not possible to switch enabled streams of a module.\n"
-+                            "It is recommended to remove all installed content from the module, and "
-+                            "reset the module using '{prog} module reset <module_name>' command. After "
-+                            "you reset the module, you can install the other stream.").format(
-+                        prog=dnf.util.MAIN_PROG)
-+                    raise dnf.exceptions.Error(msg)
- 
-         trans = self.transaction
-         pkg_str = self.output.list_transaction(trans)
diff --git a/SOURCES/0019-Update-translations.patch b/SOURCES/0019-Update-translations.patch
deleted file mode 100644
index f6d9c68..0000000
--- a/SOURCES/0019-Update-translations.patch
+++ /dev/null
@@ -1,12740 +0,0 @@
-From c01dc4f6a6cdc7297b9ffacc6fe96142f02e4d54 Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Mon, 8 Mar 2021 16:22:58 +0100
-Subject: [PATCH] Update translations
-
----
- po/CMakeLists.txt |    1 +
- po/dnf.pot        |  943 +++++++++++++++++++-------------------
- po/fr.po          | 1042 ++++++++++++++++++++++--------------------
- po/ja.po          | 1112 +++++++++++++++++++++++----------------------
- po/ko.po          |  965 ++++++++++++++++++++-------------------
- po/zh_CN.po       | 1086 +++++++++++++++++++++----------------------
- 6 files changed, 2649 insertions(+), 2500 deletions(-)
-
-diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt
-index 1e17f342..40d020dd 100644
---- a/po/CMakeLists.txt
-+++ b/po/CMakeLists.txt
-@@ -15,6 +15,7 @@ if (GIT_FOUND)
-         OUTPUT_VARIABLE CURRENT_BRANCH
-         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-         )
-+    set(CURRENT_BRANCH "rhel-8")
- 
-     # output _weblate-clone is never created so the clonning of weblate repo is always processed
-     # and fresh *.po files are used
-diff --git a/po/dnf.pot b/po/dnf.pot
-index f7101537..18d8c5ba 100644
---- a/po/dnf.pot
-+++ b/po/dnf.pot
-@@ -8,7 +8,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-10-05 09:18-0400\n"
-+"POT-Creation-Date: 2021-02-22 09:22+0100\n"
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
- "Language-Team: LANGUAGE <LL@li.org>\n"
-@@ -73,7 +73,7 @@ msgstr ""
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr ""
- 
--#: dnf/automatic/main.py:237 dnf/cli/cli.py:299
-+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304
- msgid "GPG check FAILED"
- msgstr ""
- 
-@@ -86,9 +86,10 @@ msgid "Started dnf-automatic."
- msgstr ""
- 
- #: dnf/automatic/main.py:308
--#, python-format
--msgid "Sleep for %s seconds"
--msgstr ""
-+msgid "Sleep for {} second"
-+msgid_plural "Sleep for {} seconds"
-+msgstr[0] ""
-+msgstr[1] ""
- 
- #: dnf/automatic/main.py:315
- msgid "System is off-line."
-@@ -100,7 +101,7 @@ msgstr ""
- msgid "Error: %s"
- msgstr ""
- 
--#: dnf/base.py:146
-+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474
- msgid "loading repo '{}' failure: {}"
- msgstr ""
- 
-@@ -108,237 +109,237 @@ msgstr ""
- msgid "Loading repository '{}' has failed"
- msgstr ""
- 
--#: dnf/base.py:320
-+#: dnf/base.py:322
- msgid "Metadata timer caching disabled when running on metered connection."
- msgstr ""
- 
--#: dnf/base.py:325
-+#: dnf/base.py:327
- msgid "Metadata timer caching disabled when running on a battery."
- msgstr ""
- 
--#: dnf/base.py:330
-+#: dnf/base.py:332
- msgid "Metadata timer caching disabled."
- msgstr ""
- 
--#: dnf/base.py:335
-+#: dnf/base.py:337
- msgid "Metadata cache refreshed recently."
- msgstr ""
- 
--#: dnf/base.py:341 dnf/cli/commands/__init__.py:91
-+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91
- msgid "There are no enabled repositories in \"{}\"."
- msgstr ""
- 
--#: dnf/base.py:348
-+#: dnf/base.py:350
- #, python-format
- msgid "%s: will never be expired and will not be refreshed."
- msgstr ""
- 
--#: dnf/base.py:350
-+#: dnf/base.py:352
- #, python-format
- msgid "%s: has expired and will be refreshed."
- msgstr ""
- 
- #. expires within the checking period:
--#: dnf/base.py:354
-+#: dnf/base.py:356
- #, python-format
- msgid "%s: metadata will expire after %d seconds and will be refreshed now"
- msgstr ""
- 
--#: dnf/base.py:358
-+#: dnf/base.py:360
- #, python-format
- msgid "%s: will expire after %d seconds."
- msgstr ""
- 
- #. performs the md sync
--#: dnf/base.py:364
-+#: dnf/base.py:366
- msgid "Metadata cache created."
- msgstr ""
- 
--#: dnf/base.py:397
-+#: dnf/base.py:399 dnf/base.py:466
- #, python-format
- msgid "%s: using metadata from %s."
- msgstr ""
- 
--#: dnf/base.py:409
-+#: dnf/base.py:411 dnf/base.py:479
- #, python-format
- msgid "Ignoring repositories: %s"
- msgstr ""
- 
--#: dnf/base.py:412
-+#: dnf/base.py:414
- #, python-format
- msgid "Last metadata expiration check: %s ago on %s."
- msgstr ""
- 
--#: dnf/base.py:443
-+#: dnf/base.py:507
- msgid ""
- "The downloaded packages were saved in cache until the next successful "
- "transaction."
- msgstr ""
- 
--#: dnf/base.py:445
-+#: dnf/base.py:509
- #, python-format
- msgid "You can remove cached packages by executing '%s'."
- msgstr ""
- 
--#: dnf/base.py:535
-+#: dnf/base.py:599
- #, python-format
- msgid "Invalid tsflag in config file: %s"
- msgstr ""
- 
--#: dnf/base.py:591
-+#: dnf/base.py:655
- #, python-format
- msgid "Failed to add groups file for repository: %s - %s"
- msgstr ""
- 
--#: dnf/base.py:823
-+#: dnf/base.py:887
- msgid "Running transaction check"
- msgstr ""
- 
--#: dnf/base.py:831
-+#: dnf/base.py:895
- msgid "Error: transaction check vs depsolve:"
- msgstr ""
- 
--#: dnf/base.py:837
-+#: dnf/base.py:901
- msgid "Transaction check succeeded."
- msgstr ""
- 
--#: dnf/base.py:840
-+#: dnf/base.py:904
- msgid "Running transaction test"
- msgstr ""
- 
--#: dnf/base.py:850 dnf/base.py:992
-+#: dnf/base.py:914 dnf/base.py:1065
- msgid "RPM: {}"
- msgstr ""
- 
--#: dnf/base.py:851
-+#: dnf/base.py:915
- msgid "Transaction test error:"
- msgstr ""
- 
--#: dnf/base.py:862
-+#: dnf/base.py:926
- msgid "Transaction test succeeded."
- msgstr ""
- 
--#: dnf/base.py:883
-+#: dnf/base.py:947
- msgid "Running transaction"
- msgstr ""
- 
--#: dnf/base.py:911
-+#: dnf/base.py:984
- msgid "Disk Requirements:"
- msgstr ""
- 
--#: dnf/base.py:914
-+#: dnf/base.py:987
- #, python-brace-format
- msgid "At least {0}MB more space needed on the {1} filesystem."
- msgid_plural "At least {0}MB more space needed on the {1} filesystem."
- msgstr[0] ""
- msgstr[1] ""
- 
--#: dnf/base.py:921
-+#: dnf/base.py:994
- msgid "Error Summary"
- msgstr ""
- 
--#: dnf/base.py:947
-+#: dnf/base.py:1020
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
- msgstr ""
- 
--#: dnf/base.py:993 dnf/base.py:1001
-+#: dnf/base.py:1066 dnf/base.py:1074
- msgid "Could not run transaction."
- msgstr ""
- 
--#: dnf/base.py:996
-+#: dnf/base.py:1069
- msgid "Transaction couldn't start:"
- msgstr ""
- 
--#: dnf/base.py:1010
-+#: dnf/base.py:1083
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr ""
- 
--#: dnf/base.py:1092
-+#: dnf/base.py:1165
- msgid "Some packages were not downloaded. Retrying."
- msgstr ""
- 
--#: dnf/base.py:1122
-+#: dnf/base.py:1195
- #, python-format
- msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)"
- msgstr ""
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1198
- #, python-format
- msgid ""
- "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)"
- msgstr ""
- 
--#: dnf/base.py:1167
-+#: dnf/base.py:1240
- msgid "Cannot add local packages, because transaction job already exists"
- msgstr ""
- 
--#: dnf/base.py:1181
-+#: dnf/base.py:1254
- msgid "Could not open: {}"
- msgstr ""
- 
--#: dnf/base.py:1219
-+#: dnf/base.py:1292
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr ""
- 
--#: dnf/base.py:1223
-+#: dnf/base.py:1296
- #, python-format
- msgid "Problem opening package %s"
- msgstr ""
- 
--#: dnf/base.py:1231
-+#: dnf/base.py:1304
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr ""
- 
--#: dnf/base.py:1235
-+#: dnf/base.py:1308
- #, python-format
- msgid "Package %s is not signed"
- msgstr ""
- 
--#: dnf/base.py:1265
-+#: dnf/base.py:1338
- #, python-format
- msgid "Cannot remove %s"
- msgstr ""
- 
--#: dnf/base.py:1269
-+#: dnf/base.py:1342
- #, python-format
- msgid "%s removed"
- msgstr ""
- 
--#: dnf/base.py:1549
-+#: dnf/base.py:1622
- msgid "No match for group package \"{}\""
- msgstr ""
- 
--#: dnf/base.py:1635
-+#: dnf/base.py:1708
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr ""
- 
--#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442
-+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442
- #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592
- #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80
- #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110
- msgid "Nothing to do."
- msgstr ""
- 
--#: dnf/base.py:1676
-+#: dnf/base.py:1749
- msgid "No groups marked for removal."
- msgstr ""
- 
--#: dnf/base.py:1710
-+#: dnf/base.py:1783
- msgid "No group marked for upgrade."
- msgstr ""
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1997
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
- msgstr ""
- 
--#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980
--#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411
-+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052
-+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416
- #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482
- #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633
- #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147
-@@ -348,141 +349,127 @@ msgstr ""
- msgid "No match for argument: %s"
- msgstr ""
- 
--#: dnf/base.py:1934
-+#: dnf/base.py:2006
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
- msgstr ""
- 
--#: dnf/base.py:1957
-+#: dnf/base.py:2029
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
- msgstr ""
- 
--#: dnf/base.py:1972
-+#: dnf/base.py:2044
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr ""
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:2050
- #, python-format
- msgid "Package %s not installed, cannot update it."
- msgstr ""
- 
--#: dnf/base.py:1987
-+#: dnf/base.py:2059
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
- msgstr ""
- 
--#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
- msgstr ""
- 
--#: dnf/base.py:2032
-+#: dnf/base.py:2104
- #, python-format
- msgid "Package %s available, but installed for different architecture."
- msgstr ""
- 
--#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699
-+#: dnf/base.py:2129
- #, python-format
- msgid "No package %s installed."
- msgstr ""
- 
--#: dnf/base.py:2075 dnf/cli/commands/install.py:136
-+#: dnf/base.py:2147 dnf/cli/commands/install.py:136
- #: dnf/cli/commands/remove.py:133
- #, python-format
- msgid "Not a valid form: %s"
- msgstr ""
- 
--#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681
--#: dnf/cli/commands/remove.py:163
-+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681
-+#: dnf/cli/commands/remove.py:162
- msgid "No packages marked for removal."
- msgstr ""
- 
--#: dnf/base.py:2179 dnf/cli/cli.py:422
-+#: dnf/base.py:2250 dnf/cli/cli.py:427
- #, python-format
- msgid "Packages for argument %s available, but not installed."
- msgstr ""
- 
--#: dnf/base.py:2184
-+#: dnf/base.py:2255
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
- msgstr ""
- 
--#: dnf/base.py:2242
--msgid "Action not handled: {}"
--msgstr ""
--
--#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703
--#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169
--#, python-format
--msgid "No package %s available."
--msgstr ""
--
--#: dnf/base.py:2269
--msgid "no package matched"
--msgstr ""
--
--#: dnf/base.py:2290
-+#: dnf/base.py:2302
- msgid "No security updates needed, but {} update available"
- msgstr ""
- 
--#: dnf/base.py:2292
-+#: dnf/base.py:2304
- msgid "No security updates needed, but {} updates available"
- msgstr ""
- 
--#: dnf/base.py:2296
-+#: dnf/base.py:2308
- msgid "No security updates needed for \"{}\", but {} update available"
- msgstr ""
- 
--#: dnf/base.py:2298
-+#: dnf/base.py:2310
- msgid "No security updates needed for \"{}\", but {} updates available"
- msgstr ""
- 
- #. raise an exception, because po.repoid is not in self.repos
--#: dnf/base.py:2319
-+#: dnf/base.py:2331
- #, python-format
- msgid "Unable to retrieve a key for a commandline package: %s"
- msgstr ""
- 
--#: dnf/base.py:2327
-+#: dnf/base.py:2339
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ""
- 
--#: dnf/base.py:2328
-+#: dnf/base.py:2340
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr ""
- 
--#: dnf/base.py:2340
-+#: dnf/base.py:2352
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
- msgstr ""
- 
--#: dnf/base.py:2373
-+#: dnf/base.py:2385
- msgid "The key has been approved."
- msgstr ""
- 
--#: dnf/base.py:2376
-+#: dnf/base.py:2388
- msgid "The key has been rejected."
- msgstr ""
- 
--#: dnf/base.py:2409
-+#: dnf/base.py:2421
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr ""
- 
--#: dnf/base.py:2411
-+#: dnf/base.py:2423
- msgid "Key imported successfully"
- msgstr ""
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2427
- msgid "Didn't install any keys"
- msgstr ""
- 
--#: dnf/base.py:2418
-+#: dnf/base.py:2430
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they "
-@@ -490,49 +477,49 @@ msgid ""
- "Check that the correct key URLs are configured for this repository."
- msgstr ""
- 
--#: dnf/base.py:2429
-+#: dnf/base.py:2441
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr ""
- 
--#: dnf/base.py:2482
-+#: dnf/base.py:2494
- msgid "  * Maybe you meant: {}"
- msgstr ""
- 
--#: dnf/base.py:2514
-+#: dnf/base.py:2526
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr ""
- 
--#: dnf/base.py:2517
-+#: dnf/base.py:2529
- msgid "Some packages from local repository have incorrect checksum"
- msgstr ""
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2532
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr ""
- 
--#: dnf/base.py:2523
-+#: dnf/base.py:2535
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
- msgstr ""
- 
--#: dnf/base.py:2541 dnf/base.py:2561
-+#: dnf/base.py:2553 dnf/base.py:2573
- msgid "No match for argument"
- msgstr ""
- 
--#: dnf/base.py:2549 dnf/base.py:2569
-+#: dnf/base.py:2561 dnf/base.py:2581
- msgid "All matches were filtered out by exclude filtering for argument"
- msgstr ""
- 
--#: dnf/base.py:2551
-+#: dnf/base.py:2563
- msgid "All matches were filtered out by modular filtering for argument"
- msgstr ""
- 
--#: dnf/base.py:2567
-+#: dnf/base.py:2579
- msgid "All matches were installed from a different repository for argument"
- msgstr ""
- 
--#: dnf/base.py:2583
-+#: dnf/base.py:2626
- #, python-format
- msgid "Package %s is already installed."
- msgstr ""
-@@ -552,8 +539,8 @@ msgstr ""
- msgid "Cannot read file \"%s\": %s"
- msgstr ""
- 
--#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902
--#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108
-+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803
-+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108
- #, python-format
- msgid "Config error: %s"
- msgstr ""
-@@ -584,7 +571,7 @@ msgid ""
- "stream '{2}'"
- msgstr ""
- 
--#: dnf/cli/cli.py:172
-+#: dnf/cli/cli.py:173
- #, python-brace-format
- msgid ""
- "It is not possible to switch enabled streams of a module.\n"
-@@ -593,199 +580,178 @@ msgid ""
- "reset the module, you can install the other stream."
- msgstr ""
- 
--#: dnf/cli/cli.py:210
-+#: dnf/cli/cli.py:211
- #, python-brace-format
- msgid "{prog} will only download packages for the transaction."
- msgstr ""
- 
--#: dnf/cli/cli.py:213
-+#: dnf/cli/cli.py:214
- #, python-brace-format
- msgid ""
- "{prog} will only download packages, install gpg keys, and check the "
- "transaction."
- msgstr ""
- 
--#: dnf/cli/cli.py:217
-+#: dnf/cli/cli.py:218
- msgid "Operation aborted."
- msgstr ""
- 
--#: dnf/cli/cli.py:224
-+#: dnf/cli/cli.py:225
- msgid "Downloading Packages:"
- msgstr ""
- 
--#: dnf/cli/cli.py:230
-+#: dnf/cli/cli.py:231
- msgid "Error downloading packages:"
- msgstr ""
- 
--#: dnf/cli/cli.py:258
-+#: dnf/cli/cli.py:263
- msgid "Transaction failed"
- msgstr ""
- 
--#: dnf/cli/cli.py:281
-+#: dnf/cli/cli.py:286
- msgid ""
- "Refusing to automatically import keys when running unattended.\n"
- "Use \"-y\" to override."
- msgstr ""
- 
--#: dnf/cli/cli.py:331
-+#: dnf/cli/cli.py:336
- msgid "Changelogs for {}"
- msgstr ""
- 
--#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511
-+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516
- msgid "Obsoleting Packages"
- msgstr ""
- 
--#: dnf/cli/cli.py:393
-+#: dnf/cli/cli.py:398
- msgid "No packages marked for distribution synchronization."
- msgstr ""
- 
--#: dnf/cli/cli.py:428
-+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395
-+#, python-format
-+msgid "No package %s available."
-+msgstr ""
-+
-+#: dnf/cli/cli.py:433
- msgid "No packages marked for downgrade."
- msgstr ""
- 
--#: dnf/cli/cli.py:479
-+#: dnf/cli/cli.py:484
- msgid "Installed Packages"
- msgstr ""
- 
--#: dnf/cli/cli.py:487
-+#: dnf/cli/cli.py:492
- msgid "Available Packages"
- msgstr ""
- 
--#: dnf/cli/cli.py:491
-+#: dnf/cli/cli.py:496
- msgid "Autoremove Packages"
- msgstr ""
- 
--#: dnf/cli/cli.py:493
-+#: dnf/cli/cli.py:498
- msgid "Extra Packages"
- msgstr ""
- 
--#: dnf/cli/cli.py:497
-+#: dnf/cli/cli.py:502
- msgid "Available Upgrades"
- msgstr ""
- 
--#: dnf/cli/cli.py:513
-+#: dnf/cli/cli.py:518
- msgid "Recently Added Packages"
- msgstr ""
- 
--#: dnf/cli/cli.py:518
-+#: dnf/cli/cli.py:522
- msgid "No matching Packages to list"
- msgstr ""
- 
--#: dnf/cli/cli.py:599
-+#: dnf/cli/cli.py:603
- msgid "No Matches found"
- msgstr ""
- 
--#: dnf/cli/cli.py:609
--msgid "No transaction ID given"
--msgstr ""
--
--#: dnf/cli/cli.py:614
--msgid "Not found given transaction ID"
--msgstr ""
--
--#: dnf/cli/cli.py:623
--msgid "Found more than one transaction ID!"
--msgstr ""
--
--#: dnf/cli/cli.py:640
--#, python-format
--msgid "Transaction history is incomplete, before %u."
--msgstr ""
--
--#: dnf/cli/cli.py:642
--#, python-format
--msgid "Transaction history is incomplete, after %u."
--msgstr ""
--
--#: dnf/cli/cli.py:689
--msgid "Undoing transaction {}, from {}"
--msgstr ""
--
--#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237
-+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237
- #, python-format
- msgid "Unknown repo: '%s'"
- msgstr ""
- 
--#: dnf/cli/cli.py:783
-+#: dnf/cli/cli.py:684
- #, python-format
- msgid "No repository match: %s"
- msgstr ""
- 
--#: dnf/cli/cli.py:817
-+#: dnf/cli/cli.py:718
- msgid ""
- "This command has to be run with superuser privileges (under the root user on "
- "most systems)."
- msgstr ""
- 
--#: dnf/cli/cli.py:847
-+#: dnf/cli/cli.py:748
- #, python-format
- msgid "No such command: %s. Please use %s --help"
- msgstr ""
- 
--#: dnf/cli/cli.py:850
-+#: dnf/cli/cli.py:751
- #, python-format, python-brace-format
- msgid ""
- "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-"
- "command(%s)'\""
- msgstr ""
- 
--#: dnf/cli/cli.py:854
-+#: dnf/cli/cli.py:755
- #, python-brace-format
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
- "disabled."
- msgstr ""
- 
--#: dnf/cli/cli.py:912
-+#: dnf/cli/cli.py:813
- msgid ""
- "--destdir or --downloaddir must be used with --downloadonly or download or "
- "system-upgrade command."
- msgstr ""
- 
--#: dnf/cli/cli.py:918
-+#: dnf/cli/cli.py:819
- msgid ""
- "--enable, --set-enabled and --disable, --set-disabled must be used with "
- "config-manager command."
- msgstr ""
- 
--#: dnf/cli/cli.py:1000
-+#: dnf/cli/cli.py:901
- msgid ""
- "Warning: Enforcing GPG signature check globally as per active RPM security "
- "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)"
- msgstr ""
- 
--#: dnf/cli/cli.py:1020
-+#: dnf/cli/cli.py:921
- msgid "Config file \"{}\" does not exist"
- msgstr ""
- 
--#: dnf/cli/cli.py:1040
-+#: dnf/cli/cli.py:941
- msgid ""
- "Unable to detect release version (use '--releasever' to specify release "
- "version)"
- msgstr ""
- 
--#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471
-+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr ""
- 
--#: dnf/cli/cli.py:1134
-+#: dnf/cli/cli.py:1035
- #, python-format
- msgid "Command \"%s\" already defined"
- msgstr ""
- 
--#: dnf/cli/cli.py:1154
-+#: dnf/cli/cli.py:1055
- msgid "Excludes in dnf.conf: "
- msgstr ""
- 
--#: dnf/cli/cli.py:1157
-+#: dnf/cli/cli.py:1058
- msgid "Includes in dnf.conf: "
- msgstr ""
- 
--#: dnf/cli/cli.py:1160
-+#: dnf/cli/cli.py:1061
- msgid "Excludes in repo "
- msgstr ""
- 
--#: dnf/cli/cli.py:1163
-+#: dnf/cli/cli.py:1064
- msgid "Includes in repo "
- msgstr ""
- 
-@@ -831,7 +797,7 @@ msgid "show all packages (default)"
- msgstr ""
- 
- #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743
--#: dnf/cli/commands/module.py:351
-+#: dnf/cli/commands/module.py:373
- msgid "show only available packages"
- msgstr ""
- 
-@@ -1157,78 +1123,78 @@ msgstr ""
- msgid "No group data available for configured repositories."
- msgstr ""
- 
--#: dnf/cli/commands/group.py:129
-+#: dnf/cli/commands/group.py:126
- #, python-format
- msgid "Warning: Group %s does not exist."
- msgstr ""
- 
--#: dnf/cli/commands/group.py:170
-+#: dnf/cli/commands/group.py:167
- msgid "Warning: No groups match:"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193
--#: dnf/cli/output.py:1226
-+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190
-+#: dnf/cli/output.py:1139
- msgid "<name-unset>"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:199
-+#: dnf/cli/commands/group.py:196
- msgid "Available Environment Groups:"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:201
-+#: dnf/cli/commands/group.py:198
- msgid "Installed Environment Groups:"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294
-+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291
- msgid "Installed Groups:"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301
-+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298
- msgid "Installed Language Groups:"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308
-+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305
- msgid "Available Groups:"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315
-+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312
- msgid "Available Language Groups:"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:322
-+#: dnf/cli/commands/group.py:319
- msgid "include optional packages from group"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:325
-+#: dnf/cli/commands/group.py:322
- msgid "show also hidden groups"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:327
-+#: dnf/cli/commands/group.py:324
- msgid "show only installed groups"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:329
-+#: dnf/cli/commands/group.py:326
- msgid "show only available groups"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:331
-+#: dnf/cli/commands/group.py:328
- msgid "show also ID of groups"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:333
-+#: dnf/cli/commands/group.py:330
- msgid "available subcommands: {} (default), {}"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:337
-+#: dnf/cli/commands/group.py:334
- msgid "argument for group subcommand"
- msgstr ""
- 
--#: dnf/cli/commands/group.py:346
-+#: dnf/cli/commands/group.py:343
- #, python-format
- msgid "Invalid groups sub-command, use: %s."
- msgstr ""
- 
--#: dnf/cli/commands/group.py:403
-+#: dnf/cli/commands/group.py:398
- msgid "Unable to find a mandatory group package."
- msgstr ""
- 
-@@ -1272,69 +1238,90 @@ msgstr ""
- msgid "More than one argument given as transaction file name."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126
-+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130
- msgid "No transaction ID or package name given."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:138
-+#: dnf/cli/commands/history.py:142
- #, python-format
- msgid "You don't have access to the history DB: %s"
- msgstr ""
- 
--#: dnf/cli/commands/history.py:147
-+#: dnf/cli/commands/history.py:151
- #, python-format
- msgid ""
- "Cannot undo transaction %s, doing so would result in an inconsistent package "
- "database."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:152
-+#: dnf/cli/commands/history.py:156
- #, python-format
- msgid ""
- "Cannot rollback transaction %s, doing so would result in an inconsistent "
- "package database."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:222
-+#: dnf/cli/commands/history.py:175
-+msgid "No transaction ID given"
-+msgstr ""
-+
-+#: dnf/cli/commands/history.py:179
-+#, python-brace-format
-+msgid "Transaction ID \"{0}\" not found."
-+msgstr ""
-+
-+#: dnf/cli/commands/history.py:185
-+msgid "Found more than one transaction ID!"
-+msgstr ""
-+
-+#: dnf/cli/commands/history.py:203
-+#, python-format
-+msgid "Transaction history is incomplete, before %u."
-+msgstr ""
-+
-+#: dnf/cli/commands/history.py:205
-+#, python-format
-+msgid "Transaction history is incomplete, after %u."
-+msgstr ""
-+
-+#: dnf/cli/commands/history.py:256
-+msgid "No packages to list"
-+msgstr ""
-+
-+#: dnf/cli/commands/history.py:279
- msgid ""
- "Invalid transaction ID range definition '{}'.\n"
- "Use '<transaction-id>..<transaction-id>'."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:226
-+#: dnf/cli/commands/history.py:283
- msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:255
-+#: dnf/cli/commands/history.py:312
- msgid "No transaction which manipulates package '{}' was found."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:305
--#, python-brace-format
--msgid "Transaction ID \"{id}\" not found."
--msgstr ""
--
--#: dnf/cli/commands/history.py:313
-+#: dnf/cli/commands/history.py:357
- msgid "{} exists, overwrite?"
- msgstr ""
- 
--#: dnf/cli/commands/history.py:316
-+#: dnf/cli/commands/history.py:360
- msgid "Not overwriting {}, exiting."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:323
-+#: dnf/cli/commands/history.py:367
- msgid "Transaction saved to {}."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:326
-+#: dnf/cli/commands/history.py:370
- msgid "Error storing transaction: {}"
- msgstr ""
- 
--#: dnf/cli/commands/history.py:350
--msgid ""
--"Warning, the following problems occurred while replaying the transaction:"
-+#: dnf/cli/commands/history.py:386
-+msgid "Warning, the following problems occurred while running a transaction:"
- msgstr ""
- 
- #: dnf/cli/commands/install.py:47
-@@ -1354,7 +1341,7 @@ msgstr ""
- msgid "Not a valid rpm file path: %s"
- msgstr ""
- 
--#: dnf/cli/commands/install.py:167
-+#: dnf/cli/commands/install.py:166
- #, python-brace-format
- msgid "There are following alternatives for \"{0}\": {1}"
- msgstr ""
-@@ -1394,7 +1381,7 @@ msgid "%s marked as group installed."
- msgstr ""
- 
- #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129
--#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279
-+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282
- msgid "Error:"
- msgstr ""
- 
-@@ -1450,42 +1437,46 @@ msgid "Package {} belongs to multiple modules, skipping"
- msgstr ""
- 
- #: dnf/cli/commands/module.py:277
-+msgid "switch a module to a stream and distrosync rpm packages"
-+msgstr ""
-+
-+#: dnf/cli/commands/module.py:299
- msgid "list modular packages"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:292
-+#: dnf/cli/commands/module.py:314
- msgid "list packages belonging to a module"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:327
-+#: dnf/cli/commands/module.py:349
- msgid "Interact with Modules."
- msgstr ""
- 
--#: dnf/cli/commands/module.py:340
-+#: dnf/cli/commands/module.py:362
- msgid "show only enabled modules"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:343
-+#: dnf/cli/commands/module.py:365
- msgid "show only disabled modules"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:346
-+#: dnf/cli/commands/module.py:368
- msgid "show only installed modules or packages"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:349
-+#: dnf/cli/commands/module.py:371
- msgid "show profile content"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:354
-+#: dnf/cli/commands/module.py:376
- msgid "remove all modular packages"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:364
-+#: dnf/cli/commands/module.py:386
- msgid "Module specification"
- msgstr ""
- 
--#: dnf/cli/commands/module.py:386
-+#: dnf/cli/commands/module.py:408
- msgid "{} {} {}: too few arguments"
- msgstr ""
- 
-@@ -1960,22 +1951,22 @@ msgstr ""
- msgid "Keyword to search for"
- msgstr ""
- 
--#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
-+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460
- msgctxt "long"
- msgid "Name"
- msgstr ""
- 
--#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
-+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513
- msgctxt "long"
- msgid "Summary"
- msgstr ""
- 
--#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
-+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523
- msgctxt "long"
- msgid "Description"
- msgstr ""
- 
--#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
-+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516
- msgid "URL"
- msgstr ""
- 
-@@ -2087,16 +2078,16 @@ msgid ""
- "exit (or quit)           exit the shell"
- msgstr ""
- 
--#: dnf/cli/commands/shell.py:259
-+#: dnf/cli/commands/shell.py:262
- #, python-format
- msgid "Error: Cannot open %s for reading"
- msgstr ""
- 
--#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187
-+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187
- msgid "Complete!"
- msgstr ""
- 
--#: dnf/cli/commands/shell.py:291
-+#: dnf/cli/commands/shell.py:294
- msgid "Leaving Shell"
- msgstr ""
- 
-@@ -2287,8 +2278,8 @@ msgstr ""
- msgid "Files"
- msgstr ""
- 
--#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
--#: dnf/cli/output.py:1772 dnf/cli/output.py:1774
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652
-+#: dnf/cli/output.py:1654 dnf/util.py:591
- msgid "Installed"
- msgstr ""
- 
-@@ -2609,13 +2600,13 @@ msgstr ""
- #. Translators: This is abbreviated 'Name'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:505
-+#: dnf/cli/output.py:459
- msgctxt "short"
- msgid "Name"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:511
-+#: dnf/cli/output.py:465
- msgid "Epoch"
- msgstr ""
- 
-@@ -2623,38 +2614,38 @@ msgstr ""
- #. use the full (unabbreviated) term 'Version' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:512 dnf/cli/output.py:1335
-+#: dnf/cli/output.py:466 dnf/cli/output.py:1248
- msgctxt "short"
- msgid "Version"
- msgstr ""
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1337
-+#: dnf/cli/output.py:467 dnf/cli/output.py:1250
- msgctxt "long"
- msgid "Version"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:516
-+#: dnf/cli/output.py:470
- msgid "Release"
- msgstr ""
- 
- #. Translators: This is abbreviated 'Architecture', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:517 dnf/cli/output.py:1326
-+#: dnf/cli/output.py:471 dnf/cli/output.py:1239
- msgctxt "short"
- msgid "Arch"
- msgstr ""
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:472 dnf/cli/output.py:1242
- msgctxt "long"
- msgid "Architecture"
- msgstr ""
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1352
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1265
- msgctxt "long"
- msgid "Size"
- msgstr ""
-@@ -2663,32 +2654,32 @@ msgstr ""
- #. not be longer than 5 characters. If the term 'Size' in your
- #. language is not longer than 5 characters then you can use it
- #. unabbreviated.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1350
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1263
- msgctxt "short"
- msgid "Size"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:524
-+#: dnf/cli/output.py:478
- msgid "Source"
- msgstr ""
- 
- #. Translators: This is abbreviated 'Repository', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:525 dnf/cli/output.py:1341
-+#: dnf/cli/output.py:479 dnf/cli/output.py:1254
- msgctxt "short"
- msgid "Repo"
- msgstr ""
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:480 dnf/cli/output.py:1257
- msgctxt "long"
- msgid "Repository"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:533
-+#: dnf/cli/output.py:487
- msgid "From repo"
- msgstr ""
- 
-@@ -2696,324 +2687,320 @@ msgstr ""
- #. print(_("Committer   : %s") % ucd(pkg.committer))
- #. print(_("Committime  : %s") % time.ctime(pkg.committime))
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:539
-+#: dnf/cli/output.py:493
- msgid "Packager"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:541
-+#: dnf/cli/output.py:495
- msgid "Buildtime"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:545
-+#: dnf/cli/output.py:499
- msgid "Install time"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:554
-+#: dnf/cli/output.py:508
- msgid "Installed by"
- msgstr ""
- 
- #. Translators: This is abbreviated 'Summary'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:558
-+#: dnf/cli/output.py:512
- msgctxt "short"
- msgid "Summary"
- msgstr ""
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:564
-+#: dnf/cli/output.py:518
- msgid "License"
- msgstr ""
- 
- #. Translators: This is abbreviated 'Description'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:568
-+#: dnf/cli/output.py:522
- msgctxt "short"
- msgid "Description"
- msgstr ""
- 
--#: dnf/cli/output.py:695
--msgid "No packages to list"
--msgstr ""
--
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "y"
- msgstr ""
- 
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "yes"
- msgstr ""
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "n"
- msgstr ""
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "no"
- msgstr ""
- 
--#: dnf/cli/output.py:711
-+#: dnf/cli/output.py:655
- msgid "Is this ok [y/N]: "
- msgstr ""
- 
--#: dnf/cli/output.py:715
-+#: dnf/cli/output.py:659
- msgid "Is this ok [Y/n]: "
- msgstr ""
- 
--#: dnf/cli/output.py:795
-+#: dnf/cli/output.py:739
- #, python-format
- msgid "Group: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:799
-+#: dnf/cli/output.py:743
- #, python-format
- msgid " Group-Id: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:801 dnf/cli/output.py:840
-+#: dnf/cli/output.py:745 dnf/cli/output.py:784
- #, python-format
- msgid " Description: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:803
-+#: dnf/cli/output.py:747
- #, python-format
- msgid " Language: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:806
-+#: dnf/cli/output.py:750
- msgid " Mandatory Packages:"
- msgstr ""
- 
--#: dnf/cli/output.py:807
-+#: dnf/cli/output.py:751
- msgid " Default Packages:"
- msgstr ""
- 
--#: dnf/cli/output.py:808
-+#: dnf/cli/output.py:752
- msgid " Optional Packages:"
- msgstr ""
- 
--#: dnf/cli/output.py:809
-+#: dnf/cli/output.py:753
- msgid " Conditional Packages:"
- msgstr ""
- 
--#: dnf/cli/output.py:834
-+#: dnf/cli/output.py:778
- #, python-format
- msgid "Environment Group: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:837
-+#: dnf/cli/output.py:781
- #, python-format
- msgid " Environment-Id: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:843
-+#: dnf/cli/output.py:787
- msgid " Mandatory Groups:"
- msgstr ""
- 
--#: dnf/cli/output.py:844
-+#: dnf/cli/output.py:788
- msgid " Optional Groups:"
- msgstr ""
- 
--#: dnf/cli/output.py:865
-+#: dnf/cli/output.py:809
- msgid "Matched from:"
- msgstr ""
- 
--#: dnf/cli/output.py:879
-+#: dnf/cli/output.py:823
- #, python-format
- msgid "Filename    : %s"
- msgstr ""
- 
--#: dnf/cli/output.py:904
-+#: dnf/cli/output.py:848
- #, python-format
- msgid "Repo        : %s"
- msgstr ""
- 
--#: dnf/cli/output.py:913
-+#: dnf/cli/output.py:857
- msgid "Description : "
- msgstr ""
- 
--#: dnf/cli/output.py:917
-+#: dnf/cli/output.py:861
- #, python-format
- msgid "URL         : %s"
- msgstr ""
- 
--#: dnf/cli/output.py:921
-+#: dnf/cli/output.py:865
- #, python-format
- msgid "License     : %s"
- msgstr ""
- 
--#: dnf/cli/output.py:927
-+#: dnf/cli/output.py:871
- #, python-format
- msgid "Provide    : %s"
- msgstr ""
- 
--#: dnf/cli/output.py:947
-+#: dnf/cli/output.py:891
- #, python-format
- msgid "Other       : %s"
- msgstr ""
- 
--#: dnf/cli/output.py:996
-+#: dnf/cli/output.py:940
- msgid "There was an error calculating total download size"
- msgstr ""
- 
--#: dnf/cli/output.py:1002
-+#: dnf/cli/output.py:946
- #, python-format
- msgid "Total size: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:1005
-+#: dnf/cli/output.py:949
- #, python-format
- msgid "Total download size: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:1008
-+#: dnf/cli/output.py:952
- #, python-format
- msgid "Installed size: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:1026
-+#: dnf/cli/output.py:970
- msgid "There was an error calculating installed size"
- msgstr ""
- 
--#: dnf/cli/output.py:1030
-+#: dnf/cli/output.py:974
- #, python-format
- msgid "Freed space: %s"
- msgstr ""
- 
--#: dnf/cli/output.py:1039
-+#: dnf/cli/output.py:983
- msgid "Marking packages as installed by the group:"
- msgstr ""
- 
--#: dnf/cli/output.py:1046
-+#: dnf/cli/output.py:990
- msgid "Marking packages as removed by the group:"
- msgstr ""
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Group"
- msgstr ""
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Packages"
- msgstr ""
- 
--#: dnf/cli/output.py:1133
-+#: dnf/cli/output.py:1046
- msgid "Installing group/module packages"
- msgstr ""
- 
--#: dnf/cli/output.py:1134
-+#: dnf/cli/output.py:1047
- msgid "Installing group packages"
- msgstr ""
- 
- #. TRANSLATORS: This is for a list of packages to be installed.
--#: dnf/cli/output.py:1138
-+#: dnf/cli/output.py:1051
- msgctxt "summary"
- msgid "Installing"
- msgstr ""
- 
- #. TRANSLATORS: This is for a list of packages to be upgraded.
--#: dnf/cli/output.py:1140
-+#: dnf/cli/output.py:1053
- msgctxt "summary"
- msgid "Upgrading"
- msgstr ""
- 
- #. TRANSLATORS: This is for a list of packages to be reinstalled.
--#: dnf/cli/output.py:1142
-+#: dnf/cli/output.py:1055
- msgctxt "summary"
- msgid "Reinstalling"
- msgstr ""
- 
--#: dnf/cli/output.py:1144
-+#: dnf/cli/output.py:1057
- msgid "Installing dependencies"
- msgstr ""
- 
--#: dnf/cli/output.py:1145
-+#: dnf/cli/output.py:1058
- msgid "Installing weak dependencies"
- msgstr ""
- 
- #. TRANSLATORS: This is for a list of packages to be removed.
--#: dnf/cli/output.py:1147
-+#: dnf/cli/output.py:1060
- msgid "Removing"
- msgstr ""
- 
--#: dnf/cli/output.py:1148
-+#: dnf/cli/output.py:1061
- msgid "Removing dependent packages"
- msgstr ""
- 
--#: dnf/cli/output.py:1149
-+#: dnf/cli/output.py:1062
- msgid "Removing unused dependencies"
- msgstr ""
- 
- #. TRANSLATORS: This is for a list of packages to be downgraded.
--#: dnf/cli/output.py:1151
-+#: dnf/cli/output.py:1064
- msgctxt "summary"
- msgid "Downgrading"
- msgstr ""
- 
--#: dnf/cli/output.py:1176
-+#: dnf/cli/output.py:1089
- msgid "Installing module profiles"
- msgstr ""
- 
--#: dnf/cli/output.py:1185
-+#: dnf/cli/output.py:1098
- msgid "Disabling module profiles"
- msgstr ""
- 
--#: dnf/cli/output.py:1194
-+#: dnf/cli/output.py:1107
- msgid "Enabling module streams"
- msgstr ""
- 
--#: dnf/cli/output.py:1202
-+#: dnf/cli/output.py:1115
- msgid "Switching module streams"
- msgstr ""
- 
--#: dnf/cli/output.py:1210
-+#: dnf/cli/output.py:1123
- msgid "Disabling modules"
- msgstr ""
- 
--#: dnf/cli/output.py:1218
-+#: dnf/cli/output.py:1131
- msgid "Resetting modules"
- msgstr ""
- 
--#: dnf/cli/output.py:1230
-+#: dnf/cli/output.py:1143
- msgid "Installing Environment Groups"
- msgstr ""
- 
--#: dnf/cli/output.py:1237
-+#: dnf/cli/output.py:1150
- msgid "Upgrading Environment Groups"
- msgstr ""
- 
--#: dnf/cli/output.py:1244
-+#: dnf/cli/output.py:1157
- msgid "Removing Environment Groups"
- msgstr ""
- 
--#: dnf/cli/output.py:1251
-+#: dnf/cli/output.py:1164
- msgid "Installing Groups"
- msgstr ""
- 
--#: dnf/cli/output.py:1258
-+#: dnf/cli/output.py:1171
- msgid "Upgrading Groups"
- msgstr ""
- 
--#: dnf/cli/output.py:1265
-+#: dnf/cli/output.py:1178
- msgid "Removing Groups"
- msgstr ""
- 
--#: dnf/cli/output.py:1281
-+#: dnf/cli/output.py:1194
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
- "(add '%s' to command line to force their upgrade)"
- msgstr ""
- 
--#: dnf/cli/output.py:1291
-+#: dnf/cli/output.py:1204
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr ""
- 
--#: dnf/cli/output.py:1295
-+#: dnf/cli/output.py:1208
- msgid " or part of a group"
- msgstr ""
- 
-@@ -3021,22 +3008,22 @@ msgstr ""
- #. use the full (unabbreviated) term 'Package' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:1320
-+#: dnf/cli/output.py:1233
- msgctxt "short"
- msgid "Package"
- msgstr ""
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
--#: dnf/cli/output.py:1322
-+#: dnf/cli/output.py:1235
- msgctxt "long"
- msgid "Package"
- msgstr ""
- 
--#: dnf/cli/output.py:1371
-+#: dnf/cli/output.py:1284
- msgid "replacing"
- msgstr ""
- 
--#: dnf/cli/output.py:1378
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid ""
- "\n"
-@@ -3045,289 +3032,273 @@ msgid ""
- msgstr ""
- 
- #. TODO: remove
--#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933
-+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813
- msgid "Install"
- msgstr ""
- 
--#: dnf/cli/output.py:1387 dnf/cli/output.py:1941
-+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821
- msgid "Upgrade"
- msgstr ""
- 
--#: dnf/cli/output.py:1388
-+#: dnf/cli/output.py:1301
- msgid "Remove"
- msgstr ""
- 
--#: dnf/cli/output.py:1390 dnf/cli/output.py:1939
-+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819
- msgid "Downgrade"
- msgstr ""
- 
--#: dnf/cli/output.py:1391
-+#: dnf/cli/output.py:1304
- msgid "Skip"
- msgstr ""
- 
--#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
-+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] ""
- msgstr[1] ""
- 
--#: dnf/cli/output.py:1418
-+#: dnf/cli/output.py:1331
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] ""
- msgstr[1] ""
- 
--#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942
--msgid "Upgraded"
--msgstr ""
--
--#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940
--msgid "Downgraded"
--msgstr ""
--
--#: dnf/cli/output.py:1503
--msgid "Reinstalled"
--msgstr ""
--
--#: dnf/cli/output.py:1504
--msgid "Skipped"
--msgstr ""
--
--#: dnf/cli/output.py:1505
--msgid "Removed"
--msgstr ""
--
--#: dnf/cli/output.py:1508
--msgid "Failed"
--msgstr ""
--
--#: dnf/cli/output.py:1559
-+#: dnf/cli/output.py:1439
- msgid "Total"
- msgstr ""
- 
--#: dnf/cli/output.py:1587
-+#: dnf/cli/output.py:1467
- msgid "<unset>"
- msgstr ""
- 
--#: dnf/cli/output.py:1588
-+#: dnf/cli/output.py:1468
- msgid "System"
- msgstr ""
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1518
- msgid "Command line"
- msgstr ""
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1649
-+#: dnf/cli/output.py:1529
- msgid "User name"
- msgstr ""
- 
--#: dnf/cli/output.py:1651
-+#: dnf/cli/output.py:1531
- msgid "ID"
- msgstr ""
- 
--#: dnf/cli/output.py:1653
-+#: dnf/cli/output.py:1533
- msgid "Date and time"
- msgstr ""
- 
--#: dnf/cli/output.py:1654
-+#: dnf/cli/output.py:1534
- msgid "Action(s)"
- msgstr ""
- 
--#: dnf/cli/output.py:1655
-+#: dnf/cli/output.py:1535
- msgid "Altered"
- msgstr ""
- 
--#: dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1578
- msgid "No transactions"
- msgstr ""
- 
--#: dnf/cli/output.py:1699 dnf/cli/output.py:1715
-+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595
- msgid "Failed history info"
- msgstr ""
- 
--#: dnf/cli/output.py:1714
-+#: dnf/cli/output.py:1594
- msgid "No transaction ID, or package, given"
- msgstr ""
- 
--#: dnf/cli/output.py:1772
-+#: dnf/cli/output.py:1652
- msgid "Erased"
- msgstr ""
- 
--#: dnf/cli/output.py:1774
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590
-+msgid "Downgraded"
-+msgstr ""
-+
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589
-+msgid "Upgraded"
-+msgstr ""
-+
-+#: dnf/cli/output.py:1654
- msgid "Not installed"
- msgstr ""
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Newer"
- msgstr ""
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Older"
- msgstr ""
- 
--#: dnf/cli/output.py:1823 dnf/cli/output.py:1825
-+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705
- msgid "Transaction ID :"
- msgstr ""
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1708
- msgid "Begin time     :"
- msgstr ""
- 
--#: dnf/cli/output.py:1831 dnf/cli/output.py:1833
-+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713
- msgid "Begin rpmdb    :"
- msgstr ""
- 
--#: dnf/cli/output.py:1839
-+#: dnf/cli/output.py:1719
- #, python-format
- msgid "(%u seconds)"
- msgstr ""
- 
--#: dnf/cli/output.py:1841
-+#: dnf/cli/output.py:1721
- #, python-format
- msgid "(%u minutes)"
- msgstr ""
- 
--#: dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1723
- #, python-format
- msgid "(%u hours)"
- msgstr ""
- 
--#: dnf/cli/output.py:1845
-+#: dnf/cli/output.py:1725
- #, python-format
- msgid "(%u days)"
- msgstr ""
- 
--#: dnf/cli/output.py:1846
-+#: dnf/cli/output.py:1726
- msgid "End time       :"
- msgstr ""
- 
--#: dnf/cli/output.py:1849 dnf/cli/output.py:1851
-+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731
- msgid "End rpmdb      :"
- msgstr ""
- 
--#: dnf/cli/output.py:1858 dnf/cli/output.py:1860
-+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740
- msgid "User           :"
- msgstr ""
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1871
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751
- msgid "Aborted"
- msgstr ""
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869
--#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749
-+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755
- msgid "Return-Code    :"
- msgstr ""
- 
--#: dnf/cli/output.py:1867 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755
- msgid "Success"
- msgstr ""
- 
--#: dnf/cli/output.py:1869
-+#: dnf/cli/output.py:1749
- msgid "Failures:"
- msgstr ""
- 
--#: dnf/cli/output.py:1873
-+#: dnf/cli/output.py:1753
- msgid "Failure:"
- msgstr ""
- 
--#: dnf/cli/output.py:1883 dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765
- msgid "Releasever     :"
- msgstr ""
- 
--#: dnf/cli/output.py:1890 dnf/cli/output.py:1892
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Command Line   :"
- msgstr ""
- 
--#: dnf/cli/output.py:1897 dnf/cli/output.py:1899
-+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779
- msgid "Comment        :"
- msgstr ""
- 
--#: dnf/cli/output.py:1903
-+#: dnf/cli/output.py:1783
- msgid "Transaction performed with:"
- msgstr ""
- 
--#: dnf/cli/output.py:1912
-+#: dnf/cli/output.py:1792
- msgid "Packages Altered:"
- msgstr ""
- 
--#: dnf/cli/output.py:1918
-+#: dnf/cli/output.py:1798
- msgid "Scriptlet output:"
- msgstr ""
- 
--#: dnf/cli/output.py:1925
-+#: dnf/cli/output.py:1805
- msgid "Errors:"
- msgstr ""
- 
--#: dnf/cli/output.py:1934
-+#: dnf/cli/output.py:1814
- msgid "Dep-Install"
- msgstr ""
- 
--#: dnf/cli/output.py:1935
-+#: dnf/cli/output.py:1815
- msgid "Obsoleted"
- msgstr ""
- 
--#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr ""
- 
--#: dnf/cli/output.py:1937
-+#: dnf/cli/output.py:1817
- msgid "Erase"
- msgstr ""
- 
--#: dnf/cli/output.py:1938
-+#: dnf/cli/output.py:1818
- msgid "Reinstall"
- msgstr ""
- 
--#: dnf/cli/output.py:2016
-+#: dnf/cli/output.py:1892
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr ""
- 
--#: dnf/cli/output.py:2018
-+#: dnf/cli/output.py:1894
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
- msgstr ""
- 
--#: dnf/cli/output.py:2020
-+#: dnf/cli/output.py:1896
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr ""
- 
--#: dnf/cli/output.py:2022
-+#: dnf/cli/output.py:1898
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr ""
- 
--#: dnf/cli/output.py:2024
-+#: dnf/cli/output.py:1900
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
- msgstr ""
- 
--#: dnf/cli/output.py:2026
-+#: dnf/cli/output.py:1902
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr ""
- 
--#: dnf/cli/output.py:2028
-+#: dnf/cli/output.py:1904
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr ""
- 
--#: dnf/cli/output.py:2030
-+#: dnf/cli/output.py:1906
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr ""
- 
--#: dnf/cli/output.py:2039
-+#: dnf/cli/output.py:1915
- msgid "--> Starting dependency resolution"
- msgstr ""
- 
--#: dnf/cli/output.py:2044
-+#: dnf/cli/output.py:1919
- msgid "--> Finished dependency resolution"
- msgstr ""
- 
--#: dnf/cli/output.py:2058 dnf/crypto.py:132
-+#: dnf/cli/output.py:1933 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3409,7 +3380,7 @@ msgstr ""
- msgid "Environment id '%s' does not exist."
- msgstr ""
- 
--#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453
-+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487
- #, python-format
- msgid "Environment id '%s' is not installed."
- msgstr ""
-@@ -3516,6 +3487,11 @@ msgstr ""
- msgid "repo %s: imported key 0x%s."
- msgstr ""
- 
-+#: dnf/crypto.py:177
-+#, python-format
-+msgid "retrieving repo key for %s unencrypted from %s"
-+msgstr ""
-+
- #: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
-@@ -3598,7 +3574,7 @@ msgid_plural "Modular dependency problems with Defaults:"
- msgstr[0] ""
- msgstr[1] ""
- 
--#: dnf/exceptions.py:131 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:841
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] ""
-@@ -3646,8 +3622,8 @@ msgid ""
- "Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive"
- msgstr ""
- 
--#: dnf/module/module_base.py:54 dnf/module/module_base.py:421
--#: dnf/module/module_base.py:477 dnf/module/module_base.py:543
-+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547
-+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669
- msgid "Ignoring unnecessary profile: '{}/{}'"
- msgstr ""
- 
-@@ -3656,17 +3632,17 @@ msgstr ""
- msgid "All matches for argument '{0}' in module '{1}:{2}' are not active"
- msgstr ""
- 
--#: dnf/module/module_base.py:92
-+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr ""
- 
--#: dnf/module/module_base.py:102
-+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
- msgstr ""
- 
--#: dnf/module/module_base.py:106
-+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216
- msgid "Unable to match profile for argument {}"
- msgstr ""
- 
-@@ -3682,40 +3658,54 @@ msgstr ""
- msgid "Default profile {} not available in module {}:{}"
- msgstr ""
- 
--#: dnf/module/module_base.py:142
-+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245
- msgid "Installing module from Fail-Safe repository is not allowed"
- msgstr ""
- 
--#: dnf/module/module_base.py:159 dnf/module/module_base.py:193
--#: dnf/module/module_base.py:337 dnf/module/module_base.py:355
--#: dnf/module/module_base.py:363 dnf/module/module_base.py:417
--#: dnf/module/module_base.py:473 dnf/module/module_base.py:539
--msgid "Unable to resolve argument {}"
-+#: dnf/module/module_base.py:194
-+#, python-brace-format
-+msgid "No active matches for argument '{0}' in module '{1}:{2}'"
- msgstr ""
- 
--#: dnf/module/module_base.py:160
--msgid "No match for package {}"
-+#: dnf/module/module_base.py:226
-+#, python-brace-format
-+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'"
-+msgstr ""
-+
-+#: dnf/module/module_base.py:265
-+msgid "No packages available to distrosync for package name '{}'"
- msgstr ""
- 
--#: dnf/module/module_base.py:204
-+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452
-+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496
-+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599
-+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827
-+msgid "Unable to resolve argument {}"
-+msgstr ""
-+
-+#: dnf/module/module_base.py:319
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr ""
- 
--#: dnf/module/module_base.py:223 dnf/module/module_base.py:251
-+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366
- msgid "Unable to match profile in argument {}"
- msgstr ""
- 
--#: dnf/module/module_base.py:231
-+#: dnf/module/module_base.py:346
- msgid "Upgrading module from Fail-Safe repository is not allowed"
- msgstr ""
- 
--#: dnf/module/module_base.py:367
-+#: dnf/module/module_base.py:500
- msgid ""
- "Only module name is required. Ignoring unneeded information in argument: '{}'"
- msgstr ""
- 
--#: dnf/package.py:298
-+#: dnf/module/module_base.py:828
-+msgid "No match for package {}"
-+msgstr ""
-+
-+#: dnf/package.py:333
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr ""
-@@ -3796,6 +3786,12 @@ msgstr ""
- msgid "Errors occurred during test transaction."
- msgstr ""
- 
-+#: dnf/sack.py:47
-+msgid ""
-+"allow_vendor_change is disabled. This option is currently not supported for "
-+"downgrade and distro-sync commands"
-+msgstr ""
-+
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
- msgctxt "currently"
-@@ -3842,160 +3838,183 @@ msgstr ""
- msgid "Preparing"
- msgstr ""
- 
--#: dnf/transaction_sr.py:60
-+#: dnf/transaction_sr.py:66
- #, python-brace-format
--msgid "Errors in \"{filename}\":"
-+msgid ""
-+"The following problems occurred while replaying the transaction from file "
-+"\"{filename}\":"
- msgstr ""
- 
--#: dnf/transaction_sr.py:70
--#, python-brace-format
--msgid "Error in \"{filename}\": {error}"
-+#: dnf/transaction_sr.py:68
-+msgid "The following problems occurred while running a transaction:"
- msgstr ""
- 
--#: dnf/transaction_sr.py:87
-+#: dnf/transaction_sr.py:89
- #, python-brace-format
- msgid "Invalid major version \"{major}\", number expected."
- msgstr ""
- 
--#: dnf/transaction_sr.py:95
-+#: dnf/transaction_sr.py:97
- #, python-brace-format
- msgid "Invalid minor version \"{minor}\", number expected."
- msgstr ""
- 
--#: dnf/transaction_sr.py:101
-+#: dnf/transaction_sr.py:103
- #, python-brace-format
- msgid ""
- "Incompatible major version \"{major}\", supported major version is "
- "\"{major_supp}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:244
-+#: dnf/transaction_sr.py:224
-+msgid ""
-+"Conflicting TransactionReplay arguments have been specified: filename, data"
-+msgstr ""
-+
-+#: dnf/transaction_sr.py:265
- #, python-brace-format
- msgid "Unexpected type of \"{id}\", {exp} expected."
- msgstr ""
- 
--#: dnf/transaction_sr.py:250
-+#: dnf/transaction_sr.py:271
- #, python-brace-format
- msgid "Missing key \"{key}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:263
-+#: dnf/transaction_sr.py:285
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an rpm."
- msgstr ""
- 
--#: dnf/transaction_sr.py:267
-+#: dnf/transaction_sr.py:289
- #, python-brace-format
- msgid ""
- "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:275
-+#: dnf/transaction_sr.py:297
- #, python-brace-format
- msgid "Cannot parse NEVRA for package \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:286
-+#: dnf/transaction_sr.py:321
- #, python-brace-format
- msgid "Cannot find rpm nevra \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:301
-+#: dnf/transaction_sr.py:336
- #, python-brace-format
- msgid "Package \"{na}\" is already installed for action \"{action}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:311
-+#: dnf/transaction_sr.py:345
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\" not available in repositories for action "
- "\"{action}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:322
-+#: dnf/transaction_sr.py:356
- #, python-brace-format
- msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:336
-+#: dnf/transaction_sr.py:370
- #, python-brace-format
- msgid ""
- "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:343
-+#: dnf/transaction_sr.py:377
- #, python-format
- msgid "Group id '%s' is not available."
- msgstr ""
- 
--#: dnf/transaction_sr.py:364
-+#: dnf/transaction_sr.py:398
- #, python-brace-format
- msgid "Missing object key \"{key}\" in groups.packages."
- msgstr ""
- 
--#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387
-+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421
- #, python-format
- msgid "Group id '%s' is not installed."
- msgstr ""
- 
--#: dnf/transaction_sr.py:398
-+#: dnf/transaction_sr.py:432
- #, python-format
- msgid "Environment id '%s' is not available."
- msgstr ""
- 
--#: dnf/transaction_sr.py:422
-+#: dnf/transaction_sr.py:456
- #, python-brace-format
- msgid ""
- "Invalid value \"{group_type}\" of environments.groups.group_type, only "
- "\"mandatory\" or \"optional\" is supported."
- msgstr ""
- 
--#: dnf/transaction_sr.py:430
-+#: dnf/transaction_sr.py:464
- #, python-brace-format
- msgid "Missing object key \"{key}\" in environments.groups."
- msgstr ""
- 
--#: dnf/transaction_sr.py:508
-+#: dnf/transaction_sr.py:542
- #, python-brace-format
- msgid "Unexpected value of group action \"{action}\" for group \"{group}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:513
-+#: dnf/transaction_sr.py:547
- #, python-brace-format
- msgid "Missing object key \"{key}\" in a group."
- msgstr ""
- 
--#: dnf/transaction_sr.py:537
-+#: dnf/transaction_sr.py:571
- #, python-brace-format
- msgid ""
- "Unexpected value of environment action \"{action}\" for environment "
- "\"{env}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:542
-+#: dnf/transaction_sr.py:576
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an environment."
- msgstr ""
- 
--#: dnf/transaction_sr.py:581
-+#: dnf/transaction_sr.py:615
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\", which is not present in the transaction file, was "
- "pulled into the transaction."
- msgstr ""
- 
--#: dnf/util.py:391 dnf/util.py:393
-+#: dnf/util.py:393 dnf/util.py:395
- msgid "Problem"
- msgstr ""
- 
--#: dnf/util.py:444
-+#: dnf/util.py:446
- msgid "TransactionItem not found for key: {}"
- msgstr ""
- 
--#: dnf/util.py:454
-+#: dnf/util.py:456
- msgid "TransactionSWDBItem not found for key: {}"
- msgstr ""
- 
--#: dnf/util.py:457
-+#: dnf/util.py:459
- msgid "Errors occurred during transaction."
- msgstr ""
-+
-+#: dnf/util.py:595
-+msgid "Reinstalled"
-+msgstr ""
-+
-+#: dnf/util.py:596
-+msgid "Skipped"
-+msgstr ""
-+
-+#: dnf/util.py:597
-+msgid "Removed"
-+msgstr ""
-+
-+#: dnf/util.py:600
-+msgid "Failed"
-+msgstr ""
-+
-diff --git a/po/fr.po b/po/fr.po
-index 4e883335..bf1ccb6a 100644
---- a/po/fr.po
-+++ b/po/fr.po
-@@ -18,20 +18,21 @@
- # Ludek Janda <ljanda@redhat.com>, 2018. #zanata
- # Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr>, 2019. #zanata, 2020.
- # Julien Humbert <julroy67@gmail.com>, 2020.
-+# Sundeep Anand <suanand@redhat.com>, 2021.
- msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-10-05 09:18-0400\n"
--"PO-Revision-Date: 2020-09-12 11:29+0000\n"
--"Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
--"Language-Team: French <https://translate.fedoraproject.org/projects/dnf/dnf-master/fr/>\n"
-+"POT-Creation-Date: 2021-02-22 09:22+0100\n"
-+"PO-Revision-Date: 2021-03-08 10:29+0000\n"
-+"Last-Translator: Sundeep Anand <suanand@redhat.com>\n"
-+"Language-Team: French <https://translate.fedoraproject.org/projects/dnf/dnf-rhel-8/fr/>\n"
- "Language: fr\n"
- "MIME-Version: 1.0\n"
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
- "Plural-Forms: nplurals=2; plural=n > 1;\n"
--"X-Generator: Weblate 4.2.2\n"
-+"X-Generator: Weblate 4.5.1\n"
- 
- #: dnf/automatic/emitter.py:32
- #, python-format
-@@ -88,7 +89,7 @@ msgstr "Valeur de configuration inconnue : %s=%s dans %s ; %s"
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr "Option de configuration inconnue : %s=%s dans %s"
- 
--#: dnf/automatic/main.py:237 dnf/cli/cli.py:299
-+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304
- msgid "GPG check FAILED"
- msgstr "La vérification GPG a ÉCHOUÉ"
- 
-@@ -101,9 +102,10 @@ msgid "Started dnf-automatic."
- msgstr "dnf-automatic démarré."
- 
- #: dnf/automatic/main.py:308
--#, python-format
--msgid "Sleep for %s seconds"
--msgstr "Mise en sommeil pendant %s secondes"
-+msgid "Sleep for {} second"
-+msgid_plural "Sleep for {} seconds"
-+msgstr[0] "Mise en sommeil pendant {} seconde"
-+msgstr[1] "Mise en sommeil pendant {} secondes"
- 
- #: dnf/automatic/main.py:315
- msgid "System is off-line."
-@@ -115,7 +117,7 @@ msgstr "Le système est hors-ligne."
- msgid "Error: %s"
- msgstr "Erreur : %s"
- 
--#: dnf/base.py:146
-+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474
- msgid "loading repo '{}' failure: {}"
- msgstr "Erreur lors du chargement du dépôt « {} » : {}"
- 
-@@ -123,76 +125,76 @@ msgstr "Erreur lors du chargement du dépôt « {} » : {}"
- msgid "Loading repository '{}' has failed"
- msgstr "Échec du chargement du dépôt « {} »"
- 
--#: dnf/base.py:320
-+#: dnf/base.py:322
- msgid "Metadata timer caching disabled when running on metered connection."
- msgstr ""
- "Mise en cache temporisée des métadonnées désactivée lors du fonctionnement "
- "sur connexion limitée."
- 
--#: dnf/base.py:325
-+#: dnf/base.py:327
- msgid "Metadata timer caching disabled when running on a battery."
- msgstr ""
- "Mise en cache temporisée des métadonnées désactivée lors du fonctionnement "
- "sur batterie."
- 
--#: dnf/base.py:330
-+#: dnf/base.py:332
- msgid "Metadata timer caching disabled."
- msgstr "Mise en cache temporisée des métadonnées désactivée."
- 
--#: dnf/base.py:335
-+#: dnf/base.py:337
- msgid "Metadata cache refreshed recently."
- msgstr "Cache des métadonnées mis à jour récemment."
- 
--#: dnf/base.py:341 dnf/cli/commands/__init__.py:91
-+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91
- msgid "There are no enabled repositories in \"{}\"."
- msgstr "Il n’y a pas de dépôts activés dans « {} »."
- 
--#: dnf/base.py:348
-+#: dnf/base.py:350
- #, python-format
- msgid "%s: will never be expired and will not be refreshed."
- msgstr "%s : n’expirera jamais et ne sera pas réinitialisé."
- 
--#: dnf/base.py:350
-+#: dnf/base.py:352
- #, python-format
- msgid "%s: has expired and will be refreshed."
- msgstr "%s : a expiré et sera réinitialisé."
- 
- #. expires within the checking period:
--#: dnf/base.py:354
-+#: dnf/base.py:356
- #, python-format
- msgid "%s: metadata will expire after %d seconds and will be refreshed now"
- msgstr ""
- "%s : métadonnées expireront après %d secondes et seront réinitialisées "
- "maintenant"
- 
--#: dnf/base.py:358
-+#: dnf/base.py:360
- #, python-format
- msgid "%s: will expire after %d seconds."
- msgstr "%s : expireront après %d secondes."
- 
- #. performs the md sync
--#: dnf/base.py:364
-+#: dnf/base.py:366
- msgid "Metadata cache created."
- msgstr "Cache des métadonnées créé."
- 
--#: dnf/base.py:397
-+#: dnf/base.py:399 dnf/base.py:466
- #, python-format
- msgid "%s: using metadata from %s."
- msgstr "%s : utilisation des métadonnées depuis le %s."
- 
--#: dnf/base.py:409
-+#: dnf/base.py:411 dnf/base.py:479
- #, python-format
- msgid "Ignoring repositories: %s"
- msgstr "Dépôts ignorés : %s"
- 
--#: dnf/base.py:412
-+#: dnf/base.py:414
- #, python-format
- msgid "Last metadata expiration check: %s ago on %s."
- msgstr ""
- "Dernière vérification de l’expiration des métadonnées effectuée il y a %s le"
- " %s."
- 
--#: dnf/base.py:443
-+#: dnf/base.py:507
- msgid ""
- "The downloaded packages were saved in cache until the next successful "
- "transaction."
-@@ -200,59 +202,59 @@ msgstr ""
- "Les paquets téléchargés ont été mis en cache jusqu’à la prochaine "
- "transaction réussie."
- 
--#: dnf/base.py:445
-+#: dnf/base.py:509
- #, python-format
- msgid "You can remove cached packages by executing '%s'."
- msgstr "Vous pouvez supprimer les paquets en cache en exécutant « %s »."
- 
--#: dnf/base.py:535
-+#: dnf/base.py:599
- #, python-format
- msgid "Invalid tsflag in config file: %s"
- msgstr "tsflag invalide dans le fichier de configuration : %s"
- 
--#: dnf/base.py:591
-+#: dnf/base.py:655
- #, python-format
- msgid "Failed to add groups file for repository: %s - %s"
- msgstr "Échec d’ajout du fichier de groupes pour le dépôt : %s - %s"
- 
--#: dnf/base.py:823
-+#: dnf/base.py:887
- msgid "Running transaction check"
- msgstr "Test de la transaction"
- 
--#: dnf/base.py:831
-+#: dnf/base.py:895
- msgid "Error: transaction check vs depsolve:"
- msgstr ""
- "Erreur : vérification de transaction contre résolution des dépendances :"
- 
--#: dnf/base.py:837
-+#: dnf/base.py:901
- msgid "Transaction check succeeded."
- msgstr "La vérification de la transaction a réussi."
- 
--#: dnf/base.py:840
-+#: dnf/base.py:904
- msgid "Running transaction test"
- msgstr "Lancement de la transaction de test"
- 
--#: dnf/base.py:850 dnf/base.py:992
-+#: dnf/base.py:914 dnf/base.py:1065
- msgid "RPM: {}"
- msgstr "RPM : {}"
- 
--#: dnf/base.py:851
-+#: dnf/base.py:915
- msgid "Transaction test error:"
- msgstr "Erreur de la transaction de test :"
- 
--#: dnf/base.py:862
-+#: dnf/base.py:926
- msgid "Transaction test succeeded."
- msgstr "Transaction de test réussie."
- 
--#: dnf/base.py:883
-+#: dnf/base.py:947
- msgid "Running transaction"
- msgstr "Exécution de la transaction"
- 
--#: dnf/base.py:911
-+#: dnf/base.py:984
- msgid "Disk Requirements:"
- msgstr "Besoins en espace disque :"
- 
--#: dnf/base.py:914
-+#: dnf/base.py:987
- #, python-brace-format
- msgid "At least {0}MB more space needed on the {1} filesystem."
- msgid_plural "At least {0}MB more space needed on the {1} filesystem."
-@@ -263,40 +265,40 @@ msgstr[1] ""
- "Au moins {0} Mio supplémentaires sont nécessaires sur le système de fichiers"
- " {1}."
- 
--#: dnf/base.py:921
-+#: dnf/base.py:994
- msgid "Error Summary"
- msgstr "Résumé des erreurs"
- 
--#: dnf/base.py:947
-+#: dnf/base.py:1020
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
- msgstr "RPMDB modifié en dehors de {prog}."
- 
--#: dnf/base.py:993 dnf/base.py:1001
-+#: dnf/base.py:1066 dnf/base.py:1074
- msgid "Could not run transaction."
- msgstr "Impossible d’exécuter la transaction."
- 
--#: dnf/base.py:996
-+#: dnf/base.py:1069
- msgid "Transaction couldn't start:"
- msgstr "La transaction n’a pas pu démarrer :"
- 
--#: dnf/base.py:1010
-+#: dnf/base.py:1083
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "Échec de la suppression du fichier de transaction %s"
- 
--#: dnf/base.py:1092
-+#: dnf/base.py:1165
- msgid "Some packages were not downloaded. Retrying."
- msgstr "Certains paquets n’ont pas été téléchargés. Nouvel essai."
- 
--#: dnf/base.py:1122
-+#: dnf/base.py:1195
- #, python-format
- msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)"
- msgstr ""
- "Les Delta RPM ont réduit la taille des mises à jour de %.1f Mio à %.1f Mio "
- "(%d.1%% économisés)"
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1198
- #, python-format
- msgid ""
- "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)"
-@@ -304,77 +306,77 @@ msgstr ""
- "L’échec des Delta RPMs ont fait augmenter les %.1f MO de mises à jour de "
- "%.1f MB (%d.1%% gaspillés)"
- 
--#: dnf/base.py:1167
-+#: dnf/base.py:1240
- msgid "Cannot add local packages, because transaction job already exists"
- msgstr ""
- "Impossible d’ajouter des paquets locaux, car un travail de transaction "
- "existe déjà"
- 
--#: dnf/base.py:1181
-+#: dnf/base.py:1254
- msgid "Could not open: {}"
- msgstr "Impossible d’ouvrir : {}"
- 
--#: dnf/base.py:1219
-+#: dnf/base.py:1292
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr "La clé publique pour %s n’est pas installée"
- 
--#: dnf/base.py:1223
-+#: dnf/base.py:1296
- #, python-format
- msgid "Problem opening package %s"
- msgstr "Problème à l’ouverture du paquet %s"
- 
--#: dnf/base.py:1231
-+#: dnf/base.py:1304
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr "La clé publique pour %s n’est pas de confiance"
- 
--#: dnf/base.py:1235
-+#: dnf/base.py:1308
- #, python-format
- msgid "Package %s is not signed"
- msgstr "Le paquet %s n’est pas signé"
- 
--#: dnf/base.py:1265
-+#: dnf/base.py:1338
- #, python-format
- msgid "Cannot remove %s"
- msgstr "Impossible de supprimer %s"
- 
--#: dnf/base.py:1269
-+#: dnf/base.py:1342
- #, python-format
- msgid "%s removed"
- msgstr "%s supprimé"
- 
--#: dnf/base.py:1549
-+#: dnf/base.py:1622
- msgid "No match for group package \"{}\""
- msgstr "Aucune correspondance pour le paquet du groupe « {} »"
- 
--#: dnf/base.py:1635
-+#: dnf/base.py:1708
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "Ajout de paquets en provenance du groupe « %s » : %s"
- 
--#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442
-+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442
- #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592
- #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80
- #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110
- msgid "Nothing to do."
- msgstr "Rien à faire."
- 
--#: dnf/base.py:1676
-+#: dnf/base.py:1749
- msgid "No groups marked for removal."
- msgstr "Aucun groupe marqué pour suppression."
- 
--#: dnf/base.py:1710
-+#: dnf/base.py:1783
- msgid "No group marked for upgrade."
- msgstr "Aucun groupe marqué pour mise à jour."
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1997
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
- msgstr "Le paquet %s n’est pas installé, impossible de le rétrograder."
- 
--#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980
--#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411
-+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052
-+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416
- #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482
- #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633
- #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147
-@@ -384,30 +386,30 @@ msgstr "Le paquet %s n’est pas installé, impossible de le rétrograder."
- msgid "No match for argument: %s"
- msgstr "Aucune correspondance pour l’argument : %s"
- 
--#: dnf/base.py:1934
-+#: dnf/base.py:2006
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
- msgstr ""
- "Le paquet %s est déjà installé dans une version inférieure, impossible de le"
- " rétrograder."
- 
--#: dnf/base.py:1957
-+#: dnf/base.py:2029
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
- msgstr "Le paquet %s n’est pas installé, impossible de le réinstaller."
- 
--#: dnf/base.py:1972
-+#: dnf/base.py:2044
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr ""
- "Le fichier %s est un paquet source et ne peut pas être mis à jour, ignoré."
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:2050
- #, python-format
- msgid "Package %s not installed, cannot update it."
- msgstr "Le paquet %s n’est pas installé, impossible de le mettre à jour."
- 
--#: dnf/base.py:1987
-+#: dnf/base.py:2059
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
-@@ -415,127 +417,113 @@ msgstr ""
- "La même une ou version supérieure de %s est déjà installée, mise à jour "
- "impossible."
- 
--#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
- msgstr "Le paquet %s est disponible mais n’est pas installé."
- 
--#: dnf/base.py:2032
-+#: dnf/base.py:2104
- #, python-format
- msgid "Package %s available, but installed for different architecture."
- msgstr ""
- "Le paquet %s est disponible mais est installé pour une autre architecture."
- 
--#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699
-+#: dnf/base.py:2129
- #, python-format
- msgid "No package %s installed."
- msgstr "Aucun paquet %s installé."
- 
--#: dnf/base.py:2075 dnf/cli/commands/install.py:136
-+#: dnf/base.py:2147 dnf/cli/commands/install.py:136
- #: dnf/cli/commands/remove.py:133
- #, python-format
- msgid "Not a valid form: %s"
- msgstr "Format invalide : %s"
- 
--#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681
--#: dnf/cli/commands/remove.py:163
-+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681
-+#: dnf/cli/commands/remove.py:162
- msgid "No packages marked for removal."
- msgstr "Aucun paquet marqué pour suppression."
- 
--#: dnf/base.py:2179 dnf/cli/cli.py:422
-+#: dnf/base.py:2250 dnf/cli/cli.py:427
- #, python-format
- msgid "Packages for argument %s available, but not installed."
- msgstr "Les paquets pour le paramètre %s sont disponibles mais pas installés."
- 
--#: dnf/base.py:2184
-+#: dnf/base.py:2255
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
- msgstr ""
- "La version la plus ancienne du paquet %s est déjà installée, impossible de "
- "le rétrograder."
- 
--#: dnf/base.py:2242
--msgid "Action not handled: {}"
--msgstr "Action non gérée : {}"
--
--#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703
--#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169
--#, python-format
--msgid "No package %s available."
--msgstr "Aucun paquet %s n’est disponible."
--
--#: dnf/base.py:2269
--msgid "no package matched"
--msgstr "aucun paquet correspondant"
--
--#: dnf/base.py:2290
-+#: dnf/base.py:2302
- msgid "No security updates needed, but {} update available"
- msgstr ""
- "Aucune mise à jour de sécurité n’est nécessaire, mais la mise à jour {} est "
- "disponible"
- 
--#: dnf/base.py:2292
-+#: dnf/base.py:2304
- msgid "No security updates needed, but {} updates available"
- msgstr ""
- "Aucune mise à jour de sécurité n’est nécessaire, mais les mises à jour {} "
- "sont disponibles"
- 
--#: dnf/base.py:2296
-+#: dnf/base.py:2308
- msgid "No security updates needed for \"{}\", but {} update available"
- msgstr ""
- "Aucune mise à jour de sécurité n’est nécessaire pour « {} », mais la mise à "
- "jour {} est disponible"
- 
--#: dnf/base.py:2298
-+#: dnf/base.py:2310
- msgid "No security updates needed for \"{}\", but {} updates available"
- msgstr ""
- "Aucune mise à jour de sécurité n’est nécessaire pour « {} », mais les mises "
- "à jour {} sont disponibles"
- 
- #. raise an exception, because po.repoid is not in self.repos
--#: dnf/base.py:2319
-+#: dnf/base.py:2331
- #, python-format
- msgid "Unable to retrieve a key for a commandline package: %s"
- msgstr ""
- "Impossible de récupérer une clé pour un paquet en ligne de commande : %s"
- 
--#: dnf/base.py:2327
-+#: dnf/base.py:2339
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ". Le paquet en erreur est : %s"
- 
--#: dnf/base.py:2328
-+#: dnf/base.py:2340
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "Les clés GPG sont configurées comme : %s"
- 
--#: dnf/base.py:2340
-+#: dnf/base.py:2352
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
- msgstr "La clé GPG %s (0x%s) est déjà installée"
- 
--#: dnf/base.py:2373
-+#: dnf/base.py:2385
- msgid "The key has been approved."
- msgstr "La clef a été approuvée."
- 
--#: dnf/base.py:2376
-+#: dnf/base.py:2388
- msgid "The key has been rejected."
- msgstr "La clef a été rejetée."
- 
--#: dnf/base.py:2409
-+#: dnf/base.py:2421
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "L’import de la clé a échoué (code %d)"
- 
--#: dnf/base.py:2411
-+#: dnf/base.py:2423
- msgid "Key imported successfully"
- msgstr "La clé a bien été importée"
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2427
- msgid "Didn't install any keys"
- msgstr "Toutes les clés n’ont pas été installées"
- 
--#: dnf/base.py:2418
-+#: dnf/base.py:2430
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
-@@ -544,28 +532,28 @@ msgstr ""
- "Les clés GPG listées pour le dépôt « %s » sont déjà installées mais sont incorrectes pour ce paquet.\n"
- "Vérifiez que les URL des clés pour ce dépôt soient correctes."
- 
--#: dnf/base.py:2429
-+#: dnf/base.py:2441
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr ""
- "L’import de la ou des clés n’a pas résolu le problème, clés incorrectes ?"
- 
--#: dnf/base.py:2482
-+#: dnf/base.py:2494
- msgid "  * Maybe you meant: {}"
- msgstr "  * Peut-être vouliez-vous dire : {}"
- 
--#: dnf/base.py:2514
-+#: dnf/base.py:2526
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr "Le paquet \"{}\" du dépôt local \"{}\" a une somme de contrôle incorrecte"
- 
--#: dnf/base.py:2517
-+#: dnf/base.py:2529
- msgid "Some packages from local repository have incorrect checksum"
- msgstr "Certains paquets du dépôt local ont une somme de contrôle incorrecte"
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2532
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "Le paquet \"{}\" du dépôt \"{}\" a une somme de contrôle incorrecte"
- 
--#: dnf/base.py:2523
-+#: dnf/base.py:2535
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
-@@ -573,29 +561,29 @@ msgstr ""
- "Certains paquets ont un cache invalide, mais ne peuvent pas être téléchargés"
- " à cause de l’option « --cacheonly »"
- 
--#: dnf/base.py:2541 dnf/base.py:2561
-+#: dnf/base.py:2553 dnf/base.py:2573
- msgid "No match for argument"
- msgstr "Aucune correspondance pour le paramètre"
- 
--#: dnf/base.py:2549 dnf/base.py:2569
-+#: dnf/base.py:2561 dnf/base.py:2581
- msgid "All matches were filtered out by exclude filtering for argument"
- msgstr ""
- "Toutes les correspondances ont été filtrées en excluant le filtrage pour "
- "l’argument"
- 
--#: dnf/base.py:2551
-+#: dnf/base.py:2563
- msgid "All matches were filtered out by modular filtering for argument"
- msgstr ""
- "Toutes les correspondances ont été filtrées par filtrage modulaire pour les "
- "arguments"
- 
--#: dnf/base.py:2567
-+#: dnf/base.py:2579
- msgid "All matches were installed from a different repository for argument"
- msgstr ""
- "Toutes les correspondances ont été installées à partir d’un dépôt différent "
- "pour le paramètre"
- 
--#: dnf/base.py:2583
-+#: dnf/base.py:2626
- #, python-format
- msgid "Package %s is already installed."
- msgstr "Le paquet %s est déjà installé."
-@@ -616,8 +604,8 @@ msgstr "La lecture du fichier « %s » a échoué : %s"
- msgid "Cannot read file \"%s\": %s"
- msgstr "Impossible de lire le fichier « %s » : %s"
- 
--#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902
--#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108
-+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803
-+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108
- #, python-format
- msgid "Config error: %s"
- msgstr "Erreur de configuration : %s"
-@@ -650,7 +638,7 @@ msgstr ""
- "Le résulta de l’opération sera le basculement du flux« {1} » du module « {0}"
- " » vers le flux« {2} »"
- 
--#: dnf/cli/cli.py:172
-+#: dnf/cli/cli.py:173
- #, python-brace-format
- msgid ""
- "It is not possible to switch enabled streams of a module.\n"
-@@ -659,12 +647,12 @@ msgstr ""
- "Il n’est pas possible de basculer les flux actifs d’un module.\n"
- "Il et recommandé de retirer tout contenu installé par le module, et de réinitialiser le mode en utilisant la commande « {prog} module reset <nom_du_module> ». Après la réinitialisation, vous pouvez installer les autres flux."
- 
--#: dnf/cli/cli.py:210
-+#: dnf/cli/cli.py:211
- #, python-brace-format
- msgid "{prog} will only download packages for the transaction."
- msgstr "{prog} ne téléchargera que les paquets pour la transaction."
- 
--#: dnf/cli/cli.py:213
-+#: dnf/cli/cli.py:214
- #, python-brace-format
- msgid ""
- "{prog} will only download packages, install gpg keys, and check the "
-@@ -673,23 +661,23 @@ msgstr ""
- "{prog} ne téléchargera que les paquets, installera les clefs GPG et "
- "vérifiera la transaction."
- 
--#: dnf/cli/cli.py:217
-+#: dnf/cli/cli.py:218
- msgid "Operation aborted."
- msgstr "Opération avortée."
- 
--#: dnf/cli/cli.py:224
-+#: dnf/cli/cli.py:225
- msgid "Downloading Packages:"
- msgstr "Téléchargement des paquets :"
- 
--#: dnf/cli/cli.py:230
-+#: dnf/cli/cli.py:231
- msgid "Error downloading packages:"
- msgstr "Erreur de téléchargement des paquets :"
- 
--#: dnf/cli/cli.py:258
-+#: dnf/cli/cli.py:263
- msgid "Transaction failed"
- msgstr "La transaction a échoué"
- 
--#: dnf/cli/cli.py:281
-+#: dnf/cli/cli.py:286
- msgid ""
- "Refusing to automatically import keys when running unattended.\n"
- "Use \"-y\" to override."
-@@ -697,91 +685,70 @@ msgstr ""
- "Refus de l’importation automatique des clés lors d’une exécution sans surveillance.\n"
- "Utilisez l’option « -y » pour passer outre."
- 
--#: dnf/cli/cli.py:331
-+#: dnf/cli/cli.py:336
- msgid "Changelogs for {}"
- msgstr "Changements pour {}"
- 
--#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511
-+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516
- msgid "Obsoleting Packages"
- msgstr "Passage de paquets en obsolètes"
- 
--#: dnf/cli/cli.py:393
-+#: dnf/cli/cli.py:398
- msgid "No packages marked for distribution synchronization."
- msgstr "Aucun paquet marqué pour la synchronisation de la distribution."
- 
--#: dnf/cli/cli.py:428
-+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395
-+#, python-format
-+msgid "No package %s available."
-+msgstr "Aucun paquet %s n’est disponible."
-+
-+#: dnf/cli/cli.py:433
- msgid "No packages marked for downgrade."
- msgstr "Aucun paquet n’a été marqué pour passer à une version antérieure."
- 
--#: dnf/cli/cli.py:479
-+#: dnf/cli/cli.py:484
- msgid "Installed Packages"
- msgstr "Paquets installés"
- 
--#: dnf/cli/cli.py:487
-+#: dnf/cli/cli.py:492
- msgid "Available Packages"
- msgstr "Paquets disponibles"
- 
--#: dnf/cli/cli.py:491
-+#: dnf/cli/cli.py:496
- msgid "Autoremove Packages"
- msgstr "Supprime des paquets automatiquement"
- 
--#: dnf/cli/cli.py:493
-+#: dnf/cli/cli.py:498
- msgid "Extra Packages"
- msgstr "Paquets supplémentaires"
- 
--#: dnf/cli/cli.py:497
-+#: dnf/cli/cli.py:502
- msgid "Available Upgrades"
- msgstr "Mises à jour disponibles"
- 
--#: dnf/cli/cli.py:513
-+#: dnf/cli/cli.py:518
- msgid "Recently Added Packages"
- msgstr "Paquets récemment ajoutés"
- 
--#: dnf/cli/cli.py:518
-+#: dnf/cli/cli.py:522
- msgid "No matching Packages to list"
- msgstr "Aucun paquet correspondant à lister"
- 
--#: dnf/cli/cli.py:599
-+#: dnf/cli/cli.py:603
- msgid "No Matches found"
- msgstr "Aucune correspondance trouvée"
- 
--#: dnf/cli/cli.py:609
--msgid "No transaction ID given"
--msgstr "Aucun identifiant de transaction n’a été fourni"
--
--#: dnf/cli/cli.py:614
--msgid "Not found given transaction ID"
--msgstr "L’identifiant de transaction fourni est introuvable"
--
--#: dnf/cli/cli.py:623
--msgid "Found more than one transaction ID!"
--msgstr "Plus d’un identifiant de transaction ont été trouvés !"
--
--#: dnf/cli/cli.py:640
--#, python-format
--msgid "Transaction history is incomplete, before %u."
--msgstr "L’historique des transactions est incomplet, avant %u."
--
--#: dnf/cli/cli.py:642
--#, python-format
--msgid "Transaction history is incomplete, after %u."
--msgstr "L’historique des transactions est incomplet, après %u."
--
--#: dnf/cli/cli.py:689
--msgid "Undoing transaction {}, from {}"
--msgstr "Révocation de lla transaction {}, de {}"
--
--#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237
-+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237
- #, python-format
- msgid "Unknown repo: '%s'"
- msgstr "Dépôt inconnu : « %s »"
- 
--#: dnf/cli/cli.py:783
-+#: dnf/cli/cli.py:684
- #, python-format
- msgid "No repository match: %s"
- msgstr "Aucun dépôt ne correspond à %s"
- 
--#: dnf/cli/cli.py:817
-+#: dnf/cli/cli.py:718
- msgid ""
- "This command has to be run with superuser privileges (under the root user on"
- " most systems)."
-@@ -789,12 +756,12 @@ msgstr ""
- "Cette commande doit être exécutée avec les privilèges super-utilisateur "
- "(sous l’utilisateur root sur la plupart des systèmes)."
- 
--#: dnf/cli/cli.py:847
-+#: dnf/cli/cli.py:748
- #, python-format
- msgid "No such command: %s. Please use %s --help"
- msgstr "Aucune commande telle que : %s. Veuillez utiliser %s --help"
- 
--#: dnf/cli/cli.py:850
-+#: dnf/cli/cli.py:751
- #, python-format, python-brace-format
- msgid ""
- "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-"
-@@ -803,7 +770,7 @@ msgstr ""
- "Cela est peut-être une commande d’un module supplémentaire de {PROG}, "
- "essayez : « {prog} install 'dnf-command(%s)' »"
- 
--#: dnf/cli/cli.py:854
-+#: dnf/cli/cli.py:755
- #, python-brace-format
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
-@@ -812,7 +779,7 @@ msgstr ""
- "Cela est peut-être une commande d’un module supplémentaire de {prog}, mais "
- "le chargement de modules supplémentaires est actuellement désactivé."
- 
--#: dnf/cli/cli.py:912
-+#: dnf/cli/cli.py:813
- msgid ""
- "--destdir or --downloaddir must be used with --downloadonly or download or "
- "system-upgrade command."
-@@ -820,7 +787,7 @@ msgstr ""
- "--destdir ou --downloaddir doit être utilisé avec la commande --downloadonly"
- " ou download ou system-upgrade command."
- 
--#: dnf/cli/cli.py:918
-+#: dnf/cli/cli.py:819
- msgid ""
- "--enable, --set-enabled and --disable, --set-disabled must be used with "
- "config-manager command."
-@@ -828,7 +795,7 @@ msgstr ""
- "--enable, --set-enabled et --disable, --set-disabled doit être utilisé avec "
- "la commande config-manager."
- 
--#: dnf/cli/cli.py:1000
-+#: dnf/cli/cli.py:901
- msgid ""
- "Warning: Enforcing GPG signature check globally as per active RPM security "
- "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)"
-@@ -837,11 +804,11 @@ msgstr ""
- "politique de sécurité RPM active (voir « gpgcheck » dans dnf.conf(5) pour "
- "savoir comment interpréter ce message)"
- 
--#: dnf/cli/cli.py:1020
-+#: dnf/cli/cli.py:921
- msgid "Config file \"{}\" does not exist"
- msgstr "Le fichier de configuration \"{}\" n’existe pas"
- 
--#: dnf/cli/cli.py:1040
-+#: dnf/cli/cli.py:941
- msgid ""
- "Unable to detect release version (use '--releasever' to specify release "
- "version)"
-@@ -849,28 +816,28 @@ msgstr ""
- "Impossible de détecter le numéro de version (utilisez « --releasever » pour "
- "spécifier une version)"
- 
--#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471
-+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr "paramètre {} : non autorisé avec le paramètre {}"
- 
--#: dnf/cli/cli.py:1134
-+#: dnf/cli/cli.py:1035
- #, python-format
- msgid "Command \"%s\" already defined"
- msgstr "Commande « %s » déjà définie"
- 
--#: dnf/cli/cli.py:1154
-+#: dnf/cli/cli.py:1055
- msgid "Excludes in dnf.conf: "
- msgstr "Exclut dans dnf.conf : "
- 
--#: dnf/cli/cli.py:1157
-+#: dnf/cli/cli.py:1058
- msgid "Includes in dnf.conf: "
- msgstr "Inclut dans dnf.conf : "
- 
--#: dnf/cli/cli.py:1160
-+#: dnf/cli/cli.py:1061
- msgid "Excludes in repo "
- msgstr "Exclut dans dépôt "
- 
--#: dnf/cli/cli.py:1163
-+#: dnf/cli/cli.py:1064
- msgid "Includes in repo "
- msgstr "Inclut dans dépôt "
- 
-@@ -929,7 +896,7 @@ msgid "show all packages (default)"
- msgstr "affiche tous les paquets (par défaut)"
- 
- #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743
--#: dnf/cli/commands/module.py:351
-+#: dnf/cli/commands/module.py:373
- msgid "show only available packages"
- msgstr "affiche uniquement les paquets disponibles"
- 
-@@ -1260,78 +1227,78 @@ msgstr "affiche ou utilise les informations des groupes"
- msgid "No group data available for configured repositories."
- msgstr "Aucune donnée sur les groupes disponibles pour les dépôts configurés."
- 
--#: dnf/cli/commands/group.py:129
-+#: dnf/cli/commands/group.py:126
- #, python-format
- msgid "Warning: Group %s does not exist."
- msgstr "Attention : le groupe %s n’existe pas."
- 
--#: dnf/cli/commands/group.py:170
-+#: dnf/cli/commands/group.py:167
- msgid "Warning: No groups match:"
- msgstr "Attention : aucun groupe ne correspond à :"
- 
--#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193
--#: dnf/cli/output.py:1226
-+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190
-+#: dnf/cli/output.py:1139
- msgid "<name-unset>"
- msgstr "<name-unset>"
- 
--#: dnf/cli/commands/group.py:199
-+#: dnf/cli/commands/group.py:196
- msgid "Available Environment Groups:"
- msgstr "Groupes d’environnements disponibles :"
- 
--#: dnf/cli/commands/group.py:201
-+#: dnf/cli/commands/group.py:198
- msgid "Installed Environment Groups:"
- msgstr "Groupes d’environnements installés :"
- 
--#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294
-+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291
- msgid "Installed Groups:"
- msgstr "Groupes installés :"
- 
--#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301
-+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298
- msgid "Installed Language Groups:"
- msgstr "Groupes de langues installés :"
- 
--#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308
-+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305
- msgid "Available Groups:"
- msgstr "Groupes disponibles :"
- 
--#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315
-+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312
- msgid "Available Language Groups:"
- msgstr "Groupes de langues disponibles :"
- 
--#: dnf/cli/commands/group.py:322
-+#: dnf/cli/commands/group.py:319
- msgid "include optional packages from group"
- msgstr "inclure les paquets optionnels du groupe"
- 
--#: dnf/cli/commands/group.py:325
-+#: dnf/cli/commands/group.py:322
- msgid "show also hidden groups"
- msgstr "affiche également les groupes cachés"
- 
--#: dnf/cli/commands/group.py:327
-+#: dnf/cli/commands/group.py:324
- msgid "show only installed groups"
- msgstr "affiche seulement les groupes installés"
- 
--#: dnf/cli/commands/group.py:329
-+#: dnf/cli/commands/group.py:326
- msgid "show only available groups"
- msgstr "affiche uniquement les groupes disponibles"
- 
--#: dnf/cli/commands/group.py:331
-+#: dnf/cli/commands/group.py:328
- msgid "show also ID of groups"
- msgstr "affiche également les ID des groupes"
- 
--#: dnf/cli/commands/group.py:333
-+#: dnf/cli/commands/group.py:330
- msgid "available subcommands: {} (default), {}"
- msgstr "sous-commandes disponibles : {} (par défaut), {}"
- 
--#: dnf/cli/commands/group.py:337
-+#: dnf/cli/commands/group.py:334
- msgid "argument for group subcommand"
- msgstr "paramètre pour la sous-commande group"
- 
--#: dnf/cli/commands/group.py:346
-+#: dnf/cli/commands/group.py:343
- #, python-format
- msgid "Invalid groups sub-command, use: %s."
- msgstr "Sous-commande de groupes invalide, utilisez : %s."
- 
--#: dnf/cli/commands/group.py:403
-+#: dnf/cli/commands/group.py:398
- msgid "Unable to find a mandatory group package."
- msgstr "Impossible de trouver un paquet obligatoire du groupe."
- 
-@@ -1385,16 +1352,16 @@ msgstr "Pas de transaction ou de nom de fichier fourni."
- msgid "More than one argument given as transaction file name."
- msgstr "Plus d’un argument donné comme nom de fichier de transaction."
- 
--#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126
-+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130
- msgid "No transaction ID or package name given."
- msgstr "Pas d’identifiant de transaction ou de nom de paquet fourni."
- 
--#: dnf/cli/commands/history.py:138
-+#: dnf/cli/commands/history.py:142
- #, python-format
- msgid "You don't have access to the history DB: %s"
- msgstr "Vous n’avez pas accès à la base de données de l’historique : %s"
- 
--#: dnf/cli/commands/history.py:147
-+#: dnf/cli/commands/history.py:151
- #, python-format
- msgid ""
- "Cannot undo transaction %s, doing so would result in an inconsistent package"
-@@ -1403,7 +1370,7 @@ msgstr ""
- "Impossible de défaire la transaction %s ; cela aboutirait à une base de "
- "données des paquets incohérente."
- 
--#: dnf/cli/commands/history.py:152
-+#: dnf/cli/commands/history.py:156
- #, python-format
- msgid ""
- "Cannot rollback transaction %s, doing so would result in an inconsistent "
-@@ -1412,7 +1379,34 @@ msgstr ""
- "Impossible de défaire la transaction %s ; cela aboutirait à une base de "
- "données des paquets incohérente."
- 
--#: dnf/cli/commands/history.py:222
-+#: dnf/cli/commands/history.py:175
-+msgid "No transaction ID given"
-+msgstr "Aucun identifiant de transaction n’a été fourni"
-+
-+#: dnf/cli/commands/history.py:179
-+#, python-brace-format
-+msgid "Transaction ID \"{0}\" not found."
-+msgstr "ID de transaction \"{0}\" introuvable."
-+
-+#: dnf/cli/commands/history.py:185
-+msgid "Found more than one transaction ID!"
-+msgstr "Plus d’un identifiant de transaction ont été trouvés !"
-+
-+#: dnf/cli/commands/history.py:203
-+#, python-format
-+msgid "Transaction history is incomplete, before %u."
-+msgstr "L’historique des transactions est incomplet, avant %u."
-+
-+#: dnf/cli/commands/history.py:205
-+#, python-format
-+msgid "Transaction history is incomplete, after %u."
-+msgstr "L’historique des transactions est incomplet, après %u."
-+
-+#: dnf/cli/commands/history.py:256
-+msgid "No packages to list"
-+msgstr "Aucun paquet à lister"
-+
-+#: dnf/cli/commands/history.py:279
- msgid ""
- "Invalid transaction ID range definition '{}'.\n"
- "Use '<transaction-id>..<transaction-id>'."
-@@ -1420,7 +1414,7 @@ msgstr ""
- "La définition de la plage d’identifiants de transaction est invalide « {} ».\n"
- "Utilisez « <transaction-id>..<transaction-id> »."
- 
--#: dnf/cli/commands/history.py:226
-+#: dnf/cli/commands/history.py:283
- msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
-@@ -1428,37 +1422,31 @@ msgstr ""
- "Impossible de convertir « {} » à ID transaction.\n"
- "Utiliser « <number>», « last », « last-<number> »."
- 
--#: dnf/cli/commands/history.py:255
-+#: dnf/cli/commands/history.py:312
- msgid "No transaction which manipulates package '{}' was found."
- msgstr "Aucune transaction manipulant le paquet « {} » n’a été trouvée."
- 
--#: dnf/cli/commands/history.py:305
--#, python-brace-format
--msgid "Transaction ID \"{id}\" not found."
--msgstr "ID de Transaction « {id} » non trouvé."
--
--#: dnf/cli/commands/history.py:313
-+#: dnf/cli/commands/history.py:357
- msgid "{} exists, overwrite?"
- msgstr "{} existe, l’écraser ?"
- 
--#: dnf/cli/commands/history.py:316
-+#: dnf/cli/commands/history.py:360
- msgid "Not overwriting {}, exiting."
- msgstr "{} non écrasé, sortie."
- 
--#: dnf/cli/commands/history.py:323
-+#: dnf/cli/commands/history.py:367
- msgid "Transaction saved to {}."
- msgstr "Transaction enregistrée vers {}."
- 
--#: dnf/cli/commands/history.py:326
-+#: dnf/cli/commands/history.py:370
- msgid "Error storing transaction: {}"
- msgstr "Erreur lors du stockage de la transaction : {}"
- 
--#: dnf/cli/commands/history.py:350
--msgid ""
--"Warning, the following problems occurred while replaying the transaction:"
-+#: dnf/cli/commands/history.py:386
-+msgid "Warning, the following problems occurred while running a transaction:"
- msgstr ""
--"Attention, les problèmes suivants sont survenus lors de la relecture de la "
--"transaction :"
-+"Attention, les problèmes suivants sont survenus lors de l'exécution d'une "
-+"transaction :"
- 
- #: dnf/cli/commands/install.py:47
- msgid "install a package or packages on your system"
-@@ -1477,7 +1465,7 @@ msgstr "Impossible de trouver une correspondance"
- msgid "Not a valid rpm file path: %s"
- msgstr "Chemin du fichier RPM invalide : %s"
- 
--#: dnf/cli/commands/install.py:167
-+#: dnf/cli/commands/install.py:166
- #, python-brace-format
- msgid "There are following alternatives for \"{0}\": {1}"
- msgstr "Il existe les alternatives suivantes pour \"{0}\" : {1}"
-@@ -1522,7 +1510,7 @@ msgid "%s marked as group installed."
- msgstr "%s marqué comme étant installé par un groupe."
- 
- #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129
--#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279
-+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282
- msgid "Error:"
- msgstr "Erreur :"
- 
-@@ -1580,42 +1568,46 @@ msgid "Package {} belongs to multiple modules, skipping"
- msgstr "Le paquet {} appartient à de multiples modules, ignorer"
- 
- #: dnf/cli/commands/module.py:277
-+msgid "switch a module to a stream and distrosync rpm packages"
-+msgstr "passer un module à un flux et à des paquets de rpm de distrosync"
-+
-+#: dnf/cli/commands/module.py:299
- msgid "list modular packages"
- msgstr "dresser une liste des paquets modulaires"
- 
--#: dnf/cli/commands/module.py:292
-+#: dnf/cli/commands/module.py:314
- msgid "list packages belonging to a module"
- msgstr "dresser une liste des paquets appartenant à un module"
- 
--#: dnf/cli/commands/module.py:327
-+#: dnf/cli/commands/module.py:349
- msgid "Interact with Modules."
- msgstr "Interagit avec les modules."
- 
--#: dnf/cli/commands/module.py:340
-+#: dnf/cli/commands/module.py:362
- msgid "show only enabled modules"
- msgstr "n’affiche que les modules activés"
- 
--#: dnf/cli/commands/module.py:343
-+#: dnf/cli/commands/module.py:365
- msgid "show only disabled modules"
- msgstr "n’affiche que les modules désactivés"
- 
--#: dnf/cli/commands/module.py:346
-+#: dnf/cli/commands/module.py:368
- msgid "show only installed modules or packages"
- msgstr "affiche uniquement les paquets ou modules installés"
- 
--#: dnf/cli/commands/module.py:349
-+#: dnf/cli/commands/module.py:371
- msgid "show profile content"
- msgstr "affiche le contenu du profil"
- 
--#: dnf/cli/commands/module.py:354
-+#: dnf/cli/commands/module.py:376
- msgid "remove all modular packages"
- msgstr "Supprimer les paquets modulaires"
- 
--#: dnf/cli/commands/module.py:364
-+#: dnf/cli/commands/module.py:386
- msgid "Module specification"
- msgstr "Caractéristique de module"
- 
--#: dnf/cli/commands/module.py:386
-+#: dnf/cli/commands/module.py:408
- msgid "{} {} {}: too few arguments"
- msgstr "{} {} {} : trop peu de paramètres"
- 
-@@ -2133,22 +2125,22 @@ msgstr "MOTCLEF"
- msgid "Keyword to search for"
- msgstr "Mot-clef à chercher"
- 
--#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
-+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460
- msgctxt "long"
- msgid "Name"
- msgstr "Nom"
- 
--#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
-+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513
- msgctxt "long"
- msgid "Summary"
- msgstr "Résumé"
- 
--#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
-+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523
- msgctxt "long"
- msgid "Description"
- msgstr "Description"
- 
--#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
-+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516
- msgid "URL"
- msgstr "URL"
- 
-@@ -2291,16 +2283,16 @@ msgstr ""
- "run                      résoud et exécute l’ensemble de transactions\n"
- "exit (ou quit)           quitte l’interpréteur de commandes"
- 
--#: dnf/cli/commands/shell.py:259
-+#: dnf/cli/commands/shell.py:262
- #, python-format
- msgid "Error: Cannot open %s for reading"
- msgstr "Erreur : %s n’a pu être ouvert pour lecture"
- 
--#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187
-+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187
- msgid "Complete!"
- msgstr "Terminé !"
- 
--#: dnf/cli/commands/shell.py:291
-+#: dnf/cli/commands/shell.py:294
- msgid "Leaving Shell"
- msgstr "Abandon de l’interpréteur de commandes"
- 
-@@ -2497,8 +2489,8 @@ msgstr "Criticité"
- msgid "Files"
- msgstr "Fichiers"
- 
--#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
--#: dnf/cli/output.py:1772 dnf/cli/output.py:1774
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652
-+#: dnf/cli/output.py:1654 dnf/util.py:591
- msgid "Installed"
- msgstr "Installé"
- 
-@@ -2862,13 +2854,13 @@ msgstr "Impossible d’encoder l’argument « %s » : %s"
- #. Translators: This is abbreviated 'Name'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:505
-+#: dnf/cli/output.py:459
- msgctxt "short"
- msgid "Name"
- msgstr "Nom"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:511
-+#: dnf/cli/output.py:465
- msgid "Epoch"
- msgstr "Époque"
- 
-@@ -2876,38 +2868,38 @@ msgstr "Époque"
- #. use the full (unabbreviated) term 'Version' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:512 dnf/cli/output.py:1335
-+#: dnf/cli/output.py:466 dnf/cli/output.py:1248
- msgctxt "short"
- msgid "Version"
- msgstr "Version"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1337
-+#: dnf/cli/output.py:467 dnf/cli/output.py:1250
- msgctxt "long"
- msgid "Version"
- msgstr "Version"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:516
-+#: dnf/cli/output.py:470
- msgid "Release"
- msgstr "Publication"
- 
- #. Translators: This is abbreviated 'Architecture', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:517 dnf/cli/output.py:1326
-+#: dnf/cli/output.py:471 dnf/cli/output.py:1239
- msgctxt "short"
- msgid "Arch"
- msgstr "Architecture"
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:472 dnf/cli/output.py:1242
- msgctxt "long"
- msgid "Architecture"
- msgstr "Architecture"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1352
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1265
- msgctxt "long"
- msgid "Size"
- msgstr "Taille"
-@@ -2916,32 +2908,32 @@ msgstr "Taille"
- #. not be longer than 5 characters. If the term 'Size' in your
- #. language is not longer than 5 characters then you can use it
- #. unabbreviated.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1350
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1263
- msgctxt "short"
- msgid "Size"
- msgstr "Taille"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:524
-+#: dnf/cli/output.py:478
- msgid "Source"
- msgstr "Source"
- 
- #. Translators: This is abbreviated 'Repository', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:525 dnf/cli/output.py:1341
-+#: dnf/cli/output.py:479 dnf/cli/output.py:1254
- msgctxt "short"
- msgid "Repo"
- msgstr "Dépôt"
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:480 dnf/cli/output.py:1257
- msgctxt "long"
- msgid "Repository"
- msgstr "Dépôt"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:533
-+#: dnf/cli/output.py:487
- msgid "From repo"
- msgstr "Depuis le dépôt"
- 
-@@ -2949,316 +2941,312 @@ msgstr "Depuis le dépôt"
- #. print(_("Committer   : %s") % ucd(pkg.committer))
- #. print(_("Committime  : %s") % time.ctime(pkg.committime))
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:539
-+#: dnf/cli/output.py:493
- msgid "Packager"
- msgstr "Empaqueteur"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:541
-+#: dnf/cli/output.py:495
- msgid "Buildtime"
- msgstr "Date de compilation"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:545
-+#: dnf/cli/output.py:499
- msgid "Install time"
- msgstr "Date d’installation"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:554
-+#: dnf/cli/output.py:508
- msgid "Installed by"
- msgstr "Installé par"
- 
- #. Translators: This is abbreviated 'Summary'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:558
-+#: dnf/cli/output.py:512
- msgctxt "short"
- msgid "Summary"
- msgstr "Résumé"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:564
-+#: dnf/cli/output.py:518
- msgid "License"
- msgstr "Licence"
- 
- #. Translators: This is abbreviated 'Description'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:568
-+#: dnf/cli/output.py:522
- msgctxt "short"
- msgid "Description"
- msgstr "Description"
- 
--#: dnf/cli/output.py:695
--msgid "No packages to list"
--msgstr "Aucun paquet à lister"
--
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "y"
- msgstr "o"
- 
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "yes"
- msgstr "oui"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "n"
- msgstr "n"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "no"
- msgstr "non"
- 
--#: dnf/cli/output.py:711
-+#: dnf/cli/output.py:655
- msgid "Is this ok [y/N]: "
- msgstr "Voulez-vous continuer ? [o/N] : "
- 
--#: dnf/cli/output.py:715
-+#: dnf/cli/output.py:659
- msgid "Is this ok [Y/n]: "
- msgstr "Voulez-vous continuer ? [O/n] : "
- 
--#: dnf/cli/output.py:795
-+#: dnf/cli/output.py:739
- #, python-format
- msgid "Group: %s"
- msgstr "Groupe : %s"
- 
--#: dnf/cli/output.py:799
-+#: dnf/cli/output.py:743
- #, python-format
- msgid " Group-Id: %s"
- msgstr " Identifiant du groupe : %s"
- 
--#: dnf/cli/output.py:801 dnf/cli/output.py:840
-+#: dnf/cli/output.py:745 dnf/cli/output.py:784
- #, python-format
- msgid " Description: %s"
- msgstr " Description : %s"
- 
--#: dnf/cli/output.py:803
-+#: dnf/cli/output.py:747
- #, python-format
- msgid " Language: %s"
- msgstr " Langue : %s"
- 
--#: dnf/cli/output.py:806
-+#: dnf/cli/output.py:750
- msgid " Mandatory Packages:"
- msgstr " Paquets obligatoires :"
- 
--#: dnf/cli/output.py:807
-+#: dnf/cli/output.py:751
- msgid " Default Packages:"
- msgstr " Paquets par défaut :"
- 
--#: dnf/cli/output.py:808
-+#: dnf/cli/output.py:752
- msgid " Optional Packages:"
- msgstr " Paquets optionnels :"
- 
--#: dnf/cli/output.py:809
-+#: dnf/cli/output.py:753
- msgid " Conditional Packages:"
- msgstr " Paquets conditionnels :"
- 
--#: dnf/cli/output.py:834
-+#: dnf/cli/output.py:778
- #, python-format
- msgid "Environment Group: %s"
- msgstr "Groupe d’environnement : %s"
- 
--#: dnf/cli/output.py:837
-+#: dnf/cli/output.py:781
- #, python-format
- msgid " Environment-Id: %s"
- msgstr " Identifiant d’environnement : %s"
- 
--#: dnf/cli/output.py:843
-+#: dnf/cli/output.py:787
- msgid " Mandatory Groups:"
- msgstr " Groupes obligatoires :"
- 
--#: dnf/cli/output.py:844
-+#: dnf/cli/output.py:788
- msgid " Optional Groups:"
- msgstr " Groupes optionnels :"
- 
--#: dnf/cli/output.py:865
-+#: dnf/cli/output.py:809
- msgid "Matched from:"
- msgstr "Correspondances trouvées dans  :"
- 
--#: dnf/cli/output.py:879
-+#: dnf/cli/output.py:823
- #, python-format
- msgid "Filename    : %s"
- msgstr "Nom de fichier : %s"
- 
--#: dnf/cli/output.py:904
-+#: dnf/cli/output.py:848
- #, python-format
- msgid "Repo        : %s"
- msgstr "Dépôt               : %s"
- 
--#: dnf/cli/output.py:913
-+#: dnf/cli/output.py:857
- msgid "Description : "
- msgstr "Description  : "
- 
--#: dnf/cli/output.py:917
-+#: dnf/cli/output.py:861
- #, python-format
- msgid "URL         : %s"
- msgstr "URL                 : %s"
- 
--#: dnf/cli/output.py:921
-+#: dnf/cli/output.py:865
- #, python-format
- msgid "License     : %s"
- msgstr "Licence        : %s"
- 
--#: dnf/cli/output.py:927
-+#: dnf/cli/output.py:871
- #, python-format
- msgid "Provide    : %s"
- msgstr "Provide    : %s"
- 
--#: dnf/cli/output.py:947
-+#: dnf/cli/output.py:891
- #, python-format
- msgid "Other       : %s"
- msgstr "Autre  : %s"
- 
--#: dnf/cli/output.py:996
-+#: dnf/cli/output.py:940
- msgid "There was an error calculating total download size"
- msgstr ""
- "Une erreur est survenue pendant le calcul de la taille totale des "
- "téléchargements"
- 
--#: dnf/cli/output.py:1002
-+#: dnf/cli/output.py:946
- #, python-format
- msgid "Total size: %s"
- msgstr "Taille totale  : %s"
- 
--#: dnf/cli/output.py:1005
-+#: dnf/cli/output.py:949
- #, python-format
- msgid "Total download size: %s"
- msgstr "Taille totale des téléchargements : %s"
- 
--#: dnf/cli/output.py:1008
-+#: dnf/cli/output.py:952
- #, python-format
- msgid "Installed size: %s"
- msgstr "Taille des paquets installés : %s"
- 
--#: dnf/cli/output.py:1026
-+#: dnf/cli/output.py:970
- msgid "There was an error calculating installed size"
- msgstr ""
- "Une erreur est survenue pendant le calcul de la taille des paquets "
- "installées"
- 
--#: dnf/cli/output.py:1030
-+#: dnf/cli/output.py:974
- #, python-format
- msgid "Freed space: %s"
- msgstr "Espace libéré : %s"
- 
--#: dnf/cli/output.py:1039
-+#: dnf/cli/output.py:983
- msgid "Marking packages as installed by the group:"
- msgstr "Marquage des paquets installés par le groupe :"
- 
--#: dnf/cli/output.py:1046
-+#: dnf/cli/output.py:990
- msgid "Marking packages as removed by the group:"
- msgstr "Marquage des paquets supprimés par le groupe :"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Group"
- msgstr "Groupe"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Packages"
- msgstr "Paquets"
- 
--#: dnf/cli/output.py:1133
-+#: dnf/cli/output.py:1046
- msgid "Installing group/module packages"
- msgstr "Installation des paquets du groupe/module"
- 
--#: dnf/cli/output.py:1134
-+#: dnf/cli/output.py:1047
- msgid "Installing group packages"
- msgstr "Installation du groupe de paquets"
- 
- #. TRANSLATORS: This is for a list of packages to be installed.
--#: dnf/cli/output.py:1138
-+#: dnf/cli/output.py:1051
- msgctxt "summary"
- msgid "Installing"
- msgstr "Installation"
- 
- #. TRANSLATORS: This is for a list of packages to be upgraded.
--#: dnf/cli/output.py:1140
-+#: dnf/cli/output.py:1053
- msgctxt "summary"
- msgid "Upgrading"
- msgstr "Mise à jour"
- 
- #. TRANSLATORS: This is for a list of packages to be reinstalled.
--#: dnf/cli/output.py:1142
-+#: dnf/cli/output.py:1055
- msgctxt "summary"
- msgid "Reinstalling"
- msgstr "Réinstallation"
- 
--#: dnf/cli/output.py:1144
-+#: dnf/cli/output.py:1057
- msgid "Installing dependencies"
- msgstr "Installation des dépendances"
- 
--#: dnf/cli/output.py:1145
-+#: dnf/cli/output.py:1058
- msgid "Installing weak dependencies"
- msgstr "Installation des dépendances faibles"
- 
- #. TRANSLATORS: This is for a list of packages to be removed.
--#: dnf/cli/output.py:1147
-+#: dnf/cli/output.py:1060
- msgid "Removing"
- msgstr "Suppression"
- 
--#: dnf/cli/output.py:1148
-+#: dnf/cli/output.py:1061
- msgid "Removing dependent packages"
- msgstr "Supprimer des paquets dépendants"
- 
--#: dnf/cli/output.py:1149
-+#: dnf/cli/output.py:1062
- msgid "Removing unused dependencies"
- msgstr "Suppression des dépendances inutilisées"
- 
- #. TRANSLATORS: This is for a list of packages to be downgraded.
--#: dnf/cli/output.py:1151
-+#: dnf/cli/output.py:1064
- msgctxt "summary"
- msgid "Downgrading"
- msgstr "Rétrogradation"
- 
--#: dnf/cli/output.py:1176
-+#: dnf/cli/output.py:1089
- msgid "Installing module profiles"
- msgstr "Installation des profils de module"
- 
--#: dnf/cli/output.py:1185
-+#: dnf/cli/output.py:1098
- msgid "Disabling module profiles"
- msgstr "Désactivation des profils de module"
- 
--#: dnf/cli/output.py:1194
-+#: dnf/cli/output.py:1107
- msgid "Enabling module streams"
- msgstr "Activation des flux de modules"
- 
--#: dnf/cli/output.py:1202
-+#: dnf/cli/output.py:1115
- msgid "Switching module streams"
- msgstr "Basculement des flux de modules"
- 
--#: dnf/cli/output.py:1210
-+#: dnf/cli/output.py:1123
- msgid "Disabling modules"
- msgstr "Désactivation des modules"
- 
--#: dnf/cli/output.py:1218
-+#: dnf/cli/output.py:1131
- msgid "Resetting modules"
- msgstr "Réinitialisation des modules"
- 
--#: dnf/cli/output.py:1230
-+#: dnf/cli/output.py:1143
- msgid "Installing Environment Groups"
- msgstr "Installation des groupes d’environnement"
- 
--#: dnf/cli/output.py:1237
-+#: dnf/cli/output.py:1150
- msgid "Upgrading Environment Groups"
- msgstr "Mise à niveau des groupes d’environnement"
- 
--#: dnf/cli/output.py:1244
-+#: dnf/cli/output.py:1157
- msgid "Removing Environment Groups"
- msgstr "Suppression des groupes d’environnement"
- 
--#: dnf/cli/output.py:1251
-+#: dnf/cli/output.py:1164
- msgid "Installing Groups"
- msgstr "Installation des groupes"
- 
--#: dnf/cli/output.py:1258
-+#: dnf/cli/output.py:1171
- msgid "Upgrading Groups"
- msgstr "Mise à niveau des groupes"
- 
--#: dnf/cli/output.py:1265
-+#: dnf/cli/output.py:1178
- msgid "Removing Groups"
- msgstr "Suppression des groupes"
- 
--#: dnf/cli/output.py:1281
-+#: dnf/cli/output.py:1194
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
-@@ -3267,12 +3255,12 @@ msgstr ""
- "Ignorer les paquets en conflit :\n"
- "(ajouter « %s » à la ligne de commande pour forcer leur mise à niveau)"
- 
--#: dnf/cli/output.py:1291
-+#: dnf/cli/output.py:1204
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr "Ignorer les paquets ayant des dépendances cassées %s"
- 
--#: dnf/cli/output.py:1295
-+#: dnf/cli/output.py:1208
- msgid " or part of a group"
- msgstr " ou qui fait parti d’un groupe"
- 
-@@ -3280,22 +3268,22 @@ msgstr " ou qui fait parti d’un groupe"
- #. use the full (unabbreviated) term 'Package' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:1320
-+#: dnf/cli/output.py:1233
- msgctxt "short"
- msgid "Package"
- msgstr "Paquet"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
--#: dnf/cli/output.py:1322
-+#: dnf/cli/output.py:1235
- msgctxt "long"
- msgid "Package"
- msgstr "Paquet"
- 
--#: dnf/cli/output.py:1371
-+#: dnf/cli/output.py:1284
- msgid "replacing"
- msgstr "remplacement"
- 
--#: dnf/cli/output.py:1378
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid ""
- "\n"
-@@ -3307,289 +3295,273 @@ msgstr ""
- "%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933
-+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813
- msgid "Install"
- msgstr "Installer"
- 
--#: dnf/cli/output.py:1387 dnf/cli/output.py:1941
-+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821
- msgid "Upgrade"
- msgstr "Mettre à niveau"
- 
--#: dnf/cli/output.py:1388
-+#: dnf/cli/output.py:1301
- msgid "Remove"
- msgstr "Supprimer"
- 
--#: dnf/cli/output.py:1390 dnf/cli/output.py:1939
-+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819
- msgid "Downgrade"
- msgstr "Retrograder"
- 
--#: dnf/cli/output.py:1391
-+#: dnf/cli/output.py:1304
- msgid "Skip"
- msgstr "Ignorer"
- 
--#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
-+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] "Paquet"
- msgstr[1] "Paquets"
- 
--#: dnf/cli/output.py:1418
-+#: dnf/cli/output.py:1331
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "Paquet dépendant"
- msgstr[1] "Paquets dépendants"
- 
--#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942
--msgid "Upgraded"
--msgstr "Mis à niveau"
--
--#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940
--msgid "Downgraded"
--msgstr "Rétrogradé"
--
--#: dnf/cli/output.py:1503
--msgid "Reinstalled"
--msgstr "Réinstallé"
--
--#: dnf/cli/output.py:1504
--msgid "Skipped"
--msgstr "Ignoré"
--
--#: dnf/cli/output.py:1505
--msgid "Removed"
--msgstr "Supprimé"
--
--#: dnf/cli/output.py:1508
--msgid "Failed"
--msgstr "Échec"
--
--#: dnf/cli/output.py:1559
-+#: dnf/cli/output.py:1439
- msgid "Total"
- msgstr "Total"
- 
--#: dnf/cli/output.py:1587
-+#: dnf/cli/output.py:1467
- msgid "<unset>"
- msgstr "<unset>"
- 
--#: dnf/cli/output.py:1588
-+#: dnf/cli/output.py:1468
- msgid "System"
- msgstr "Système"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1518
- msgid "Command line"
- msgstr "Ligne de commande"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1649
-+#: dnf/cli/output.py:1529
- msgid "User name"
- msgstr "Nom d’utilisateur"
- 
--#: dnf/cli/output.py:1651
-+#: dnf/cli/output.py:1531
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1653
-+#: dnf/cli/output.py:1533
- msgid "Date and time"
- msgstr "Date et heure"
- 
--#: dnf/cli/output.py:1654
-+#: dnf/cli/output.py:1534
- msgid "Action(s)"
- msgstr "Action(s)"
- 
--#: dnf/cli/output.py:1655
-+#: dnf/cli/output.py:1535
- msgid "Altered"
- msgstr "Modifié"
- 
--#: dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1578
- msgid "No transactions"
- msgstr "Pas de transaction"
- 
--#: dnf/cli/output.py:1699 dnf/cli/output.py:1715
-+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595
- msgid "Failed history info"
- msgstr "Infos sur l’historique des échecs"
- 
--#: dnf/cli/output.py:1714
-+#: dnf/cli/output.py:1594
- msgid "No transaction ID, or package, given"
- msgstr "Pas de paquet ou d’identifiant de transaction fourni"
- 
--#: dnf/cli/output.py:1772
-+#: dnf/cli/output.py:1652
- msgid "Erased"
- msgstr "Effacé"
- 
--#: dnf/cli/output.py:1774
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590
-+msgid "Downgraded"
-+msgstr "Rétrogradé"
-+
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589
-+msgid "Upgraded"
-+msgstr "Mis à niveau"
-+
-+#: dnf/cli/output.py:1654
- msgid "Not installed"
- msgstr "Non installé"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Newer"
- msgstr "Plus récent"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Older"
- msgstr "Plus ancien"
- 
--#: dnf/cli/output.py:1823 dnf/cli/output.py:1825
-+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705
- msgid "Transaction ID :"
- msgstr "Identifiant de transaction :"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1708
- msgid "Begin time     :"
- msgstr "Temps de début    :"
- 
--#: dnf/cli/output.py:1831 dnf/cli/output.py:1833
-+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713
- msgid "Begin rpmdb    :"
- msgstr "Début de RPMDB    :"
- 
--#: dnf/cli/output.py:1839
-+#: dnf/cli/output.py:1719
- #, python-format
- msgid "(%u seconds)"
- msgstr "(%u secondes)"
- 
--#: dnf/cli/output.py:1841
-+#: dnf/cli/output.py:1721
- #, python-format
- msgid "(%u minutes)"
- msgstr "(%u minutes)"
- 
--#: dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1723
- #, python-format
- msgid "(%u hours)"
- msgstr "(%u heures)"
- 
--#: dnf/cli/output.py:1845
-+#: dnf/cli/output.py:1725
- #, python-format
- msgid "(%u days)"
- msgstr "(%u jours)"
- 
--#: dnf/cli/output.py:1846
-+#: dnf/cli/output.py:1726
- msgid "End time       :"
- msgstr "Temps de fin :"
- 
--#: dnf/cli/output.py:1849 dnf/cli/output.py:1851
-+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731
- msgid "End rpmdb      :"
- msgstr "Fin de RPMDB :"
- 
--#: dnf/cli/output.py:1858 dnf/cli/output.py:1860
-+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740
- msgid "User           :"
- msgstr "Utilisateur  :"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1871
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751
- msgid "Aborted"
- msgstr "Avorté"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869
--#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749
-+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755
- msgid "Return-Code    :"
- msgstr "Code de retour  :"
- 
--#: dnf/cli/output.py:1867 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755
- msgid "Success"
- msgstr "Réussi"
- 
--#: dnf/cli/output.py:1869
-+#: dnf/cli/output.py:1749
- msgid "Failures:"
- msgstr "Échecs :"
- 
--#: dnf/cli/output.py:1873
-+#: dnf/cli/output.py:1753
- msgid "Failure:"
- msgstr "Échec :"
- 
--#: dnf/cli/output.py:1883 dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765
- msgid "Releasever     :"
- msgstr "Releasever     :"
- 
--#: dnf/cli/output.py:1890 dnf/cli/output.py:1892
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Command Line   :"
- msgstr "Ligne de commande :"
- 
--#: dnf/cli/output.py:1897 dnf/cli/output.py:1899
-+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779
- msgid "Comment        :"
- msgstr "Commentaire :"
- 
--#: dnf/cli/output.py:1903
-+#: dnf/cli/output.py:1783
- msgid "Transaction performed with:"
- msgstr "Transaction effectuée avec :"
- 
--#: dnf/cli/output.py:1912
-+#: dnf/cli/output.py:1792
- msgid "Packages Altered:"
- msgstr "Paquets modifiés :"
- 
--#: dnf/cli/output.py:1918
-+#: dnf/cli/output.py:1798
- msgid "Scriptlet output:"
- msgstr "Sortie du mini script :"
- 
--#: dnf/cli/output.py:1925
-+#: dnf/cli/output.py:1805
- msgid "Errors:"
- msgstr "Erreurs :"
- 
--#: dnf/cli/output.py:1934
-+#: dnf/cli/output.py:1814
- msgid "Dep-Install"
- msgstr "Installation des dépendances"
- 
--#: dnf/cli/output.py:1935
-+#: dnf/cli/output.py:1815
- msgid "Obsoleted"
- msgstr "Rendu obsolète"
- 
--#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "Rend obsolète"
- 
--#: dnf/cli/output.py:1937
-+#: dnf/cli/output.py:1817
- msgid "Erase"
- msgstr "Effacement"
- 
--#: dnf/cli/output.py:1938
-+#: dnf/cli/output.py:1818
- msgid "Reinstall"
- msgstr "Réinstallation"
- 
--#: dnf/cli/output.py:2016
-+#: dnf/cli/output.py:1892
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr "---> Le paquet %s.%s %s sera installé"
- 
--#: dnf/cli/output.py:2018
-+#: dnf/cli/output.py:1894
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
- msgstr "---> Le paquet %s.%s %s sera une mise à jour"
- 
--#: dnf/cli/output.py:2020
-+#: dnf/cli/output.py:1896
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr "---> Le paquet %s.%s %s sera supprimé"
- 
--#: dnf/cli/output.py:2022
-+#: dnf/cli/output.py:1898
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr "---> Le paquet %s.%s %s sera réinstallé"
- 
--#: dnf/cli/output.py:2024
-+#: dnf/cli/output.py:1900
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
- msgstr "---> Le paquet %s.%s %s sera une rétrogradation"
- 
--#: dnf/cli/output.py:2026
-+#: dnf/cli/output.py:1902
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr "---> Le paquet %s.%s %s sera rendu obsolète"
- 
--#: dnf/cli/output.py:2028
-+#: dnf/cli/output.py:1904
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr "---> Le paquet %s.%s %s sera mis à jour"
- 
--#: dnf/cli/output.py:2030
-+#: dnf/cli/output.py:1906
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr "---> Le paquet %s.%s %s sera rendu obsolète"
- 
--#: dnf/cli/output.py:2039
-+#: dnf/cli/output.py:1915
- msgid "--> Starting dependency resolution"
- msgstr "--> Début de la résolution des dépendances"
- 
--#: dnf/cli/output.py:2044
-+#: dnf/cli/output.py:1919
- msgid "--> Finished dependency resolution"
- msgstr "--> Résolution des dépendances terminée"
- 
--#: dnf/cli/output.py:2058 dnf/crypto.py:132
-+#: dnf/cli/output.py:1933 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3677,7 +3649,7 @@ msgstr "Module ou Groupe « %s » n’existe pas."
- msgid "Environment id '%s' does not exist."
- msgstr "L’id d’environnement « %s » n’existe pas."
- 
--#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453
-+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487
- #, python-format
- msgid "Environment id '%s' is not installed."
- msgstr "L’id d’environnement « %s » n’est pas installé."
-@@ -3791,6 +3763,11 @@ msgstr "dépôt %s : 0x%s déjà importé"
- msgid "repo %s: imported key 0x%s."
- msgstr "dépôt %s : clé importée 0x%s."
- 
-+#: dnf/crypto.py:177
-+#, python-format
-+msgid "retrieving repo key for %s unencrypted from %s"
-+msgstr "récupération de la clé de repo de %s non cryptée à partir %s"
-+
- #: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
-@@ -3878,7 +3855,7 @@ msgid_plural "Modular dependency problems with Defaults:"
- msgstr[0] "Problème de dépendance modulaire avec les valeurs par défaut :"
- msgstr[1] "Problèmes de dépendance modulaire avec les valeurs par défaut :"
- 
--#: dnf/exceptions.py:131 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:841
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] "Problème de dépendance modulaire :"
-@@ -3935,8 +3912,8 @@ msgstr ""
- "\n"
- "Aide : [d]éfaut, [e]activé, [x]désactivé, [i]nstallé, [a]ctivé"
- 
--#: dnf/module/module_base.py:54 dnf/module/module_base.py:421
--#: dnf/module/module_base.py:477 dnf/module/module_base.py:543
-+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547
-+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669
- msgid "Ignoring unnecessary profile: '{}/{}'"
- msgstr "Profil inutile ignoré : {}/{}"
- 
-@@ -3947,21 +3924,21 @@ msgstr ""
- "Toutes les correspondance pour le paramètre « {0} » dans le mode module « "
- "{1}:{2} » ne sont pas actives"
- 
--#: dnf/module/module_base.py:92
-+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr ""
- "L’installation du module « {0} » à partir du dépôt Fail-Safe {1} n’est pas "
- "permise"
- 
--#: dnf/module/module_base.py:102
-+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
- msgstr ""
- "Impossible de faire correspondre le profil pour l’argument {}. Profils "
- "disponibles pour « {}:{} » : {}"
- 
--#: dnf/module/module_base.py:106
-+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216
- msgid "Unable to match profile for argument {}"
- msgstr "Impossible de faire correspondre le profil pour l’argument {}"
- 
-@@ -3978,39 +3955,53 @@ msgstr "Aucun profil pour le module {} : {}"
- msgid "Default profile {} not available in module {}:{}"
- msgstr "Le profil par défaut {} n’est pas disponible dans le module {} : {}"
- 
--#: dnf/module/module_base.py:142
-+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245
- msgid "Installing module from Fail-Safe repository is not allowed"
- msgstr ""
- "L’installation du module à partir du dépôt Fail-Safe n’est pas permise"
- 
--#: dnf/module/module_base.py:159 dnf/module/module_base.py:193
--#: dnf/module/module_base.py:337 dnf/module/module_base.py:355
--#: dnf/module/module_base.py:363 dnf/module/module_base.py:417
--#: dnf/module/module_base.py:473 dnf/module/module_base.py:539
-+#: dnf/module/module_base.py:194
-+#, python-brace-format
-+msgid "No active matches for argument '{0}' in module '{1}:{2}'"
-+msgstr ""
-+"Aucune correspondance active pour l'argument '{0}' dans le module '{1}:{2}'"
-+
-+#: dnf/module/module_base.py:226
-+#, python-brace-format
-+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'"
-+msgstr ""
-+"Le profil installé '{0}' n'est pas disponible dans le module '{1}' stream "
-+"'{2}'"
-+
-+#: dnf/module/module_base.py:265
-+msgid "No packages available to distrosync for package name '{}'"
-+msgstr ""
-+"Aucun paquet disponible pour la distribution pour le nom de paquet '{}'"
-+
-+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452
-+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496
-+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599
-+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827
- msgid "Unable to resolve argument {}"
- msgstr "Impossible de résoudre le paramètre {}"
- 
--#: dnf/module/module_base.py:160
--msgid "No match for package {}"
--msgstr "Aucune correspondance pour le paquet {}"
--
--#: dnf/module/module_base.py:204
-+#: dnf/module/module_base.py:319
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr ""
- "La mise à niveau du module « {0} » à partir du dépôt Fail-Safe {1} n’est pas"
- " permise"
- 
--#: dnf/module/module_base.py:223 dnf/module/module_base.py:251
-+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366
- msgid "Unable to match profile in argument {}"
- msgstr "Impossible de faire correspondre le profil dans l’argument {}"
- 
--#: dnf/module/module_base.py:231
-+#: dnf/module/module_base.py:346
- msgid "Upgrading module from Fail-Safe repository is not allowed"
- msgstr ""
- "La mise à niveau du module à partir du dépôt Fail-Safe n’est pas permise"
- 
--#: dnf/module/module_base.py:367
-+#: dnf/module/module_base.py:500
- msgid ""
- "Only module name is required. Ignoring unneeded information in argument: "
- "'{}'"
-@@ -4018,7 +4009,11 @@ msgstr ""
- "Seul le nom du module est nécessaire. Les paramètres inutiles ont été "
- "ignorés : « {} »"
- 
--#: dnf/package.py:298
-+#: dnf/module/module_base.py:828
-+msgid "No match for package {}"
-+msgstr "Aucune correspondance pour le paquet {}"
-+
-+#: dnf/package.py:333
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s : %s vérification a échoué : %s vs %s"
-@@ -4032,12 +4027,12 @@ msgstr "%s est un fichier vide"
- #: dnf/persistor.py:91
- #, python-format
- msgid "Failed to load expired repos cache: %s"
--msgstr ""
-+msgstr "Echec du chargement du cache des repos expirés : %s"
- 
- #: dnf/persistor.py:99
- #, python-format
- msgid "Failed to store expired repos cache: %s"
--msgstr ""
-+msgstr "N'a pas réussi à stocker le cache des repos expirés : %s"
- 
- #: dnf/persistor.py:106
- msgid "Failed storing last makecache time."
-@@ -4102,6 +4097,14 @@ msgstr "Ajout du dépôt %s depuis le %s"
- msgid "Errors occurred during test transaction."
- msgstr "Des erreurs sont survenues lors de la transaction de test."
- 
-+#: dnf/sack.py:47
-+msgid ""
-+"allow_vendor_change is disabled. This option is currently not supported for "
-+"downgrade and distro-sync commands"
-+msgstr ""
-+"allow_vendor_change est désactivé. Cette option n'est actuellement pas prise"
-+" en charge pour les commandes de downgrade et de distro-sync"
-+
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
- msgctxt "currently"
-@@ -4148,27 +4151,31 @@ msgstr "Exécution du scriptlet"
- msgid "Preparing"
- msgstr "Préparation"
- 
--#: dnf/transaction_sr.py:60
-+#: dnf/transaction_sr.py:66
- #, python-brace-format
--msgid "Errors in \"{filename}\":"
--msgstr "Erreurs dans « {filename} » :"
-+msgid ""
-+"The following problems occurred while replaying the transaction from file "
-+"\"{filename}\":"
-+msgstr ""
-+"Les problèmes suivants sont survenus lors de la relecture de la transaction "
-+"à partir du fichier \"{filename}\" :"
- 
--#: dnf/transaction_sr.py:70
--#, python-brace-format
--msgid "Error in \"{filename}\": {error}"
--msgstr "Erreur dans « {filename} » : {error}"
-+#: dnf/transaction_sr.py:68
-+msgid "The following problems occurred while running a transaction:"
-+msgstr ""
-+"Les problèmes suivants sont survenus lors de l'exécution d'une transaction :"
- 
--#: dnf/transaction_sr.py:87
-+#: dnf/transaction_sr.py:89
- #, python-brace-format
- msgid "Invalid major version \"{major}\", number expected."
- msgstr "Version majeur invalide « {major} », numéro attendu."
- 
--#: dnf/transaction_sr.py:95
-+#: dnf/transaction_sr.py:97
- #, python-brace-format
- msgid "Invalid minor version \"{minor}\", number expected."
- msgstr "Version mineure invalide « {minor} », numéro attendu."
- 
--#: dnf/transaction_sr.py:101
-+#: dnf/transaction_sr.py:103
- #, python-brace-format
- msgid ""
- "Incompatible major version \"{major}\", supported major version is "
-@@ -4177,137 +4184,186 @@ msgstr ""
- "Version majeure incompatible « {major} », la version majeure prise en charge"
- " est « {major_supp} »."
- 
--#: dnf/transaction_sr.py:244
-+#: dnf/transaction_sr.py:224
-+msgid ""
-+"Conflicting TransactionReplay arguments have been specified: filename, data"
-+msgstr ""
-+"Des arguments contradictoires de TransactionReplay ont été spécifiés : nom "
-+"de fichier, données"
-+
-+#: dnf/transaction_sr.py:265
- #, python-brace-format
- msgid "Unexpected type of \"{id}\", {exp} expected."
- msgstr "Type de « {id} » inattendu, {exp} attendu."
- 
--#: dnf/transaction_sr.py:250
-+#: dnf/transaction_sr.py:271
- #, python-brace-format
- msgid "Missing key \"{key}\"."
- msgstr "Clé « {key} » manquante."
- 
--#: dnf/transaction_sr.py:263
-+#: dnf/transaction_sr.py:285
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an rpm."
- msgstr "Clé objet « {key} » manquante dans un rpm."
- 
--#: dnf/transaction_sr.py:267
-+#: dnf/transaction_sr.py:289
- #, python-brace-format
- msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"."
- msgstr ""
-+"Valeur inattendue de la raison du paquet \"{reason}\" pour rpm nevra "
-+"\"{nevra}\"."
- 
--#: dnf/transaction_sr.py:275
-+#: dnf/transaction_sr.py:297
- #, python-brace-format
- msgid "Cannot parse NEVRA for package \"{nevra}\"."
--msgstr ""
-+msgstr "Impossible d'analyser NEVRA pour le paquet \"{nevra}\"."
- 
--#: dnf/transaction_sr.py:286
-+#: dnf/transaction_sr.py:321
- #, python-brace-format
- msgid "Cannot find rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "Impossible de trouver rpm nevra \"{nevra}\"."
- 
--#: dnf/transaction_sr.py:301
--#, fuzzy, python-brace-format
--#| msgid "Package %s is already installed."
-+#: dnf/transaction_sr.py:336
-+#, python-brace-format
- msgid "Package \"{na}\" is already installed for action \"{action}\"."
--msgstr "Le paquet %s est déjà installé."
-+msgstr "Le paquet \"%s\" est déjà installé pour l'action \"{action}\"."
- 
--#: dnf/transaction_sr.py:311
-+#: dnf/transaction_sr.py:345
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\" not available in repositories for action "
- "\"{action}\"."
- msgstr ""
-+"Le paquet nevra \"{nevra}\" n'est pas disponible dans les dépôts pour action"
-+" \"{action}\"."
- 
--#: dnf/transaction_sr.py:322
-+#: dnf/transaction_sr.py:356
- #, python-brace-format
- msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"."
--msgstr ""
-+msgstr "Le paquet nevra \"{nevra}\" n'est pas installé pour l'action \"{action}\"."
- 
--#: dnf/transaction_sr.py:336
-+#: dnf/transaction_sr.py:370
- #, python-brace-format
- msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "Valeur inattendue de l'action paquet \"{action}\" pour rpm nevra \"{nevra}\"."
- 
--#: dnf/transaction_sr.py:343
--#, fuzzy, python-format
--#| msgid "Module or Group '%s' is not available."
-+#: dnf/transaction_sr.py:377
-+#, python-format
- msgid "Group id '%s' is not available."
--msgstr "Module ou Groupe « %s » non disponible."
-+msgstr "L'id du groupe '%s' n'est pas disponible."
- 
--#: dnf/transaction_sr.py:364
-+#: dnf/transaction_sr.py:398
- #, python-brace-format
- msgid "Missing object key \"{key}\" in groups.packages."
--msgstr ""
-+msgstr "Clé d'objet manquante \"{key}\" dans groups.packages."
- 
--#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387
--#, fuzzy, python-format
--#| msgid "Module or Group '%s' is not installed."
-+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421
-+#, python-format
- msgid "Group id '%s' is not installed."
--msgstr "Module ou Groupe « %s » non installé."
-+msgstr "L'id de groupe '%s' non installé."
- 
--#: dnf/transaction_sr.py:398
--#, fuzzy, python-format
--#| msgid "Environment '%s' is not available."
-+#: dnf/transaction_sr.py:432
-+#, python-format
- msgid "Environment id '%s' is not available."
--msgstr "L’environnement « %s » n’est pas disponible."
-+msgstr "L’id e l’environnement « %s » n’est pas disponible."
- 
--#: dnf/transaction_sr.py:422
-+#: dnf/transaction_sr.py:456
- #, python-brace-format
- msgid ""
- "Invalid value \"{group_type}\" of environments.groups.group_type, only "
- "\"mandatory\" or \"optional\" is supported."
- msgstr ""
-+"Valeur invalide \"{group_type}\" de environments.groups.group_type, seul \" "
-+"obligatoire \" ou \" optionnel \" est supporté."
- 
--#: dnf/transaction_sr.py:430
-+#: dnf/transaction_sr.py:464
- #, python-brace-format
- msgid "Missing object key \"{key}\" in environments.groups."
--msgstr ""
-+msgstr "Clé d'objet manquante \"{key}\" dans environments.groups."
- 
--#: dnf/transaction_sr.py:508
-+#: dnf/transaction_sr.py:542
- #, python-brace-format
- msgid "Unexpected value of group action \"{action}\" for group \"{group}\"."
- msgstr ""
-+"Valeur inattendue de l'action de groupe \"{action}\" pour le groupe "
-+"\"{group}\"."
- 
--#: dnf/transaction_sr.py:513
-+#: dnf/transaction_sr.py:547
- #, python-brace-format
- msgid "Missing object key \"{key}\" in a group."
--msgstr ""
-+msgstr "Clé d'objet manquant \"{key}\" dans un groupe."
- 
--#: dnf/transaction_sr.py:537
-+#: dnf/transaction_sr.py:571
- #, python-brace-format
- msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"."
- msgstr ""
-+"Valeur inattendue de l'action environnementale \"{action}\" pour "
-+"l'environnement \"{env}\"."
- 
--#: dnf/transaction_sr.py:542
-+#: dnf/transaction_sr.py:576
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an environment."
--msgstr ""
-+msgstr "Clé d'objet manquant \"{key}\" dans un environnement."
- 
--#: dnf/transaction_sr.py:581
-+#: dnf/transaction_sr.py:615
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\", which is not present in the transaction file, was"
- " pulled into the transaction."
- msgstr ""
-+"Le paquet nevra \"{nevra}\", qui n'est pas présent dans le fichier de "
-+"transaction, a été introduit dans la transaction."
- 
--#: dnf/util.py:391 dnf/util.py:393
-+#: dnf/util.py:393 dnf/util.py:395
- msgid "Problem"
- msgstr "Problème"
- 
--#: dnf/util.py:444
-+#: dnf/util.py:446
- msgid "TransactionItem not found for key: {}"
- msgstr "TransactionItem n’a pas été trouvé pour la clef : {}"
- 
--#: dnf/util.py:454
-+#: dnf/util.py:456
- msgid "TransactionSWDBItem not found for key: {}"
- msgstr "TransactionSWDBItem n’a pas été trouvé pour la clef : {}"
- 
--#: dnf/util.py:457
-+#: dnf/util.py:459
- msgid "Errors occurred during transaction."
- msgstr "Des erreurs sont survenues lors de la transaction."
- 
-+#: dnf/util.py:595
-+msgid "Reinstalled"
-+msgstr "Réinstallé"
-+
-+#: dnf/util.py:596
-+msgid "Skipped"
-+msgstr "Ignoré"
-+
-+#: dnf/util.py:597
-+msgid "Removed"
-+msgstr "Supprimé"
-+
-+#: dnf/util.py:600
-+msgid "Failed"
-+msgstr "Échec"
-+
-+#~ msgid "Action not handled: {}"
-+#~ msgstr "Action non gérée : {}"
-+
-+#~ msgid "no package matched"
-+#~ msgstr "aucun paquet correspondant"
-+
-+#~ msgid "Not found given transaction ID"
-+#~ msgstr "L’identifiant de transaction fourni est introuvable"
-+
-+#~ msgid "Undoing transaction {}, from {}"
-+#~ msgstr "Révocation de lla transaction {}, de {}"
-+
-+#~ msgid "Errors in \"{filename}\":"
-+#~ msgstr "Erreurs dans « {filename} » :"
-+
-+#~ msgid "Error in \"{filename}\": {error}"
-+#~ msgstr "Erreur dans « {filename} » : {error}"
-+
- #~ msgid "format for displaying found packages"
- #~ msgstr "format d’affichage des paquets trouvés"
- 
-diff --git a/po/ja.po b/po/ja.po
-index 6435271c..00529771 100644
---- a/po/ja.po
-+++ b/po/ja.po
-@@ -22,20 +22,21 @@
- # Julien Humbert <julroy67@gmail.com>, 2020.
- # Casey Jones <nahareport@yahoo.com>, 2020.
- # Hajime Taira <htaira@pantora.net>, 2020.
-+# Sundeep Anand <suanand@redhat.com>, 2021.
- msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-10-05 09:18-0400\n"
--"PO-Revision-Date: 2020-07-27 05:29+0000\n"
--"Last-Translator: Hajime Taira <htaira@pantora.net>\n"
--"Language-Team: Japanese <https://translate.fedoraproject.org/projects/dnf/dnf-master/ja/>\n"
-+"POT-Creation-Date: 2021-02-22 09:22+0100\n"
-+"PO-Revision-Date: 2021-03-08 10:29+0000\n"
-+"Last-Translator: Sundeep Anand <suanand@redhat.com>\n"
-+"Language-Team: Japanese <https://translate.fedoraproject.org/projects/dnf/dnf-rhel-8/ja/>\n"
- "Language: ja\n"
- "MIME-Version: 1.0\n"
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
- "Plural-Forms: nplurals=1; plural=0;\n"
--"X-Generator: Weblate 4.1.1\n"
-+"X-Generator: Weblate 4.5.1\n"
- 
- #: dnf/automatic/emitter.py:32
- #, python-format
-@@ -45,7 +46,7 @@ msgstr "'%s' に以下の更新が適用されました:"
- #: dnf/automatic/emitter.py:33
- #, python-format
- msgid "Updates completed at %s"
--msgstr "'%s' に更新が適用されました。"
-+msgstr "'%s' に更新が適用されました"
- 
- #: dnf/automatic/emitter.py:34
- #, python-format
-@@ -92,7 +93,7 @@ msgstr "不明な設定値: %s=%s in %s; %s"
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr "不明な設定オプション: %s = %s in %s"
- 
--#: dnf/automatic/main.py:237 dnf/cli/cli.py:299
-+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304
- msgid "GPG check FAILED"
- msgstr "GPG の確認に失敗しました"
- 
-@@ -105,9 +106,9 @@ msgid "Started dnf-automatic."
- msgstr "dnf-automatic を開始しました。"
- 
- #: dnf/automatic/main.py:308
--#, python-format
--msgid "Sleep for %s seconds"
--msgstr "%s 秒スリープします"
-+msgid "Sleep for {} second"
-+msgid_plural "Sleep for {} seconds"
-+msgstr[0] "{} 秒スリープします"
- 
- #: dnf/automatic/main.py:315
- msgid "System is off-line."
-@@ -119,7 +120,7 @@ msgstr "システムはオフラインです。"
- msgid "Error: %s"
- msgstr "エラー: %s"
- 
--#: dnf/base.py:146
-+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474
- msgid "loading repo '{}' failure: {}"
- msgstr "repo '{}' のロードに失敗しました: {}"
- 
-@@ -127,236 +128,236 @@ msgstr "repo '{}' のロードに失敗しました: {}"
- msgid "Loading repository '{}' has failed"
- msgstr "repository '{}' のロードに失敗しました"
- 
--#: dnf/base.py:320
-+#: dnf/base.py:322
- msgid "Metadata timer caching disabled when running on metered connection."
- msgstr "metered 接続で実行する際、メタデータタイマーキャッシュは無効化されました。"
- 
--#: dnf/base.py:325
-+#: dnf/base.py:327
- msgid "Metadata timer caching disabled when running on a battery."
- msgstr "バッテリーで実行する際、メタデータタイマーキャッシュは無効化されました。"
- 
--#: dnf/base.py:330
-+#: dnf/base.py:332
- msgid "Metadata timer caching disabled."
- msgstr "メタデータタイマーキャッシュは無効化されました。"
- 
--#: dnf/base.py:335
-+#: dnf/base.py:337
- msgid "Metadata cache refreshed recently."
- msgstr "メタデータキャッシュは最近、リフレッシュされました。"
- 
--#: dnf/base.py:341 dnf/cli/commands/__init__.py:91
-+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91
- msgid "There are no enabled repositories in \"{}\"."
- msgstr "\"{}\" には有効化されたリポジトリーがありません。"
- 
--#: dnf/base.py:348
-+#: dnf/base.py:350
- #, python-format
- msgid "%s: will never be expired and will not be refreshed."
- msgstr "%s: は期限切れになることはなく、リフレッシュされることもありません。"
- 
--#: dnf/base.py:350
-+#: dnf/base.py:352
- #, python-format
- msgid "%s: has expired and will be refreshed."
- msgstr "%s: は期限切れとなったのでリフレッシュされます。"
- 
- #. expires within the checking period:
--#: dnf/base.py:354
-+#: dnf/base.py:356
- #, python-format
- msgid "%s: metadata will expire after %d seconds and will be refreshed now"
- msgstr "%s: メタデータは %d 秒後に期限切れとなり、すぐにリフレッシュされます"
- 
--#: dnf/base.py:358
-+#: dnf/base.py:360
- #, python-format
- msgid "%s: will expire after %d seconds."
- msgstr "%s: は %d 秒後に期限切れとなります。"
- 
- #. performs the md sync
--#: dnf/base.py:364
-+#: dnf/base.py:366
- msgid "Metadata cache created."
- msgstr "メタデータキャッシュを作成しました。"
- 
--#: dnf/base.py:397
-+#: dnf/base.py:399 dnf/base.py:466
- #, python-format
- msgid "%s: using metadata from %s."
--msgstr "%s: は %s から取得したメタデータを使用中"
-+msgstr "%s: は %s から取得したメタデータを使用中。"
- 
--#: dnf/base.py:409
-+#: dnf/base.py:411 dnf/base.py:479
- #, python-format
- msgid "Ignoring repositories: %s"
- msgstr "リポジトリーを無視します: %s"
- 
--#: dnf/base.py:412
-+#: dnf/base.py:414
- #, python-format
- msgid "Last metadata expiration check: %s ago on %s."
- msgstr "メタデータの期限切れの最終確認: %s 時間前の %s に実施しました。"
- 
--#: dnf/base.py:443
-+#: dnf/base.py:507
- msgid ""
- "The downloaded packages were saved in cache until the next successful "
- "transaction."
- msgstr "ダウンロード済みのパッケージは、次の正常なトランザクションまでキャッシュに保存されました。"
- 
--#: dnf/base.py:445
-+#: dnf/base.py:509
- #, python-format
- msgid "You can remove cached packages by executing '%s'."
- msgstr "'%s' を実行することでキャッシュパッケージを削除できます。"
- 
--#: dnf/base.py:535
-+#: dnf/base.py:599
- #, python-format
- msgid "Invalid tsflag in config file: %s"
- msgstr "設定ファイルの tsflag が無効です: %s"
- 
--#: dnf/base.py:591
-+#: dnf/base.py:655
- #, python-format
- msgid "Failed to add groups file for repository: %s - %s"
- msgstr "リポジトリーのグループファイルを追加できませんでした: %s - %s"
- 
--#: dnf/base.py:823
-+#: dnf/base.py:887
- msgid "Running transaction check"
- msgstr "トランザクションの確認を実行中"
- 
--#: dnf/base.py:831
-+#: dnf/base.py:895
- msgid "Error: transaction check vs depsolve:"
- msgstr "エラー: トランザクションの確認 vs depsolve:"
- 
--#: dnf/base.py:837
-+#: dnf/base.py:901
- msgid "Transaction check succeeded."
- msgstr "トランザクションの確認に成功しました。"
- 
--#: dnf/base.py:840
-+#: dnf/base.py:904
- msgid "Running transaction test"
- msgstr "トランザクションのテストを実行中"
- 
--#: dnf/base.py:850 dnf/base.py:992
-+#: dnf/base.py:914 dnf/base.py:1065
- msgid "RPM: {}"
- msgstr "RPM: {}"
- 
--#: dnf/base.py:851
-+#: dnf/base.py:915
- msgid "Transaction test error:"
- msgstr "トランザクションテストエラー:"
- 
--#: dnf/base.py:862
-+#: dnf/base.py:926
- msgid "Transaction test succeeded."
- msgstr "トランザクションのテストに成功しました。"
- 
--#: dnf/base.py:883
-+#: dnf/base.py:947
- msgid "Running transaction"
- msgstr "トランザクションを実行中"
- 
--#: dnf/base.py:911
-+#: dnf/base.py:984
- msgid "Disk Requirements:"
--msgstr "ディスク要件"
-+msgstr "ディスク要件:"
- 
--#: dnf/base.py:914
-+#: dnf/base.py:987
- #, python-brace-format
- msgid "At least {0}MB more space needed on the {1} filesystem."
- msgid_plural "At least {0}MB more space needed on the {1} filesystem."
- msgstr[0] "{1} ファイルシステムに最低 {0}MB の追加スペースが必要です。"
- 
--#: dnf/base.py:921
-+#: dnf/base.py:994
- msgid "Error Summary"
- msgstr "エラーの概要"
- 
--#: dnf/base.py:947
-+#: dnf/base.py:1020
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
- msgstr "RPMDBは {prog} のサポート外に変更されました。"
- 
--#: dnf/base.py:993 dnf/base.py:1001
-+#: dnf/base.py:1066 dnf/base.py:1074
- msgid "Could not run transaction."
- msgstr "トランザクションを実行できませんでした。"
- 
--#: dnf/base.py:996
-+#: dnf/base.py:1069
- msgid "Transaction couldn't start:"
- msgstr "トランザクションを開始できませんでした:"
- 
--#: dnf/base.py:1010
-+#: dnf/base.py:1083
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "トランザクションファイル %s の削除に失敗しました"
- 
--#: dnf/base.py:1092
-+#: dnf/base.py:1165
- msgid "Some packages were not downloaded. Retrying."
- msgstr "一部のパッケージはダウンロードされませんでした。再試行中です。"
- 
--#: dnf/base.py:1122
-+#: dnf/base.py:1195
- #, python-format
- msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)"
- msgstr "Delta RPM により %.1f MB の更新を %.1f MB に削減できました。(%d.1%% がキャッシュされていました)"
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1198
- #, python-format
- msgid ""
- "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)"
- msgstr "非効率な Delta RPM により %.1f MB の更新が増加し、%.1f MB となりました。(%d.1%% が無駄になりました)"
- 
--#: dnf/base.py:1167
-+#: dnf/base.py:1240
- msgid "Cannot add local packages, because transaction job already exists"
- msgstr "ローカルパッケージを追加できません、トランザクションジョブがすでに存在するためです"
- 
--#: dnf/base.py:1181
-+#: dnf/base.py:1254
- msgid "Could not open: {}"
- msgstr "開くことができませんでした: {}"
- 
--#: dnf/base.py:1219
-+#: dnf/base.py:1292
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr "%s の公開鍵がインストールされていません"
- 
--#: dnf/base.py:1223
-+#: dnf/base.py:1296
- #, python-format
- msgid "Problem opening package %s"
- msgstr "パッケージ %s を開くことができません"
- 
--#: dnf/base.py:1231
-+#: dnf/base.py:1304
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr "%s の公開鍵は信頼されていません"
- 
--#: dnf/base.py:1235
-+#: dnf/base.py:1308
- #, python-format
- msgid "Package %s is not signed"
- msgstr "パッケージ %s は署名されていません"
- 
--#: dnf/base.py:1265
-+#: dnf/base.py:1338
- #, python-format
- msgid "Cannot remove %s"
- msgstr "%s を削除できません"
- 
--#: dnf/base.py:1269
-+#: dnf/base.py:1342
- #, python-format
- msgid "%s removed"
- msgstr "%s を削除しました"
- 
--#: dnf/base.py:1549
-+#: dnf/base.py:1622
- msgid "No match for group package \"{}\""
--msgstr "グループパッケージ  \"{}\" に一致するものはありません"
-+msgstr "グループパッケージ \"{}\" に一致するものはありません"
- 
--#: dnf/base.py:1635
-+#: dnf/base.py:1708
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "グループ '%s' からのパッケージを追加します: %s"
- 
--#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442
-+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442
- #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592
- #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80
- #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110
- msgid "Nothing to do."
- msgstr "行うべきことはありません。"
- 
--#: dnf/base.py:1676
-+#: dnf/base.py:1749
- msgid "No groups marked for removal."
- msgstr "削除対象のパッケージはありません。"
- 
--#: dnf/base.py:1710
-+#: dnf/base.py:1783
- msgid "No group marked for upgrade."
- msgstr "アップグレード対象のグループはありません。"
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1997
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
- msgstr "パッケージ %s はインストールされていないので、ダウングレードできません。"
- 
--#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980
--#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411
-+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052
-+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416
- #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482
- #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633
- #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147
-@@ -366,141 +367,127 @@ msgstr "パッケージ %s はインストールされていないので、ダ
- msgid "No match for argument: %s"
- msgstr "一致した引数がありません: %s"
- 
--#: dnf/base.py:1934
-+#: dnf/base.py:2006
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
- msgstr "下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。"
- 
--#: dnf/base.py:1957
-+#: dnf/base.py:2029
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
- msgstr "パッケージ %s はインストールされていないのでの、再インストールできません。"
- 
--#: dnf/base.py:1972
-+#: dnf/base.py:2044
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr "ファイル %s はソースパッケージで更新できません。無視します。"
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:2050
- #, python-format
- msgid "Package %s not installed, cannot update it."
- msgstr "パッケージ %s はインストールされていないので、更新できません。"
- 
--#: dnf/base.py:1987
-+#: dnf/base.py:2059
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
- msgstr "同じまたはさらに新しいバージョンの %s が既にインストールされています、アップデートできません。"
- 
--#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
- msgstr "パッケージ %s は利用可能ですが、インストールされていません。"
- 
--#: dnf/base.py:2032
-+#: dnf/base.py:2104
- #, python-format
- msgid "Package %s available, but installed for different architecture."
- msgstr "パッケージ %s は利用可能ですが、他のアーキテクチャー用にインストールされています。"
- 
--#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699
-+#: dnf/base.py:2129
- #, python-format
- msgid "No package %s installed."
- msgstr "パッケージ %s はインストールされていません。"
- 
--#: dnf/base.py:2075 dnf/cli/commands/install.py:136
-+#: dnf/base.py:2147 dnf/cli/commands/install.py:136
- #: dnf/cli/commands/remove.py:133
- #, python-format
- msgid "Not a valid form: %s"
- msgstr "有効な形式ではありません: %s"
- 
--#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681
--#: dnf/cli/commands/remove.py:163
-+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681
-+#: dnf/cli/commands/remove.py:162
- msgid "No packages marked for removal."
- msgstr "削除対象のパッケージはありません。"
- 
--#: dnf/base.py:2179 dnf/cli/cli.py:422
-+#: dnf/base.py:2250 dnf/cli/cli.py:427
- #, python-format
- msgid "Packages for argument %s available, but not installed."
--msgstr "引数  %s のパッケージは利用可能ですが、インストールされていません。"
-+msgstr "引数 %s のパッケージは利用可能ですが、インストールされていません。"
- 
--#: dnf/base.py:2184
-+#: dnf/base.py:2255
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
- msgstr "最下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。"
- 
--#: dnf/base.py:2242
--msgid "Action not handled: {}"
--msgstr "動作は対処されていません: {}"
--
--#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703
--#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169
--#, python-format
--msgid "No package %s available."
--msgstr "利用可能なパッケージ %s がありません。"
--
--#: dnf/base.py:2269
--msgid "no package matched"
--msgstr "一致したパッケージはありません。"
--
--#: dnf/base.py:2290
-+#: dnf/base.py:2302
- msgid "No security updates needed, but {} update available"
- msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
--#: dnf/base.py:2292
-+#: dnf/base.py:2304
- msgid "No security updates needed, but {} updates available"
- msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
--#: dnf/base.py:2296
-+#: dnf/base.py:2308
- msgid "No security updates needed for \"{}\", but {} update available"
- msgstr "\"{}\" のセキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
--#: dnf/base.py:2298
-+#: dnf/base.py:2310
- msgid "No security updates needed for \"{}\", but {} updates available"
- msgstr "\"{}\" のセキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
- #. raise an exception, because po.repoid is not in self.repos
--#: dnf/base.py:2319
-+#: dnf/base.py:2331
- #, python-format
- msgid "Unable to retrieve a key for a commandline package: %s"
--msgstr ""
-+msgstr "コマンドラインパッケージのキーを取得できません: %s"
- 
--#: dnf/base.py:2327
-+#: dnf/base.py:2339
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ". 失敗したパッケージは: %s"
- 
--#: dnf/base.py:2328
-+#: dnf/base.py:2340
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "GPG 鍵が設定されています: %s"
- 
--#: dnf/base.py:2340
-+#: dnf/base.py:2352
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
- msgstr "%s (0x%s) の GPG 鍵はインストール済みです"
- 
--#: dnf/base.py:2373
-+#: dnf/base.py:2385
- msgid "The key has been approved."
- msgstr "鍵が承認されました。"
- 
--#: dnf/base.py:2376
-+#: dnf/base.py:2388
- msgid "The key has been rejected."
- msgstr "鍵が拒否されました。"
- 
--#: dnf/base.py:2409
-+#: dnf/base.py:2421
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "鍵のインポートに失敗しました (コード: %d)"
- 
--#: dnf/base.py:2411
-+#: dnf/base.py:2423
- msgid "Key imported successfully"
- msgstr "鍵のインポートに成功しました"
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2427
- msgid "Didn't install any keys"
- msgstr "鍵を 1 つもインストールしませんでした"
- 
--#: dnf/base.py:2418
-+#: dnf/base.py:2430
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
-@@ -509,49 +496,49 @@ msgstr ""
- "\"%s\" リポジトリーに一覧表示されている GPG 鍵はインストール済みですが、このパッケージには適切ではありません。\n"
- "正しい鍵 URL がこのリポジトリー用に設定されているか確認してください。"
- 
--#: dnf/base.py:2429
-+#: dnf/base.py:2441
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr "鍵をインポートしても役に立ちませんでした。鍵が間違っていませんか?"
- 
--#: dnf/base.py:2482
-+#: dnf/base.py:2494
- msgid "  * Maybe you meant: {}"
- msgstr "  * おそらく: {}"
- 
--#: dnf/base.py:2514
-+#: dnf/base.py:2526
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr "ローカルリポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません"
- 
--#: dnf/base.py:2517
-+#: dnf/base.py:2529
- msgid "Some packages from local repository have incorrect checksum"
- msgstr "ローカルリポジトリーのいくつかのパッケージのチェックサムは正しくありません"
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2532
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "リポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません"
- 
--#: dnf/base.py:2523
-+#: dnf/base.py:2535
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
- msgstr "いくつかのパッケージには無効なキャッシュがありますが、\"--cacheonly\" オプションによりダウンロードできません"
- 
--#: dnf/base.py:2541 dnf/base.py:2561
-+#: dnf/base.py:2553 dnf/base.py:2573
- msgid "No match for argument"
- msgstr "一致した引数がありません"
- 
--#: dnf/base.py:2549 dnf/base.py:2569
-+#: dnf/base.py:2561 dnf/base.py:2581
- msgid "All matches were filtered out by exclude filtering for argument"
--msgstr "すべての検索結果は引数の除外フィルタリングに一致しません(filter out)"
-+msgstr "すべての検索結果は引数の除外フィルタリングに一致しません (filter out)"
- 
--#: dnf/base.py:2551
-+#: dnf/base.py:2563
- msgid "All matches were filtered out by modular filtering for argument"
--msgstr "すべての検出結果は引数のモジュラーフィルタリングに一致しません(filter out)"
-+msgstr "すべての検出結果は引数のモジュラーフィルタリングに一致しません (filter out)"
- 
--#: dnf/base.py:2567
-+#: dnf/base.py:2579
- msgid "All matches were installed from a different repository for argument"
- msgstr "すべての検索結果は引数に対し異なるレポジトリからインストールされたものです"
- 
--#: dnf/base.py:2583
-+#: dnf/base.py:2626
- #, python-format
- msgid "Package %s is already installed."
- msgstr "パッケージ %s は既にインストールされています。"
-@@ -571,8 +558,8 @@ msgstr "ファイル \"%s\" の解析に失敗しました: %s"
- msgid "Cannot read file \"%s\": %s"
- msgstr "ファイル \"%s\" を読み込めません: %s"
- 
--#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902
--#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108
-+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803
-+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108
- #, python-format
- msgid "Config error: %s"
- msgstr "設定エラー: %s"
-@@ -603,7 +590,7 @@ msgid ""
- "stream '{2}'"
- msgstr "オペレーションは、モジュール '{0}' ストリーム '{1}' を ストリーム '{2}' へと切り替える結果となります"
- 
--#: dnf/cli/cli.py:172
-+#: dnf/cli/cli.py:173
- #, python-brace-format
- msgid ""
- "It is not possible to switch enabled streams of a module.\n"
-@@ -612,35 +599,35 @@ msgstr ""
- "モジュールの有効なストリームを切り替えることはできません。\n"
- "モジュールからインストールされた全てのコンテンツを削除し、 '{prog} module reset <module_name>' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。"
- 
--#: dnf/cli/cli.py:210
-+#: dnf/cli/cli.py:211
- #, python-brace-format
- msgid "{prog} will only download packages for the transaction."
- msgstr "{prog} はトランザクションでパッケージのダウンロードのみ行います。"
- 
--#: dnf/cli/cli.py:213
-+#: dnf/cli/cli.py:214
- #, python-brace-format
- msgid ""
- "{prog} will only download packages, install gpg keys, and check the "
- "transaction."
- msgstr "{prog} はパッケージのダウンロード、gpgキーのインストール、トランザクションのチェックのみ行います。"
- 
--#: dnf/cli/cli.py:217
-+#: dnf/cli/cli.py:218
- msgid "Operation aborted."
- msgstr "操作が中断されました。"
- 
--#: dnf/cli/cli.py:224
-+#: dnf/cli/cli.py:225
- msgid "Downloading Packages:"
- msgstr "パッケージのダウンロード:"
- 
--#: dnf/cli/cli.py:230
-+#: dnf/cli/cli.py:231
- msgid "Error downloading packages:"
- msgstr "パッケージのダウンロード中にエラーが発生しました:"
- 
--#: dnf/cli/cli.py:258
-+#: dnf/cli/cli.py:263
- msgid "Transaction failed"
- msgstr "トランザクションが失敗しました"
- 
--#: dnf/cli/cli.py:281
-+#: dnf/cli/cli.py:286
- msgid ""
- "Refusing to automatically import keys when running unattended.\n"
- "Use \"-y\" to override."
-@@ -648,116 +635,95 @@ msgstr ""
- "無人での実行中に鍵の自動インポートを拒否します。\n"
- "オーバーライドするには \"-y\" を使用してください。"
- 
--#: dnf/cli/cli.py:331
-+#: dnf/cli/cli.py:336
- msgid "Changelogs for {}"
- msgstr "{} の Changelogs"
- 
--#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511
-+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516
- msgid "Obsoleting Packages"
- msgstr "パッケージの廃止"
- 
--#: dnf/cli/cli.py:393
-+#: dnf/cli/cli.py:398
- msgid "No packages marked for distribution synchronization."
--msgstr "ディストリビューション同期対象のパッケージがありません"
-+msgstr "ディストリビューション同期対象のパッケージがありません。"
-+
-+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395
-+#, python-format
-+msgid "No package %s available."
-+msgstr "利用可能なパッケージ %s がありません。"
- 
--#: dnf/cli/cli.py:428
-+#: dnf/cli/cli.py:433
- msgid "No packages marked for downgrade."
- msgstr "ダウングレード対象のパッケージはありません。"
- 
--#: dnf/cli/cli.py:479
-+#: dnf/cli/cli.py:484
- msgid "Installed Packages"
- msgstr "インストール済みパッケージ"
- 
--#: dnf/cli/cli.py:487
-+#: dnf/cli/cli.py:492
- msgid "Available Packages"
- msgstr "利用可能なパッケージ"
- 
--#: dnf/cli/cli.py:491
-+#: dnf/cli/cli.py:496
- msgid "Autoremove Packages"
- msgstr "パッケージを自動削除します"
- 
--#: dnf/cli/cli.py:493
-+#: dnf/cli/cli.py:498
- msgid "Extra Packages"
- msgstr "エクストラパッケージ"
- 
--#: dnf/cli/cli.py:497
-+#: dnf/cli/cli.py:502
- msgid "Available Upgrades"
- msgstr "利用可能なアップグレード"
- 
--#: dnf/cli/cli.py:513
-+#: dnf/cli/cli.py:518
- msgid "Recently Added Packages"
- msgstr "最近追加したパッケージ"
- 
--#: dnf/cli/cli.py:518
-+#: dnf/cli/cli.py:522
- msgid "No matching Packages to list"
- msgstr "表示するための一致したパッケージはありません"
- 
--#: dnf/cli/cli.py:599
-+#: dnf/cli/cli.py:603
- msgid "No Matches found"
- msgstr "一致したものは見つかりませんでした"
- 
--#: dnf/cli/cli.py:609
--msgid "No transaction ID given"
--msgstr "トランザクション ID は指定されていません"
--
--#: dnf/cli/cli.py:614
--msgid "Not found given transaction ID"
--msgstr "指定されたトランザクション ID は見つかりません"
--
--#: dnf/cli/cli.py:623
--msgid "Found more than one transaction ID!"
--msgstr "1 つ以上のトランザクション ID が見つかりました!"
--
--#: dnf/cli/cli.py:640
--#, python-format
--msgid "Transaction history is incomplete, before %u."
--msgstr "%u の前のトランザクション履歴が不完全です。"
--
--#: dnf/cli/cli.py:642
--#, python-format
--msgid "Transaction history is incomplete, after %u."
--msgstr "%u の後のトランザクション履歴が不完全です。"
--
--#: dnf/cli/cli.py:689
--msgid "Undoing transaction {}, from {}"
--msgstr "トランザクション {} を {} から取り消しています"
--
--#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237
-+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237
- #, python-format
- msgid "Unknown repo: '%s'"
- msgstr "不明な repo : '%s'"
- 
--#: dnf/cli/cli.py:783
-+#: dnf/cli/cli.py:684
- #, python-format
- msgid "No repository match: %s"
- msgstr "一致するリポジトリーがありません: %s"
- 
--#: dnf/cli/cli.py:817
-+#: dnf/cli/cli.py:718
- msgid ""
- "This command has to be run with superuser privileges (under the root user on"
- " most systems)."
- msgstr "このコマンドはスーパーユーザー特権(大概のシステムではrootユーザー)で実行しなければいけません。"
- 
--#: dnf/cli/cli.py:847
-+#: dnf/cli/cli.py:748
- #, python-format
- msgid "No such command: %s. Please use %s --help"
--msgstr "そのようなコマンドはありません: %s. %s --help を使用してください。"
-+msgstr "そのようなコマンドはありません: %s. %s --help を使用してください"
- 
--#: dnf/cli/cli.py:850
-+#: dnf/cli/cli.py:751
- #, python-format, python-brace-format
- msgid ""
- "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-"
- "command(%s)'\""
- msgstr "{PROG} プラグインコマンドを実行できません、試してください: \"{prog} install 'dnf-command(%s)'\""
- 
--#: dnf/cli/cli.py:854
-+#: dnf/cli/cli.py:755
- #, python-brace-format
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
- "disabled."
- msgstr "{prog} プラグインコマンドを実行できません、プラグインのロードが現在無効になっているようです。"
- 
--#: dnf/cli/cli.py:912
-+#: dnf/cli/cli.py:813
- msgid ""
- "--destdir or --downloaddir must be used with --downloadonly or download or "
- "system-upgrade command."
-@@ -765,7 +731,7 @@ msgstr ""
- "--destdir または --downloaddir は、--downloadonly、download あるいは system-upgrade "
- "コマンドと共に使用する必要があります。"
- 
--#: dnf/cli/cli.py:918
-+#: dnf/cli/cli.py:819
- msgid ""
- "--enable, --set-enabled and --disable, --set-disabled must be used with "
- "config-manager command."
-@@ -773,7 +739,7 @@ msgstr ""
- "--enable と --set-enabled および --disable と --set-disabled は、config-manager "
- "コマンドと共に使用しなければなりません。"
- 
--#: dnf/cli/cli.py:1000
-+#: dnf/cli/cli.py:901
- msgid ""
- "Warning: Enforcing GPG signature check globally as per active RPM security "
- "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)"
-@@ -781,38 +747,38 @@ msgstr ""
- "警告: アクティブな RPM セキュリティーポリシーにより、GPG 署名の確認をグローバルに強制します "
- "(このメッセージをスケルチするには、dnf.conf(5) の 'gpgcheck' を参照してください)"
- 
--#: dnf/cli/cli.py:1020
-+#: dnf/cli/cli.py:921
- msgid "Config file \"{}\" does not exist"
- msgstr "設定ファイル \"{}\" は存在しません"
- 
--#: dnf/cli/cli.py:1040
-+#: dnf/cli/cli.py:941
- msgid ""
- "Unable to detect release version (use '--releasever' to specify release "
- "version)"
- msgstr "リリースバージョンを検出できません (リリースバージョンを指定するには '--releasever' を使用してください)"
- 
--#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471
-+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr "引数 {}: 引数 {} と許可されていません"
- 
--#: dnf/cli/cli.py:1134
-+#: dnf/cli/cli.py:1035
- #, python-format
- msgid "Command \"%s\" already defined"
- msgstr "コマンド \"%s\" はすでに定義済みです"
- 
--#: dnf/cli/cli.py:1154
-+#: dnf/cli/cli.py:1055
- msgid "Excludes in dnf.conf: "
- msgstr "dnf.conf で除外します: "
- 
--#: dnf/cli/cli.py:1157
-+#: dnf/cli/cli.py:1058
- msgid "Includes in dnf.conf: "
- msgstr "dnf.conf で含めます: "
- 
--#: dnf/cli/cli.py:1160
-+#: dnf/cli/cli.py:1061
- msgid "Excludes in repo "
- msgstr "repo で除外します "
- 
--#: dnf/cli/cli.py:1163
-+#: dnf/cli/cli.py:1064
- msgid "Includes in repo "
- msgstr "repo に含めます "
- 
-@@ -869,7 +835,7 @@ msgid "show all packages (default)"
- msgstr "すべてのパッケージを表示します (デフォルト)"
- 
- #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743
--#: dnf/cli/commands/module.py:351
-+#: dnf/cli/commands/module.py:373
- msgid "show only available packages"
- msgstr "利用可能なパッケージのみを表示します"
- 
-@@ -1194,78 +1160,78 @@ msgstr "グループ情報を表示または使用します"
- msgid "No group data available for configured repositories."
- msgstr "設定されたリポジトリーが利用可能なグループデータはありません。"
- 
--#: dnf/cli/commands/group.py:129
-+#: dnf/cli/commands/group.py:126
- #, python-format
- msgid "Warning: Group %s does not exist."
- msgstr "警告: グループ %s は存在しません。"
- 
--#: dnf/cli/commands/group.py:170
-+#: dnf/cli/commands/group.py:167
- msgid "Warning: No groups match:"
- msgstr "警告: 一致するグループはありません:"
- 
--#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193
--#: dnf/cli/output.py:1226
-+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190
-+#: dnf/cli/output.py:1139
- msgid "<name-unset>"
- msgstr "<name-unset>"
- 
--#: dnf/cli/commands/group.py:199
-+#: dnf/cli/commands/group.py:196
- msgid "Available Environment Groups:"
- msgstr "利用可能な環境グループ:"
- 
--#: dnf/cli/commands/group.py:201
-+#: dnf/cli/commands/group.py:198
- msgid "Installed Environment Groups:"
- msgstr "インストール済みの環境グループ:"
- 
--#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294
-+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291
- msgid "Installed Groups:"
- msgstr "インストール済みのグループ:"
- 
--#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301
-+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298
- msgid "Installed Language Groups:"
- msgstr "インストール済みの言語グループ:"
- 
--#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308
-+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305
- msgid "Available Groups:"
- msgstr "利用可能なグループ:"
- 
--#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315
-+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312
- msgid "Available Language Groups:"
- msgstr "利用可能な言語グループ:"
- 
--#: dnf/cli/commands/group.py:322
-+#: dnf/cli/commands/group.py:319
- msgid "include optional packages from group"
- msgstr "グループのオプションパッケージを含めます"
- 
--#: dnf/cli/commands/group.py:325
-+#: dnf/cli/commands/group.py:322
- msgid "show also hidden groups"
- msgstr "非表示のグループも表示します"
- 
--#: dnf/cli/commands/group.py:327
-+#: dnf/cli/commands/group.py:324
- msgid "show only installed groups"
- msgstr "インストール済みのグループのみを表示します"
- 
--#: dnf/cli/commands/group.py:329
-+#: dnf/cli/commands/group.py:326
- msgid "show only available groups"
- msgstr "利用可能なグループのみを表示します"
- 
--#: dnf/cli/commands/group.py:331
-+#: dnf/cli/commands/group.py:328
- msgid "show also ID of groups"
- msgstr "グループIDも表示"
- 
--#: dnf/cli/commands/group.py:333
-+#: dnf/cli/commands/group.py:330
- msgid "available subcommands: {} (default), {}"
- msgstr "利用可能なサブコマンド: {} (default), {}"
- 
--#: dnf/cli/commands/group.py:337
-+#: dnf/cli/commands/group.py:334
- msgid "argument for group subcommand"
- msgstr "グループサブコマンドの引数"
- 
--#: dnf/cli/commands/group.py:346
-+#: dnf/cli/commands/group.py:343
- #, python-format
- msgid "Invalid groups sub-command, use: %s."
--msgstr "groups のサブコマンドが無効です: %s. を使用します"
-+msgstr "groups のサブコマンドが無効です: %s を使用します。"
- 
--#: dnf/cli/commands/group.py:403
-+#: dnf/cli/commands/group.py:398
- msgid "Unable to find a mandatory group package."
- msgstr "必須のグループパッケージを見つけることができません。"
- 
-@@ -1275,25 +1241,25 @@ msgstr "トランザクション履歴を表示、または使用します"
- 
- #: dnf/cli/commands/history.py:66
- msgid "For the store command, file path to store the transaction to"
--msgstr ""
-+msgstr "store コマンドの場合は、トランザクションを保存するファイルパス"
- 
- #: dnf/cli/commands/history.py:68
- msgid ""
- "For the replay command, don't check for installed packages matching those in"
- " transaction"
--msgstr ""
-+msgstr "replay コマンドの場合は、トランザクション内のパッケージに一致するインストール済みパッケージを確認しない"
- 
- #: dnf/cli/commands/history.py:71
- msgid ""
- "For the replay command, don't check for extra packages pulled into the "
- "transaction"
--msgstr ""
-+msgstr "replay コマンドの場合は、トランザクションにプルされた追加パッケージを確認しない"
- 
- #: dnf/cli/commands/history.py:74
- msgid ""
- "For the replay command, skip packages that are not available or have missing"
- " dependencies"
--msgstr ""
-+msgstr "replay コマンドの場合は、利用できないパッケージや、依存関係が不足しているパッケージをスキップ"
- 
- #: dnf/cli/commands/history.py:94
- msgid ""
-@@ -1304,41 +1270,64 @@ msgstr ""
- "'{}' は 1 つのトランザクション ID またはパッケージ名が必要です。"
- 
- #: dnf/cli/commands/history.py:101
--#, fuzzy
--#| msgid "No transaction ID or package name given."
- msgid "No transaction file name given."
--msgstr "トランザクション ID、またはパッケージ名が指定されていません。"
-+msgstr "トランザクションファイル名が指定されていません。"
- 
- #: dnf/cli/commands/history.py:103
--#, fuzzy
--#| msgid "Failed to remove transaction file %s"
- msgid "More than one argument given as transaction file name."
--msgstr "トランザクションファイル %s の削除に失敗しました"
-+msgstr "トランザクションファイル名として指定された複数の引数。"
- 
--#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126
-+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130
- msgid "No transaction ID or package name given."
- msgstr "トランザクション ID、またはパッケージ名が指定されていません。"
- 
--#: dnf/cli/commands/history.py:138
-+#: dnf/cli/commands/history.py:142
- #, python-format
- msgid "You don't have access to the history DB: %s"
- msgstr "履歴 DB にアクセスできません: %s"
- 
--#: dnf/cli/commands/history.py:147
-+#: dnf/cli/commands/history.py:151
- #, python-format
- msgid ""
- "Cannot undo transaction %s, doing so would result in an inconsistent package"
- " database."
- msgstr "トランザクション %s を取り消すことはできません。取り消すことで、パッケージデータベースに矛盾が生じます。"
- 
--#: dnf/cli/commands/history.py:152
-+#: dnf/cli/commands/history.py:156
- #, python-format
- msgid ""
- "Cannot rollback transaction %s, doing so would result in an inconsistent "
- "package database."
- msgstr "トランザクション %s をロールバックすることはできません。ロールバックすることで、パッケージデータベースに矛盾が生じます。"
- 
--#: dnf/cli/commands/history.py:222
-+#: dnf/cli/commands/history.py:175
-+msgid "No transaction ID given"
-+msgstr "トランザクション ID は指定されていません"
-+
-+#: dnf/cli/commands/history.py:179
-+#, python-brace-format
-+msgid "Transaction ID \"{0}\" not found."
-+msgstr "トランザクション ID \"{0}\" が見つかりません。"
-+
-+#: dnf/cli/commands/history.py:185
-+msgid "Found more than one transaction ID!"
-+msgstr "1 つ以上のトランザクション ID が見つかりました!"
-+
-+#: dnf/cli/commands/history.py:203
-+#, python-format
-+msgid "Transaction history is incomplete, before %u."
-+msgstr "%u の前のトランザクション履歴が不完全です。"
-+
-+#: dnf/cli/commands/history.py:205
-+#, python-format
-+msgid "Transaction history is incomplete, after %u."
-+msgstr "%u の後のトランザクション履歴が不完全です。"
-+
-+#: dnf/cli/commands/history.py:256
-+msgid "No packages to list"
-+msgstr "一覧表示するパッケージはありません"
-+
-+#: dnf/cli/commands/history.py:279
- msgid ""
- "Invalid transaction ID range definition '{}'.\n"
- "Use '<transaction-id>..<transaction-id>'."
-@@ -1346,7 +1335,7 @@ msgstr ""
- "無効なトランザクション ID の範囲の定義 '{}'。\n"
- "'<transaction-id>..<transaction-id>' を使用してください。"
- 
--#: dnf/cli/commands/history.py:226
-+#: dnf/cli/commands/history.py:283
- msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
-@@ -1354,40 +1343,29 @@ msgstr ""
- "'{}' をトランザクション IDに変換できません。\n"
- "'<number>', 'last', 'last-<number>' を使用してください。"
- 
--#: dnf/cli/commands/history.py:255
-+#: dnf/cli/commands/history.py:312
- msgid "No transaction which manipulates package '{}' was found."
- msgstr "パッケージ '{}' を操作するトランザクションが見つかりません。"
- 
--#: dnf/cli/commands/history.py:305
--#, fuzzy, python-brace-format
--#| msgid "TransactionItem not found for key: {}"
--msgid "Transaction ID \"{id}\" not found."
--msgstr "TransactionItemが見つかりません鍵: {}"
--
--#: dnf/cli/commands/history.py:313
-+#: dnf/cli/commands/history.py:357
- msgid "{} exists, overwrite?"
--msgstr ""
-+msgstr "{} は存在します。上書きしますか?"
- 
--#: dnf/cli/commands/history.py:316
-+#: dnf/cli/commands/history.py:360
- msgid "Not overwriting {}, exiting."
--msgstr ""
-+msgstr "{} は存在するため上書きしません。"
- 
--#: dnf/cli/commands/history.py:323
--#, fuzzy
--#| msgid "Transaction failed"
-+#: dnf/cli/commands/history.py:367
- msgid "Transaction saved to {}."
--msgstr "トランザクションが失敗しました"
-+msgstr "{} に保存されているトランザクション。"
- 
--#: dnf/cli/commands/history.py:326
--#, fuzzy
--#| msgid "Errors occurred during transaction."
-+#: dnf/cli/commands/history.py:370
- msgid "Error storing transaction: {}"
--msgstr "トランザクション中にエラーが発生しました。"
-+msgstr "トランザクションの保存エラー: {}"
- 
--#: dnf/cli/commands/history.py:350
--msgid ""
--"Warning, the following problems occurred while replaying the transaction:"
--msgstr ""
-+#: dnf/cli/commands/history.py:386
-+msgid "Warning, the following problems occurred while running a transaction:"
-+msgstr "警告: トランザクションの実行中に以下の問題が発生しました。"
- 
- #: dnf/cli/commands/install.py:47
- msgid "install a package or packages on your system"
-@@ -1406,7 +1384,7 @@ msgstr "一致するものが見つかりません"
- msgid "Not a valid rpm file path: %s"
- msgstr "有効な rpm ファイルパスではありません: %s"
- 
--#: dnf/cli/commands/install.py:167
-+#: dnf/cli/commands/install.py:166
- #, python-brace-format
- msgid "There are following alternatives for \"{0}\": {1}"
- msgstr "\"{0}\"には次の選択肢があります: {1}"
-@@ -1449,7 +1427,7 @@ msgid "%s marked as group installed."
- msgstr "グループインストールには %s のマークがついています。"
- 
- #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129
--#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279
-+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282
- msgid "Error:"
- msgstr "エラー:"
- 
-@@ -1505,42 +1483,46 @@ msgid "Package {} belongs to multiple modules, skipping"
- msgstr "パッケージ {} は複数のモジュールに属しています、スキップします"
- 
- #: dnf/cli/commands/module.py:277
-+msgid "switch a module to a stream and distrosync rpm packages"
-+msgstr "モジュールをストリームに切り替え、rpm パッケージを distrosync します"
-+
-+#: dnf/cli/commands/module.py:299
- msgid "list modular packages"
- msgstr "モジュラーパッケージをリスト"
- 
--#: dnf/cli/commands/module.py:292
-+#: dnf/cli/commands/module.py:314
- msgid "list packages belonging to a module"
- msgstr "モジュールに属するパッケージをリスト"
- 
--#: dnf/cli/commands/module.py:327
-+#: dnf/cli/commands/module.py:349
- msgid "Interact with Modules."
- msgstr "モジュールと対話します。"
- 
--#: dnf/cli/commands/module.py:340
-+#: dnf/cli/commands/module.py:362
- msgid "show only enabled modules"
- msgstr "有効なモジュールのみを表示します"
- 
--#: dnf/cli/commands/module.py:343
-+#: dnf/cli/commands/module.py:365
- msgid "show only disabled modules"
- msgstr "無効なモジュールのみを表示します"
- 
--#: dnf/cli/commands/module.py:346
-+#: dnf/cli/commands/module.py:368
- msgid "show only installed modules or packages"
- msgstr "インストールされたモジュールまたはパッケージのみ表示"
- 
--#: dnf/cli/commands/module.py:349
-+#: dnf/cli/commands/module.py:371
- msgid "show profile content"
- msgstr "プロファイルコンテンツを表示します"
- 
--#: dnf/cli/commands/module.py:354
-+#: dnf/cli/commands/module.py:376
- msgid "remove all modular packages"
- msgstr "すべてのモジュラーパッケージを削除"
- 
--#: dnf/cli/commands/module.py:364
-+#: dnf/cli/commands/module.py:386
- msgid "Module specification"
- msgstr "モジュールspec"
- 
--#: dnf/cli/commands/module.py:386
-+#: dnf/cli/commands/module.py:408
- msgid "{} {} {}: too few arguments"
- msgstr "{} {} {}: 引数が足りません"
- 
-@@ -1843,6 +1825,8 @@ msgid ""
- "display format for listing packages: \"%%{name} %%{version} ...\", use "
- "--querytags to view full tag list"
- msgstr ""
-+"パッケージを一覧表示するための形式の表示: \"%%{name} %%{version} ...\"。--querytags "
-+"を指定して完全なタグリストを表示"
- 
- #: dnf/cli/commands/repoquery.py:198
- msgid "show available tags to use with --queryformat"
-@@ -1977,7 +1961,7 @@ msgid ""
- msgstr ""
- "オプションの '--resolve' は、'--conflicts'、'--depends'、'--enhances'、'--provides'、'--"
- "recommends'、'--requires'、'--requires-pre'、'--suggests' または '--supplements' "
--"オプションのいずれか 1 つと使用する必要があります。"
-+"オプションのいずれか 1 つと使用する必要があります"
- 
- #: dnf/cli/commands/repoquery.py:305
- msgid ""
-@@ -1986,7 +1970,7 @@ msgid ""
- "--resolve'"
- msgstr ""
- "オプションの '--recursive' は、'--whatrequires <REQ>' (オプションでは '--exactdeps' ではなく、'"
--"--alldeps' と共に使用) または '--requires <REQ> --resolve' と共に使用する必要があります。"
-+"--alldeps' と共に使用) または '--requires <REQ> --resolve' と共に使用する必要があります"
- 
- #: dnf/cli/commands/repoquery.py:312
- msgid "argument {} requires --whatrequires or --whatdepends option"
-@@ -2027,22 +2011,22 @@ msgstr "KEYWORD"
- msgid "Keyword to search for"
- msgstr "検索のキーワード"
- 
--#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
-+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460
- msgctxt "long"
- msgid "Name"
- msgstr "名前"
- 
--#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
-+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513
- msgctxt "long"
- msgid "Summary"
- msgstr "概要"
- 
--#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
-+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523
- msgctxt "long"
- msgid "Description"
- msgstr "説明"
- 
--#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
-+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516
- msgid "URL"
- msgstr "URL"
- 
-@@ -2185,16 +2169,16 @@ msgstr ""
- "実行                      トランザクションセットの解決および実行\n"
- "終了 (または 中止)           シェルの終了"
- 
--#: dnf/cli/commands/shell.py:259
-+#: dnf/cli/commands/shell.py:262
- #, python-format
- msgid "Error: Cannot open %s for reading"
- msgstr "エラー: 読み込み用に %s を開くことができません"
- 
--#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187
-+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187
- msgid "Complete!"
- msgstr "完了しました!"
- 
--#: dnf/cli/commands/shell.py:291
-+#: dnf/cli/commands/shell.py:294
- msgid "Leaving Shell"
- msgstr "シェルを終了します"
- 
-@@ -2385,8 +2369,8 @@ msgstr "重大度"
- msgid "Files"
- msgstr "ファイル"
- 
--#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
--#: dnf/cli/output.py:1772 dnf/cli/output.py:1774
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652
-+#: dnf/cli/output.py:1654 dnf/util.py:591
- msgid "Installed"
- msgstr "インストール済み"
- 
-@@ -2709,13 +2693,13 @@ msgstr "引数をエンコードできません '%s': %s"
- #. Translators: This is abbreviated 'Name'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:505
-+#: dnf/cli/output.py:459
- msgctxt "short"
- msgid "Name"
- msgstr "名前"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:511
-+#: dnf/cli/output.py:465
- msgid "Epoch"
- msgstr "エポック"
- 
-@@ -2723,38 +2707,38 @@ msgstr "エポック"
- #. use the full (unabbreviated) term 'Version' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:512 dnf/cli/output.py:1335
-+#: dnf/cli/output.py:466 dnf/cli/output.py:1248
- msgctxt "short"
- msgid "Version"
- msgstr "バージョン"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1337
-+#: dnf/cli/output.py:467 dnf/cli/output.py:1250
- msgctxt "long"
- msgid "Version"
- msgstr "バージョン"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:516
-+#: dnf/cli/output.py:470
- msgid "Release"
- msgstr "リリース"
- 
- #. Translators: This is abbreviated 'Architecture', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:517 dnf/cli/output.py:1326
-+#: dnf/cli/output.py:471 dnf/cli/output.py:1239
- msgctxt "short"
- msgid "Arch"
- msgstr "Arch"
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:472 dnf/cli/output.py:1242
- msgctxt "long"
- msgid "Architecture"
- msgstr "アーキテクチャー"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1352
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1265
- msgctxt "long"
- msgid "Size"
- msgstr "サイズ"
-@@ -2763,32 +2747,32 @@ msgstr "サイズ"
- #. not be longer than 5 characters. If the term 'Size' in your
- #. language is not longer than 5 characters then you can use it
- #. unabbreviated.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1350
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1263
- msgctxt "short"
- msgid "Size"
- msgstr "サイズ"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:524
-+#: dnf/cli/output.py:478
- msgid "Source"
- msgstr "ソース"
- 
- #. Translators: This is abbreviated 'Repository', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:525 dnf/cli/output.py:1341
-+#: dnf/cli/output.py:479 dnf/cli/output.py:1254
- msgctxt "short"
- msgid "Repo"
- msgstr "Repo"
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:480 dnf/cli/output.py:1257
- msgctxt "long"
- msgid "Repository"
- msgstr "リポジトリー"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:533
-+#: dnf/cli/output.py:487
- msgid "From repo"
- msgstr "repo から"
- 
-@@ -2796,312 +2780,308 @@ msgstr "repo から"
- #. print(_("Committer   : %s") % ucd(pkg.committer))
- #. print(_("Committime  : %s") % time.ctime(pkg.committime))
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:539
-+#: dnf/cli/output.py:493
- msgid "Packager"
- msgstr "パッケージャー"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:541
-+#: dnf/cli/output.py:495
- msgid "Buildtime"
- msgstr "ビルド時間"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:545
-+#: dnf/cli/output.py:499
- msgid "Install time"
- msgstr "インストール時間"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:554
-+#: dnf/cli/output.py:508
- msgid "Installed by"
- msgstr "インストール済み"
- 
- #. Translators: This is abbreviated 'Summary'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:558
-+#: dnf/cli/output.py:512
- msgctxt "short"
- msgid "Summary"
- msgstr "概要"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:564
-+#: dnf/cli/output.py:518
- msgid "License"
- msgstr "ライセンス"
- 
- #. Translators: This is abbreviated 'Description'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:568
-+#: dnf/cli/output.py:522
- msgctxt "short"
- msgid "Description"
- msgstr "説明"
- 
--#: dnf/cli/output.py:695
--msgid "No packages to list"
--msgstr "一覧表示するパッケージはありません"
--
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "y"
- msgstr "y"
- 
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "yes"
- msgstr "はい"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "n"
- msgstr "n"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "no"
- msgstr "いいえ"
- 
--#: dnf/cli/output.py:711
-+#: dnf/cli/output.py:655
- msgid "Is this ok [y/N]: "
- msgstr "これでよろしいですか? [y/N]: "
- 
--#: dnf/cli/output.py:715
-+#: dnf/cli/output.py:659
- msgid "Is this ok [Y/n]: "
- msgstr "これでよろしいですか? [Y/n]: "
- 
--#: dnf/cli/output.py:795
-+#: dnf/cli/output.py:739
- #, python-format
- msgid "Group: %s"
- msgstr "グループ: %s"
- 
--#: dnf/cli/output.py:799
-+#: dnf/cli/output.py:743
- #, python-format
- msgid " Group-Id: %s"
- msgstr " グループ ID: %s"
- 
--#: dnf/cli/output.py:801 dnf/cli/output.py:840
-+#: dnf/cli/output.py:745 dnf/cli/output.py:784
- #, python-format
- msgid " Description: %s"
- msgstr " 説明: %s"
- 
--#: dnf/cli/output.py:803
-+#: dnf/cli/output.py:747
- #, python-format
- msgid " Language: %s"
- msgstr " 言語: %s"
- 
--#: dnf/cli/output.py:806
-+#: dnf/cli/output.py:750
- msgid " Mandatory Packages:"
- msgstr " 必須なパッケージ:"
- 
--#: dnf/cli/output.py:807
-+#: dnf/cli/output.py:751
- msgid " Default Packages:"
- msgstr " 標準パッケージ:"
- 
--#: dnf/cli/output.py:808
-+#: dnf/cli/output.py:752
- msgid " Optional Packages:"
- msgstr " オプション パッケージ:"
- 
--#: dnf/cli/output.py:809
-+#: dnf/cli/output.py:753
- msgid " Conditional Packages:"
- msgstr " 条件付きパッケージ:"
- 
--#: dnf/cli/output.py:834
-+#: dnf/cli/output.py:778
- #, python-format
- msgid "Environment Group: %s"
- msgstr "環境グループ: %s"
- 
--#: dnf/cli/output.py:837
-+#: dnf/cli/output.py:781
- #, python-format
- msgid " Environment-Id: %s"
- msgstr " 環境 Id: %s"
- 
--#: dnf/cli/output.py:843
-+#: dnf/cli/output.py:787
- msgid " Mandatory Groups:"
- msgstr " 必須なグループ:"
- 
--#: dnf/cli/output.py:844
-+#: dnf/cli/output.py:788
- msgid " Optional Groups:"
- msgstr " 任意なグループ:"
- 
--#: dnf/cli/output.py:865
-+#: dnf/cli/output.py:809
- msgid "Matched from:"
- msgstr "一致:"
- 
--#: dnf/cli/output.py:879
-+#: dnf/cli/output.py:823
- #, python-format
- msgid "Filename    : %s"
- msgstr "ファイル名    : %s"
- 
--#: dnf/cli/output.py:904
-+#: dnf/cli/output.py:848
- #, python-format
- msgid "Repo        : %s"
- msgstr "Repo        : %s"
- 
--#: dnf/cli/output.py:913
-+#: dnf/cli/output.py:857
- msgid "Description : "
--msgstr "説明                : "
-+msgstr "説明: "
- 
--#: dnf/cli/output.py:917
-+#: dnf/cli/output.py:861
- #, python-format
- msgid "URL         : %s"
- msgstr "URL                 : %s"
- 
--#: dnf/cli/output.py:921
-+#: dnf/cli/output.py:865
- #, python-format
- msgid "License     : %s"
- msgstr "ライセンス    : %s"
- 
--#: dnf/cli/output.py:927
-+#: dnf/cli/output.py:871
- #, python-format
- msgid "Provide    : %s"
- msgstr "提供する    : %s"
- 
--#: dnf/cli/output.py:947
-+#: dnf/cli/output.py:891
- #, python-format
- msgid "Other       : %s"
- msgstr "その他       : %s"
- 
--#: dnf/cli/output.py:996
-+#: dnf/cli/output.py:940
- msgid "There was an error calculating total download size"
- msgstr "ダウンロードサイズの合計を計算中にエラーが発生しました"
- 
--#: dnf/cli/output.py:1002
-+#: dnf/cli/output.py:946
- #, python-format
- msgid "Total size: %s"
- msgstr "合計サイズ: %s"
- 
--#: dnf/cli/output.py:1005
-+#: dnf/cli/output.py:949
- #, python-format
- msgid "Total download size: %s"
- msgstr "ダウンロードサイズの合計: %s"
- 
--#: dnf/cli/output.py:1008
-+#: dnf/cli/output.py:952
- #, python-format
- msgid "Installed size: %s"
- msgstr "インストール後のサイズ: %s"
- 
--#: dnf/cli/output.py:1026
-+#: dnf/cli/output.py:970
- msgid "There was an error calculating installed size"
- msgstr "インストール後のサイズを計算中にエラーが発生しました"
- 
--#: dnf/cli/output.py:1030
-+#: dnf/cli/output.py:974
- #, python-format
- msgid "Freed space: %s"
- msgstr "解放された容量: %s"
- 
--#: dnf/cli/output.py:1039
-+#: dnf/cli/output.py:983
- msgid "Marking packages as installed by the group:"
- msgstr "パッケージをグループごとにインストール済みとマークします:"
- 
--#: dnf/cli/output.py:1046
-+#: dnf/cli/output.py:990
- msgid "Marking packages as removed by the group:"
- msgstr "パッケージをグループごとに削除済みとマークします:"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Group"
- msgstr "グループ"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Packages"
- msgstr "パッケージ"
- 
--#: dnf/cli/output.py:1133
-+#: dnf/cli/output.py:1046
- msgid "Installing group/module packages"
- msgstr "group/moduleパッケージをインストール"
- 
--#: dnf/cli/output.py:1134
-+#: dnf/cli/output.py:1047
- msgid "Installing group packages"
- msgstr "グループパッケージのインストール"
- 
- #. TRANSLATORS: This is for a list of packages to be installed.
--#: dnf/cli/output.py:1138
-+#: dnf/cli/output.py:1051
- msgctxt "summary"
- msgid "Installing"
- msgstr "インストール"
- 
- #. TRANSLATORS: This is for a list of packages to be upgraded.
--#: dnf/cli/output.py:1140
-+#: dnf/cli/output.py:1053
- msgctxt "summary"
- msgid "Upgrading"
- msgstr "アップグレード"
- 
- #. TRANSLATORS: This is for a list of packages to be reinstalled.
--#: dnf/cli/output.py:1142
-+#: dnf/cli/output.py:1055
- msgctxt "summary"
- msgid "Reinstalling"
- msgstr "再インストール"
- 
--#: dnf/cli/output.py:1144
-+#: dnf/cli/output.py:1057
- msgid "Installing dependencies"
- msgstr "依存関係のインストール"
- 
--#: dnf/cli/output.py:1145
-+#: dnf/cli/output.py:1058
- msgid "Installing weak dependencies"
- msgstr "弱い依存関係のインストール"
- 
- #. TRANSLATORS: This is for a list of packages to be removed.
--#: dnf/cli/output.py:1147
-+#: dnf/cli/output.py:1060
- msgid "Removing"
- msgstr "削除中"
- 
--#: dnf/cli/output.py:1148
-+#: dnf/cli/output.py:1061
- msgid "Removing dependent packages"
- msgstr "依存関係パッケージの削除"
- 
--#: dnf/cli/output.py:1149
-+#: dnf/cli/output.py:1062
- msgid "Removing unused dependencies"
- msgstr "未使用の依存関係の削除"
- 
- #. TRANSLATORS: This is for a list of packages to be downgraded.
--#: dnf/cli/output.py:1151
-+#: dnf/cli/output.py:1064
- msgctxt "summary"
- msgid "Downgrading"
- msgstr "ダウングレード"
- 
--#: dnf/cli/output.py:1176
-+#: dnf/cli/output.py:1089
- msgid "Installing module profiles"
- msgstr "モジュールプロファイルのインストール中"
- 
--#: dnf/cli/output.py:1185
-+#: dnf/cli/output.py:1098
- msgid "Disabling module profiles"
- msgstr "モジュールプロファイルの無効化中"
- 
--#: dnf/cli/output.py:1194
-+#: dnf/cli/output.py:1107
- msgid "Enabling module streams"
- msgstr "モジュールストリームの有効化中"
- 
--#: dnf/cli/output.py:1202
-+#: dnf/cli/output.py:1115
- msgid "Switching module streams"
- msgstr "モジュールストリームの切り替え中"
- 
--#: dnf/cli/output.py:1210
-+#: dnf/cli/output.py:1123
- msgid "Disabling modules"
- msgstr "モジュールの無効化"
- 
--#: dnf/cli/output.py:1218
-+#: dnf/cli/output.py:1131
- msgid "Resetting modules"
- msgstr "モジュールの再設定中"
- 
--#: dnf/cli/output.py:1230
-+#: dnf/cli/output.py:1143
- msgid "Installing Environment Groups"
- msgstr "環境グループのインストール中"
- 
--#: dnf/cli/output.py:1237
-+#: dnf/cli/output.py:1150
- msgid "Upgrading Environment Groups"
- msgstr "環境グループのアップグレード中"
- 
--#: dnf/cli/output.py:1244
-+#: dnf/cli/output.py:1157
- msgid "Removing Environment Groups"
- msgstr "環境グループの削除中"
- 
--#: dnf/cli/output.py:1251
-+#: dnf/cli/output.py:1164
- msgid "Installing Groups"
- msgstr "グループのインストール中"
- 
--#: dnf/cli/output.py:1258
-+#: dnf/cli/output.py:1171
- msgid "Upgrading Groups"
- msgstr "グループのアップグレード中"
- 
--#: dnf/cli/output.py:1265
-+#: dnf/cli/output.py:1178
- msgid "Removing Groups"
- msgstr "グループの削除中"
- 
--#: dnf/cli/output.py:1281
-+#: dnf/cli/output.py:1194
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
-@@ -3110,12 +3090,12 @@ msgstr ""
- "競合するパッケージをスキップします:\n"
- "(アップグレードを強制するにはコマンドラインに '%s' を追加します)"
- 
--#: dnf/cli/output.py:1291
-+#: dnf/cli/output.py:1204
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr "壊れた dependencies%s のパッケージをスキップします"
- 
--#: dnf/cli/output.py:1295
-+#: dnf/cli/output.py:1208
- msgid " or part of a group"
- msgstr " またはグループの一部"
- 
-@@ -3123,22 +3103,22 @@ msgstr " またはグループの一部"
- #. use the full (unabbreviated) term 'Package' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:1320
-+#: dnf/cli/output.py:1233
- msgctxt "short"
- msgid "Package"
- msgstr "パッケージ"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
--#: dnf/cli/output.py:1322
-+#: dnf/cli/output.py:1235
- msgctxt "long"
- msgid "Package"
- msgstr "パッケージ"
- 
--#: dnf/cli/output.py:1371
-+#: dnf/cli/output.py:1284
- msgid "replacing"
- msgstr "置き換え"
- 
--#: dnf/cli/output.py:1378
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid ""
- "\n"
-@@ -3150,287 +3130,271 @@ msgstr ""
- "%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933
-+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813
- msgid "Install"
- msgstr "インストール"
- 
--#: dnf/cli/output.py:1387 dnf/cli/output.py:1941
-+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821
- msgid "Upgrade"
- msgstr "アップグレード"
- 
--#: dnf/cli/output.py:1388
-+#: dnf/cli/output.py:1301
- msgid "Remove"
- msgstr "削除"
- 
--#: dnf/cli/output.py:1390 dnf/cli/output.py:1939
-+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819
- msgid "Downgrade"
- msgstr "ダウングレード"
- 
--#: dnf/cli/output.py:1391
-+#: dnf/cli/output.py:1304
- msgid "Skip"
- msgstr "スキップ"
- 
--#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
-+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] "パッケージ"
- 
--#: dnf/cli/output.py:1418
-+#: dnf/cli/output.py:1331
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "依存パッケージ"
- 
--#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942
--msgid "Upgraded"
--msgstr "アップグレード済み"
--
--#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940
--msgid "Downgraded"
--msgstr "ダウングレード済み"
--
--#: dnf/cli/output.py:1503
--msgid "Reinstalled"
--msgstr "再インストール済み"
--
--#: dnf/cli/output.py:1504
--msgid "Skipped"
--msgstr "スキップ済み"
--
--#: dnf/cli/output.py:1505
--msgid "Removed"
--msgstr "削除しました"
--
--#: dnf/cli/output.py:1508
--msgid "Failed"
--msgstr "失敗しました"
--
--#: dnf/cli/output.py:1559
-+#: dnf/cli/output.py:1439
- msgid "Total"
- msgstr "合計"
- 
--#: dnf/cli/output.py:1587
-+#: dnf/cli/output.py:1467
- msgid "<unset>"
- msgstr "<未設定>"
- 
--#: dnf/cli/output.py:1588
-+#: dnf/cli/output.py:1468
- msgid "System"
- msgstr "システム"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1518
- msgid "Command line"
- msgstr "コマンドライン"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1649
-+#: dnf/cli/output.py:1529
- msgid "User name"
- msgstr "ユーザー名"
- 
--#: dnf/cli/output.py:1651
-+#: dnf/cli/output.py:1531
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1653
-+#: dnf/cli/output.py:1533
- msgid "Date and time"
- msgstr "日時"
- 
--#: dnf/cli/output.py:1654
-+#: dnf/cli/output.py:1534
- msgid "Action(s)"
- msgstr "動作"
- 
--#: dnf/cli/output.py:1655
-+#: dnf/cli/output.py:1535
- msgid "Altered"
- msgstr "変更されました"
- 
--#: dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1578
- msgid "No transactions"
- msgstr "トランザクションがありません"
- 
--#: dnf/cli/output.py:1699 dnf/cli/output.py:1715
-+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595
- msgid "Failed history info"
- msgstr "失敗した履歴情報"
- 
--#: dnf/cli/output.py:1714
-+#: dnf/cli/output.py:1594
- msgid "No transaction ID, or package, given"
- msgstr "トランザクション ID、またはパッケージが指定されていません"
- 
--#: dnf/cli/output.py:1772
-+#: dnf/cli/output.py:1652
- msgid "Erased"
- msgstr "削除されました"
- 
--#: dnf/cli/output.py:1774
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590
-+msgid "Downgraded"
-+msgstr "ダウングレード済み"
-+
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589
-+msgid "Upgraded"
-+msgstr "アップグレード済み"
-+
-+#: dnf/cli/output.py:1654
- msgid "Not installed"
- msgstr "インストールされていません"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Newer"
- msgstr "新しい"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Older"
- msgstr "古い"
- 
--#: dnf/cli/output.py:1823 dnf/cli/output.py:1825
-+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705
- msgid "Transaction ID :"
- msgstr "トランザクション ID :"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1708
- msgid "Begin time     :"
- msgstr "開始時間            :"
- 
--#: dnf/cli/output.py:1831 dnf/cli/output.py:1833
-+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713
- msgid "Begin rpmdb    :"
- msgstr "開始 rpmdb          :"
- 
--#: dnf/cli/output.py:1839
-+#: dnf/cli/output.py:1719
- #, python-format
- msgid "(%u seconds)"
- msgstr "(%u 秒)"
- 
--#: dnf/cli/output.py:1841
-+#: dnf/cli/output.py:1721
- #, python-format
- msgid "(%u minutes)"
- msgstr "(%u 分)"
- 
--#: dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1723
- #, python-format
- msgid "(%u hours)"
- msgstr "(%u 時間)"
- 
--#: dnf/cli/output.py:1845
-+#: dnf/cli/output.py:1725
- #, python-format
- msgid "(%u days)"
- msgstr "(%u 日)"
- 
--#: dnf/cli/output.py:1846
-+#: dnf/cli/output.py:1726
- msgid "End time       :"
- msgstr "終了時間            :"
- 
--#: dnf/cli/output.py:1849 dnf/cli/output.py:1851
-+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731
- msgid "End rpmdb      :"
- msgstr "終了 rpmdb          :"
- 
--#: dnf/cli/output.py:1858 dnf/cli/output.py:1860
-+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740
- msgid "User           :"
- msgstr "ユーザー            :"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1871
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751
- msgid "Aborted"
- msgstr "中断しました"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869
--#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749
-+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755
- msgid "Return-Code    :"
- msgstr "終了コード          :"
- 
--#: dnf/cli/output.py:1867 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755
- msgid "Success"
- msgstr "成功"
- 
--#: dnf/cli/output.py:1869
-+#: dnf/cli/output.py:1749
- msgid "Failures:"
- msgstr "失敗:"
- 
--#: dnf/cli/output.py:1873
-+#: dnf/cli/output.py:1753
- msgid "Failure:"
- msgstr "失敗しました:"
- 
--#: dnf/cli/output.py:1883 dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765
- msgid "Releasever     :"
- msgstr "Releasever     :"
- 
--#: dnf/cli/output.py:1890 dnf/cli/output.py:1892
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Command Line   :"
- msgstr "コマンドライン      :"
- 
--#: dnf/cli/output.py:1897 dnf/cli/output.py:1899
-+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779
- msgid "Comment        :"
- msgstr "コメント        :"
- 
--#: dnf/cli/output.py:1903
-+#: dnf/cli/output.py:1783
- msgid "Transaction performed with:"
- msgstr "実行されたトランザクション:"
- 
--#: dnf/cli/output.py:1912
-+#: dnf/cli/output.py:1792
- msgid "Packages Altered:"
- msgstr "変更されたパッケージ:"
- 
--#: dnf/cli/output.py:1918
-+#: dnf/cli/output.py:1798
- msgid "Scriptlet output:"
- msgstr "Scriptlet の出力:"
- 
--#: dnf/cli/output.py:1925
-+#: dnf/cli/output.py:1805
- msgid "Errors:"
- msgstr "エラー:"
- 
--#: dnf/cli/output.py:1934
-+#: dnf/cli/output.py:1814
- msgid "Dep-Install"
- msgstr "Dep-Install"
- 
--#: dnf/cli/output.py:1935
-+#: dnf/cli/output.py:1815
- msgid "Obsoleted"
- msgstr "廃止された"
- 
--#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "廃止"
- 
--#: dnf/cli/output.py:1937
-+#: dnf/cli/output.py:1817
- msgid "Erase"
- msgstr "削除"
- 
--#: dnf/cli/output.py:1938
-+#: dnf/cli/output.py:1818
- msgid "Reinstall"
- msgstr "再インストール"
- 
--#: dnf/cli/output.py:2016
-+#: dnf/cli/output.py:1892
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr "---> パッケージ %s.%s %s はインストールされます"
- 
--#: dnf/cli/output.py:2018
-+#: dnf/cli/output.py:1894
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
- msgstr "---> パッケージ %s.%s %s はアップグレードされます"
- 
--#: dnf/cli/output.py:2020
-+#: dnf/cli/output.py:1896
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr "---> パッケージ %s.%s %s は消去されます"
- 
--#: dnf/cli/output.py:2022
-+#: dnf/cli/output.py:1898
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr "---> パッケージ %s.%s %s は再インストールされます"
- 
--#: dnf/cli/output.py:2024
-+#: dnf/cli/output.py:1900
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
- msgstr "---> パッケージ %s.%s %s はダウングレードされます"
- 
--#: dnf/cli/output.py:2026
-+#: dnf/cli/output.py:1902
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr "---> パッケージ %s.%s %s は廃止となります"
- 
--#: dnf/cli/output.py:2028
-+#: dnf/cli/output.py:1904
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr "---> パッケージ %s.%s %s はアップグレードされます"
- 
--#: dnf/cli/output.py:2030
-+#: dnf/cli/output.py:1906
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr "---> パッケージ %s.%s %s は廃止されます"
- 
--#: dnf/cli/output.py:2039
-+#: dnf/cli/output.py:1915
- msgid "--> Starting dependency resolution"
- msgstr "--> 依存関係の解決を開始しました"
- 
--#: dnf/cli/output.py:2044
-+#: dnf/cli/output.py:1919
- msgid "--> Finished dependency resolution"
- msgstr "--> 依存関係の解決が完了しました"
- 
--#: dnf/cli/output.py:2058 dnf/crypto.py:132
-+#: dnf/cli/output.py:1933 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3512,16 +3476,14 @@ msgid "Module or Group '%s' does not exist."
- msgstr "モジュールまたはグループ '%s' は存在しません。"
- 
- #: dnf/comps.py:599
--#, fuzzy, python-format
--#| msgid "Environment '%s' is not installed."
-+#, python-format
- msgid "Environment id '%s' does not exist."
--msgstr "環境 '%s' はインストールされていません。"
-+msgstr "環境 id '%s' は存在しません。"
- 
--#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453
--#, fuzzy, python-format
--#| msgid "Environment '%s' is not installed."
-+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487
-+#, python-format
- msgid "Environment id '%s' is not installed."
--msgstr "環境 '%s' はインストールされていません。"
-+msgstr "環境 id '%s' はインストールされていません。"
- 
- #: dnf/comps.py:639
- #, python-format
-@@ -3534,10 +3496,9 @@ msgid "Environment '%s' is not available."
- msgstr "環境 '%s' は利用不可です。"
- 
- #: dnf/comps.py:673
--#, fuzzy, python-format
--#| msgid "Group_id '%s' does not exist."
-+#, python-format
- msgid "Group id '%s' does not exist."
--msgstr "Group_id '%s' は存在しません。"
-+msgstr "グループ id '%s' は存在しません。"
- 
- #: dnf/conf/config.py:136
- #, python-format
-@@ -3588,7 +3549,7 @@ msgstr "repo %s には setopt の前に %s attr. がありませんでした"
- #: dnf/conf/read.py:51
- #, python-format
- msgid "Warning: failed loading '%s', skipping."
--msgstr "警告:  '%s' のロードに失敗、スキップします。"
-+msgstr "警告: '%s' のロードに失敗、スキップします。"
- 
- #: dnf/conf/read.py:63
- msgid "Bad id for repo: {} ({}), byte = {} {}"
-@@ -3628,6 +3589,11 @@ msgstr "repo %s: 0x%s はインポート済みです"
- msgid "repo %s: imported key 0x%s."
- msgstr "repo %s: インポート済みの鍵 0x%s。"
- 
-+#: dnf/crypto.py:177
-+#, python-format
-+msgid "retrieving repo key for %s unencrypted from %s"
-+msgstr "%s から暗号化されていない %s の repo キーを取得しています"
-+
- #: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
-@@ -3710,7 +3676,7 @@ msgid "Modular dependency problem with Defaults:"
- msgid_plural "Modular dependency problems with Defaults:"
- msgstr[0] "デフォルトのモジュラー依存問題:"
- 
--#: dnf/exceptions.py:131 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:841
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] "モジュラーの依存に関する問題:"
-@@ -3764,8 +3730,8 @@ msgstr ""
- "\n"
- "ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive"
- 
--#: dnf/module/module_base.py:54 dnf/module/module_base.py:421
--#: dnf/module/module_base.py:477 dnf/module/module_base.py:543
-+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547
-+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669
- msgid "Ignoring unnecessary profile: '{}/{}'"
- msgstr "不要なプロファイルを無視します: '{}/{}'"
- 
-@@ -3774,17 +3740,17 @@ msgstr "不要なプロファイルを無視します: '{}/{}'"
- msgid "All matches for argument '{0}' in module '{1}:{2}' are not active"
- msgstr "モジュール '{1}:{2}' の引数 '{0}' に一致するものはすべて非アクティブです"
- 
--#: dnf/module/module_base.py:92
-+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr "フェイルセーフレポジトリー {1} からのモジュール '{0}' インストールは許可されていません"
- 
--#: dnf/module/module_base.py:102
-+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
- msgstr "引数 {} でプロファイルが見つかりません。利用可能プロファイル '{}:{}': {}"
- 
--#: dnf/module/module_base.py:106
-+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216
- msgid "Unable to match profile for argument {}"
- msgstr "引数 {} でプロファイルが見つかりません"
- 
-@@ -3800,41 +3766,55 @@ msgstr "モジュール {}:{} にプロファイルがありません"
- msgid "Default profile {} not available in module {}:{}"
- msgstr "デフォルトのプロファイル {} はモジュール {}:{} で利用不可です"
- 
--#: dnf/module/module_base.py:142
-+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245
- msgid "Installing module from Fail-Safe repository is not allowed"
- msgstr "フェイルセーフレポジトリーからのモジュールインストールは許可されていません"
- 
--#: dnf/module/module_base.py:159 dnf/module/module_base.py:193
--#: dnf/module/module_base.py:337 dnf/module/module_base.py:355
--#: dnf/module/module_base.py:363 dnf/module/module_base.py:417
--#: dnf/module/module_base.py:473 dnf/module/module_base.py:539
-+#: dnf/module/module_base.py:194
-+#, python-brace-format
-+msgid "No active matches for argument '{0}' in module '{1}:{2}'"
-+msgstr "モジュール '{1}:{2}' の引数 '{0}' には、アクティブな一致がありません"
-+
-+#: dnf/module/module_base.py:226
-+#, python-brace-format
-+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'"
-+msgstr "インストールされたプロファイル '{0}' は、モジュール '{1}' ストリーム '{2}' では利用できません"
-+
-+#: dnf/module/module_base.py:265
-+msgid "No packages available to distrosync for package name '{}'"
-+msgstr "パッケージ名 '{}' 向けに distrosync するパッケージはありません"
-+
-+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452
-+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496
-+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599
-+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827
- msgid "Unable to resolve argument {}"
- msgstr "引数 {} を解決できません"
- 
--#: dnf/module/module_base.py:160
--msgid "No match for package {}"
--msgstr "パッケージ {} に一致するものはありません"
--
--#: dnf/module/module_base.py:204
-+#: dnf/module/module_base.py:319
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr "フェイルセーフレポジトリー {1} からのモジュール '{0}' アップグレードは許可されていません"
- 
--#: dnf/module/module_base.py:223 dnf/module/module_base.py:251
-+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366
- msgid "Unable to match profile in argument {}"
- msgstr "引数 {} でプロファイルを一致できません"
- 
--#: dnf/module/module_base.py:231
-+#: dnf/module/module_base.py:346
- msgid "Upgrading module from Fail-Safe repository is not allowed"
- msgstr "フェイルセーフレポジトリーからのモジュールアップグレードは許可されていません"
- 
--#: dnf/module/module_base.py:367
-+#: dnf/module/module_base.py:500
- msgid ""
- "Only module name is required. Ignoring unneeded information in argument: "
- "'{}'"
- msgstr "モジュール名のみが必要です。引数で不必要な情報を無視します: '{}'"
- 
--#: dnf/package.py:298
-+#: dnf/module/module_base.py:828
-+msgid "No match for package {}"
-+msgstr "パッケージ {} に一致するものはありません"
-+
-+#: dnf/package.py:333
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s: %s の確認に失敗しました: %s vs %s"
-@@ -3848,12 +3828,12 @@ msgstr "%s は空のファイルです"
- #: dnf/persistor.py:91
- #, python-format
- msgid "Failed to load expired repos cache: %s"
--msgstr ""
-+msgstr "期限切れのリポジトリーキャッシュのロードに失敗しました: %s"
- 
- #: dnf/persistor.py:99
- #, python-format
- msgid "Failed to store expired repos cache: %s"
--msgstr ""
-+msgstr "期限切れのリポジトリーキャッシュの保存に失敗しました: %s"
- 
- #: dnf/persistor.py:106
- msgid "Failed storing last makecache time."
-@@ -3915,6 +3895,14 @@ msgstr "%s から %s repo を追加しました"
- msgid "Errors occurred during test transaction."
- msgstr "テストトランザクション中にエラーが発生しました。"
- 
-+#: dnf/sack.py:47
-+msgid ""
-+"allow_vendor_change is disabled. This option is currently not supported for "
-+"downgrade and distro-sync commands"
-+msgstr ""
-+"allow_vendor_change は無効になっています。このオプションは、downgrade コマンドおよび distro-sync "
-+"コマンドではサポートされていません"
-+
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
- msgctxt "currently"
-@@ -3961,168 +3949,200 @@ msgstr "scriptletの実行中"
- msgid "Preparing"
- msgstr "準備"
- 
--#: dnf/transaction_sr.py:60
-+#: dnf/transaction_sr.py:66
- #, python-brace-format
--msgid "Errors in \"{filename}\":"
--msgstr ""
-+msgid ""
-+"The following problems occurred while replaying the transaction from file "
-+"\"{filename}\":"
-+msgstr "ファイル \"{filename}\" からのトランザクションの再生中に以下の問題が発生しました。"
- 
--#: dnf/transaction_sr.py:70
--#, python-brace-format
--msgid "Error in \"{filename}\": {error}"
--msgstr ""
-+#: dnf/transaction_sr.py:68
-+msgid "The following problems occurred while running a transaction:"
-+msgstr "トランザクションの実行中に以下の問題が発生しました。"
- 
--#: dnf/transaction_sr.py:87
-+#: dnf/transaction_sr.py:89
- #, python-brace-format
- msgid "Invalid major version \"{major}\", number expected."
--msgstr ""
-+msgstr "無効なメジャーバージョン \"{major}\"。数字が必要です。"
- 
--#: dnf/transaction_sr.py:95
-+#: dnf/transaction_sr.py:97
- #, python-brace-format
- msgid "Invalid minor version \"{minor}\", number expected."
--msgstr ""
-+msgstr "無効なマイナーバージョン \"{minor}\"。数字が必要です。"
- 
--#: dnf/transaction_sr.py:101
-+#: dnf/transaction_sr.py:103
- #, python-brace-format
- msgid ""
- "Incompatible major version \"{major}\", supported major version is "
- "\"{major_supp}\"."
--msgstr ""
-+msgstr "互換性のないメジャーバージョン \"{major}\"。サポートされているメジャーバージョンは \"{major_supp}\" です。"
-+
-+#: dnf/transaction_sr.py:224
-+msgid ""
-+"Conflicting TransactionReplay arguments have been specified: filename, data"
-+msgstr "競合する TransactionReplay 引数が指定されています。filename, data"
- 
--#: dnf/transaction_sr.py:244
-+#: dnf/transaction_sr.py:265
- #, python-brace-format
- msgid "Unexpected type of \"{id}\", {exp} expected."
--msgstr ""
-+msgstr "予期しない {id}\" のタイプ。{exp} が必要です。"
- 
--#: dnf/transaction_sr.py:250
-+#: dnf/transaction_sr.py:271
- #, python-brace-format
- msgid "Missing key \"{key}\"."
--msgstr ""
-+msgstr "\"{key}\" キーがありません。"
- 
--#: dnf/transaction_sr.py:263
-+#: dnf/transaction_sr.py:285
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an rpm."
--msgstr ""
-+msgstr "オブジェクトキー \"{key}\" が rpm にありません。"
- 
--#: dnf/transaction_sr.py:267
-+#: dnf/transaction_sr.py:289
- #, python-brace-format
- msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "rpm nevra \"{nevra}\" の予期しないパッケージ理由 \"{reason}\" の値。"
- 
--#: dnf/transaction_sr.py:275
-+#: dnf/transaction_sr.py:297
- #, python-brace-format
- msgid "Cannot parse NEVRA for package \"{nevra}\"."
--msgstr ""
-+msgstr "パッケージ \"{nevra}\" の NEVRA を解析できません。"
- 
--#: dnf/transaction_sr.py:286
-+#: dnf/transaction_sr.py:321
- #, python-brace-format
- msgid "Cannot find rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "rpm nevra \"{nevra}\" を見つけることはできません。"
- 
--#: dnf/transaction_sr.py:301
--#, fuzzy, python-brace-format
--#| msgid "Package %s is already installed."
-+#: dnf/transaction_sr.py:336
-+#, python-brace-format
- msgid "Package \"{na}\" is already installed for action \"{action}\"."
--msgstr "パッケージ %s は既にインストールされています。"
-+msgstr "パッケージ \"{na}\" は、アクション \"{action}\" 用に既にインストールされています。"
- 
--#: dnf/transaction_sr.py:311
-+#: dnf/transaction_sr.py:345
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\" not available in repositories for action "
- "\"{action}\"."
--msgstr ""
-+msgstr "アクション \"{action}\" に利用できる パッケージ nevra \"{nevra}\" はレポジトリーにありません。"
- 
--#: dnf/transaction_sr.py:322
-+#: dnf/transaction_sr.py:356
- #, python-brace-format
- msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"."
--msgstr ""
-+msgstr "アクション \"{action}\" には、パッケージ nevra \"{nevra}\" インストールされていません。"
- 
--#: dnf/transaction_sr.py:336
-+#: dnf/transaction_sr.py:370
- #, python-brace-format
- msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "rpm nevra \"{nevra}\" の、パッケージアクション \"{action}\" の予期しない値。"
- 
--#: dnf/transaction_sr.py:343
--#, fuzzy, python-format
--#| msgid "Module or Group '%s' is not available."
-+#: dnf/transaction_sr.py:377
-+#, python-format
- msgid "Group id '%s' is not available."
--msgstr "モジュールまたはグループ '%s' は利用不可です。"
-+msgstr "グループ id '%s' は利用できません。"
- 
--#: dnf/transaction_sr.py:364
-+#: dnf/transaction_sr.py:398
- #, python-brace-format
- msgid "Missing object key \"{key}\" in groups.packages."
--msgstr ""
-+msgstr "オブジェクトキー \"{key}\" が groups.packages に含まれません。"
- 
--#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387
--#, fuzzy, python-format
--#| msgid "Module or Group '%s' is not installed."
-+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421
-+#, python-format
- msgid "Group id '%s' is not installed."
--msgstr "モジュールまたはグループ '%s' がインストールされていません。"
-+msgstr "グループ id '%s' がインストールされていません。"
- 
--#: dnf/transaction_sr.py:398
--#, fuzzy, python-format
--#| msgid "Environment '%s' is not available."
-+#: dnf/transaction_sr.py:432
-+#, python-format
- msgid "Environment id '%s' is not available."
--msgstr "環境 '%s' は利用不可です。"
-+msgstr "環境 id '%s' は利用できません。"
- 
--#: dnf/transaction_sr.py:422
-+#: dnf/transaction_sr.py:456
- #, python-brace-format
- msgid ""
- "Invalid value \"{group_type}\" of environments.groups.group_type, only "
- "\"mandatory\" or \"optional\" is supported."
- msgstr ""
-+"environments.groups.group_type の無効な値 \"{group_type}\"。\"mandatory\" または "
-+"\"optional\" のみに対応しています。"
- 
--#: dnf/transaction_sr.py:430
-+#: dnf/transaction_sr.py:464
- #, python-brace-format
- msgid "Missing object key \"{key}\" in environments.groups."
--msgstr ""
-+msgstr "オブジェクトキー \"{key}\" が environments.groups に含まれません。"
- 
--#: dnf/transaction_sr.py:508
-+#: dnf/transaction_sr.py:542
- #, python-brace-format
- msgid "Unexpected value of group action \"{action}\" for group \"{group}\"."
--msgstr ""
-+msgstr "グループ \"{group}\" の グループアクション \"{action}\" の予期しない値。"
- 
--#: dnf/transaction_sr.py:513
-+#: dnf/transaction_sr.py:547
- #, python-brace-format
- msgid "Missing object key \"{key}\" in a group."
--msgstr ""
-+msgstr "オブジェクトキー \"{key}\" がグループ内にありません。"
- 
--#: dnf/transaction_sr.py:537
-+#: dnf/transaction_sr.py:571
- #, python-brace-format
- msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"."
--msgstr ""
-+msgstr "環境 \"{env}\" の環境アクション \"{action}\" の予期しない値。"
- 
--#: dnf/transaction_sr.py:542
-+#: dnf/transaction_sr.py:576
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an environment."
--msgstr ""
-+msgstr "オブジェクトキー \"{key}\" が環境にありません。"
- 
--#: dnf/transaction_sr.py:581
-+#: dnf/transaction_sr.py:615
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\", which is not present in the transaction file, was"
- " pulled into the transaction."
--msgstr ""
-+msgstr "トランザクションファイルに存在しないパッケージ nevra \"{nevra}\" がトランザクションにプルされていました。"
- 
- # translation auto-copied from project jbpm-designer, version 6.0.1, document
- # org.jbpm/jbpm-designer-
- # api/resources/org/jbpm/designer/resources/i18n/DesignerConstants, author
- # nmirasch
--#: dnf/util.py:391 dnf/util.py:393
-+#: dnf/util.py:393 dnf/util.py:395
- msgid "Problem"
- msgstr "問題"
- 
--#: dnf/util.py:444
-+#: dnf/util.py:446
- msgid "TransactionItem not found for key: {}"
- msgstr "TransactionItemが見つかりません鍵: {}"
- 
--#: dnf/util.py:454
-+#: dnf/util.py:456
- msgid "TransactionSWDBItem not found for key: {}"
- msgstr "TransactionSWDBItemが見つかりません鍵: {}"
- 
--#: dnf/util.py:457
-+#: dnf/util.py:459
- msgid "Errors occurred during transaction."
- msgstr "トランザクション中にエラーが発生しました。"
- 
-+#: dnf/util.py:595
-+msgid "Reinstalled"
-+msgstr "再インストール済み"
-+
-+#: dnf/util.py:596
-+msgid "Skipped"
-+msgstr "スキップ済み"
-+
-+#: dnf/util.py:597
-+msgid "Removed"
-+msgstr "削除しました"
-+
-+#: dnf/util.py:600
-+msgid "Failed"
-+msgstr "失敗しました"
-+
-+#~ msgid "Action not handled: {}"
-+#~ msgstr "動作は対処されていません: {}"
-+
-+#~ msgid "no package matched"
-+#~ msgstr "一致したパッケージはありません。"
-+
-+#~ msgid "Not found given transaction ID"
-+#~ msgstr "指定されたトランザクション ID は見つかりません"
-+
-+#~ msgid "Undoing transaction {}, from {}"
-+#~ msgstr "トランザクション {} を {} から取り消しています"
-+
- #~ msgid "format for displaying found packages"
- #~ msgstr "見つかったパッケージを表示する形式"
- 
-diff --git a/po/ko.po b/po/ko.po
-index 449f6130..9f37ae13 100644
---- a/po/ko.po
-+++ b/po/ko.po
-@@ -5,7 +5,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-10-05 09:18-0400\n"
-+"POT-Creation-Date: 2021-02-22 09:22+0100\n"
- "PO-Revision-Date: 2020-09-12 11:29+0000\n"
- "Last-Translator: Ludek Janda <ljanda@redhat.com>\n"
- "Language-Team: Korean <https://translate.fedoraproject.org/projects/dnf/dnf-master/ko/>\n"
-@@ -72,7 +72,7 @@ msgstr "알 수없는 설정: %s=%s in %s; %s"
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr "알 수없는 옵션 : %s = %s in %s"
- 
--#: dnf/automatic/main.py:237 dnf/cli/cli.py:299
-+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304
- msgid "GPG check FAILED"
- msgstr "GPG 확인 실패"
- 
-@@ -85,9 +85,11 @@ msgid "Started dnf-automatic."
- msgstr "dnf-automatic을 시작했습니다."
- 
- #: dnf/automatic/main.py:308
--#, python-format
--msgid "Sleep for %s seconds"
--msgstr "%s 초 동안 절전합니다"
-+#, fuzzy
-+#| msgid "Sleep for %s seconds"
-+msgid "Sleep for {} second"
-+msgid_plural "Sleep for {} seconds"
-+msgstr[0] "%s 초 동안 절전합니다"
- 
- #: dnf/automatic/main.py:315
- msgid "System is off-line."
-@@ -99,7 +101,7 @@ msgstr ""
- msgid "Error: %s"
- msgstr "오류: %s"
- 
--#: dnf/base.py:146
-+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474
- msgid "loading repo '{}' failure: {}"
- msgstr "repo '{}'의 로드에 실패했습니다 : {}"
- 
-@@ -107,236 +109,236 @@ msgstr "repo '{}'의 로드에 실패했습니다 : {}"
- msgid "Loading repository '{}' has failed"
- msgstr "리포지토리 '{}'의 로드에 실패했습니다"
- 
--#: dnf/base.py:320
-+#: dnf/base.py:322
- msgid "Metadata timer caching disabled when running on metered connection."
- msgstr "데이터 통신 연결을 사용할 때 메타 데이터 타이머 캐싱을 비활성화합니다."
- 
--#: dnf/base.py:325
-+#: dnf/base.py:327
- msgid "Metadata timer caching disabled when running on a battery."
- msgstr "배터리를 사용할할 때 메타 데이터 타이머 캐싱을 비활성화합니다."
- 
--#: dnf/base.py:330
-+#: dnf/base.py:332
- msgid "Metadata timer caching disabled."
- msgstr "메타 데이터 타이머 캐싱이 비활성화되었습니다."
- 
--#: dnf/base.py:335
-+#: dnf/base.py:337
- msgid "Metadata cache refreshed recently."
- msgstr "최근에 메타 데이터 캐시가 새로 고쳐졌습니다."
- 
--#: dnf/base.py:341 dnf/cli/commands/__init__.py:91
-+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91
- msgid "There are no enabled repositories in \"{}\"."
- msgstr "\"{}\"에 사용 가능한 저장소가 없습니다."
- 
--#: dnf/base.py:348
-+#: dnf/base.py:350
- #, python-format
- msgid "%s: will never be expired and will not be refreshed."
- msgstr "%s: 만료되지 않고 새로 고침되지 않습니다."
- 
--#: dnf/base.py:350
-+#: dnf/base.py:352
- #, python-format
- msgid "%s: has expired and will be refreshed."
- msgstr "%s: 만료되어 새로 고침됩니다."
- 
- #. expires within the checking period:
--#: dnf/base.py:354
-+#: dnf/base.py:356
- #, python-format
- msgid "%s: metadata will expire after %d seconds and will be refreshed now"
- msgstr "%s: 메타 데이터는 %d 초 이후에 만료되며 이제 새로 고침됩니다."
- 
--#: dnf/base.py:358
-+#: dnf/base.py:360
- #, python-format
- msgid "%s: will expire after %d seconds."
- msgstr "%s: %d 초 후에 만료됩니다."
- 
- #. performs the md sync
--#: dnf/base.py:364
-+#: dnf/base.py:366
- msgid "Metadata cache created."
- msgstr "메타 데이터 캐시가 생성되었습니다."
- 
--#: dnf/base.py:397
-+#: dnf/base.py:399 dnf/base.py:466
- #, python-format
- msgid "%s: using metadata from %s."
- msgstr "%s: %s에서 메타 데이터 사용 중"
- 
--#: dnf/base.py:409
-+#: dnf/base.py:411 dnf/base.py:479
- #, python-format
- msgid "Ignoring repositories: %s"
- msgstr "리포지토리를 무시합니다: %s"
- 
--#: dnf/base.py:412
-+#: dnf/base.py:414
- #, python-format
- msgid "Last metadata expiration check: %s ago on %s."
- msgstr "마지막 메타 데이터 만료 확인 :%s. %s 이전에 확인"
- 
--#: dnf/base.py:443
-+#: dnf/base.py:507
- msgid ""
- "The downloaded packages were saved in cache until the next successful "
- "transaction."
- msgstr "다운로드된 패키지는 다음 번 성공적인 트랜잭션까지 캐시에 저장됩니다."
- 
--#: dnf/base.py:445
-+#: dnf/base.py:509
- #, python-format
- msgid "You can remove cached packages by executing '%s'."
- msgstr "'%s'을/를 실행하여 캐시 패키지를 삭제할 수 있습니다."
- 
--#: dnf/base.py:535
-+#: dnf/base.py:599
- #, python-format
- msgid "Invalid tsflag in config file: %s"
- msgstr "설정 파일에서 tsflag 사용이 잘못되었습니다: %s"
- 
--#: dnf/base.py:591
-+#: dnf/base.py:655
- #, python-format
- msgid "Failed to add groups file for repository: %s - %s"
- msgstr "리포지토리의 그룹 파일을 추가하지 못했습니다. %s - %s"
- 
--#: dnf/base.py:823
-+#: dnf/base.py:887
- msgid "Running transaction check"
- msgstr "트랜잭션 확인 실행 중"
- 
--#: dnf/base.py:831
-+#: dnf/base.py:895
- msgid "Error: transaction check vs depsolve:"
- msgstr "오류 : 트랜잭션 확인 및 종속성 해결 오류"
- 
--#: dnf/base.py:837
-+#: dnf/base.py:901
- msgid "Transaction check succeeded."
- msgstr "트랜잭션 확인에 성공했습니다."
- 
--#: dnf/base.py:840
-+#: dnf/base.py:904
- msgid "Running transaction test"
- msgstr "트랜잭션 테스트 실행 중"
- 
--#: dnf/base.py:850 dnf/base.py:992
-+#: dnf/base.py:914 dnf/base.py:1065
- msgid "RPM: {}"
- msgstr "RPM: {}"
- 
--#: dnf/base.py:851
-+#: dnf/base.py:915
- msgid "Transaction test error:"
- msgstr "트랜잭션 테스트 오류:"
- 
--#: dnf/base.py:862
-+#: dnf/base.py:926
- msgid "Transaction test succeeded."
- msgstr "트랜잭션 테스트에 성공했습니다."
- 
--#: dnf/base.py:883
-+#: dnf/base.py:947
- msgid "Running transaction"
- msgstr "트랜잭션 실행 중"
- 
--#: dnf/base.py:911
-+#: dnf/base.py:984
- msgid "Disk Requirements:"
- msgstr "디스크 요구 사항 :"
- 
--#: dnf/base.py:914
-+#: dnf/base.py:987
- #, python-brace-format
- msgid "At least {0}MB more space needed on the {1} filesystem."
- msgid_plural "At least {0}MB more space needed on the {1} filesystem."
- msgstr[0] "{1} 파일 시스템에 최소 {0}MB의 공간이 더 필요합니다."
- 
--#: dnf/base.py:921
-+#: dnf/base.py:994
- msgid "Error Summary"
- msgstr "오류 요약"
- 
--#: dnf/base.py:947
-+#: dnf/base.py:1020
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
- msgstr "RPMDB는 {prog} 외부에서 변경되었습니다."
- 
--#: dnf/base.py:993 dnf/base.py:1001
-+#: dnf/base.py:1066 dnf/base.py:1074
- msgid "Could not run transaction."
- msgstr "트랜잭션을 실행할 수 없습니다."
- 
--#: dnf/base.py:996
-+#: dnf/base.py:1069
- msgid "Transaction couldn't start:"
- msgstr "트랜잭션을 시작할 수 없습니다 :"
- 
--#: dnf/base.py:1010
-+#: dnf/base.py:1083
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "%s 트랜잭션 파일을 삭제하지 못했습니다"
- 
--#: dnf/base.py:1092
-+#: dnf/base.py:1165
- msgid "Some packages were not downloaded. Retrying."
- msgstr "일부 패키지가 다운로드되지 않았습니다. 다시 시도 중입니다."
- 
--#: dnf/base.py:1122
-+#: dnf/base.py:1195
- #, python-format
- msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)"
- msgstr "Delta RPM이 %.1f MB의 업데이트를 %.1f MB로 줄였습니다. (%d.1 %% 절약됨)"
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1198
- #, python-format
- msgid ""
- "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)"
- msgstr "Delta RPM은 %.1f MB의 업데이트를 %.1f MB로 줄이는데 실패했습니다. (%d.1 %% 손실됨)"
- 
--#: dnf/base.py:1167
-+#: dnf/base.py:1240
- msgid "Cannot add local packages, because transaction job already exists"
- msgstr "트랜잭션 작업이 이미 존재하므로 로컬 패키지를 추가할 수 없습니다"
- 
--#: dnf/base.py:1181
-+#: dnf/base.py:1254
- msgid "Could not open: {}"
- msgstr "열 수 없음 : {}"
- 
--#: dnf/base.py:1219
-+#: dnf/base.py:1292
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr "%s의 공개 키는 설치되어 있지 않습니다."
- 
--#: dnf/base.py:1223
-+#: dnf/base.py:1296
- #, python-format
- msgid "Problem opening package %s"
- msgstr "%s 패키지를 여는 중에 문제가 발생했습니다"
- 
--#: dnf/base.py:1231
-+#: dnf/base.py:1304
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr "%s의 공개 키는 신뢰할 수 없습니다"
- 
--#: dnf/base.py:1235
-+#: dnf/base.py:1308
- #, python-format
- msgid "Package %s is not signed"
- msgstr "%s 패키지가 서명되지 않았습니다"
- 
--#: dnf/base.py:1265
-+#: dnf/base.py:1338
- #, python-format
- msgid "Cannot remove %s"
- msgstr "%s을/를 삭제할 수 없습니다."
- 
--#: dnf/base.py:1269
-+#: dnf/base.py:1342
- #, python-format
- msgid "%s removed"
- msgstr "%s가 삭제되었습니다"
- 
--#: dnf/base.py:1549
-+#: dnf/base.py:1622
- msgid "No match for group package \"{}\""
- msgstr "그룹 패키지 \"{}\"에 일치하는 항목이 없습니다"
- 
--#: dnf/base.py:1635
-+#: dnf/base.py:1708
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "'%s' 그룹에서 패키지 추가: %s"
- 
--#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442
-+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442
- #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592
- #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80
- #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110
- msgid "Nothing to do."
- msgstr "처리가 필요하지 않습니다"
- 
--#: dnf/base.py:1676
-+#: dnf/base.py:1749
- msgid "No groups marked for removal."
- msgstr "제거할 패키지 그룹이 없습니다"
- 
--#: dnf/base.py:1710
-+#: dnf/base.py:1783
- msgid "No group marked for upgrade."
- msgstr "업그레이드용으로 표시된 그룹이 없습니다."
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1997
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
- msgstr "%s 패키지가 설치되어 있지 않기 때문에 다운 그레이드할 수 없습니다."
- 
--#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980
--#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411
-+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052
-+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416
- #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482
- #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633
- #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147
-@@ -346,141 +348,127 @@ msgstr "%s 패키지가 설치되어 있지 않기 때문에 다운 그레이드
- msgid "No match for argument: %s"
- msgstr "일치하는 인수가 없습니다 : %s"
- 
--#: dnf/base.py:1934
-+#: dnf/base.py:2006
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
- msgstr "%s 패키지의 하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다."
- 
--#: dnf/base.py:1957
-+#: dnf/base.py:2029
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
- msgstr "%s 패키지가 설치되어 있지 않기 때문에 다시 설치할 수 없습니다."
- 
--#: dnf/base.py:1972
-+#: dnf/base.py:2044
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr "%s 파일은 소스 패키지이며 업데이트할 수 없습니다. 무시합니다."
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:2050
- #, python-format
- msgid "Package %s not installed, cannot update it."
- msgstr "%s 패키지가 설치되어 있지 않기 때문에 업데이트할 수 없습니다."
- 
--#: dnf/base.py:1987
-+#: dnf/base.py:2059
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
- msgstr "%s 이상의 버전이 이미 설치되어 있으므로 업데이트할 수 없습니다."
- 
--#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
- msgstr "%s 패키지는 사용할 수는 있지만 설치되어 있지 않습니다."
- 
--#: dnf/base.py:2032
-+#: dnf/base.py:2104
- #, python-format
- msgid "Package %s available, but installed for different architecture."
- msgstr "%s 패키지는 사용 가능하지만 다른 아키텍처 용으로 설치되어 있습니다."
- 
--#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699
-+#: dnf/base.py:2129
- #, python-format
- msgid "No package %s installed."
- msgstr "%s 패키지는 설치되어 있지 않습니다"
- 
--#: dnf/base.py:2075 dnf/cli/commands/install.py:136
-+#: dnf/base.py:2147 dnf/cli/commands/install.py:136
- #: dnf/cli/commands/remove.py:133
- #, python-format
- msgid "Not a valid form: %s"
- msgstr "잘못된 형식: %s"
- 
--#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681
--#: dnf/cli/commands/remove.py:163
-+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681
-+#: dnf/cli/commands/remove.py:162
- msgid "No packages marked for removal."
- msgstr "제거 대상 패키지가 없습니다."
- 
--#: dnf/base.py:2179 dnf/cli/cli.py:422
-+#: dnf/base.py:2250 dnf/cli/cli.py:427
- #, python-format
- msgid "Packages for argument %s available, but not installed."
- msgstr "%s 인수에 대한 패키지를 사용할 수 있지만 설치되어 있지 않습니다."
- 
--#: dnf/base.py:2184
-+#: dnf/base.py:2255
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
- msgstr "%s 패키지의 최하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다."
- 
--#: dnf/base.py:2242
--msgid "Action not handled: {}"
--msgstr "작업이 처리되지 않았습니다: {}"
--
--#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703
--#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169
--#, python-format
--msgid "No package %s available."
--msgstr "사용 가능한 패키지 %s가 없습니다."
--
--#: dnf/base.py:2269
--msgid "no package matched"
--msgstr "일치하는 패키지가 없습니다."
--
--#: dnf/base.py:2290
-+#: dnf/base.py:2302
- msgid "No security updates needed, but {} update available"
- msgstr "보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다"
- 
--#: dnf/base.py:2292
-+#: dnf/base.py:2304
- msgid "No security updates needed, but {} updates available"
- msgstr "보안 업데이트는 필요하지 않지만 {} 업데이트가 가능합니다"
- 
--#: dnf/base.py:2296
-+#: dnf/base.py:2308
- msgid "No security updates needed for \"{}\", but {} update available"
- msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다"
- 
--#: dnf/base.py:2298
-+#: dnf/base.py:2310
- msgid "No security updates needed for \"{}\", but {} updates available"
- msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다"
- 
- #. raise an exception, because po.repoid is not in self.repos
--#: dnf/base.py:2319
-+#: dnf/base.py:2331
- #, python-format
- msgid "Unable to retrieve a key for a commandline package: %s"
- msgstr ""
- 
--#: dnf/base.py:2327
-+#: dnf/base.py:2339
- #, python-format
- msgid ". Failing package is: %s"
- msgstr "실패한 패키지는 다음과 같습니다. %s"
- 
--#: dnf/base.py:2328
-+#: dnf/base.py:2340
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "GPG 키는 다음과 같이 설정되어 있습니다. %s"
- 
--#: dnf/base.py:2340
-+#: dnf/base.py:2352
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
- msgstr "%s (0x%s)의 GPG 키가 이미 설치되어 있습니다"
- 
--#: dnf/base.py:2373
-+#: dnf/base.py:2385
- msgid "The key has been approved."
- msgstr "키가 승인되었습니다."
- 
--#: dnf/base.py:2376
-+#: dnf/base.py:2388
- msgid "The key has been rejected."
- msgstr "키가 거부되었습니다."
- 
--#: dnf/base.py:2409
-+#: dnf/base.py:2421
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "키 가져 오기에 실패했습니다 (코드 %d)"
- 
--#: dnf/base.py:2411
-+#: dnf/base.py:2423
- msgid "Key imported successfully"
- msgstr "키 가져오기에 성공했습니다"
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2427
- msgid "Didn't install any keys"
- msgstr "키를 하나도 설치하지 못했습니다"
- 
--#: dnf/base.py:2418
-+#: dnf/base.py:2430
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
-@@ -489,49 +477,49 @@ msgstr ""
- "해당 GPG 키는 \"%s\"저장소가 이미 설치되어 있지만이 패키지에 맞지 않습니다.\n"
- "이 저장소에 대해 올바른 키 URL이 구성되었는지 확인하십시오."
- 
--#: dnf/base.py:2429
-+#: dnf/base.py:2441
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr "가져온 키에 문제가 있습니다. 잘못된 키입니까?"
- 
--#: dnf/base.py:2482
-+#: dnf/base.py:2494
- msgid "  * Maybe you meant: {}"
- msgstr "  * 다음을 의미할 수도 있습니다: {}"
- 
--#: dnf/base.py:2514
-+#: dnf/base.py:2526
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr "로컬 저장소 \"{}\"의 \"{}\"패키지에 잘못된 체크섬이 있습니다"
- 
--#: dnf/base.py:2517
-+#: dnf/base.py:2529
- msgid "Some packages from local repository have incorrect checksum"
- msgstr "로컬 저장소의 일부 패키지에 잘못된 체크섬이 있습니다"
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2532
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "저장소 \"{}\"의 패키지 \"{}\"에 잘못된 체크섬이 있습니다"
- 
--#: dnf/base.py:2523
-+#: dnf/base.py:2535
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
- msgstr "일부 패키지에는 유효하지 않은 캐시가 있지만 \"--cacheonly\"옵션으로 인해 다운로드할 수 없습니다"
- 
--#: dnf/base.py:2541 dnf/base.py:2561
-+#: dnf/base.py:2553 dnf/base.py:2573
- msgid "No match for argument"
- msgstr "일치하는 인수가 없습니다"
- 
--#: dnf/base.py:2549 dnf/base.py:2569
-+#: dnf/base.py:2561 dnf/base.py:2581
- msgid "All matches were filtered out by exclude filtering for argument"
- msgstr "모든 일치 항목이 인수의 제외 필터로 필터링되었습니다"
- 
--#: dnf/base.py:2551
-+#: dnf/base.py:2563
- msgid "All matches were filtered out by modular filtering for argument"
- msgstr "모든 일치 항목이 인수의 모듈식 필터로 필터링되었습니다"
- 
--#: dnf/base.py:2567
-+#: dnf/base.py:2579
- msgid "All matches were installed from a different repository for argument"
- msgstr "모든 일치 항목이 인수의 다른 리포지토리에서 설치되었습니다"
- 
--#: dnf/base.py:2583
-+#: dnf/base.py:2626
- #, python-format
- msgid "Package %s is already installed."
- msgstr "패키지 %s이/가 이미 설치되어 있습니다."
-@@ -551,8 +539,8 @@ msgstr "\"%s\" 파일의 구문 분석에 실패했습니다 : %s"
- msgid "Cannot read file \"%s\": %s"
- msgstr "\"%s\" 파일을 읽을 수 없습니다: %s"
- 
--#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902
--#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108
-+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803
-+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108
- #, python-format
- msgid "Config error: %s"
- msgstr "설정 오류: %s"
-@@ -583,7 +571,7 @@ msgid ""
- "stream '{2}'"
- msgstr "이 작업은 '{0}' 모듈을 '{1}' 스트림에서 ‘{2}' 스트림으로 전환합니다"
- 
--#: dnf/cli/cli.py:172
-+#: dnf/cli/cli.py:173
- #, python-brace-format
- msgid ""
- "It is not possible to switch enabled streams of a module.\n"
-@@ -592,35 +580,35 @@ msgstr ""
- "활성화된 모듈 스트림을 전환 할 수 없습니다.\n"
- "설치된 모든 내용을 모듈에서 제거하고 ‘{prog} module reset <module_name>' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후 다른 스트림을 설치할 수 있습니다."
- 
--#: dnf/cli/cli.py:210
-+#: dnf/cli/cli.py:211
- #, python-brace-format
- msgid "{prog} will only download packages for the transaction."
- msgstr "{prog}은/는 트랜잭션용 패키지 만 다운로드합니다."
- 
--#: dnf/cli/cli.py:213
-+#: dnf/cli/cli.py:214
- #, python-brace-format
- msgid ""
- "{prog} will only download packages, install gpg keys, and check the "
- "transaction."
- msgstr "{prog}은/는 패키지 만 다운로드하고 gpg 키를 설치하며 트랜잭션을 확인합니다."
- 
--#: dnf/cli/cli.py:217
-+#: dnf/cli/cli.py:218
- msgid "Operation aborted."
- msgstr "작업이 중지됨."
- 
--#: dnf/cli/cli.py:224
-+#: dnf/cli/cli.py:225
- msgid "Downloading Packages:"
- msgstr "패키지 다운로드중:"
- 
--#: dnf/cli/cli.py:230
-+#: dnf/cli/cli.py:231
- msgid "Error downloading packages:"
- msgstr "패키지 다운로드중 오류 발생:"
- 
--#: dnf/cli/cli.py:258
-+#: dnf/cli/cli.py:263
- msgid "Transaction failed"
- msgstr "트랜잭션 실패"
- 
--#: dnf/cli/cli.py:281
-+#: dnf/cli/cli.py:286
- msgid ""
- "Refusing to automatically import keys when running unattended.\n"
- "Use \"-y\" to override."
-@@ -628,117 +616,96 @@ msgstr ""
- "키를 자동으로 가져 오는 것을 거부합니다.\n"
- "동작을 무시하려면 \"-y\"를 사용하십시오."
- 
--#: dnf/cli/cli.py:331
-+#: dnf/cli/cli.py:336
- msgid "Changelogs for {}"
- msgstr "{}의 변경 사항"
- 
--#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511
-+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516
- msgid "Obsoleting Packages"
- msgstr "더 이상 사용되지 않는 패키지"
- 
--#: dnf/cli/cli.py:393
-+#: dnf/cli/cli.py:398
- msgid "No packages marked for distribution synchronization."
- msgstr "배포 동기화가 필요한 패키지가 없습니다."
- 
--#: dnf/cli/cli.py:428
-+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395
-+#, python-format
-+msgid "No package %s available."
-+msgstr "사용 가능한 패키지 %s가 없습니다."
-+
-+#: dnf/cli/cli.py:433
- msgid "No packages marked for downgrade."
- msgstr "다운 그레이드 대상으로 표시된 패키지가 없습니다."
- 
--#: dnf/cli/cli.py:479
-+#: dnf/cli/cli.py:484
- msgid "Installed Packages"
- msgstr "설치된 패키지"
- 
--#: dnf/cli/cli.py:487
-+#: dnf/cli/cli.py:492
- msgid "Available Packages"
- msgstr "사용 가능한 패키지"
- 
--#: dnf/cli/cli.py:491
-+#: dnf/cli/cli.py:496
- msgid "Autoremove Packages"
- msgstr "패키지 자동 삭제"
- 
- # ctx::sourcefile::Systems Navigation Menu
--#: dnf/cli/cli.py:493
-+#: dnf/cli/cli.py:498
- msgid "Extra Packages"
- msgstr "추가 패키지"
- 
--#: dnf/cli/cli.py:497
-+#: dnf/cli/cli.py:502
- msgid "Available Upgrades"
- msgstr "사용 가능한 업그레이드"
- 
--#: dnf/cli/cli.py:513
-+#: dnf/cli/cli.py:518
- msgid "Recently Added Packages"
- msgstr "최근에 추가 된 패키지"
- 
--#: dnf/cli/cli.py:518
-+#: dnf/cli/cli.py:522
- msgid "No matching Packages to list"
- msgstr "목록과 일치하는 패키지가 없습니다"
- 
--#: dnf/cli/cli.py:599
-+#: dnf/cli/cli.py:603
- msgid "No Matches found"
- msgstr "검색 결과가 없습니다"
- 
--#: dnf/cli/cli.py:609
--msgid "No transaction ID given"
--msgstr "지정된 트랜잭션 ID가 없습니다"
--
--#: dnf/cli/cli.py:614
--msgid "Not found given transaction ID"
--msgstr "주어진 트랜잭션 ID를 찾을 수 없습니다"
--
--#: dnf/cli/cli.py:623
--msgid "Found more than one transaction ID!"
--msgstr "두 개 이상의 트랜잭션 ID를 찾았습니다!"
--
--#: dnf/cli/cli.py:640
--#, python-format
--msgid "Transaction history is incomplete, before %u."
--msgstr "%u이전 트랜잭션 내역이 불완전합니다."
--
--#: dnf/cli/cli.py:642
--#, python-format
--msgid "Transaction history is incomplete, after %u."
--msgstr "%u이후 트랜잭션 내역이 불완전합니다."
--
--#: dnf/cli/cli.py:689
--msgid "Undoing transaction {}, from {}"
--msgstr "{}에서 {} 트랜잭션 실행을 취소하고 있습니다"
--
--#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237
-+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237
- #, python-format
- msgid "Unknown repo: '%s'"
- msgstr "알 수 없는 저장소: '%s'"
- 
--#: dnf/cli/cli.py:783
-+#: dnf/cli/cli.py:684
- #, python-format
- msgid "No repository match: %s"
- msgstr "일치하는 저장소가 없습니다 : %s"
- 
--#: dnf/cli/cli.py:817
-+#: dnf/cli/cli.py:718
- msgid ""
- "This command has to be run with superuser privileges (under the root user on"
- " most systems)."
- msgstr "이 명령은 수퍼 유저 권한으로 실행해야합니다 (대부분의 시스템에서 root 사용자로 실행)."
- 
--#: dnf/cli/cli.py:847
-+#: dnf/cli/cli.py:748
- #, python-format
- msgid "No such command: %s. Please use %s --help"
- msgstr "명령을 찾을 수 없습니다: %s . %s --help를 사용하십시오"
- 
--#: dnf/cli/cli.py:850
-+#: dnf/cli/cli.py:751
- #, python-format, python-brace-format
- msgid ""
- "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-"
- "command(%s)'\""
- msgstr "{PROG} 플러그인 명령일 수 있습니다: \"{prog} 'dnf-command(%s)'\""
- 
--#: dnf/cli/cli.py:854
-+#: dnf/cli/cli.py:755
- #, python-brace-format
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
- "disabled."
- msgstr "{prog} 플러그인 명령일 수 있지만 플러그인 로딩은 현재 비활성화되어 있습니다."
- 
--#: dnf/cli/cli.py:912
-+#: dnf/cli/cli.py:813
- msgid ""
- "--destdir or --downloaddir must be used with --downloadonly or download or "
- "system-upgrade command."
-@@ -746,7 +713,7 @@ msgstr ""
- "--destdir 또는 --downloaddir은 --downloadonly 또는 download 또는 system-upgrade 명령과"
- " 함께 사용해야합니다."
- 
--#: dnf/cli/cli.py:918
-+#: dnf/cli/cli.py:819
- msgid ""
- "--enable, --set-enabled and --disable, --set-disabled must be used with "
- "config-manager command."
-@@ -754,7 +721,7 @@ msgstr ""
- "--enable, --set-enabled 및 --disable, --set-disabled는 config-manager 명령과 함께 "
- "사용해야합니다."
- 
--#: dnf/cli/cli.py:1000
-+#: dnf/cli/cli.py:901
- msgid ""
- "Warning: Enforcing GPG signature check globally as per active RPM security "
- "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)"
-@@ -762,38 +729,38 @@ msgstr ""
- "경고: 활성화된 RPM 보안 정책에 따라 GPG 서명 검사를 전체적으로 시행합니다 (이 메시지를 제거하는 방법은 dnf.conf (5)의"
- " 'gpgcheck' 참조)"
- 
--#: dnf/cli/cli.py:1020
-+#: dnf/cli/cli.py:921
- msgid "Config file \"{}\" does not exist"
- msgstr "\"{}\" 설정 파일이 존재하지 않습니다"
- 
--#: dnf/cli/cli.py:1040
-+#: dnf/cli/cli.py:941
- msgid ""
- "Unable to detect release version (use '--releasever' to specify release "
- "version)"
- msgstr "릴리스 버전을 찾을 수 없습니다 ('--releasever'를 사용하여 릴리스 버전을 지정하십시오)"
- 
--#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471
-+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr "인수 {}: 인수 {}과 함께 사용할 수 없습니다"
- 
--#: dnf/cli/cli.py:1134
-+#: dnf/cli/cli.py:1035
- #, python-format
- msgid "Command \"%s\" already defined"
- msgstr "\"%s\" 명령이 이미 정의되어 있습니다"
- 
--#: dnf/cli/cli.py:1154
-+#: dnf/cli/cli.py:1055
- msgid "Excludes in dnf.conf: "
- msgstr "dnf.conf에서 제외: "
- 
--#: dnf/cli/cli.py:1157
-+#: dnf/cli/cli.py:1058
- msgid "Includes in dnf.conf: "
- msgstr "dnf.conf에 포함:. "
- 
--#: dnf/cli/cli.py:1160
-+#: dnf/cli/cli.py:1061
- msgid "Excludes in repo "
- msgstr "리포지토리에서 제외 "
- 
--#: dnf/cli/cli.py:1163
-+#: dnf/cli/cli.py:1064
- msgid "Includes in repo "
- msgstr "리포지토리에 포함 "
- 
-@@ -849,7 +816,7 @@ msgid "show all packages (default)"
- msgstr "모든 패키지 표시 (기본값)"
- 
- #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743
--#: dnf/cli/commands/module.py:351
-+#: dnf/cli/commands/module.py:373
- msgid "show only available packages"
- msgstr "사용 가능한 패키지 만 표시"
- 
-@@ -1174,78 +1141,78 @@ msgstr "그룹 정보를 표시하거나 사용합니다"
- msgid "No group data available for configured repositories."
- msgstr "설정된 리포지토리에 사용할 수있는 그룹 데이터가 없습니다."
- 
--#: dnf/cli/commands/group.py:129
-+#: dnf/cli/commands/group.py:126
- #, python-format
- msgid "Warning: Group %s does not exist."
- msgstr "경고: %s 그룹이 존재하지 않습니다."
- 
--#: dnf/cli/commands/group.py:170
-+#: dnf/cli/commands/group.py:167
- msgid "Warning: No groups match:"
- msgstr "경고: 일치하는 그룹이 없습니다"
- 
--#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193
--#: dnf/cli/output.py:1226
-+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190
-+#: dnf/cli/output.py:1139
- msgid "<name-unset>"
- msgstr "<name-unset>"
- 
--#: dnf/cli/commands/group.py:199
-+#: dnf/cli/commands/group.py:196
- msgid "Available Environment Groups:"
- msgstr "사용 가능한 환경 그룹 :"
- 
--#: dnf/cli/commands/group.py:201
-+#: dnf/cli/commands/group.py:198
- msgid "Installed Environment Groups:"
- msgstr "설치된 환경 그룹 :"
- 
--#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294
-+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291
- msgid "Installed Groups:"
- msgstr "설치된 그룹 :"
- 
--#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301
-+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298
- msgid "Installed Language Groups:"
- msgstr "설치된 언어 그룹 :"
- 
--#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308
-+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305
- msgid "Available Groups:"
- msgstr "사용 가능한 그룹 :"
- 
--#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315
-+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312
- msgid "Available Language Groups:"
- msgstr "사용 가능한 언어 그룹 :"
- 
--#: dnf/cli/commands/group.py:322
-+#: dnf/cli/commands/group.py:319
- msgid "include optional packages from group"
- msgstr "그룹의 선택 패키지를 포함합니다"
- 
--#: dnf/cli/commands/group.py:325
-+#: dnf/cli/commands/group.py:322
- msgid "show also hidden groups"
- msgstr "숨겨진 그룹도 표시합니다"
- 
--#: dnf/cli/commands/group.py:327
-+#: dnf/cli/commands/group.py:324
- msgid "show only installed groups"
- msgstr "설치된 그룹 만 표시합니다"
- 
--#: dnf/cli/commands/group.py:329
-+#: dnf/cli/commands/group.py:326
- msgid "show only available groups"
- msgstr "사용 가능한 그룹 만 표시합니다"
- 
--#: dnf/cli/commands/group.py:331
-+#: dnf/cli/commands/group.py:328
- msgid "show also ID of groups"
- msgstr "그룹 ID 표시"
- 
--#: dnf/cli/commands/group.py:333
-+#: dnf/cli/commands/group.py:330
- msgid "available subcommands: {} (default), {}"
- msgstr "사용 가능한 하위 명령: {} (기본값), {}"
- 
--#: dnf/cli/commands/group.py:337
-+#: dnf/cli/commands/group.py:334
- msgid "argument for group subcommand"
- msgstr "그룹 하위 명령의 인수"
- 
--#: dnf/cli/commands/group.py:346
-+#: dnf/cli/commands/group.py:343
- #, python-format
- msgid "Invalid groups sub-command, use: %s."
- msgstr "그룹 하위 명령이 잘못되었습니다. %s을/를 사용합니다."
- 
--#: dnf/cli/commands/group.py:403
-+#: dnf/cli/commands/group.py:398
- msgid "Unable to find a mandatory group package."
- msgstr "필수 그룹 패키지를 찾을 수 없습니다."
- 
-@@ -1295,30 +1262,58 @@ msgstr "주어진 거래 ID가 없습니다."
- msgid "More than one argument given as transaction file name."
- msgstr "트랜잭션 파일을 제거하지 못했습니다. %s"
- 
--#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126
-+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130
- msgid "No transaction ID or package name given."
- msgstr "트랜잭션 ID 또는 패키지 이름이 없습니다."
- 
--#: dnf/cli/commands/history.py:138
-+#: dnf/cli/commands/history.py:142
- #, python-format
- msgid "You don't have access to the history DB: %s"
- msgstr "기록 DB에 액세스할 수 없습니다: %s"
- 
--#: dnf/cli/commands/history.py:147
-+#: dnf/cli/commands/history.py:151
- #, python-format
- msgid ""
- "Cannot undo transaction %s, doing so would result in an inconsistent package"
- " database."
- msgstr "%s 트랜잭션을 취소할 수 없습니다. 취소하면 패키지 데이터베이스가 일치하지 않게 됩니다."
- 
--#: dnf/cli/commands/history.py:152
-+#: dnf/cli/commands/history.py:156
- #, python-format
- msgid ""
- "Cannot rollback transaction %s, doing so would result in an inconsistent "
- "package database."
- msgstr "%s 트랜잭션을 롤백할 수 없습니다. 이렇게하면 패키지 데이터베이스가 일치하지 않게 됩니다."
- 
--#: dnf/cli/commands/history.py:222
-+#: dnf/cli/commands/history.py:175
-+msgid "No transaction ID given"
-+msgstr "지정된 트랜잭션 ID가 없습니다"
-+
-+#: dnf/cli/commands/history.py:179
-+#, fuzzy, python-brace-format
-+#| msgid "TransactionItem not found for key: {}"
-+msgid "Transaction ID \"{0}\" not found."
-+msgstr "{} 키에 대한 TransactionItem을 찾을 수 없습니다"
-+
-+#: dnf/cli/commands/history.py:185
-+msgid "Found more than one transaction ID!"
-+msgstr "두 개 이상의 트랜잭션 ID를 찾았습니다!"
-+
-+#: dnf/cli/commands/history.py:203
-+#, python-format
-+msgid "Transaction history is incomplete, before %u."
-+msgstr "%u이전 트랜잭션 내역이 불완전합니다."
-+
-+#: dnf/cli/commands/history.py:205
-+#, python-format
-+msgid "Transaction history is incomplete, after %u."
-+msgstr "%u이후 트랜잭션 내역이 불완전합니다."
-+
-+#: dnf/cli/commands/history.py:256
-+msgid "No packages to list"
-+msgstr "목록에 패키지가 없습니다"
-+
-+#: dnf/cli/commands/history.py:279
- msgid ""
- "Invalid transaction ID range definition '{}'.\n"
- "Use '<transaction-id>..<transaction-id>'."
-@@ -1326,7 +1321,7 @@ msgstr ""
- "잘못된 트랜잭션 ID 범위 정의 '{}'. \n"
- "'<transaction-id>..<transaction-id>' 사용."
- 
--#: dnf/cli/commands/history.py:226
-+#: dnf/cli/commands/history.py:283
- msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
-@@ -1334,38 +1329,32 @@ msgstr ""
- "'{}'을 (를) 트랜잭션 ID로 변환할 수 없습니다. \n"
- "'<number>', 'last', 'last-<number>' 사용."
- 
--#: dnf/cli/commands/history.py:255
-+#: dnf/cli/commands/history.py:312
- msgid "No transaction which manipulates package '{}' was found."
- msgstr "패키지 '{}'을 (를) 사용하는 트랜잭션이 없습니다."
- 
--#: dnf/cli/commands/history.py:305
--#, python-brace-format
--msgid "Transaction ID \"{id}\" not found."
--msgstr ""
--
--#: dnf/cli/commands/history.py:313
-+#: dnf/cli/commands/history.py:357
- msgid "{} exists, overwrite?"
- msgstr ""
- 
--#: dnf/cli/commands/history.py:316
-+#: dnf/cli/commands/history.py:360
- msgid "Not overwriting {}, exiting."
- msgstr ""
- 
--#: dnf/cli/commands/history.py:323
-+#: dnf/cli/commands/history.py:367
- #, fuzzy
- #| msgid "Transaction test succeeded."
- msgid "Transaction saved to {}."
- msgstr "트랜잭션 테스트가 완료되었습니다."
- 
--#: dnf/cli/commands/history.py:326
-+#: dnf/cli/commands/history.py:370
- #, fuzzy
- #| msgid "Errors occurred during transaction."
- msgid "Error storing transaction: {}"
- msgstr "거래 중에 오류가 발생했습니다."
- 
--#: dnf/cli/commands/history.py:350
--msgid ""
--"Warning, the following problems occurred while replaying the transaction:"
-+#: dnf/cli/commands/history.py:386
-+msgid "Warning, the following problems occurred while running a transaction:"
- msgstr ""
- 
- #: dnf/cli/commands/install.py:47
-@@ -1385,7 +1374,7 @@ msgstr "일치하는 항목을 찾을 수 없습니다"
- msgid "Not a valid rpm file path: %s"
- msgstr "올바른 rpm 파일 경로가 아닙니다. %s"
- 
--#: dnf/cli/commands/install.py:167
-+#: dnf/cli/commands/install.py:166
- #, python-brace-format
- msgid "There are following alternatives for \"{0}\": {1}"
- msgstr "다음은 “{0}\"의 대안입니다. {1}"
-@@ -1428,7 +1417,7 @@ msgid "%s marked as group installed."
- msgstr "%s은/는 그룹이 설치한 것으로 표시되었습니다"
- 
- #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129
--#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279
-+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282
- msgid "Error:"
- msgstr "오류:"
- 
-@@ -1484,42 +1473,46 @@ msgid "Package {} belongs to multiple modules, skipping"
- msgstr "{} 패키지는 여러 모듈에 속합니다. 건너 뛰기"
- 
- #: dnf/cli/commands/module.py:277
-+msgid "switch a module to a stream and distrosync rpm packages"
-+msgstr ""
-+
-+#: dnf/cli/commands/module.py:299
- msgid "list modular packages"
- msgstr "모듈 패키지 목록"
- 
--#: dnf/cli/commands/module.py:292
-+#: dnf/cli/commands/module.py:314
- msgid "list packages belonging to a module"
- msgstr "모듈에 속하는 패키지를 나열하십시오"
- 
--#: dnf/cli/commands/module.py:327
-+#: dnf/cli/commands/module.py:349
- msgid "Interact with Modules."
- msgstr "모듈과 상호 작용합니다."
- 
--#: dnf/cli/commands/module.py:340
-+#: dnf/cli/commands/module.py:362
- msgid "show only enabled modules"
- msgstr "활성화된 모듈 만 표시"
- 
--#: dnf/cli/commands/module.py:343
-+#: dnf/cli/commands/module.py:365
- msgid "show only disabled modules"
- msgstr "비활성화된 모듈 만 표시"
- 
--#: dnf/cli/commands/module.py:346
-+#: dnf/cli/commands/module.py:368
- msgid "show only installed modules or packages"
- msgstr "설치된 모듈 또는 패키지 만 표시"
- 
--#: dnf/cli/commands/module.py:349
-+#: dnf/cli/commands/module.py:371
- msgid "show profile content"
- msgstr "프로파일 내용 표시"
- 
--#: dnf/cli/commands/module.py:354
-+#: dnf/cli/commands/module.py:376
- msgid "remove all modular packages"
- msgstr "모든 모듈 패키지 삭제"
- 
--#: dnf/cli/commands/module.py:364
-+#: dnf/cli/commands/module.py:386
- msgid "Module specification"
- msgstr "모듈 사양"
- 
--#: dnf/cli/commands/module.py:386
-+#: dnf/cli/commands/module.py:408
- msgid "{} {} {}: too few arguments"
- msgstr "{} {} {}: 인수가 부족합니다"
- 
-@@ -2004,22 +1997,22 @@ msgstr "KEYWORD"
- msgid "Keyword to search for"
- msgstr "검색 키워드"
- 
--#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
-+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460
- msgctxt "long"
- msgid "Name"
- msgstr "이름"
- 
--#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
-+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513
- msgctxt "long"
- msgid "Summary"
- msgstr "요약"
- 
--#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
-+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523
- msgctxt "long"
- msgid "Description"
- msgstr "설명"
- 
--#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
-+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516
- msgid "URL"
- msgstr "URL"
- 
-@@ -2162,16 +2155,16 @@ msgstr ""
- "run                      트랜잭션 세트 분석 및 실행\n"
- "exit (or quit)           쉘 종료"
- 
--#: dnf/cli/commands/shell.py:259
-+#: dnf/cli/commands/shell.py:262
- #, python-format
- msgid "Error: Cannot open %s for reading"
- msgstr "오류: 읽기 전용 %s를 열 수 없습니다"
- 
--#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187
-+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187
- msgid "Complete!"
- msgstr "완료되었습니다!"
- 
--#: dnf/cli/commands/shell.py:291
-+#: dnf/cli/commands/shell.py:294
- msgid "Leaving Shell"
- msgstr "쉘 나가기"
- 
-@@ -2364,8 +2357,8 @@ msgstr "파일"
- 
- # translation auto-copied from project subscription-manager, version 1.11.X,
- # document keys
--#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
--#: dnf/cli/output.py:1772 dnf/cli/output.py:1774
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652
-+#: dnf/cli/output.py:1654 dnf/util.py:591
- msgid "Installed"
- msgstr "설치됨"
- 
-@@ -2688,13 +2681,13 @@ msgstr "‘%s' 인수를 인코딩할 수 없습니다: %s"
- #. Translators: This is abbreviated 'Name'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:505
-+#: dnf/cli/output.py:459
- msgctxt "short"
- msgid "Name"
- msgstr "이름"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:511
-+#: dnf/cli/output.py:465
- msgid "Epoch"
- msgstr "기간"
- 
-@@ -2702,38 +2695,38 @@ msgstr "기간"
- #. use the full (unabbreviated) term 'Version' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:512 dnf/cli/output.py:1335
-+#: dnf/cli/output.py:466 dnf/cli/output.py:1248
- msgctxt "short"
- msgid "Version"
- msgstr "버전"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1337
-+#: dnf/cli/output.py:467 dnf/cli/output.py:1250
- msgctxt "long"
- msgid "Version"
- msgstr "버전"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:516
-+#: dnf/cli/output.py:470
- msgid "Release"
- msgstr "릴리즈"
- 
- #. Translators: This is abbreviated 'Architecture', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:517 dnf/cli/output.py:1326
-+#: dnf/cli/output.py:471 dnf/cli/output.py:1239
- msgctxt "short"
- msgid "Arch"
- msgstr "아키텍처"
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:472 dnf/cli/output.py:1242
- msgctxt "long"
- msgid "Architecture"
- msgstr "아키텍처"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1352
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1265
- msgctxt "long"
- msgid "Size"
- msgstr "크기"
-@@ -2742,32 +2735,32 @@ msgstr "크기"
- #. not be longer than 5 characters. If the term 'Size' in your
- #. language is not longer than 5 characters then you can use it
- #. unabbreviated.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1350
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1263
- msgctxt "short"
- msgid "Size"
- msgstr "크기"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:524
-+#: dnf/cli/output.py:478
- msgid "Source"
- msgstr "소스"
- 
- #. Translators: This is abbreviated 'Repository', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:525 dnf/cli/output.py:1341
-+#: dnf/cli/output.py:479 dnf/cli/output.py:1254
- msgctxt "short"
- msgid "Repo"
- msgstr "리포지터리"
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:480 dnf/cli/output.py:1257
- msgctxt "long"
- msgid "Repository"
- msgstr "리포지터리"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:533
-+#: dnf/cli/output.py:487
- msgid "From repo"
- msgstr "리포지터리에서"
- 
-@@ -2775,314 +2768,310 @@ msgstr "리포지터리에서"
- #. print(_("Committer   : %s") % ucd(pkg.committer))
- #. print(_("Committime  : %s") % time.ctime(pkg.committime))
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:539
-+#: dnf/cli/output.py:493
- msgid "Packager"
- msgstr "패키지 프로그램"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:541
-+#: dnf/cli/output.py:495
- msgid "Buildtime"
- msgstr "빌드 시간"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:545
-+#: dnf/cli/output.py:499
- msgid "Install time"
- msgstr "설치 시간"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:554
-+#: dnf/cli/output.py:508
- msgid "Installed by"
- msgstr "설치자"
- 
- #. Translators: This is abbreviated 'Summary'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:558
-+#: dnf/cli/output.py:512
- msgctxt "short"
- msgid "Summary"
- msgstr "요약"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:564
-+#: dnf/cli/output.py:518
- msgid "License"
- msgstr "라이센스"
- 
- #. Translators: This is abbreviated 'Description'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:568
-+#: dnf/cli/output.py:522
- msgctxt "short"
- msgid "Description"
- msgstr "설명"
- 
--#: dnf/cli/output.py:695
--msgid "No packages to list"
--msgstr "목록에 패키지가 없습니다"
--
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "y"
- msgstr "y"
- 
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "yes"
- msgstr "예"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "n"
- msgstr "n"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "no"
- msgstr "아니요"
- 
--#: dnf/cli/output.py:711
-+#: dnf/cli/output.py:655
- msgid "Is this ok [y/N]: "
- msgstr "정말입니까 [y/N]: "
- 
--#: dnf/cli/output.py:715
-+#: dnf/cli/output.py:659
- msgid "Is this ok [Y/n]: "
- msgstr "정말입니까 [Y/n]: "
- 
--#: dnf/cli/output.py:795
-+#: dnf/cli/output.py:739
- #, python-format
- msgid "Group: %s"
- msgstr "그룹 %s"
- 
--#: dnf/cli/output.py:799
-+#: dnf/cli/output.py:743
- #, python-format
- msgid " Group-Id: %s"
- msgstr " 그룹 ID: %s"
- 
--#: dnf/cli/output.py:801 dnf/cli/output.py:840
-+#: dnf/cli/output.py:745 dnf/cli/output.py:784
- #, python-format
- msgid " Description: %s"
- msgstr " 설명: %s"
- 
--#: dnf/cli/output.py:803
-+#: dnf/cli/output.py:747
- #, python-format
- msgid " Language: %s"
- msgstr " 언어: %s"
- 
--#: dnf/cli/output.py:806
-+#: dnf/cli/output.py:750
- msgid " Mandatory Packages:"
- msgstr " 필수 패키지 :"
- 
--#: dnf/cli/output.py:807
-+#: dnf/cli/output.py:751
- msgid " Default Packages:"
- msgstr " 기본 패키지 :"
- 
--#: dnf/cli/output.py:808
-+#: dnf/cli/output.py:752
- msgid " Optional Packages:"
- msgstr " 선택적인 패키지 :"
- 
--#: dnf/cli/output.py:809
-+#: dnf/cli/output.py:753
- msgid " Conditional Packages:"
- msgstr " 추가 가능 패키지 :"
- 
--#: dnf/cli/output.py:834
-+#: dnf/cli/output.py:778
- #, python-format
- msgid "Environment Group: %s"
- msgstr "환경 그룹 : %s"
- 
--#: dnf/cli/output.py:837
-+#: dnf/cli/output.py:781
- #, python-format
- msgid " Environment-Id: %s"
- msgstr " 환경 -ID : %s"
- 
--#: dnf/cli/output.py:843
-+#: dnf/cli/output.py:787
- msgid " Mandatory Groups:"
- msgstr " 필수 그룹 :"
- 
--#: dnf/cli/output.py:844
-+#: dnf/cli/output.py:788
- msgid " Optional Groups:"
- msgstr " 선택적인 그룹 :"
- 
--#: dnf/cli/output.py:865
-+#: dnf/cli/output.py:809
- msgid "Matched from:"
- msgstr "일치하는 항목 :"
- 
--#: dnf/cli/output.py:879
-+#: dnf/cli/output.py:823
- #, python-format
- msgid "Filename    : %s"
- msgstr "파일 이름 : %s"
- 
--#: dnf/cli/output.py:904
-+#: dnf/cli/output.py:848
- #, python-format
- msgid "Repo        : %s"
- msgstr "리포지토리      : %s"
- 
--#: dnf/cli/output.py:913
-+#: dnf/cli/output.py:857
- msgid "Description : "
- msgstr "설명 : "
- 
--#: dnf/cli/output.py:917
-+#: dnf/cli/output.py:861
- #, python-format
- msgid "URL         : %s"
- msgstr "URL         : %s"
- 
--#: dnf/cli/output.py:921
-+#: dnf/cli/output.py:865
- #, python-format
- msgid "License     : %s"
- msgstr "라이센스    : %s"
- 
--#: dnf/cli/output.py:927
-+#: dnf/cli/output.py:871
- #, python-format
- msgid "Provide    : %s"
- msgstr "제공        : %s"
- 
--#: dnf/cli/output.py:947
-+#: dnf/cli/output.py:891
- #, python-format
- msgid "Other       : %s"
- msgstr "기타       : %s"
- 
--#: dnf/cli/output.py:996
-+#: dnf/cli/output.py:940
- msgid "There was an error calculating total download size"
- msgstr "총 다운로드 크기를 계산하는 중에 오류가 발생했습니다"
- 
--#: dnf/cli/output.py:1002
-+#: dnf/cli/output.py:946
- #, python-format
- msgid "Total size: %s"
- msgstr "전체 크기: %s"
- 
--#: dnf/cli/output.py:1005
-+#: dnf/cli/output.py:949
- #, python-format
- msgid "Total download size: %s"
- msgstr "총 다운로드 크기 : %s"
- 
--#: dnf/cli/output.py:1008
-+#: dnf/cli/output.py:952
- #, python-format
- msgid "Installed size: %s"
- msgstr "설치된 크기 : %s"
- 
--#: dnf/cli/output.py:1026
-+#: dnf/cli/output.py:970
- msgid "There was an error calculating installed size"
- msgstr "설치된 크기를 계산하는 동안 오류가 발생했습니다"
- 
--#: dnf/cli/output.py:1030
-+#: dnf/cli/output.py:974
- #, python-format
- msgid "Freed space: %s"
- msgstr "사용 가능한 공간 : %s"
- 
--#: dnf/cli/output.py:1039
-+#: dnf/cli/output.py:983
- msgid "Marking packages as installed by the group:"
- msgstr "그룹에 설치된 패키지 표시:"
- 
--#: dnf/cli/output.py:1046
-+#: dnf/cli/output.py:990
- msgid "Marking packages as removed by the group:"
- msgstr "그룹에 의해 제거된 패키지 표시:"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Group"
- msgstr "그룹"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Packages"
- msgstr "패키지"
- 
--#: dnf/cli/output.py:1133
-+#: dnf/cli/output.py:1046
- msgid "Installing group/module packages"
- msgstr "그룹 / 모듈 패키지 설치"
- 
--#: dnf/cli/output.py:1134
-+#: dnf/cli/output.py:1047
- msgid "Installing group packages"
- msgstr "그룹 패키지 설치"
- 
- #. TRANSLATORS: This is for a list of packages to be installed.
--#: dnf/cli/output.py:1138
-+#: dnf/cli/output.py:1051
- msgctxt "summary"
- msgid "Installing"
- msgstr "설치 중"
- 
- #. TRANSLATORS: This is for a list of packages to be upgraded.
--#: dnf/cli/output.py:1140
-+#: dnf/cli/output.py:1053
- msgctxt "summary"
- msgid "Upgrading"
- msgstr "업그레이드 중"
- 
- #. TRANSLATORS: This is for a list of packages to be reinstalled.
--#: dnf/cli/output.py:1142
-+#: dnf/cli/output.py:1055
- msgctxt "summary"
- msgid "Reinstalling"
- msgstr "재설치 중"
- 
--#: dnf/cli/output.py:1144
-+#: dnf/cli/output.py:1057
- msgid "Installing dependencies"
- msgstr "종속 패키지 설치 중"
- 
--#: dnf/cli/output.py:1145
-+#: dnf/cli/output.py:1058
- msgid "Installing weak dependencies"
- msgstr "취약한 종속 패키지 설치 중"
- 
- #. TRANSLATORS: This is for a list of packages to be removed.
- # translation auto-copied from project subscription-manager, version 1.11.X,
- # document keys
--#: dnf/cli/output.py:1147
-+#: dnf/cli/output.py:1060
- msgid "Removing"
- msgstr "삭제 중"
- 
--#: dnf/cli/output.py:1148
-+#: dnf/cli/output.py:1061
- msgid "Removing dependent packages"
- msgstr "종속 패키지 제거"
- 
--#: dnf/cli/output.py:1149
-+#: dnf/cli/output.py:1062
- msgid "Removing unused dependencies"
- msgstr "사용하지 않는 종속 패키지 제거"
- 
- #. TRANSLATORS: This is for a list of packages to be downgraded.
--#: dnf/cli/output.py:1151
-+#: dnf/cli/output.py:1064
- msgctxt "summary"
- msgid "Downgrading"
- msgstr "다운그레이드 중"
- 
--#: dnf/cli/output.py:1176
-+#: dnf/cli/output.py:1089
- msgid "Installing module profiles"
- msgstr "모듈 프로파일 설치"
- 
--#: dnf/cli/output.py:1185
-+#: dnf/cli/output.py:1098
- msgid "Disabling module profiles"
- msgstr "모듈 프로파일 비활성화"
- 
--#: dnf/cli/output.py:1194
-+#: dnf/cli/output.py:1107
- msgid "Enabling module streams"
- msgstr "모듈 스트림 활성화"
- 
--#: dnf/cli/output.py:1202
-+#: dnf/cli/output.py:1115
- msgid "Switching module streams"
- msgstr "모듈 스트림 전환"
- 
--#: dnf/cli/output.py:1210
-+#: dnf/cli/output.py:1123
- msgid "Disabling modules"
- msgstr "모듈 비활성화"
- 
--#: dnf/cli/output.py:1218
-+#: dnf/cli/output.py:1131
- msgid "Resetting modules"
- msgstr "모듈 재설정"
- 
--#: dnf/cli/output.py:1230
-+#: dnf/cli/output.py:1143
- msgid "Installing Environment Groups"
- msgstr "환경 그룹 설치"
- 
--#: dnf/cli/output.py:1237
-+#: dnf/cli/output.py:1150
- msgid "Upgrading Environment Groups"
- msgstr "환경 그룹 업그레이드"
- 
--#: dnf/cli/output.py:1244
-+#: dnf/cli/output.py:1157
- msgid "Removing Environment Groups"
- msgstr "환경 그룹 제거"
- 
--#: dnf/cli/output.py:1251
-+#: dnf/cli/output.py:1164
- msgid "Installing Groups"
- msgstr "그룹 설치"
- 
--#: dnf/cli/output.py:1258
-+#: dnf/cli/output.py:1171
- msgid "Upgrading Groups"
- msgstr "그룹 업그레이드"
- 
--#: dnf/cli/output.py:1265
-+#: dnf/cli/output.py:1178
- msgid "Removing Groups"
- msgstr "그룹 제거"
- 
--#: dnf/cli/output.py:1281
-+#: dnf/cli/output.py:1194
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
-@@ -3091,12 +3080,12 @@ msgstr ""
- "충돌 패키지 건너 뛰기 :\n"
- "(업그레이드를 강제하려면 명령행에 '%s' 추가)"
- 
--#: dnf/cli/output.py:1291
-+#: dnf/cli/output.py:1204
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr "손상된 종속성이 있는 %s 패키지 건너 뛰기"
- 
--#: dnf/cli/output.py:1295
-+#: dnf/cli/output.py:1208
- msgid " or part of a group"
- msgstr " 또는 그룹의 일부"
- 
-@@ -3104,22 +3093,22 @@ msgstr " 또는 그룹의 일부"
- #. use the full (unabbreviated) term 'Package' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:1320
-+#: dnf/cli/output.py:1233
- msgctxt "short"
- msgid "Package"
- msgstr "패키지"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
--#: dnf/cli/output.py:1322
-+#: dnf/cli/output.py:1235
- msgctxt "long"
- msgid "Package"
- msgstr "패키지"
- 
--#: dnf/cli/output.py:1371
-+#: dnf/cli/output.py:1284
- msgid "replacing"
- msgstr "교체"
- 
--#: dnf/cli/output.py:1378
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid ""
- "\n"
-@@ -3131,292 +3120,276 @@ msgstr ""
- "%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933
-+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813
- msgid "Install"
- msgstr "설치"
- 
- # ctx::sourcefile::Navigation Menu
--#: dnf/cli/output.py:1387 dnf/cli/output.py:1941
-+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821
- msgid "Upgrade"
- msgstr "업그레이드"
- 
--#: dnf/cli/output.py:1388
-+#: dnf/cli/output.py:1301
- msgid "Remove"
- msgstr "삭제"
- 
--#: dnf/cli/output.py:1390 dnf/cli/output.py:1939
-+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819
- msgid "Downgrade"
- msgstr "다운 그레이드"
- 
--#: dnf/cli/output.py:1391
-+#: dnf/cli/output.py:1304
- msgid "Skip"
- msgstr "건너뛰기"
- 
--#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
-+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] "패키지"
- 
--#: dnf/cli/output.py:1418
-+#: dnf/cli/output.py:1331
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "종속 패키지"
- 
--#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942
--msgid "Upgraded"
--msgstr "업그레이드 됨"
--
--#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940
--msgid "Downgraded"
--msgstr "다운 그레이드"
--
--#: dnf/cli/output.py:1503
--msgid "Reinstalled"
--msgstr "다시 설치됨"
--
--#: dnf/cli/output.py:1504
--msgid "Skipped"
--msgstr "건너 뛰기됨"
--
--#: dnf/cli/output.py:1505
--msgid "Removed"
--msgstr "제거됨"
--
--#: dnf/cli/output.py:1508
--msgid "Failed"
--msgstr "실패하였습니다"
--
- # auto translated by TM merge from project: RHOSP Director Installation and
- # Usage , version: 11-Korean, DocId: master
--#: dnf/cli/output.py:1559
-+#: dnf/cli/output.py:1439
- msgid "Total"
- msgstr "합계"
- 
--#: dnf/cli/output.py:1587
-+#: dnf/cli/output.py:1467
- msgid "<unset>"
- msgstr "<unset>"
- 
--#: dnf/cli/output.py:1588
-+#: dnf/cli/output.py:1468
- msgid "System"
- msgstr "시스템"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1518
- msgid "Command line"
- msgstr "명령행"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1649
-+#: dnf/cli/output.py:1529
- msgid "User name"
- msgstr "사용자 이름"
- 
- # translation auto-copied from project subscription-manager, version 1.11.X,
- # document keys
--#: dnf/cli/output.py:1651
-+#: dnf/cli/output.py:1531
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1653
-+#: dnf/cli/output.py:1533
- msgid "Date and time"
- msgstr "날짜와 시간"
- 
--#: dnf/cli/output.py:1654
-+#: dnf/cli/output.py:1534
- msgid "Action(s)"
- msgstr "작업"
- 
--#: dnf/cli/output.py:1655
-+#: dnf/cli/output.py:1535
- msgid "Altered"
- msgstr "변경됨"
- 
--#: dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1578
- msgid "No transactions"
- msgstr "트랜잭션 없음"
- 
--#: dnf/cli/output.py:1699 dnf/cli/output.py:1715
-+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595
- msgid "Failed history info"
- msgstr "실패 기록 정보"
- 
--#: dnf/cli/output.py:1714
-+#: dnf/cli/output.py:1594
- msgid "No transaction ID, or package, given"
- msgstr "트랜잭션 ID 또는 패키지가 지정되지 않았습니다"
- 
--#: dnf/cli/output.py:1772
-+#: dnf/cli/output.py:1652
- msgid "Erased"
- msgstr "삭제됨"
- 
--#: dnf/cli/output.py:1774
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590
-+msgid "Downgraded"
-+msgstr "다운 그레이드"
-+
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589
-+msgid "Upgraded"
-+msgstr "업그레이드 됨"
-+
-+#: dnf/cli/output.py:1654
- msgid "Not installed"
- msgstr "설치되지 않음"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Newer"
- msgstr "최신"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Older"
- msgstr "이전"
- 
--#: dnf/cli/output.py:1823 dnf/cli/output.py:1825
-+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705
- msgid "Transaction ID :"
- msgstr "트랜잭션 ID :"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1708
- msgid "Begin time     :"
- msgstr "시작 시간 :"
- 
--#: dnf/cli/output.py:1831 dnf/cli/output.py:1833
-+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713
- msgid "Begin rpmdb    :"
- msgstr "rpmdb 시작 :"
- 
--#: dnf/cli/output.py:1839
-+#: dnf/cli/output.py:1719
- #, python-format
- msgid "(%u seconds)"
- msgstr "(%u 초)"
- 
--#: dnf/cli/output.py:1841
-+#: dnf/cli/output.py:1721
- #, python-format
- msgid "(%u minutes)"
- msgstr "(%u 분)"
- 
--#: dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1723
- #, python-format
- msgid "(%u hours)"
- msgstr "(%u 시간)"
- 
--#: dnf/cli/output.py:1845
-+#: dnf/cli/output.py:1725
- #, python-format
- msgid "(%u days)"
- msgstr "(%u 일)"
- 
--#: dnf/cli/output.py:1846
-+#: dnf/cli/output.py:1726
- msgid "End time       :"
- msgstr "종료 시간 :"
- 
--#: dnf/cli/output.py:1849 dnf/cli/output.py:1851
-+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731
- msgid "End rpmdb      :"
- msgstr "rpmdb 종료:"
- 
--#: dnf/cli/output.py:1858 dnf/cli/output.py:1860
-+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740
- msgid "User           :"
- msgstr "사용자            :"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1871
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751
- msgid "Aborted"
- msgstr "중지됨"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869
--#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749
-+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755
- msgid "Return-Code    :"
- msgstr "반환 코드 :"
- 
--#: dnf/cli/output.py:1867 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755
- msgid "Success"
- msgstr "성공"
- 
--#: dnf/cli/output.py:1869
-+#: dnf/cli/output.py:1749
- msgid "Failures:"
- msgstr "실패 :"
- 
--#: dnf/cli/output.py:1873
-+#: dnf/cli/output.py:1753
- msgid "Failure:"
- msgstr "실패:"
- 
--#: dnf/cli/output.py:1883 dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765
- msgid "Releasever     :"
- msgstr "Releasever     :"
- 
--#: dnf/cli/output.py:1890 dnf/cli/output.py:1892
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Command Line   :"
- msgstr "명령 줄 :"
- 
--#: dnf/cli/output.py:1897 dnf/cli/output.py:1899
-+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779
- msgid "Comment        :"
- msgstr "댓글 :"
- 
--#: dnf/cli/output.py:1903
-+#: dnf/cli/output.py:1783
- msgid "Transaction performed with:"
- msgstr "실행된 트랜잭션:"
- 
--#: dnf/cli/output.py:1912
-+#: dnf/cli/output.py:1792
- msgid "Packages Altered:"
- msgstr "변경된 패키지 :"
- 
--#: dnf/cli/output.py:1918
-+#: dnf/cli/output.py:1798
- msgid "Scriptlet output:"
- msgstr "Scriptlet 출력 :"
- 
--#: dnf/cli/output.py:1925
-+#: dnf/cli/output.py:1805
- msgid "Errors:"
- msgstr "오류 :"
- 
--#: dnf/cli/output.py:1934
-+#: dnf/cli/output.py:1814
- msgid "Dep-Install"
- msgstr "Dep-Install"
- 
--#: dnf/cli/output.py:1935
-+#: dnf/cli/output.py:1815
- msgid "Obsoleted"
- msgstr "사용 중지됨"
- 
--#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "사용 중지"
- 
--#: dnf/cli/output.py:1937
-+#: dnf/cli/output.py:1817
- msgid "Erase"
- msgstr "삭제"
- 
--#: dnf/cli/output.py:1938
-+#: dnf/cli/output.py:1818
- msgid "Reinstall"
- msgstr "재설치"
- 
--#: dnf/cli/output.py:2016
-+#: dnf/cli/output.py:1892
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr "---> 패키지 %s.%s %s이/가 설치됩니다"
- 
--#: dnf/cli/output.py:2018
-+#: dnf/cli/output.py:1894
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
- msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다"
- 
--#: dnf/cli/output.py:2020
-+#: dnf/cli/output.py:1896
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr "---> 패키지 %s.%s %s이/가 제거됩니다"
- 
--#: dnf/cli/output.py:2022
-+#: dnf/cli/output.py:1898
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr "---> 패키지 %s.%s %s이/가 다시 설치됩니다"
- 
--#: dnf/cli/output.py:2024
-+#: dnf/cli/output.py:1900
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
- msgstr "---> 패키지 %s.%s %s이/가 다운그레이드됩니다"
- 
--#: dnf/cli/output.py:2026
-+#: dnf/cli/output.py:1902
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다"
- 
--#: dnf/cli/output.py:2028
-+#: dnf/cli/output.py:1904
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다"
- 
--#: dnf/cli/output.py:2030
-+#: dnf/cli/output.py:1906
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다"
- 
--#: dnf/cli/output.py:2039
-+#: dnf/cli/output.py:1915
- msgid "--> Starting dependency resolution"
- msgstr "-> 종석성 해결 시작"
- 
--#: dnf/cli/output.py:2044
-+#: dnf/cli/output.py:1919
- msgid "--> Finished dependency resolution"
- msgstr "-> 종속성 해결 완료"
- 
--#: dnf/cli/output.py:2058 dnf/crypto.py:132
-+#: dnf/cli/output.py:1933 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3503,7 +3476,7 @@ msgstr "모듈 또는 그룹 '%s'이/가 존재하지 않습니다."
- msgid "Environment id '%s' does not exist."
- msgstr "환경 '%s'이 설치되지 않았습니다."
- 
--#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453
-+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487
- #, fuzzy, python-format
- #| msgid "Environment '%s' is not installed."
- msgid "Environment id '%s' is not installed."
-@@ -3614,6 +3587,11 @@ msgstr "repo %s: 0x%s을/를 이미 가져왔습니다"
- msgid "repo %s: imported key 0x%s."
- msgstr "repo %s: 0x%s 키를 가져왔습니다."
- 
-+#: dnf/crypto.py:177
-+#, python-format
-+msgid "retrieving repo key for %s unencrypted from %s"
-+msgstr ""
-+
- #: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
-@@ -3698,7 +3676,7 @@ msgid "Modular dependency problem with Defaults:"
- msgid_plural "Modular dependency problems with Defaults:"
- msgstr[0] "기본값의 모듈 종속성 문제 :"
- 
--#: dnf/exceptions.py:131 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:841
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] "모듈 종속성 문제 :"
-@@ -3752,8 +3730,8 @@ msgstr ""
- "\n"
- "힌트 : [d] efault, [e] nabled, [x] disabled, [i] stalled, [a] ctive"
- 
--#: dnf/module/module_base.py:54 dnf/module/module_base.py:421
--#: dnf/module/module_base.py:477 dnf/module/module_base.py:543
-+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547
-+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669
- msgid "Ignoring unnecessary profile: '{}/{}'"
- msgstr "불필요한 프로파일을 무시합니다: '{}/{}'"
- 
-@@ -3762,17 +3740,17 @@ msgstr "불필요한 프로파일을 무시합니다: '{}/{}'"
- msgid "All matches for argument '{0}' in module '{1}:{2}' are not active"
- msgstr "모듈 '{1}:{2}'의 인수 '{0}'에 대한 모든 일치 항목이 활성화되지 않았습니다"
- 
--#: dnf/module/module_base.py:92
-+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 설치할 수 없습니다"
- 
--#: dnf/module/module_base.py:102
-+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
- msgstr "인수 {}의 프로파일을 찾을 수 없습니다. '{}:{}'에 사용 가능한 프로파일: {}"
- 
--#: dnf/module/module_base.py:106
-+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216
- msgid "Unable to match profile for argument {}"
- msgstr "인수 {}의 프로파일을 찾을 수 없습니다"
- 
-@@ -3788,41 +3766,58 @@ msgstr "{} : {} 모듈에 대한 프로파일이 없습니다"
- msgid "Default profile {} not available in module {}:{}"
- msgstr "{} 모듈에서 기본 프로필 {}을 (를) 사용할 수 없음 : {}"
- 
--#: dnf/module/module_base.py:142
-+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245
- msgid "Installing module from Fail-Safe repository is not allowed"
- msgstr "Fail-Safe 리포지토리에서 모듈을 설치할 수 없습니다"
- 
--#: dnf/module/module_base.py:159 dnf/module/module_base.py:193
--#: dnf/module/module_base.py:337 dnf/module/module_base.py:355
--#: dnf/module/module_base.py:363 dnf/module/module_base.py:417
--#: dnf/module/module_base.py:473 dnf/module/module_base.py:539
-+#: dnf/module/module_base.py:194
-+#, fuzzy, python-brace-format
-+#| msgid ""
-+#| "All matches for argument '{0}' in module '{1}:{2}' are not active"
-+msgid "No active matches for argument '{0}' in module '{1}:{2}'"
-+msgstr "모듈 '{1}:{2}'의 인수 '{0}'에 대한 모든 일치 항목이 활성화되지 않았습니다"
-+
-+#: dnf/module/module_base.py:226
-+#, fuzzy, python-brace-format
-+#| msgid "Default profile {} not available in module {}:{}"
-+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'"
-+msgstr "{} 모듈에서 기본 프로필 {}을 (를) 사용할 수 없음 : {}"
-+
-+#: dnf/module/module_base.py:265
-+msgid "No packages available to distrosync for package name '{}'"
-+msgstr ""
-+
-+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452
-+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496
-+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599
-+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827
- msgid "Unable to resolve argument {}"
- msgstr "인수 {}을 (를) 구문 분석할 수 없습니다"
- 
--#: dnf/module/module_base.py:160
--msgid "No match for package {}"
--msgstr "{} 패키지와 일치하지 않습니다"
--
--#: dnf/module/module_base.py:204
-+#: dnf/module/module_base.py:319
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 업그레이드할 수 없습니다"
- 
--#: dnf/module/module_base.py:223 dnf/module/module_base.py:251
-+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366
- msgid "Unable to match profile in argument {}"
- msgstr "인수 {}에서 프로파일이 일치하지 않습니다"
- 
--#: dnf/module/module_base.py:231
-+#: dnf/module/module_base.py:346
- msgid "Upgrading module from Fail-Safe repository is not allowed"
- msgstr "Fail-Safe 리포지토리에서 모듈을 업그레이드할 수 없습니다"
- 
--#: dnf/module/module_base.py:367
-+#: dnf/module/module_base.py:500
- msgid ""
- "Only module name is required. Ignoring unneeded information in argument: "
- "'{}'"
- msgstr "모듈 이름만 필요합니다. '{}'인수에서 불필요한 정보를 무시합니다"
- 
--#: dnf/package.py:298
-+#: dnf/module/module_base.py:828
-+msgid "No match for package {}"
-+msgstr "{} 패키지와 일치하지 않습니다"
-+
-+#: dnf/package.py:333
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s: %s 확인 실패 : %s 대 %s"
-@@ -3903,6 +3898,12 @@ msgstr "%s 에서 %s repo를 추가했습니다"
- msgid "Errors occurred during test transaction."
- msgstr "트랜잭션 테스트 중에 오류가 발생했습니다."
- 
-+#: dnf/sack.py:47
-+msgid ""
-+"allow_vendor_change is disabled. This option is currently not supported for "
-+"downgrade and distro-sync commands"
-+msgstr ""
-+
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
- msgctxt "currently"
-@@ -3949,163 +3950,199 @@ msgstr "scriptlet 실행 중"
- msgid "Preparing"
- msgstr "준비 중"
- 
--#: dnf/transaction_sr.py:60
-+#: dnf/transaction_sr.py:66
- #, python-brace-format
--msgid "Errors in \"{filename}\":"
-+msgid ""
-+"The following problems occurred while replaying the transaction from file "
-+"\"{filename}\":"
- msgstr ""
- 
--#: dnf/transaction_sr.py:70
--#, python-brace-format
--msgid "Error in \"{filename}\": {error}"
--msgstr ""
-+#: dnf/transaction_sr.py:68
-+#, fuzzy
-+#| msgid "Errors occurred during transaction."
-+msgid "The following problems occurred while running a transaction:"
-+msgstr "트랜잭션 중에 오류가 발생했습니다."
- 
--#: dnf/transaction_sr.py:87
-+#: dnf/transaction_sr.py:89
- #, python-brace-format
- msgid "Invalid major version \"{major}\", number expected."
- msgstr ""
- 
--#: dnf/transaction_sr.py:95
-+#: dnf/transaction_sr.py:97
- #, python-brace-format
- msgid "Invalid minor version \"{minor}\", number expected."
- msgstr ""
- 
--#: dnf/transaction_sr.py:101
-+#: dnf/transaction_sr.py:103
- #, python-brace-format
- msgid ""
- "Incompatible major version \"{major}\", supported major version is "
- "\"{major_supp}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:244
-+#: dnf/transaction_sr.py:224
-+msgid ""
-+"Conflicting TransactionReplay arguments have been specified: filename, data"
-+msgstr ""
-+
-+#: dnf/transaction_sr.py:265
- #, python-brace-format
- msgid "Unexpected type of \"{id}\", {exp} expected."
- msgstr ""
- 
--#: dnf/transaction_sr.py:250
-+#: dnf/transaction_sr.py:271
- #, python-brace-format
- msgid "Missing key \"{key}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:263
-+#: dnf/transaction_sr.py:285
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an rpm."
- msgstr ""
- 
--#: dnf/transaction_sr.py:267
-+#: dnf/transaction_sr.py:289
- #, python-brace-format
- msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:275
-+#: dnf/transaction_sr.py:297
- #, python-brace-format
- msgid "Cannot parse NEVRA for package \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:286
-+#: dnf/transaction_sr.py:321
- #, python-brace-format
- msgid "Cannot find rpm nevra \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:301
-+#: dnf/transaction_sr.py:336
- #, python-brace-format
- msgid "Package \"{na}\" is already installed for action \"{action}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:311
-+#: dnf/transaction_sr.py:345
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\" not available in repositories for action "
- "\"{action}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:322
-+#: dnf/transaction_sr.py:356
- #, python-brace-format
- msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:336
-+#: dnf/transaction_sr.py:370
- #, python-brace-format
- msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:343
-+#: dnf/transaction_sr.py:377
- #, fuzzy, python-format
- #| msgid "Group_id '%s' does not exist."
- msgid "Group id '%s' is not available."
- msgstr "Group_id '%s' 존재하지 않는다."
- 
--#: dnf/transaction_sr.py:364
-+#: dnf/transaction_sr.py:398
- #, python-brace-format
- msgid "Missing object key \"{key}\" in groups.packages."
- msgstr ""
- 
--#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387
-+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421
- #, fuzzy, python-format
- #| msgid "Environment '%s' is not installed."
- msgid "Group id '%s' is not installed."
- msgstr "환경 '%s'이 설치되지 않았습니다."
- 
--#: dnf/transaction_sr.py:398
-+#: dnf/transaction_sr.py:432
- #, fuzzy, python-format
- #| msgid "Environment '%s' is not installed."
- msgid "Environment id '%s' is not available."
- msgstr "환경 '%s'이 설치되지 않았습니다."
- 
--#: dnf/transaction_sr.py:422
-+#: dnf/transaction_sr.py:456
- #, python-brace-format
- msgid ""
- "Invalid value \"{group_type}\" of environments.groups.group_type, only "
- "\"mandatory\" or \"optional\" is supported."
- msgstr ""
- 
--#: dnf/transaction_sr.py:430
-+#: dnf/transaction_sr.py:464
- #, python-brace-format
- msgid "Missing object key \"{key}\" in environments.groups."
- msgstr ""
- 
--#: dnf/transaction_sr.py:508
-+#: dnf/transaction_sr.py:542
- #, python-brace-format
- msgid "Unexpected value of group action \"{action}\" for group \"{group}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:513
-+#: dnf/transaction_sr.py:547
- #, python-brace-format
- msgid "Missing object key \"{key}\" in a group."
- msgstr ""
- 
--#: dnf/transaction_sr.py:537
-+#: dnf/transaction_sr.py:571
- #, python-brace-format
- msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"."
- msgstr ""
- 
--#: dnf/transaction_sr.py:542
-+#: dnf/transaction_sr.py:576
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an environment."
- msgstr ""
- 
--#: dnf/transaction_sr.py:581
-+#: dnf/transaction_sr.py:615
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\", which is not present in the transaction file, was"
- " pulled into the transaction."
- msgstr ""
- 
--#: dnf/util.py:391 dnf/util.py:393
-+#: dnf/util.py:393 dnf/util.py:395
- msgid "Problem"
- msgstr "문제"
- 
--#: dnf/util.py:444
-+#: dnf/util.py:446
- msgid "TransactionItem not found for key: {}"
- msgstr "{} 키에 대한 TransactionItem을 찾을 수 없습니다"
- 
--#: dnf/util.py:454
-+#: dnf/util.py:456
- msgid "TransactionSWDBItem not found for key: {}"
- msgstr "{} 키에 대한 TransactionSWDBItem을 찾을 수 없습니다"
- 
--#: dnf/util.py:457
-+#: dnf/util.py:459
- msgid "Errors occurred during transaction."
- msgstr "트랜잭션 중에 오류가 발생했습니다."
- 
-+#: dnf/util.py:595
-+msgid "Reinstalled"
-+msgstr "다시 설치됨"
-+
-+#: dnf/util.py:596
-+msgid "Skipped"
-+msgstr "건너 뛰기됨"
-+
-+#: dnf/util.py:597
-+msgid "Removed"
-+msgstr "제거됨"
-+
-+#: dnf/util.py:600
-+msgid "Failed"
-+msgstr "실패하였습니다"
-+
-+#~ msgid "Action not handled: {}"
-+#~ msgstr "작업이 처리되지 않았습니다: {}"
-+
-+#~ msgid "no package matched"
-+#~ msgstr "일치하는 패키지가 없습니다."
-+
-+#~ msgid "Not found given transaction ID"
-+#~ msgstr "주어진 트랜잭션 ID를 찾을 수 없습니다"
-+
-+#~ msgid "Undoing transaction {}, from {}"
-+#~ msgstr "{}에서 {} 트랜잭션 실행을 취소하고 있습니다"
-+
- #~ msgid "format for displaying found packages"
- #~ msgstr "발견 된 패키지를 표시하기위한 형식"
- 
-diff --git a/po/zh_CN.po b/po/zh_CN.po
-index 7ede4ed8..d1c433a3 100644
---- a/po/zh_CN.po
-+++ b/po/zh_CN.po
-@@ -26,20 +26,21 @@
- # Anonymous <noreply@weblate.org>, 2020.
- # Hongqiao Chen <harrychen0314@gmail.com>, 2020.
- # Harry Chen <harrychen0314@gmail.com>, 2020.
-+# Sundeep Anand <suanand@redhat.com>, 2021.
- msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-10-05 09:18-0400\n"
--"PO-Revision-Date: 2020-08-02 08:29+0000\n"
--"Last-Translator: Charles Lee <lchopn@gmail.com>\n"
--"Language-Team: Chinese (Simplified) <https://translate.fedoraproject.org/projects/dnf/dnf-master/zh_CN/>\n"
-+"POT-Creation-Date: 2021-02-22 09:22+0100\n"
-+"PO-Revision-Date: 2021-03-08 10:29+0000\n"
-+"Last-Translator: Sundeep Anand <suanand@redhat.com>\n"
-+"Language-Team: Chinese (Simplified) <https://translate.fedoraproject.org/projects/dnf/dnf-rhel-8/zh_CN/>\n"
- "Language: zh_CN\n"
- "MIME-Version: 1.0\n"
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
- "Plural-Forms: nplurals=1; plural=0;\n"
--"X-Generator: Weblate 4.1.1\n"
-+"X-Generator: Weblate 4.5.1\n"
- 
- #: dnf/automatic/emitter.py:32
- #, python-format
-@@ -96,7 +97,7 @@ msgstr "未知配置值: %s=%s 在 %s 中; %s"
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr "未知配置选项:%s = %s 在 %s 中"
- 
--#: dnf/automatic/main.py:237 dnf/cli/cli.py:299
-+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304
- msgid "GPG check FAILED"
- msgstr "GPG 检查失败"
- 
-@@ -109,9 +110,9 @@ msgid "Started dnf-automatic."
- msgstr "启动的 dnf-automatic。"
- 
- #: dnf/automatic/main.py:308
--#, python-format
--msgid "Sleep for %s seconds"
--msgstr "休眠 %s 秒"
-+msgid "Sleep for {} second"
-+msgid_plural "Sleep for {} seconds"
-+msgstr[0] "休眠 {} 秒"
- 
- #: dnf/automatic/main.py:315
- msgid "System is off-line."
-@@ -123,7 +124,7 @@ msgstr "系统离线。"
- msgid "Error: %s"
- msgstr "错误:%s"
- 
--#: dnf/base.py:146
-+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474
- msgid "loading repo '{}' failure: {}"
- msgstr "加载仓库 '{}' 失败:{}"
- 
-@@ -131,236 +132,236 @@ msgstr "加载仓库 '{}' 失败:{}"
- msgid "Loading repository '{}' has failed"
- msgstr "加载仓库 '{}' 失败"
- 
--#: dnf/base.py:320
-+#: dnf/base.py:322
- msgid "Metadata timer caching disabled when running on metered connection."
- msgstr "在使用按流量计费的连接时禁用元数据计时缓存。"
- 
--#: dnf/base.py:325
-+#: dnf/base.py:327
- msgid "Metadata timer caching disabled when running on a battery."
- msgstr "在使用电池时禁用元数据计时缓存。"
- 
--#: dnf/base.py:330
-+#: dnf/base.py:332
- msgid "Metadata timer caching disabled."
- msgstr "元数据计时缓存已禁用。"
- 
--#: dnf/base.py:335
-+#: dnf/base.py:337
- msgid "Metadata cache refreshed recently."
- msgstr "元数据缓存近期已刷新。"
- 
--#: dnf/base.py:341 dnf/cli/commands/__init__.py:91
-+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91
- msgid "There are no enabled repositories in \"{}\"."
- msgstr "在\"{}\"中没有被启用的仓库。"
- 
--#: dnf/base.py:348
-+#: dnf/base.py:350
- #, python-format
- msgid "%s: will never be expired and will not be refreshed."
- msgstr "%s: 永远不过期并不会被刷新。"
- 
--#: dnf/base.py:350
-+#: dnf/base.py:352
- #, python-format
- msgid "%s: has expired and will be refreshed."
- msgstr "%s: 已过期并不会被刷新。"
- 
- #. expires within the checking period:
--#: dnf/base.py:354
-+#: dnf/base.py:356
- #, python-format
- msgid "%s: metadata will expire after %d seconds and will be refreshed now"
- msgstr "%s: 元数据将在 %d 秒后过期,现在将会被刷新"
- 
--#: dnf/base.py:358
-+#: dnf/base.py:360
- #, python-format
- msgid "%s: will expire after %d seconds."
- msgstr "%s: 将会在 %d 秒后过期。"
- 
- #. performs the md sync
--#: dnf/base.py:364
-+#: dnf/base.py:366
- msgid "Metadata cache created."
- msgstr "元数据缓存已建立。"
- 
--#: dnf/base.py:397
-+#: dnf/base.py:399 dnf/base.py:466
- #, python-format
- msgid "%s: using metadata from %s."
- msgstr "%s:正在使用截止于 %s 的元数据。"
- 
--#: dnf/base.py:409
-+#: dnf/base.py:411 dnf/base.py:479
- #, python-format
- msgid "Ignoring repositories: %s"
- msgstr "正在忽略仓库:%s"
- 
--#: dnf/base.py:412
-+#: dnf/base.py:414
- #, python-format
- msgid "Last metadata expiration check: %s ago on %s."
- msgstr "上次元数据过期检查:%s 前,执行于 %s。"
- 
--#: dnf/base.py:443
-+#: dnf/base.py:507
- msgid ""
- "The downloaded packages were saved in cache until the next successful "
- "transaction."
- msgstr "下载的软件包保存在缓存中,直到下次成功执行事务。"
- 
--#: dnf/base.py:445
-+#: dnf/base.py:509
- #, python-format
- msgid "You can remove cached packages by executing '%s'."
- msgstr "您可以通过执行 '%s' 删除软件包缓存。"
- 
--#: dnf/base.py:535
-+#: dnf/base.py:599
- #, python-format
- msgid "Invalid tsflag in config file: %s"
- msgstr "配置文件 %s 中使用 tsflag 是错误的"
- 
--#: dnf/base.py:591
-+#: dnf/base.py:655
- #, python-format
- msgid "Failed to add groups file for repository: %s - %s"
- msgstr "为仓库 %s 添加组文件时失败:%s"
- 
--#: dnf/base.py:823
-+#: dnf/base.py:887
- msgid "Running transaction check"
- msgstr "运行事务检查"
- 
--#: dnf/base.py:831
-+#: dnf/base.py:895
- msgid "Error: transaction check vs depsolve:"
- msgstr "错误:事务检查与依赖解决错误:"
- 
--#: dnf/base.py:837
-+#: dnf/base.py:901
- msgid "Transaction check succeeded."
- msgstr "事务检查成功。"
- 
--#: dnf/base.py:840
-+#: dnf/base.py:904
- msgid "Running transaction test"
- msgstr "运行事务测试"
- 
--#: dnf/base.py:850 dnf/base.py:992
-+#: dnf/base.py:914 dnf/base.py:1065
- msgid "RPM: {}"
- msgstr "RPM软件包: {}"
- 
--#: dnf/base.py:851
-+#: dnf/base.py:915
- msgid "Transaction test error:"
- msgstr "事物测试失败:"
- 
--#: dnf/base.py:862
-+#: dnf/base.py:926
- msgid "Transaction test succeeded."
- msgstr "事务测试成功。"
- 
--#: dnf/base.py:883
-+#: dnf/base.py:947
- msgid "Running transaction"
- msgstr "运行事务"
- 
--#: dnf/base.py:911
-+#: dnf/base.py:984
- msgid "Disk Requirements:"
- msgstr "磁盘需求:"
- 
--#: dnf/base.py:914
-+#: dnf/base.py:987
- #, python-brace-format
- msgid "At least {0}MB more space needed on the {1} filesystem."
- msgid_plural "At least {0}MB more space needed on the {1} filesystem."
- msgstr[0] "在文件系统{1}上至少需要{0}MB的可用空间。"
- 
--#: dnf/base.py:921
-+#: dnf/base.py:994
- msgid "Error Summary"
- msgstr "错误汇总"
- 
--#: dnf/base.py:947
-+#: dnf/base.py:1020
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
- msgstr "RPMDB 在 {prog} 外被改动了。"
- 
--#: dnf/base.py:993 dnf/base.py:1001
-+#: dnf/base.py:1066 dnf/base.py:1074
- msgid "Could not run transaction."
- msgstr "不能执行事务。"
- 
--#: dnf/base.py:996
-+#: dnf/base.py:1069
- msgid "Transaction couldn't start:"
- msgstr "事务无法启动:"
- 
--#: dnf/base.py:1010
-+#: dnf/base.py:1083
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "移除事务文件 %s 失败"
- 
--#: dnf/base.py:1092
-+#: dnf/base.py:1165
- msgid "Some packages were not downloaded. Retrying."
- msgstr "某些软件包没有被下载。正在重试。"
- 
--#: dnf/base.py:1122
-+#: dnf/base.py:1195
- #, python-format
- msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)"
- msgstr "增量 RPM 将 %.1f MB 的更新减少至 %.1f MB(已节省 %d.1%% )"
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1198
- #, python-format
- msgid ""
- "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)"
- msgstr "增量 RPM 未能将 %.1f MB 的更新减少至 %.1f MB(已浪费 %d.1%% )"
- 
--#: dnf/base.py:1167
-+#: dnf/base.py:1240
- msgid "Cannot add local packages, because transaction job already exists"
- msgstr "由于事物已经存在,无法添加本地软件包"
- 
--#: dnf/base.py:1181
-+#: dnf/base.py:1254
- msgid "Could not open: {}"
- msgstr "无法打开: {}"
- 
--#: dnf/base.py:1219
-+#: dnf/base.py:1292
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr "%s 的公钥没有安装"
- 
--#: dnf/base.py:1223
-+#: dnf/base.py:1296
- #, python-format
- msgid "Problem opening package %s"
- msgstr "打开软件包 %s 出现问题"
- 
--#: dnf/base.py:1231
-+#: dnf/base.py:1304
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr "%s 的公钥不可信任"
- 
--#: dnf/base.py:1235
-+#: dnf/base.py:1308
- #, python-format
- msgid "Package %s is not signed"
- msgstr "软件包 %s 没有签名"
- 
--#: dnf/base.py:1265
-+#: dnf/base.py:1338
- #, python-format
- msgid "Cannot remove %s"
- msgstr "无法删除 %s"
- 
--#: dnf/base.py:1269
-+#: dnf/base.py:1342
- #, python-format
- msgid "%s removed"
- msgstr "%s 已删除"
- 
--#: dnf/base.py:1549
-+#: dnf/base.py:1622
- msgid "No match for group package \"{}\""
- msgstr "没有和组 \"{}\" 匹配的"
- 
--#: dnf/base.py:1635
-+#: dnf/base.py:1708
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "从组 '%s': %s 添加软件包"
- 
--#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442
-+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442
- #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592
- #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80
- #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110
- msgid "Nothing to do."
- msgstr "无需任何处理。"
- 
--#: dnf/base.py:1676
-+#: dnf/base.py:1749
- msgid "No groups marked for removal."
- msgstr "没有软件包组需要移除。"
- 
--#: dnf/base.py:1710
-+#: dnf/base.py:1783
- msgid "No group marked for upgrade."
- msgstr "没有标记为要升级的组。"
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1997
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
- msgstr "软件包 %s 并没有能够安装,无法进行降级操作。"
- 
--#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980
--#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411
-+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052
-+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416
- #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482
- #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633
- #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147
-@@ -370,141 +371,127 @@ msgstr "软件包 %s 并没有能够安装,无法进行降级操作。"
- msgid "No match for argument: %s"
- msgstr "未找到匹配的参数: %s"
- 
--#: dnf/base.py:1934
-+#: dnf/base.py:2006
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
- msgstr "软件包 %s 的低版本已经安装,无法进行降级。"
- 
--#: dnf/base.py:1957
-+#: dnf/base.py:2029
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
- msgstr "软件包 %s 未能够安装成功,无法进行重新安装。"
- 
--#: dnf/base.py:1972
-+#: dnf/base.py:2044
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr "%s 文件无法被升级,已忽略。"
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:2050
- #, python-format
- msgid "Package %s not installed, cannot update it."
- msgstr "软件包 %s 未安装,无法更新。"
- 
--#: dnf/base.py:1987
-+#: dnf/base.py:2059
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
- msgstr "已经安装了软件包%s的相同或更高版本,无法更新。"
- 
--#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
- msgstr "软件包 %s 可用,但没有被安装。"
- 
--#: dnf/base.py:2032
-+#: dnf/base.py:2104
- #, python-format
- msgid "Package %s available, but installed for different architecture."
- msgstr "软件包 %s 可用,当是为其它架构安装。"
- 
--#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699
-+#: dnf/base.py:2129
- #, python-format
- msgid "No package %s installed."
- msgstr "没有软件包 %s 安装。"
- 
--#: dnf/base.py:2075 dnf/cli/commands/install.py:136
-+#: dnf/base.py:2147 dnf/cli/commands/install.py:136
- #: dnf/cli/commands/remove.py:133
- #, python-format
- msgid "Not a valid form: %s"
- msgstr "无效: %s"
- 
--#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681
--#: dnf/cli/commands/remove.py:163
-+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681
-+#: dnf/cli/commands/remove.py:162
- msgid "No packages marked for removal."
- msgstr "没有软件包需要移除。"
- 
--#: dnf/base.py:2179 dnf/cli/cli.py:422
-+#: dnf/base.py:2250 dnf/cli/cli.py:427
- #, python-format
- msgid "Packages for argument %s available, but not installed."
- msgstr "针对于参数 %s 的软件包可用, 但是目前没有安装。"
- 
--#: dnf/base.py:2184
-+#: dnf/base.py:2255
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
- msgstr "软件包 %s 的最低版本已经安装,无法再进行降级。"
- 
--#: dnf/base.py:2242
--msgid "Action not handled: {}"
--msgstr "操作没被处理:{}"
--
--#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703
--#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169
--#, python-format
--msgid "No package %s available."
--msgstr "没有可用的软件包 %s。"
--
--#: dnf/base.py:2269
--msgid "no package matched"
--msgstr "没有能够与之匹配的软件包"
--
--#: dnf/base.py:2290
-+#: dnf/base.py:2302
- msgid "No security updates needed, but {} update available"
- msgstr "没有必须的安全更新, 但是 {} 的更新可用"
- 
--#: dnf/base.py:2292
-+#: dnf/base.py:2304
- msgid "No security updates needed, but {} updates available"
- msgstr "没有必须的安全更新, 但是 {} 的更新可用"
- 
--#: dnf/base.py:2296
-+#: dnf/base.py:2308
- msgid "No security updates needed for \"{}\", but {} update available"
- msgstr "没有针对于\"{}\" 所必须的安全更新, 但是 {} 的更新可用"
- 
--#: dnf/base.py:2298
-+#: dnf/base.py:2310
- msgid "No security updates needed for \"{}\", but {} updates available"
- msgstr "没有针对于\"{}\" 所必须的安全更新, 但是 {} 的更新可用"
- 
- #. raise an exception, because po.repoid is not in self.repos
--#: dnf/base.py:2319
-+#: dnf/base.py:2331
- #, python-format
- msgid "Unable to retrieve a key for a commandline package: %s"
--msgstr ""
-+msgstr "无法获取命令行软件包的密钥: %s"
- 
--#: dnf/base.py:2327
-+#: dnf/base.py:2339
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ". 失败的软件包是:%s"
- 
--#: dnf/base.py:2328
-+#: dnf/base.py:2340
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "GPG密钥配置为:%s"
- 
--#: dnf/base.py:2340
-+#: dnf/base.py:2352
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
- msgstr "%s 的 GPG 公钥(0x%s)已安装"
- 
--#: dnf/base.py:2373
-+#: dnf/base.py:2385
- msgid "The key has been approved."
- msgstr "密钥已被确认。"
- 
--#: dnf/base.py:2376
-+#: dnf/base.py:2388
- msgid "The key has been rejected."
- msgstr "密钥已被拒绝。"
- 
--#: dnf/base.py:2409
-+#: dnf/base.py:2421
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "导入公钥失败(代码 %d)"
- 
--#: dnf/base.py:2411
-+#: dnf/base.py:2423
- msgid "Key imported successfully"
- msgstr "导入公钥成功"
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2427
- msgid "Didn't install any keys"
- msgstr "没有安装任何公钥"
- 
--#: dnf/base.py:2418
-+#: dnf/base.py:2430
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
-@@ -513,49 +500,49 @@ msgstr ""
- "仓库 \"%s\" 的 GPG 公钥已安装,但是不适用于此软件包。\n"
- "请检查此仓库的公钥 URL 是否配置正确。"
- 
--#: dnf/base.py:2429
-+#: dnf/base.py:2441
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr "导入的密钥没有公钥,错误的公钥?"
- 
--#: dnf/base.py:2482
-+#: dnf/base.py:2494
- msgid "  * Maybe you meant: {}"
- msgstr "  * 可能您的意思是:{}"
- 
--#: dnf/base.py:2514
-+#: dnf/base.py:2526
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr "软件包 \"{}\"(来自于本地仓库 \"{}\")的 checksum 不正确"
- 
--#: dnf/base.py:2517
-+#: dnf/base.py:2529
- msgid "Some packages from local repository have incorrect checksum"
- msgstr "本地仓库的一些软件包校验值(checksum)不正确,无法确定软件包完整"
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2532
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "软件包 \"{}\"(来自仓库 \"{}\")的 checksum 不正确"
- 
--#: dnf/base.py:2523
-+#: dnf/base.py:2535
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
- msgstr "以下软件包有无效缓存,因为使用了 \"--cacheonly\" 选项不能下载"
- 
--#: dnf/base.py:2541 dnf/base.py:2561
-+#: dnf/base.py:2553 dnf/base.py:2573
- msgid "No match for argument"
- msgstr "未找到匹配的参数"
- 
--#: dnf/base.py:2549 dnf/base.py:2569
-+#: dnf/base.py:2561 dnf/base.py:2581
- msgid "All matches were filtered out by exclude filtering for argument"
- msgstr "由于您的搜索参数,所有相关结果都已被滤掉"
- 
--#: dnf/base.py:2551
-+#: dnf/base.py:2563
- msgid "All matches were filtered out by modular filtering for argument"
- msgstr "所有的匹配结果均已经被参数的模块化过滤条件筛除"
- 
--#: dnf/base.py:2567
-+#: dnf/base.py:2579
- msgid "All matches were installed from a different repository for argument"
- msgstr "已从另一个仓库安装了参数的所有匹配"
- 
--#: dnf/base.py:2583
-+#: dnf/base.py:2626
- #, python-format
- msgid "Package %s is already installed."
- msgstr "软件包 %s 已安装。"
-@@ -575,8 +562,8 @@ msgstr "解析文件 \"%s\" 失败:%s"
- msgid "Cannot read file \"%s\": %s"
- msgstr "无法读取文件 \"%s\": %s"
- 
--#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902
--#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108
-+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803
-+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108
- #, python-format
- msgid "Config error: %s"
- msgstr "配置错误:%s"
-@@ -607,7 +594,7 @@ msgid ""
- "stream '{2}'"
- msgstr "这个操作会把模块 '{0}' 从流 '{1}' 切换到流 '{2}'"
- 
--#: dnf/cli/cli.py:172
-+#: dnf/cli/cli.py:173
- #, python-brace-format
- msgid ""
- "It is not possible to switch enabled streams of a module.\n"
-@@ -616,35 +603,35 @@ msgstr ""
- "无法切换已启用模块的流。\n"
- "推荐移除来自模块的所有已安装内容,然后通过 '{prog} module reset <module_name>' 命令重置模块。在您重置模块之后,就可以安装其他的流。"
- 
--#: dnf/cli/cli.py:210
-+#: dnf/cli/cli.py:211
- #, python-brace-format
- msgid "{prog} will only download packages for the transaction."
- msgstr "{prog}将仅会从事务下载软件包。"
- 
--#: dnf/cli/cli.py:213
-+#: dnf/cli/cli.py:214
- #, python-brace-format
- msgid ""
- "{prog} will only download packages, install gpg keys, and check the "
- "transaction."
- msgstr "{prog}将仅会下载软件包,导入gpg密钥并检查事务。"
- 
--#: dnf/cli/cli.py:217
-+#: dnf/cli/cli.py:218
- msgid "Operation aborted."
- msgstr "操作中止。"
- 
--#: dnf/cli/cli.py:224
-+#: dnf/cli/cli.py:225
- msgid "Downloading Packages:"
- msgstr "下载软件包:"
- 
--#: dnf/cli/cli.py:230
-+#: dnf/cli/cli.py:231
- msgid "Error downloading packages:"
- msgstr "下载软件包出错 :"
- 
--#: dnf/cli/cli.py:258
-+#: dnf/cli/cli.py:263
- msgid "Transaction failed"
- msgstr "事务失败"
- 
--#: dnf/cli/cli.py:281
-+#: dnf/cli/cli.py:286
- msgid ""
- "Refusing to automatically import keys when running unattended.\n"
- "Use \"-y\" to override."
-@@ -652,116 +639,95 @@ msgstr ""
- "如果不加干预,拒绝自动导入公钥。\n"
- "指定 \"-y\" 改变这个行为。"
- 
--#: dnf/cli/cli.py:331
-+#: dnf/cli/cli.py:336
- msgid "Changelogs for {}"
- msgstr "{}的变更记录"
- 
--#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511
-+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516
- msgid "Obsoleting Packages"
- msgstr "取代的软件包"
- 
--#: dnf/cli/cli.py:393
-+#: dnf/cli/cli.py:398
- msgid "No packages marked for distribution synchronization."
- msgstr "没有软件包需要发行版同步。"
- 
--#: dnf/cli/cli.py:428
-+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395
-+#, python-format
-+msgid "No package %s available."
-+msgstr "没有可用的软件包 %s。"
-+
-+#: dnf/cli/cli.py:433
- msgid "No packages marked for downgrade."
- msgstr "没有标记要降级的软件包。"
- 
--#: dnf/cli/cli.py:479
-+#: dnf/cli/cli.py:484
- msgid "Installed Packages"
- msgstr "已安装的软件包"
- 
--#: dnf/cli/cli.py:487
-+#: dnf/cli/cli.py:492
- msgid "Available Packages"
- msgstr "可安装的软件包"
- 
--#: dnf/cli/cli.py:491
-+#: dnf/cli/cli.py:496
- msgid "Autoremove Packages"
- msgstr "自动移除软件包"
- 
--#: dnf/cli/cli.py:493
-+#: dnf/cli/cli.py:498
- msgid "Extra Packages"
- msgstr "更多软件包"
- 
--#: dnf/cli/cli.py:497
-+#: dnf/cli/cli.py:502
- msgid "Available Upgrades"
- msgstr "可用升级"
- 
--#: dnf/cli/cli.py:513
-+#: dnf/cli/cli.py:518
- msgid "Recently Added Packages"
- msgstr "最近添加的软件包"
- 
--#: dnf/cli/cli.py:518
-+#: dnf/cli/cli.py:522
- msgid "No matching Packages to list"
- msgstr "没有匹配的软件包可以列出"
- 
--#: dnf/cli/cli.py:599
-+#: dnf/cli/cli.py:603
- msgid "No Matches found"
- msgstr "没有找到匹配的软件包"
- 
--#: dnf/cli/cli.py:609
--msgid "No transaction ID given"
--msgstr "没有事务 ID"
--
--#: dnf/cli/cli.py:614
--msgid "Not found given transaction ID"
--msgstr "未找到指定事务 ID"
--
--#: dnf/cli/cli.py:623
--msgid "Found more than one transaction ID!"
--msgstr "找到多个事务 ID!"
--
--#: dnf/cli/cli.py:640
--#, python-format
--msgid "Transaction history is incomplete, before %u."
--msgstr "在 %u 之前,事务历史不完整。"
--
--#: dnf/cli/cli.py:642
--#, python-format
--msgid "Transaction history is incomplete, after %u."
--msgstr "在 %u 之后,事务历史不完整。"
--
--#: dnf/cli/cli.py:689
--msgid "Undoing transaction {}, from {}"
--msgstr "撤销事务 {},从 {}"
--
--#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237
-+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237
- #, python-format
- msgid "Unknown repo: '%s'"
- msgstr "未知仓库:'%s'"
- 
--#: dnf/cli/cli.py:783
-+#: dnf/cli/cli.py:684
- #, python-format
- msgid "No repository match: %s"
- msgstr "没有仓库匹配: %s"
- 
--#: dnf/cli/cli.py:817
-+#: dnf/cli/cli.py:718
- msgid ""
- "This command has to be run with superuser privileges (under the root user on"
- " most systems)."
- msgstr "运行此命令需要管理员特权(多数系统下是root用户)。"
- 
--#: dnf/cli/cli.py:847
-+#: dnf/cli/cli.py:748
- #, python-format
- msgid "No such command: %s. Please use %s --help"
- msgstr "未找到命令: %s。请使用 %s --help"
- 
--#: dnf/cli/cli.py:850
-+#: dnf/cli/cli.py:751
- #, python-format, python-brace-format
- msgid ""
- "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-"
- "command(%s)'\""
- msgstr "它可能是一个{PROG}插件命令,尝试:\"{prog} install 'dnf-command(%s)'\""
- 
--#: dnf/cli/cli.py:854
-+#: dnf/cli/cli.py:755
- #, python-brace-format
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
- "disabled."
- msgstr "这可能是一个 {prog} 插件的命令,但是插件的加载当前已经禁用。"
- 
--#: dnf/cli/cli.py:912
-+#: dnf/cli/cli.py:813
- msgid ""
- "--destdir or --downloaddir must be used with --downloadonly or download or "
- "system-upgrade command."
-@@ -769,51 +735,51 @@ msgstr ""
- "--destdir 或 --downloaddir 必须和 --downloadonly 或 download 或 system-upgrade "
- "命令一起使用。"
- 
--#: dnf/cli/cli.py:918
-+#: dnf/cli/cli.py:819
- msgid ""
- "--enable, --set-enabled and --disable, --set-disabled must be used with "
- "config-manager command."
- msgstr ""
- "--enable、--set-enabled 和 --disable、--set-disabled 必须和 config-manager 命令一起使用。"
- 
--#: dnf/cli/cli.py:1000
-+#: dnf/cli/cli.py:901
- msgid ""
- "Warning: Enforcing GPG signature check globally as per active RPM security "
- "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)"
- msgstr "警告:由于活动的RPM安全策略,强制执行全局GPG签名检查 (请参照dnf.conf(5)中的'gpgcheck'以了解如何阻止这条信息)"
- 
--#: dnf/cli/cli.py:1020
-+#: dnf/cli/cli.py:921
- msgid "Config file \"{}\" does not exist"
- msgstr "配置文件 \"{}\" 不存在"
- 
--#: dnf/cli/cli.py:1040
-+#: dnf/cli/cli.py:941
- msgid ""
- "Unable to detect release version (use '--releasever' to specify release "
- "version)"
- msgstr "无法找到发布版本(可用 '--releasever' 指定版本)"
- 
--#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471
-+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr "参数 {}:不允许与参数 {} 一起使用"
- 
--#: dnf/cli/cli.py:1134
-+#: dnf/cli/cli.py:1035
- #, python-format
- msgid "Command \"%s\" already defined"
- msgstr "命令 \"%s\" 已有定义"
- 
--#: dnf/cli/cli.py:1154
-+#: dnf/cli/cli.py:1055
- msgid "Excludes in dnf.conf: "
- msgstr "在 dnf.conf 中排除: "
- 
--#: dnf/cli/cli.py:1157
-+#: dnf/cli/cli.py:1058
- msgid "Includes in dnf.conf: "
- msgstr "在 dnf.conf 中包括: "
- 
--#: dnf/cli/cli.py:1160
-+#: dnf/cli/cli.py:1061
- msgid "Excludes in repo "
- msgstr "在 repo 中排除 "
- 
--#: dnf/cli/cli.py:1163
-+#: dnf/cli/cli.py:1064
- msgid "Includes in repo "
- msgstr "在 repo 中包括 "
- 
-@@ -870,7 +836,7 @@ msgid "show all packages (default)"
- msgstr "显示所有的软件包(默认)"
- 
- #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743
--#: dnf/cli/commands/module.py:351
-+#: dnf/cli/commands/module.py:373
- msgid "show only available packages"
- msgstr "只显示可用的软件包"
- 
-@@ -1195,78 +1161,78 @@ msgstr "显示或使用组信息"
- msgid "No group data available for configured repositories."
- msgstr "配置的软件源不包含组数据。"
- 
--#: dnf/cli/commands/group.py:129
-+#: dnf/cli/commands/group.py:126
- #, python-format
- msgid "Warning: Group %s does not exist."
- msgstr "警告:组 %s 不存在。"
- 
--#: dnf/cli/commands/group.py:170
-+#: dnf/cli/commands/group.py:167
- msgid "Warning: No groups match:"
- msgstr "警告:没有匹配的组:"
- 
--#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193
--#: dnf/cli/output.py:1226
-+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190
-+#: dnf/cli/output.py:1139
- msgid "<name-unset>"
- msgstr "<名称-未设定>"
- 
--#: dnf/cli/commands/group.py:199
-+#: dnf/cli/commands/group.py:196
- msgid "Available Environment Groups:"
- msgstr "可用环境组:"
- 
--#: dnf/cli/commands/group.py:201
-+#: dnf/cli/commands/group.py:198
- msgid "Installed Environment Groups:"
- msgstr "已安装的环境组:"
- 
--#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294
-+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291
- msgid "Installed Groups:"
- msgstr "已安装组:"
- 
--#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301
-+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298
- msgid "Installed Language Groups:"
- msgstr "已安装语言组:"
- 
--#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308
-+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305
- msgid "Available Groups:"
- msgstr "可用组:"
- 
--#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315
-+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312
- msgid "Available Language Groups:"
- msgstr "可用语言组:"
- 
--#: dnf/cli/commands/group.py:322
-+#: dnf/cli/commands/group.py:319
- msgid "include optional packages from group"
- msgstr "包含可选软件包"
- 
--#: dnf/cli/commands/group.py:325
-+#: dnf/cli/commands/group.py:322
- msgid "show also hidden groups"
- msgstr "同时显示已隐藏的软件组"
- 
--#: dnf/cli/commands/group.py:327
-+#: dnf/cli/commands/group.py:324
- msgid "show only installed groups"
- msgstr "只显示已安装的软件组"
- 
--#: dnf/cli/commands/group.py:329
-+#: dnf/cli/commands/group.py:326
- msgid "show only available groups"
- msgstr "只显示可获得的团队"
- 
--#: dnf/cli/commands/group.py:331
-+#: dnf/cli/commands/group.py:328
- msgid "show also ID of groups"
- msgstr "同时显示组的 ID"
- 
--#: dnf/cli/commands/group.py:333
-+#: dnf/cli/commands/group.py:330
- msgid "available subcommands: {} (default), {}"
- msgstr "可用的子命令:{} (默认), {}"
- 
--#: dnf/cli/commands/group.py:337
-+#: dnf/cli/commands/group.py:334
- msgid "argument for group subcommand"
- msgstr "组子命令的参数"
- 
--#: dnf/cli/commands/group.py:346
-+#: dnf/cli/commands/group.py:343
- #, python-format
- msgid "Invalid groups sub-command, use: %s."
- msgstr "无效的组子命令,请使用:%s 。"
- 
--#: dnf/cli/commands/group.py:403
-+#: dnf/cli/commands/group.py:398
- msgid "Unable to find a mandatory group package."
- msgstr "无法找到一个必须的组软件包。"
- 
-@@ -1276,25 +1242,25 @@ msgstr "显示或使用事务历史"
- 
- #: dnf/cli/commands/history.py:66
- msgid "For the store command, file path to store the transaction to"
--msgstr ""
-+msgstr "对于 store 命令,将事务保存到的文件路径"
- 
- #: dnf/cli/commands/history.py:68
- msgid ""
- "For the replay command, don't check for installed packages matching those in"
- " transaction"
--msgstr ""
-+msgstr "对于 replay 命令,不检查与事务中匹配的安装的软件包"
- 
- #: dnf/cli/commands/history.py:71
- msgid ""
- "For the replay command, don't check for extra packages pulled into the "
- "transaction"
--msgstr ""
-+msgstr "对于 replay 命令,不检查提取到事务中的额外的软件包"
- 
- #: dnf/cli/commands/history.py:74
- msgid ""
- "For the replay command, skip packages that are not available or have missing"
- " dependencies"
--msgstr ""
-+msgstr "对于 replay 命令,跳过不可用或者缺少依赖项的软件包"
- 
- #: dnf/cli/commands/history.py:94
- msgid ""
-@@ -1305,41 +1271,64 @@ msgstr ""
- "'{}' 需要一个事务 ID 或软件包名。"
- 
- #: dnf/cli/commands/history.py:101
--#, fuzzy
--#| msgid "No transaction ID or package name given."
- msgid "No transaction file name given."
--msgstr "没有提供事务 ID 或软件包名。"
-+msgstr "没有给定事务文件名称。"
- 
- #: dnf/cli/commands/history.py:103
--#, fuzzy
--#| msgid "Failed to remove transaction file %s"
- msgid "More than one argument given as transaction file name."
--msgstr "移除事务文件 %s 失败"
-+msgstr "提供了多于一个的作为事务文件名的参数。"
- 
--#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126
-+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130
- msgid "No transaction ID or package name given."
- msgstr "没有提供事务 ID 或软件包名。"
- 
--#: dnf/cli/commands/history.py:138
-+#: dnf/cli/commands/history.py:142
- #, python-format
- msgid "You don't have access to the history DB: %s"
- msgstr "你没有权限访问历史数据库:%s"
- 
--#: dnf/cli/commands/history.py:147
-+#: dnf/cli/commands/history.py:151
- #, python-format
- msgid ""
- "Cannot undo transaction %s, doing so would result in an inconsistent package"
- " database."
- msgstr "无法撤销事务 %s,这样做将可能导致不一致的软件包数据库。"
- 
--#: dnf/cli/commands/history.py:152
-+#: dnf/cli/commands/history.py:156
- #, python-format
- msgid ""
- "Cannot rollback transaction %s, doing so would result in an inconsistent "
- "package database."
- msgstr "无法回滚事务 %s,这样做将可能导致不一致的软件包数据库。"
- 
--#: dnf/cli/commands/history.py:222
-+#: dnf/cli/commands/history.py:175
-+msgid "No transaction ID given"
-+msgstr "没有事务 ID"
-+
-+#: dnf/cli/commands/history.py:179
-+#, python-brace-format
-+msgid "Transaction ID \"{0}\" not found."
-+msgstr "没有找到事务 ID \"{0}\"。"
-+
-+#: dnf/cli/commands/history.py:185
-+msgid "Found more than one transaction ID!"
-+msgstr "找到多个事务 ID!"
-+
-+#: dnf/cli/commands/history.py:203
-+#, python-format
-+msgid "Transaction history is incomplete, before %u."
-+msgstr "在 %u 之前,事务历史不完整。"
-+
-+#: dnf/cli/commands/history.py:205
-+#, python-format
-+msgid "Transaction history is incomplete, after %u."
-+msgstr "在 %u 之后,事务历史不完整。"
-+
-+#: dnf/cli/commands/history.py:256
-+msgid "No packages to list"
-+msgstr "没有可以列出的软件包"
-+
-+#: dnf/cli/commands/history.py:279
- msgid ""
- "Invalid transaction ID range definition '{}'.\n"
- "Use '<transaction-id>..<transaction-id>'."
-@@ -1347,7 +1336,7 @@ msgstr ""
- "无效的事务 ID 范围定义 '{}'。\n"
- "使用 '<transaction-id>..<transaction-id>'。"
- 
--#: dnf/cli/commands/history.py:226
-+#: dnf/cli/commands/history.py:283
- msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
-@@ -1355,40 +1344,29 @@ msgstr ""
- "无法将 '{}' 转换为事务 ID。\n"
- "请使用 '<number>'、'last'、'last-<number>'。"
- 
--#: dnf/cli/commands/history.py:255
-+#: dnf/cli/commands/history.py:312
- msgid "No transaction which manipulates package '{}' was found."
- msgstr "没有找到操作软件包 '{}' 的事务。"
- 
--#: dnf/cli/commands/history.py:305
--#, fuzzy, python-brace-format
--#| msgid "TransactionItem not found for key: {}"
--msgid "Transaction ID \"{id}\" not found."
--msgstr "找不到键的 TransactionItem: {}"
--
--#: dnf/cli/commands/history.py:313
-+#: dnf/cli/commands/history.py:357
- msgid "{} exists, overwrite?"
--msgstr ""
-+msgstr "{} 已存在,是否覆盖?"
- 
--#: dnf/cli/commands/history.py:316
-+#: dnf/cli/commands/history.py:360
- msgid "Not overwriting {}, exiting."
--msgstr ""
-+msgstr "不覆盖 {},退出。"
- 
--#: dnf/cli/commands/history.py:323
--#, fuzzy
--#| msgid "Transaction failed"
-+#: dnf/cli/commands/history.py:367
- msgid "Transaction saved to {}."
--msgstr "事务失败"
-+msgstr "事务保存到 {}。"
- 
--#: dnf/cli/commands/history.py:326
--#, fuzzy
--#| msgid "Errors occurred during transaction."
-+#: dnf/cli/commands/history.py:370
- msgid "Error storing transaction: {}"
--msgstr "事务过程中出现错误。"
-+msgstr "存储事务出错:{}"
- 
--#: dnf/cli/commands/history.py:350
--msgid ""
--"Warning, the following problems occurred while replaying the transaction:"
--msgstr ""
-+#: dnf/cli/commands/history.py:386
-+msgid "Warning, the following problems occurred while running a transaction:"
-+msgstr "警告,在运行事务时发生以下问题:"
- 
- #: dnf/cli/commands/install.py:47
- msgid "install a package or packages on your system"
-@@ -1407,7 +1385,7 @@ msgstr "没有任何匹配"
- msgid "Not a valid rpm file path: %s"
- msgstr "RPM文件路径错误:%s"
- 
--#: dnf/cli/commands/install.py:167
-+#: dnf/cli/commands/install.py:166
- #, python-brace-format
- msgid "There are following alternatives for \"{0}\": {1}"
- msgstr "以下是 \"{0}\" 的替代 : {1}"
-@@ -1450,7 +1428,7 @@ msgid "%s marked as group installed."
- msgstr "%s 已标记为已安装软件组。"
- 
- #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129
--#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279
-+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282
- msgid "Error:"
- msgstr "错误:"
- 
-@@ -1506,42 +1484,46 @@ msgid "Package {} belongs to multiple modules, skipping"
- msgstr "软件包 {} 属于多个模块,正在跳过"
- 
- #: dnf/cli/commands/module.py:277
-+msgid "switch a module to a stream and distrosync rpm packages"
-+msgstr "将模块切换到流和 distrosync rpm 软件包"
-+
-+#: dnf/cli/commands/module.py:299
- msgid "list modular packages"
- msgstr "列出模块包"
- 
--#: dnf/cli/commands/module.py:292
-+#: dnf/cli/commands/module.py:314
- msgid "list packages belonging to a module"
- msgstr "列出属于一个模块的软件包"
- 
--#: dnf/cli/commands/module.py:327
-+#: dnf/cli/commands/module.py:349
- msgid "Interact with Modules."
- msgstr "与模块交互。"
- 
--#: dnf/cli/commands/module.py:340
-+#: dnf/cli/commands/module.py:362
- msgid "show only enabled modules"
- msgstr "只显示启用的模块"
- 
--#: dnf/cli/commands/module.py:343
-+#: dnf/cli/commands/module.py:365
- msgid "show only disabled modules"
- msgstr "只显示禁用的模块"
- 
--#: dnf/cli/commands/module.py:346
-+#: dnf/cli/commands/module.py:368
- msgid "show only installed modules or packages"
- msgstr "只显示已安装的模块或者软件包"
- 
--#: dnf/cli/commands/module.py:349
-+#: dnf/cli/commands/module.py:371
- msgid "show profile content"
- msgstr "显示档案内容"
- 
--#: dnf/cli/commands/module.py:354
-+#: dnf/cli/commands/module.py:376
- msgid "remove all modular packages"
- msgstr "移除所有模块包"
- 
--#: dnf/cli/commands/module.py:364
-+#: dnf/cli/commands/module.py:386
- msgid "Module specification"
- msgstr "模块规格"
- 
--#: dnf/cli/commands/module.py:386
-+#: dnf/cli/commands/module.py:408
- msgid "{} {} {}: too few arguments"
- msgstr "{} {} {}: 参数太少"
- 
-@@ -2026,22 +2008,22 @@ msgstr "KEYWORD"
- msgid "Keyword to search for"
- msgstr "要搜索的关键字"
- 
--#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
-+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460
- msgctxt "long"
- msgid "Name"
- msgstr "名称"
- 
--#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
-+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513
- msgctxt "long"
- msgid "Summary"
- msgstr "概况"
- 
--#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
-+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523
- msgctxt "long"
- msgid "Description"
- msgstr "描述"
- 
--#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
-+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516
- msgid "URL"
- msgstr "URL"
- 
-@@ -2184,16 +2166,16 @@ msgstr ""
- "run                      解析以及运行事务集\n"
- "exit (或 quit)           退出 shell"
- 
--#: dnf/cli/commands/shell.py:259
-+#: dnf/cli/commands/shell.py:262
- #, python-format
- msgid "Error: Cannot open %s for reading"
- msgstr "错误:无法打开%s来读取"
- 
--#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187
-+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187
- msgid "Complete!"
- msgstr "完毕!"
- 
--#: dnf/cli/commands/shell.py:291
-+#: dnf/cli/commands/shell.py:294
- msgid "Leaving Shell"
- msgstr "离开终端"
- 
-@@ -2384,8 +2366,8 @@ msgstr "严重性"
- msgid "Files"
- msgstr "文件"
- 
--#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
--#: dnf/cli/output.py:1772 dnf/cli/output.py:1774
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652
-+#: dnf/cli/output.py:1654 dnf/util.py:591
- msgid "Installed"
- msgstr "已安装"
- 
-@@ -2706,13 +2688,13 @@ msgstr "无法编码参数 '%s': %s"
- #. Translators: This is abbreviated 'Name'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:505
-+#: dnf/cli/output.py:459
- msgctxt "short"
- msgid "Name"
- msgstr "名称"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:511
-+#: dnf/cli/output.py:465
- msgid "Epoch"
- msgstr "时期"
- 
-@@ -2720,38 +2702,38 @@ msgstr "时期"
- #. use the full (unabbreviated) term 'Version' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:512 dnf/cli/output.py:1335
-+#: dnf/cli/output.py:466 dnf/cli/output.py:1248
- msgctxt "short"
- msgid "Version"
- msgstr "版本"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1337
-+#: dnf/cli/output.py:467 dnf/cli/output.py:1250
- msgctxt "long"
- msgid "Version"
- msgstr "版本"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:516
-+#: dnf/cli/output.py:470
- msgid "Release"
- msgstr "发布"
- 
- #. Translators: This is abbreviated 'Architecture', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:517 dnf/cli/output.py:1326
-+#: dnf/cli/output.py:471 dnf/cli/output.py:1239
- msgctxt "short"
- msgid "Arch"
- msgstr "架构"
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:472 dnf/cli/output.py:1242
- msgctxt "long"
- msgid "Architecture"
- msgstr "架构"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1352
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1265
- msgctxt "long"
- msgid "Size"
- msgstr "大小"
-@@ -2760,32 +2742,32 @@ msgstr "大小"
- #. not be longer than 5 characters. If the term 'Size' in your
- #. language is not longer than 5 characters then you can use it
- #. unabbreviated.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1350
-+#: dnf/cli/output.py:474 dnf/cli/output.py:1263
- msgctxt "short"
- msgid "Size"
- msgstr "大小"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:524
-+#: dnf/cli/output.py:478
- msgid "Source"
- msgstr "源"
- 
- #. Translators: This is abbreviated 'Repository', used when
- #. we have not enough space to display the full word.
--#: dnf/cli/output.py:525 dnf/cli/output.py:1341
-+#: dnf/cli/output.py:479 dnf/cli/output.py:1254
- msgctxt "short"
- msgid "Repo"
- msgstr "仓库"
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:480 dnf/cli/output.py:1257
- msgctxt "long"
- msgid "Repository"
- msgstr "仓库"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:533
-+#: dnf/cli/output.py:487
- msgid "From repo"
- msgstr "来自仓库"
- 
-@@ -2793,312 +2775,308 @@ msgstr "来自仓库"
- #. print(_("Committer   : %s") % ucd(pkg.committer))
- #. print(_("Committime  : %s") % time.ctime(pkg.committime))
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:539
-+#: dnf/cli/output.py:493
- msgid "Packager"
- msgstr "打包者"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:541
-+#: dnf/cli/output.py:495
- msgid "Buildtime"
- msgstr "构建时间"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:545
-+#: dnf/cli/output.py:499
- msgid "Install time"
- msgstr "安装时间"
- 
- #. Translators: This message should be no longer than 12 chars.
--#: dnf/cli/output.py:554
-+#: dnf/cli/output.py:508
- msgid "Installed by"
- msgstr "安装者"
- 
- #. Translators: This is abbreviated 'Summary'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:558
-+#: dnf/cli/output.py:512
- msgctxt "short"
- msgid "Summary"
- msgstr "概况"
- 
- #. Translators: This message should be no longer than 12 characters.
--#: dnf/cli/output.py:564
-+#: dnf/cli/output.py:518
- msgid "License"
- msgstr "协议"
- 
- #. Translators: This is abbreviated 'Description'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
- #. enough in your language.
--#: dnf/cli/output.py:568
-+#: dnf/cli/output.py:522
- msgctxt "short"
- msgid "Description"
- msgstr "描述"
- 
--#: dnf/cli/output.py:695
--msgid "No packages to list"
--msgstr "没有可以列出的软件包"
--
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "y"
- msgstr "y"
- 
--#: dnf/cli/output.py:706
-+#: dnf/cli/output.py:650
- msgid "yes"
- msgstr "是"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "n"
- msgstr "n"
- 
--#: dnf/cli/output.py:707
-+#: dnf/cli/output.py:651
- msgid "no"
- msgstr "否"
- 
--#: dnf/cli/output.py:711
-+#: dnf/cli/output.py:655
- msgid "Is this ok [y/N]: "
- msgstr "确定吗?[y/N]: "
- 
--#: dnf/cli/output.py:715
-+#: dnf/cli/output.py:659
- msgid "Is this ok [Y/n]: "
- msgstr "确定吗?[Y/n]: "
- 
--#: dnf/cli/output.py:795
-+#: dnf/cli/output.py:739
- #, python-format
- msgid "Group: %s"
- msgstr "组:%s"
- 
--#: dnf/cli/output.py:799
-+#: dnf/cli/output.py:743
- #, python-format
- msgid " Group-Id: %s"
- msgstr " 组编号:%s"
- 
--#: dnf/cli/output.py:801 dnf/cli/output.py:840
-+#: dnf/cli/output.py:745 dnf/cli/output.py:784
- #, python-format
- msgid " Description: %s"
- msgstr " 描述:%s"
- 
--#: dnf/cli/output.py:803
-+#: dnf/cli/output.py:747
- #, python-format
- msgid " Language: %s"
- msgstr " 语言:%s"
- 
--#: dnf/cli/output.py:806
-+#: dnf/cli/output.py:750
- msgid " Mandatory Packages:"
- msgstr " 必要的软件包:"
- 
--#: dnf/cli/output.py:807
-+#: dnf/cli/output.py:751
- msgid " Default Packages:"
- msgstr " 默认的软件包:"
- 
--#: dnf/cli/output.py:808
-+#: dnf/cli/output.py:752
- msgid " Optional Packages:"
- msgstr " 可选的软件包:"
- 
--#: dnf/cli/output.py:809
-+#: dnf/cli/output.py:753
- msgid " Conditional Packages:"
- msgstr " 可能的软件包:"
- 
--#: dnf/cli/output.py:834
-+#: dnf/cli/output.py:778
- #, python-format
- msgid "Environment Group: %s"
- msgstr "环境组:%s"
- 
--#: dnf/cli/output.py:837
-+#: dnf/cli/output.py:781
- #, python-format
- msgid " Environment-Id: %s"
- msgstr " 环境-Id:%s"
- 
--#: dnf/cli/output.py:843
-+#: dnf/cli/output.py:787
- msgid " Mandatory Groups:"
- msgstr " 必选软件包组:"
- 
--#: dnf/cli/output.py:844
-+#: dnf/cli/output.py:788
- msgid " Optional Groups:"
- msgstr " 可选软件包组:"
- 
--#: dnf/cli/output.py:865
-+#: dnf/cli/output.py:809
- msgid "Matched from:"
- msgstr "匹配来源:"
- 
--#: dnf/cli/output.py:879
-+#: dnf/cli/output.py:823
- #, python-format
- msgid "Filename    : %s"
- msgstr "文件名    :%s"
- 
--#: dnf/cli/output.py:904
-+#: dnf/cli/output.py:848
- #, python-format
- msgid "Repo        : %s"
- msgstr "仓库        :%s"
- 
--#: dnf/cli/output.py:913
-+#: dnf/cli/output.py:857
- msgid "Description : "
- msgstr "描述: "
- 
--#: dnf/cli/output.py:917
-+#: dnf/cli/output.py:861
- #, python-format
- msgid "URL         : %s"
- msgstr "网址         :%s"
- 
--#: dnf/cli/output.py:921
-+#: dnf/cli/output.py:865
- #, python-format
- msgid "License     : %s"
- msgstr "协议     :%s"
- 
--#: dnf/cli/output.py:927
-+#: dnf/cli/output.py:871
- #, python-format
- msgid "Provide    : %s"
- msgstr "提供    : %s"
- 
--#: dnf/cli/output.py:947
-+#: dnf/cli/output.py:891
- #, python-format
- msgid "Other       : %s"
- msgstr "其它       : %s"
- 
--#: dnf/cli/output.py:996
-+#: dnf/cli/output.py:940
- msgid "There was an error calculating total download size"
- msgstr "计算总下载量时出错"
- 
--#: dnf/cli/output.py:1002
-+#: dnf/cli/output.py:946
- #, python-format
- msgid "Total size: %s"
- msgstr "总计:%s"
- 
--#: dnf/cli/output.py:1005
-+#: dnf/cli/output.py:949
- #, python-format
- msgid "Total download size: %s"
- msgstr "总下载:%s"
- 
--#: dnf/cli/output.py:1008
-+#: dnf/cli/output.py:952
- #, python-format
- msgid "Installed size: %s"
- msgstr "安装大小:%s"
- 
--#: dnf/cli/output.py:1026
-+#: dnf/cli/output.py:970
- msgid "There was an error calculating installed size"
- msgstr "计算安装大小时出错"
- 
--#: dnf/cli/output.py:1030
-+#: dnf/cli/output.py:974
- #, python-format
- msgid "Freed space: %s"
- msgstr "将会释放空间:%s"
- 
--#: dnf/cli/output.py:1039
-+#: dnf/cli/output.py:983
- msgid "Marking packages as installed by the group:"
- msgstr "标记软件包为遵循软件包组安装的:"
- 
--#: dnf/cli/output.py:1046
-+#: dnf/cli/output.py:990
- msgid "Marking packages as removed by the group:"
- msgstr "标记软件包为遵循软件包组移除的:"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Group"
- msgstr "组"
- 
--#: dnf/cli/output.py:1056
-+#: dnf/cli/output.py:1000
- msgid "Packages"
- msgstr "软件包"
- 
--#: dnf/cli/output.py:1133
-+#: dnf/cli/output.py:1046
- msgid "Installing group/module packages"
- msgstr "安装组/模块包"
- 
--#: dnf/cli/output.py:1134
-+#: dnf/cli/output.py:1047
- msgid "Installing group packages"
- msgstr "安装软件包组"
- 
- #. TRANSLATORS: This is for a list of packages to be installed.
--#: dnf/cli/output.py:1138
-+#: dnf/cli/output.py:1051
- msgctxt "summary"
- msgid "Installing"
- msgstr "安装"
- 
- #. TRANSLATORS: This is for a list of packages to be upgraded.
--#: dnf/cli/output.py:1140
-+#: dnf/cli/output.py:1053
- msgctxt "summary"
- msgid "Upgrading"
- msgstr "升级"
- 
- #. TRANSLATORS: This is for a list of packages to be reinstalled.
--#: dnf/cli/output.py:1142
-+#: dnf/cli/output.py:1055
- msgctxt "summary"
- msgid "Reinstalling"
- msgstr "重新安装"
- 
--#: dnf/cli/output.py:1144
-+#: dnf/cli/output.py:1057
- msgid "Installing dependencies"
- msgstr "安装依赖关系"
- 
--#: dnf/cli/output.py:1145
-+#: dnf/cli/output.py:1058
- msgid "Installing weak dependencies"
- msgstr "安装弱的依赖"
- 
- #. TRANSLATORS: This is for a list of packages to be removed.
--#: dnf/cli/output.py:1147
-+#: dnf/cli/output.py:1060
- msgid "Removing"
- msgstr "移除"
- 
--#: dnf/cli/output.py:1148
-+#: dnf/cli/output.py:1061
- msgid "Removing dependent packages"
- msgstr "移除依赖的软件包"
- 
--#: dnf/cli/output.py:1149
-+#: dnf/cli/output.py:1062
- msgid "Removing unused dependencies"
- msgstr "清除未被使用的依赖关系"
- 
- #. TRANSLATORS: This is for a list of packages to be downgraded.
--#: dnf/cli/output.py:1151
-+#: dnf/cli/output.py:1064
- msgctxt "summary"
- msgid "Downgrading"
- msgstr "降级"
- 
--#: dnf/cli/output.py:1176
-+#: dnf/cli/output.py:1089
- msgid "Installing module profiles"
- msgstr "安装模块配置档案"
- 
--#: dnf/cli/output.py:1185
-+#: dnf/cli/output.py:1098
- msgid "Disabling module profiles"
- msgstr "禁用模块配置档案"
- 
--#: dnf/cli/output.py:1194
-+#: dnf/cli/output.py:1107
- msgid "Enabling module streams"
- msgstr "启用模块流"
- 
--#: dnf/cli/output.py:1202
-+#: dnf/cli/output.py:1115
- msgid "Switching module streams"
- msgstr "切换模块流"
- 
--#: dnf/cli/output.py:1210
-+#: dnf/cli/output.py:1123
- msgid "Disabling modules"
- msgstr "禁用模块"
- 
--#: dnf/cli/output.py:1218
-+#: dnf/cli/output.py:1131
- msgid "Resetting modules"
- msgstr "重置模块"
- 
--#: dnf/cli/output.py:1230
-+#: dnf/cli/output.py:1143
- msgid "Installing Environment Groups"
- msgstr "安装环境组"
- 
--#: dnf/cli/output.py:1237
-+#: dnf/cli/output.py:1150
- msgid "Upgrading Environment Groups"
- msgstr "升级环境组"
- 
--#: dnf/cli/output.py:1244
-+#: dnf/cli/output.py:1157
- msgid "Removing Environment Groups"
- msgstr "删除环境组"
- 
--#: dnf/cli/output.py:1251
-+#: dnf/cli/output.py:1164
- msgid "Installing Groups"
- msgstr "安装组"
- 
--#: dnf/cli/output.py:1258
-+#: dnf/cli/output.py:1171
- msgid "Upgrading Groups"
- msgstr "升级组"
- 
--#: dnf/cli/output.py:1265
-+#: dnf/cli/output.py:1178
- msgid "Removing Groups"
- msgstr "删除组"
- 
--#: dnf/cli/output.py:1281
-+#: dnf/cli/output.py:1194
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
-@@ -3107,12 +3085,12 @@ msgstr ""
- "跳过有冲突的软件包:\n"
- "(添加 '%s' 至命令行来强制升级)"
- 
--#: dnf/cli/output.py:1291
-+#: dnf/cli/output.py:1204
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr "跳过存在损坏依赖关系的软件包 %s"
- 
--#: dnf/cli/output.py:1295
-+#: dnf/cli/output.py:1208
- msgid " or part of a group"
- msgstr " 或一个组的一部分"
- 
-@@ -3120,22 +3098,22 @@ msgstr " 或一个组的一部分"
- #. use the full (unabbreviated) term 'Package' if you think that
- #. the translation to your language is not too long and will
- #. always fit to limited space.
--#: dnf/cli/output.py:1320
-+#: dnf/cli/output.py:1233
- msgctxt "short"
- msgid "Package"
- msgstr "软件包"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
--#: dnf/cli/output.py:1322
-+#: dnf/cli/output.py:1235
- msgctxt "long"
- msgid "Package"
- msgstr "软件包"
- 
--#: dnf/cli/output.py:1371
-+#: dnf/cli/output.py:1284
- msgid "replacing"
- msgstr "替换"
- 
--#: dnf/cli/output.py:1378
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid ""
- "\n"
-@@ -3147,287 +3125,271 @@ msgstr ""
- "%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933
-+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813
- msgid "Install"
- msgstr "安装"
- 
--#: dnf/cli/output.py:1387 dnf/cli/output.py:1941
-+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821
- msgid "Upgrade"
- msgstr "升级"
- 
--#: dnf/cli/output.py:1388
-+#: dnf/cli/output.py:1301
- msgid "Remove"
- msgstr "移除"
- 
--#: dnf/cli/output.py:1390 dnf/cli/output.py:1939
-+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819
- msgid "Downgrade"
- msgstr "降级"
- 
--#: dnf/cli/output.py:1391
-+#: dnf/cli/output.py:1304
- msgid "Skip"
- msgstr "跳过"
- 
--#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
-+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] "软件包"
- 
--#: dnf/cli/output.py:1418
-+#: dnf/cli/output.py:1331
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "依赖软件包"
- 
--#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942
--msgid "Upgraded"
--msgstr "已升级"
--
--#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940
--msgid "Downgraded"
--msgstr "已降级"
--
--#: dnf/cli/output.py:1503
--msgid "Reinstalled"
--msgstr "已重装"
--
--#: dnf/cli/output.py:1504
--msgid "Skipped"
--msgstr "已跳过"
--
--#: dnf/cli/output.py:1505
--msgid "Removed"
--msgstr "已移除"
--
--#: dnf/cli/output.py:1508
--msgid "Failed"
--msgstr "失败"
--
--#: dnf/cli/output.py:1559
-+#: dnf/cli/output.py:1439
- msgid "Total"
- msgstr "总计"
- 
--#: dnf/cli/output.py:1587
-+#: dnf/cli/output.py:1467
- msgid "<unset>"
- msgstr "<空>"
- 
--#: dnf/cli/output.py:1588
-+#: dnf/cli/output.py:1468
- msgid "System"
- msgstr "系统"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1518
- msgid "Command line"
- msgstr "命令行"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1649
-+#: dnf/cli/output.py:1529
- msgid "User name"
- msgstr "用户名"
- 
--#: dnf/cli/output.py:1651
-+#: dnf/cli/output.py:1531
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1653
-+#: dnf/cli/output.py:1533
- msgid "Date and time"
- msgstr "日期和时间"
- 
--#: dnf/cli/output.py:1654
-+#: dnf/cli/output.py:1534
- msgid "Action(s)"
- msgstr "操作"
- 
--#: dnf/cli/output.py:1655
-+#: dnf/cli/output.py:1535
- msgid "Altered"
- msgstr "更改"
- 
--#: dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1578
- msgid "No transactions"
- msgstr "没有事务"
- 
--#: dnf/cli/output.py:1699 dnf/cli/output.py:1715
-+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595
- msgid "Failed history info"
- msgstr "失败的历史信息"
- 
--#: dnf/cli/output.py:1714
-+#: dnf/cli/output.py:1594
- msgid "No transaction ID, or package, given"
- msgstr "未指定事务 ID、或者软件包"
- 
--#: dnf/cli/output.py:1772
-+#: dnf/cli/output.py:1652
- msgid "Erased"
- msgstr "已删除"
- 
--#: dnf/cli/output.py:1774
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590
-+msgid "Downgraded"
-+msgstr "已降级"
-+
-+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589
-+msgid "Upgraded"
-+msgstr "已升级"
-+
-+#: dnf/cli/output.py:1654
- msgid "Not installed"
- msgstr "未安装"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Newer"
- msgstr "较早的"
- 
--#: dnf/cli/output.py:1775
-+#: dnf/cli/output.py:1655
- msgid "Older"
- msgstr "较老的"
- 
--#: dnf/cli/output.py:1823 dnf/cli/output.py:1825
-+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705
- msgid "Transaction ID :"
- msgstr "事务 ID:"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1708
- msgid "Begin time     :"
- msgstr "起始时间    :"
- 
--#: dnf/cli/output.py:1831 dnf/cli/output.py:1833
-+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713
- msgid "Begin rpmdb    :"
- msgstr "起始 RPM 数据库     :"
- 
--#: dnf/cli/output.py:1839
-+#: dnf/cli/output.py:1719
- #, python-format
- msgid "(%u seconds)"
- msgstr "(%u 秒)"
- 
--#: dnf/cli/output.py:1841
-+#: dnf/cli/output.py:1721
- #, python-format
- msgid "(%u minutes)"
- msgstr "(%u 分钟)"
- 
--#: dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1723
- #, python-format
- msgid "(%u hours)"
- msgstr "(%u 小时)"
- 
--#: dnf/cli/output.py:1845
-+#: dnf/cli/output.py:1725
- #, python-format
- msgid "(%u days)"
- msgstr "(%u 天)"
- 
--#: dnf/cli/output.py:1846
-+#: dnf/cli/output.py:1726
- msgid "End time       :"
- msgstr "结束时间       :"
- 
--#: dnf/cli/output.py:1849 dnf/cli/output.py:1851
-+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731
- msgid "End rpmdb      :"
- msgstr "结束 RPM 数据库      :"
- 
--#: dnf/cli/output.py:1858 dnf/cli/output.py:1860
-+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740
- msgid "User           :"
- msgstr "用户           :"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1871
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751
- msgid "Aborted"
- msgstr "已终止"
- 
--#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869
--#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749
-+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755
- msgid "Return-Code    :"
- msgstr "返回码    :"
- 
--#: dnf/cli/output.py:1867 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755
- msgid "Success"
- msgstr "成功"
- 
--#: dnf/cli/output.py:1869
-+#: dnf/cli/output.py:1749
- msgid "Failures:"
- msgstr "失败:"
- 
--#: dnf/cli/output.py:1873
-+#: dnf/cli/output.py:1753
- msgid "Failure:"
- msgstr "失败:"
- 
--#: dnf/cli/output.py:1883 dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765
- msgid "Releasever     :"
- msgstr "Releasever     :"
- 
--#: dnf/cli/output.py:1890 dnf/cli/output.py:1892
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Command Line   :"
- msgstr "命令行   :"
- 
--#: dnf/cli/output.py:1897 dnf/cli/output.py:1899
-+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779
- msgid "Comment        :"
- msgstr "注释        :"
- 
--#: dnf/cli/output.py:1903
-+#: dnf/cli/output.py:1783
- msgid "Transaction performed with:"
- msgstr "事务完成由:"
- 
--#: dnf/cli/output.py:1912
-+#: dnf/cli/output.py:1792
- msgid "Packages Altered:"
- msgstr "已改变的包:"
- 
--#: dnf/cli/output.py:1918
-+#: dnf/cli/output.py:1798
- msgid "Scriptlet output:"
- msgstr "Scriptlet 输出:"
- 
--#: dnf/cli/output.py:1925
-+#: dnf/cli/output.py:1805
- msgid "Errors:"
- msgstr "错误:"
- 
--#: dnf/cli/output.py:1934
-+#: dnf/cli/output.py:1814
- msgid "Dep-Install"
- msgstr "依赖安装"
- 
--#: dnf/cli/output.py:1935
-+#: dnf/cli/output.py:1815
- msgid "Obsoleted"
- msgstr "已废弃"
- 
--#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "废弃"
- 
--#: dnf/cli/output.py:1937
-+#: dnf/cli/output.py:1817
- msgid "Erase"
- msgstr "删除"
- 
--#: dnf/cli/output.py:1938
-+#: dnf/cli/output.py:1818
- msgid "Reinstall"
- msgstr "重装"
- 
--#: dnf/cli/output.py:2016
-+#: dnf/cli/output.py:1892
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr "---> 软件包 %s.%s %s 将会被安装"
- 
--#: dnf/cli/output.py:2018
-+#: dnf/cli/output.py:1894
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
- msgstr "---> 软件包 %s.%s %s 将作为一个更新"
- 
--#: dnf/cli/output.py:2020
-+#: dnf/cli/output.py:1896
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr "---> 软件包 %s.%s %s 将会被清除"
- 
--#: dnf/cli/output.py:2022
-+#: dnf/cli/output.py:1898
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr "---> 软件包 %s.%s %s 将会被重新安装"
- 
--#: dnf/cli/output.py:2024
-+#: dnf/cli/output.py:1900
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
- msgstr "---> 软件包 %s.%s %s 将会被降级"
- 
--#: dnf/cli/output.py:2026
-+#: dnf/cli/output.py:1902
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr "---> 软件包 %s.%s %s 将会废弃"
- 
--#: dnf/cli/output.py:2028
-+#: dnf/cli/output.py:1904
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr "---> 软件包 %s.%s %s 将会被升级"
- 
--#: dnf/cli/output.py:2030
-+#: dnf/cli/output.py:1906
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr "---> 软件包 %s.%s %s 将会被废弃"
- 
--#: dnf/cli/output.py:2039
-+#: dnf/cli/output.py:1915
- msgid "--> Starting dependency resolution"
- msgstr "--> 开始解决依赖关系"
- 
--#: dnf/cli/output.py:2044
-+#: dnf/cli/output.py:1919
- msgid "--> Finished dependency resolution"
- msgstr "--> 依赖关系解决完成"
- 
--#: dnf/cli/output.py:2058 dnf/crypto.py:132
-+#: dnf/cli/output.py:1933 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3509,16 +3471,14 @@ msgid "Module or Group '%s' does not exist."
- msgstr "模块或者组 '%s' 不存在。"
- 
- #: dnf/comps.py:599
--#, fuzzy, python-format
--#| msgid "Environment '%s' is not installed."
-+#, python-format
- msgid "Environment id '%s' does not exist."
--msgstr "环境组 '%s' 没有安装。"
-+msgstr "环境 id '%s' 不存在。"
- 
--#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453
--#, fuzzy, python-format
--#| msgid "Environment '%s' is not installed."
-+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487
-+#, python-format
- msgid "Environment id '%s' is not installed."
--msgstr "环境组 '%s' 没有安装。"
-+msgstr "环境 id '%s' 没有安装。"
- 
- #: dnf/comps.py:639
- #, python-format
-@@ -3531,10 +3491,9 @@ msgid "Environment '%s' is not available."
- msgstr "环境 '%s' 不可用。"
- 
- #: dnf/comps.py:673
--#, fuzzy, python-format
--#| msgid "Group_id '%s' does not exist."
-+#, python-format
- msgid "Group id '%s' does not exist."
--msgstr "Group_id '%s' 不存在。"
-+msgstr "组 id '%s' 不存在。"
- 
- #: dnf/conf/config.py:136
- #, python-format
-@@ -3593,7 +3552,7 @@ msgstr "repo 的 id 无效: {} ({}), byte = {} {}"
- 
- #: dnf/conf/read.py:67
- msgid "Bad id for repo: {}, byte = {} {}"
--msgstr "repo 的 id 无效: %s, byte = %s %d"
-+msgstr "repo 的 id 无效: {}, byte = {} {}"
- 
- #: dnf/conf/read.py:75
- msgid "Repository '{}' ({}): Error parsing config: {}"
-@@ -3625,6 +3584,11 @@ msgstr "repo %s: 0x%s 已被导入"
- msgid "repo %s: imported key 0x%s."
- msgstr "repo %s: 已导入密钥 0x%s。"
- 
-+#: dnf/crypto.py:177
-+#, python-format
-+msgid "retrieving repo key for %s unencrypted from %s"
-+msgstr "为 %s 从 %s 获取的 repo 密钥未加密"
-+
- #: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
-@@ -3707,7 +3671,7 @@ msgid "Modular dependency problem with Defaults:"
- msgid_plural "Modular dependency problems with Defaults:"
- msgstr[0] "默认设置中的模块依赖问题 :"
- 
--#: dnf/exceptions.py:131 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:841
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] "模块依赖问题:"
-@@ -3761,27 +3725,27 @@ msgstr ""
- "\n"
- "提示 : [d]默认, [e]启用, [x]禁用, [i]已安装的, [a]活跃的"
- 
--#: dnf/module/module_base.py:54 dnf/module/module_base.py:421
--#: dnf/module/module_base.py:477 dnf/module/module_base.py:543
-+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547
-+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669
- msgid "Ignoring unnecessary profile: '{}/{}'"
- msgstr "正在忽略无用的配置文件'{}/{}'"
- 
- #: dnf/module/module_base.py:84
- #, python-brace-format
- msgid "All matches for argument '{0}' in module '{1}:{2}' are not active"
--msgstr "模块 '{1}:{2}' 中参数 '{0}' 的所有匹配项目都未激活"
-+msgstr "模块 '{1}:{2}' 中的参数 '{0}' 的所有匹配项目都未激活"
- 
--#: dnf/module/module_base.py:92
-+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
--msgstr "不允许从失效保险仓库 {1} 安装模块 '{0}'"
-+msgstr "不允许从 Fail-Safe repository {1} 安装模块 '{0}'"
- 
--#: dnf/module/module_base.py:102
-+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
- msgstr "不能为参数 {} 匹配配置文件。'{}:{}' 可用的配置文件为 : {}"
- 
--#: dnf/module/module_base.py:106
-+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216
- msgid "Unable to match profile for argument {}"
- msgstr "无法配置参数 {} 中的配置档案"
- 
-@@ -3797,41 +3761,55 @@ msgstr "没有模块 {}:{} 的配置文件"
- msgid "Default profile {} not available in module {}:{}"
- msgstr "默认配置文件 {} 在模块 {}:{} 中不可用"
- 
--#: dnf/module/module_base.py:142
-+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245
- msgid "Installing module from Fail-Safe repository is not allowed"
- msgstr "不允许从失效保险仓库中安装模块"
- 
--#: dnf/module/module_base.py:159 dnf/module/module_base.py:193
--#: dnf/module/module_base.py:337 dnf/module/module_base.py:355
--#: dnf/module/module_base.py:363 dnf/module/module_base.py:417
--#: dnf/module/module_base.py:473 dnf/module/module_base.py:539
-+#: dnf/module/module_base.py:194
-+#, python-brace-format
-+msgid "No active matches for argument '{0}' in module '{1}:{2}'"
-+msgstr "模块 '{1}:{2}' 中的参数 '{0}' 没有活跃的匹配"
-+
-+#: dnf/module/module_base.py:226
-+#, python-brace-format
-+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'"
-+msgstr "在模块 '{1}' 流 '{2}' 中没有安装的配置集 '{0}'"
-+
-+#: dnf/module/module_base.py:265
-+msgid "No packages available to distrosync for package name '{}'"
-+msgstr "软件包名称 '{}' 没有可用的软件包用于 distrosync"
-+
-+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452
-+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496
-+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599
-+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827
- msgid "Unable to resolve argument {}"
- msgstr "无法解析参数 {}"
- 
--#: dnf/module/module_base.py:160
--msgid "No match for package {}"
--msgstr "没有和{}匹配的软件包"
--
--#: dnf/module/module_base.py:204
-+#: dnf/module/module_base.py:319
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
- msgstr "不允许从失效保险仓库 {1} 中升级模块 '{0}'"
- 
--#: dnf/module/module_base.py:223 dnf/module/module_base.py:251
-+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366
- msgid "Unable to match profile in argument {}"
- msgstr "无法匹配参数 {} 中的配置档案"
- 
--#: dnf/module/module_base.py:231
-+#: dnf/module/module_base.py:346
- msgid "Upgrading module from Fail-Safe repository is not allowed"
- msgstr "不允许从失效保险仓库中升级模块"
- 
--#: dnf/module/module_base.py:367
-+#: dnf/module/module_base.py:500
- msgid ""
- "Only module name is required. Ignoring unneeded information in argument: "
- "'{}'"
- msgstr "只需要模块名。正在忽略'{}'中的无用信息"
- 
--#: dnf/package.py:298
-+#: dnf/module/module_base.py:828
-+msgid "No match for package {}"
-+msgstr "没有和{}匹配的软件包"
-+
-+#: dnf/package.py:333
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s: %s 检查失败:%s vs %s"
-@@ -3845,12 +3823,12 @@ msgstr "%s 为空文件"
- #: dnf/persistor.py:91
- #, python-format
- msgid "Failed to load expired repos cache: %s"
--msgstr ""
-+msgstr "加载过期的仓库缓存失败: %s"
- 
- #: dnf/persistor.py:99
- #, python-format
- msgid "Failed to store expired repos cache: %s"
--msgstr ""
-+msgstr "存储已过期的仓库缓存失败: %s"
- 
- #: dnf/persistor.py:106
- msgid "Failed storing last makecache time."
-@@ -3912,6 +3890,12 @@ msgstr "已添加 %s 仓库来自 %s"
- msgid "Errors occurred during test transaction."
- msgstr "测试事务过程中出现错误。"
- 
-+#: dnf/sack.py:47
-+msgid ""
-+"allow_vendor_change is disabled. This option is currently not supported for "
-+"downgrade and distro-sync commands"
-+msgstr "allow_vendor_change 被禁用。目前不支持 downgrade 和 distro-sync 命令"
-+
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
- msgctxt "currently"
-@@ -3958,164 +3942,196 @@ msgstr "运行脚本"
- msgid "Preparing"
- msgstr "准备中"
- 
--#: dnf/transaction_sr.py:60
-+#: dnf/transaction_sr.py:66
- #, python-brace-format
--msgid "Errors in \"{filename}\":"
--msgstr ""
-+msgid ""
-+"The following problems occurred while replaying the transaction from file "
-+"\"{filename}\":"
-+msgstr "在从文件 \"{filename}\" replay 事务时发生以下问题:"
- 
--#: dnf/transaction_sr.py:70
--#, python-brace-format
--msgid "Error in \"{filename}\": {error}"
--msgstr ""
-+#: dnf/transaction_sr.py:68
-+msgid "The following problems occurred while running a transaction:"
-+msgstr "运行事务时发生以下问题:"
- 
--#: dnf/transaction_sr.py:87
-+#: dnf/transaction_sr.py:89
- #, python-brace-format
- msgid "Invalid major version \"{major}\", number expected."
--msgstr ""
-+msgstr "无效的主版本 \"{major}\",需要是数字。"
- 
--#: dnf/transaction_sr.py:95
-+#: dnf/transaction_sr.py:97
- #, python-brace-format
- msgid "Invalid minor version \"{minor}\", number expected."
--msgstr ""
-+msgstr "无效的次版本 \"{minor}\",需要是数字。"
- 
--#: dnf/transaction_sr.py:101
-+#: dnf/transaction_sr.py:103
- #, python-brace-format
- msgid ""
- "Incompatible major version \"{major}\", supported major version is "
- "\"{major_supp}\"."
--msgstr ""
-+msgstr "不兼容的主版本 \"{major}\",支持的主版本是 \"{major_supp}\"。"
- 
--#: dnf/transaction_sr.py:244
-+#: dnf/transaction_sr.py:224
-+msgid ""
-+"Conflicting TransactionReplay arguments have been specified: filename, data"
-+msgstr "指定了有冲突的 TransactionReplay 参数: filename、data"
-+
-+#: dnf/transaction_sr.py:265
- #, python-brace-format
- msgid "Unexpected type of \"{id}\", {exp} expected."
--msgstr ""
-+msgstr "意外类型 \"{id}\",需要是 {exp}。"
- 
--#: dnf/transaction_sr.py:250
-+#: dnf/transaction_sr.py:271
- #, python-brace-format
- msgid "Missing key \"{key}\"."
--msgstr ""
-+msgstr "缺少键 \"{key}\"。"
- 
--#: dnf/transaction_sr.py:263
-+#: dnf/transaction_sr.py:285
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an rpm."
--msgstr ""
-+msgstr "在 rpm 中缺少对象键 \"{key}\"。"
- 
--#: dnf/transaction_sr.py:267
-+#: dnf/transaction_sr.py:289
- #, python-brace-format
- msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "rpm nevra \"{reason}\" 的软件包原因 \"{nevra}\" 的值无效。"
- 
--#: dnf/transaction_sr.py:275
-+#: dnf/transaction_sr.py:297
- #, python-brace-format
- msgid "Cannot parse NEVRA for package \"{nevra}\"."
--msgstr ""
-+msgstr "无法为软件包 \"{nevra}\" 解析 NEVRA。"
- 
--#: dnf/transaction_sr.py:286
-+#: dnf/transaction_sr.py:321
- #, python-brace-format
- msgid "Cannot find rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "无法找到 rpm nevra \"{nevra}\"。"
- 
--#: dnf/transaction_sr.py:301
--#, fuzzy, python-brace-format
--#| msgid "Package %s is already installed."
-+#: dnf/transaction_sr.py:336
-+#, python-brace-format
- msgid "Package \"{na}\" is already installed for action \"{action}\"."
--msgstr "软件包 %s 已安装。"
-+msgstr "已为操作 \"{action}\" 安装了软件包 \"{na}\"。"
- 
--#: dnf/transaction_sr.py:311
-+#: dnf/transaction_sr.py:345
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\" not available in repositories for action "
- "\"{action}\"."
--msgstr ""
-+msgstr "对于操作 \"{action}\",软件包 nevra \"{nevra}\" 没有包括在仓库中。"
- 
--#: dnf/transaction_sr.py:322
-+#: dnf/transaction_sr.py:356
- #, python-brace-format
- msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"."
--msgstr ""
-+msgstr "没有为操作 \"{action}\" 安装软件包 nevra \"{nevra}\"。"
- 
--#: dnf/transaction_sr.py:336
-+#: dnf/transaction_sr.py:370
- #, python-brace-format
- msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"."
--msgstr ""
-+msgstr "rpm nevra \"{action}\" 的软件包操作 \"{nevra}\" 无效。"
- 
--#: dnf/transaction_sr.py:343
--#, fuzzy, python-format
--#| msgid "Module or Group '%s' is not available."
-+#: dnf/transaction_sr.py:377
-+#, python-format
- msgid "Group id '%s' is not available."
--msgstr "模块或者组 '%s' 不可用。"
-+msgstr "组 id '%s' 不可用。"
- 
--#: dnf/transaction_sr.py:364
-+#: dnf/transaction_sr.py:398
- #, python-brace-format
- msgid "Missing object key \"{key}\" in groups.packages."
--msgstr ""
-+msgstr "在 groups.packages 中缺少对象键 \"{key}\"。"
- 
--#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387
--#, fuzzy, python-format
--#| msgid "Module or Group '%s' is not installed."
-+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421
-+#, python-format
- msgid "Group id '%s' is not installed."
--msgstr "模块或者组 '%s' 未安装。"
-+msgstr "组 id '%s' 没有安装。"
- 
--#: dnf/transaction_sr.py:398
--#, fuzzy, python-format
--#| msgid "Environment '%s' is not available."
-+#: dnf/transaction_sr.py:432
-+#, python-format
- msgid "Environment id '%s' is not available."
--msgstr "环境 '%s' 不可用。"
-+msgstr "环境 id '%s' 不可用。"
- 
--#: dnf/transaction_sr.py:422
-+#: dnf/transaction_sr.py:456
- #, python-brace-format
- msgid ""
- "Invalid value \"{group_type}\" of environments.groups.group_type, only "
- "\"mandatory\" or \"optional\" is supported."
- msgstr ""
-+"environments.groups.group_type 无效的值 \"{group_type}\",只支持 \"mandatory\" 或 "
-+"\"optional\"。"
- 
--#: dnf/transaction_sr.py:430
-+#: dnf/transaction_sr.py:464
- #, python-brace-format
- msgid "Missing object key \"{key}\" in environments.groups."
--msgstr ""
-+msgstr "在 environment.groups 中缺少对象键 \"{key}\"。"
- 
--#: dnf/transaction_sr.py:508
-+#: dnf/transaction_sr.py:542
- #, python-brace-format
- msgid "Unexpected value of group action \"{action}\" for group \"{group}\"."
--msgstr ""
-+msgstr "组 \"{action}\" 的组操作 \"{group}\" 的值无效。"
- 
--#: dnf/transaction_sr.py:513
-+#: dnf/transaction_sr.py:547
- #, python-brace-format
- msgid "Missing object key \"{key}\" in a group."
--msgstr ""
-+msgstr "在一个组中缺少对象键 \"{key}\"。"
- 
--#: dnf/transaction_sr.py:537
-+#: dnf/transaction_sr.py:571
- #, python-brace-format
- msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"."
--msgstr ""
-+msgstr "环境 \"{env}\" 的环境操作 \"{action}\" 的值无效。"
- 
--#: dnf/transaction_sr.py:542
-+#: dnf/transaction_sr.py:576
- #, python-brace-format
- msgid "Missing object key \"{key}\" in an environment."
--msgstr ""
-+msgstr "在环境中缺少对象键 \"{key}\"。"
- 
--#: dnf/transaction_sr.py:581
-+#: dnf/transaction_sr.py:615
- #, python-brace-format
- msgid ""
- "Package nevra \"{nevra}\", which is not present in the transaction file, was"
- " pulled into the transaction."
--msgstr ""
-+msgstr "软件包 nevra \"{nevra}\" 没有包括在事务文件中,但它被拉取到事务中。"
- 
--#: dnf/util.py:391 dnf/util.py:393
-+#: dnf/util.py:393 dnf/util.py:395
- msgid "Problem"
- msgstr "问题"
- 
--#: dnf/util.py:444
-+#: dnf/util.py:446
- msgid "TransactionItem not found for key: {}"
- msgstr "找不到键的 TransactionItem: {}"
- 
--#: dnf/util.py:454
-+#: dnf/util.py:456
- msgid "TransactionSWDBItem not found for key: {}"
- msgstr "找不到键的 TransactionSWDBItem: {}"
- 
--#: dnf/util.py:457
-+#: dnf/util.py:459
- msgid "Errors occurred during transaction."
- msgstr "事务过程中出现错误。"
- 
-+#: dnf/util.py:595
-+msgid "Reinstalled"
-+msgstr "已重装"
-+
-+#: dnf/util.py:596
-+msgid "Skipped"
-+msgstr "已跳过"
-+
-+#: dnf/util.py:597
-+msgid "Removed"
-+msgstr "已移除"
-+
-+#: dnf/util.py:600
-+msgid "Failed"
-+msgstr "失败"
-+
-+#~ msgid "Action not handled: {}"
-+#~ msgstr "操作没被处理:{}"
-+
-+#~ msgid "no package matched"
-+#~ msgstr "没有能够与之匹配的软件包"
-+
-+#~ msgid "Not found given transaction ID"
-+#~ msgstr "未找到指定事务 ID"
-+
-+#~ msgid "Undoing transaction {}, from {}"
-+#~ msgstr "撤销事务 {},从 {}"
-+
- #~ msgid "format for displaying found packages"
- #~ msgstr "用于显示已查找到软件包的格式"
- 
--- 
-2.29.2
-
diff --git a/SPECS/dnf.spec b/SPECS/dnf.spec
index 24d28b1..89825db 100644
--- a/SPECS/dnf.spec
+++ b/SPECS/dnf.spec
@@ -1,11 +1,14 @@
+# Always build out-of-source
+%define __cmake_in_source_build 1
+
 # default dependencies
-%global hawkey_version 0.55.0-5
+%global hawkey_version 0.61.1
 %global libcomps_version 0.1.8
-%global libmodulemd_version 1.4.0
+%global libmodulemd_version 2.9.3
 %global rpm_version 4.14.2-35
 
 # conflicts
-%global conflicts_dnf_plugins_core_version 4.0.16
+%global conflicts_dnf_plugins_core_version 4.0.20
 %global conflicts_dnf_plugins_extras_version 4.0.4
 %global conflicts_dnfdaemon_version 0.3.19
 
@@ -24,19 +27,6 @@
 %endif
 
 
-%if 0%{?rhel} && 0%{?rhel} <= 7
-%bcond_with python3
-%else
-%bcond_without python3
-%endif
-
-%if 0%{?rhel} >= 8 || 0%{?fedora} > 29
-# Disable python2 build
-%bcond_with python2
-%else
-%bcond_without python2
-%endif
-
 # YUM compat subpackage configuration
 #
 # level=full    -> deploy all compat symlinks (conflicts with yum < 4)
@@ -64,13 +54,7 @@
 %global confdir %{_sysconfdir}/%{name}
 %global pluginconfpath %{confdir}/plugins
 
-%if %{with python2}
-    %global py2pluginpath %{python2_sitelib}/%{name}-plugins
-%endif
-
-%if %{with python3}
-    %global py3pluginpath %{python3_sitelib}/%{name}-plugins
-%endif
+%global py3pluginpath %{python3_sitelib}/%{name}-plugins
 
 # Use the same directory of the main package for subpackage licence and docs
 %global _docdir_fmt %{name}
@@ -81,53 +65,14 @@
 It supports RPMs, modules and comps groups & environments.
 
 Name:           dnf
-Version:        4.4.2
-Release:        11%{?dist}
+Version:        4.7.0
+Release:        1%{?dist}
 Summary:        %{pkg_summary}
 # For a breakdown of the licensing, see PACKAGE-LICENSING
-License:        GPLv2+ and GPLv2 and GPL
+License:        GPLv2+
 URL:            https://github.com/rpm-software-management/dnf
 Source0:        %{url}/archive/%{version}/%{name}-%{version}.tar.gz
-# https://github.com/rpm-software-management/dnf/commit/f6d1e4308769efaa6175f70d52bfd784c62fbf98
-Patch1:         0001-tests-SQL-write-a-readonly-folder.patch
-# https://github.com/rpm-software-management/dnf/commit/c2e4901cec947e5be2e5ff5afa22691841d00bdc
-Patch2:         0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch
-# https://github.com/rpm-software-management/dnf/pull/1675
-Patch3:         0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch
-# https://github.com/rpm-software-management/dnf/pull/1698
-Patch4:         0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch
-# https://github.com/rpm-software-management/dnf/pull/1659
-# https://github.com/rpm-software-management/dnf/pull/1689
-# https://github.com/rpm-software-management/dnf/pull/1709
-# https://github.com/rpm-software-management/dnf/pull/1690
-Patch5:         0005-dnf-history-operations-that-work-with-comps-correctly.patch
-# https://github.com/rpm-software-management/dnf/pull/1691
-Patch6:         0006-Remove-sourcepackages-from-install-upgrade-set.patch
-# https://github.com/rpm-software-management/dnf/pull/1710
-Patch7:         0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch
-# https://github.com/rpm-software-management/dnf/pull/1685
-Patch8:         0008-Module-switch-command.patch
-# https://github.com/rpm-software-management/dnf/pull/1702
-Patch9:         0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch
-# https://github.com/rpm-software-management/dnf/pull/1693
-Patch10:        0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch
-# https://github.com/rpm-software-management/dnf/pull/1692
-Patch11:        0011-Add-new-attribute-for-Package--from-repo.patch
-# https://github.com/rpm-software-management/dnf/pull/1695
-Patch12:        0012-Change-behaviour-of-Package-.from-repo.patch
-# https://github.com/rpm-software-management/dnf/pull/1686
-Patch13:        0013-Package-add-a-get-header--method.patch
-# https://github.com/rpm-software-management/dnf/pull/1703
-Patch14:        0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch
-# https://github.com/rpm-software-management/dnf/pull/1711
-Patch15:        0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch
-# https://github.com/rpm-software-management/dnf/pull/1721
-Patch16:        0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch
-#https://github.com/rpm-software-management/dnf/pull/1723
-Patch17:        0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch
-# https://github.com/rpm-software-management/dnf/pull/1725
-Patch18:        0018-Allow-stream-switching-if-option-enabled.patch
-Patch19:        0019-Update-translations.patch
+Patch1:         0001-Set-top-level-directory-for-unittest.patch
 
 BuildArch:      noarch
 BuildRequires:  cmake
@@ -135,22 +80,13 @@ BuildRequires:  gettext
 # Documentation
 BuildRequires:  systemd
 BuildRequires:  bash-completion
-%if %{with python3}
 BuildRequires:  %{_bindir}/sphinx-build-3
 Requires:       python3-%{name} = %{version}-%{release}
-%else
-BuildRequires:  %{_bindir}/sphinx-build
-Requires:       python2-%{name} = %{version}-%{release}
-%endif
 %if 0%{?rhel} && 0%{?rhel} <= 7
 Requires:       python-dbus
 Requires:       %{_bindir}/sqlite3
 %else
-%if %{with python3}
 Recommends:     (python3-dbus if NetworkManager)
-%else
-Recommends:     (python2-dbus if NetworkManager)
-%endif
 Recommends:     (%{_bindir}/sqlite3 if bash-completion)
 %endif
 Provides:       dnf-command(alias)
@@ -176,9 +112,7 @@ Provides:       dnf-command(search)
 Provides:       dnf-command(updateinfo)
 Provides:       dnf-command(upgrade)
 Provides:       dnf-command(upgrade-to)
-Conflicts:      python2-dnf-plugins-core < %{conflicts_dnf_plugins_core_version}
 Conflicts:      python3-dnf-plugins-core < %{conflicts_dnf_plugins_core_version}
-Conflicts:      python2-dnf-plugins-extras-common < %{conflicts_dnf_plugins_extras_version}
 Conflicts:      python3-dnf-plugins-extras-common < %{conflicts_dnf_plugins_extras_version}
 
 %description
@@ -208,55 +142,6 @@ Conflicts:      yum < 3.4.3-505
 %description -n %{yum_subpackage_name}
 %{pkg_description}
 
-%if %{with python2}
-%package -n python2-%{name}
-Summary:        Python 2 interface to DNF
-%{?python_provide:%python_provide python2-%{name}}
-BuildRequires:  python2-devel
-BuildRequires:  python2-hawkey >= %{hawkey_version}
-BuildRequires:  python2-libdnf >= %{hawkey_version}
-BuildRequires:  python2-libcomps >= %{libcomps_version}
-BuildRequires:  python2-libdnf
-BuildRequires:  python2-nose
-BuildRequires:  libmodulemd >= %{libmodulemd_version}
-Requires:       libmodulemd >= %{libmodulemd_version}
-%if (0%{?rhel} && 0%{?rhel} <= 7)
-BuildRequires:  pygpgme
-Requires:       pygpgme
-BuildRequires:  python-enum34
-Requires:       python-enum34
-%else
-BuildRequires:  python2-gpg
-Requires:       python2-gpg
-BuildRequires:  python2-enum34
-Requires:       python2-enum34
-%endif
-Requires:       %{name}-data = %{version}-%{release}
-%if 0%{?fedora}
-Recommends:     deltarpm
-# required for DNSSEC main.gpgkey_dns_verification https://dnf.readthedocs.io/en/latest/conf_ref.html
-Recommends:     python2-unbound
-%endif
-Requires:       python2-hawkey >= %{hawkey_version}
-Requires:       python2-libdnf >= %{hawkey_version}
-Requires:       python2-libcomps >= %{libcomps_version}
-Requires:       python2-libdnf
-%if 0%{?rhel} && 0%{?rhel} <= 7
-BuildRequires:  rpm-python >= %{rpm_version}
-Requires:       rpm-python >= %{rpm_version}
-%else
-BuildRequires:  python2-rpm >= %{rpm_version}
-Requires:       python2-rpm >= %{rpm_version}
-Recommends:     rpm-plugin-systemd-inhibit
-%endif
-Conflicts:      dnfdaemon < %{conflicts_dnfdaemon_version}
-
-%description -n python2-%{name}
-Python 2 interface to DNF.
-%endif
-# ^ %%{with python2}
-
-%if %{with python3}
 %package -n python3-%{name}
 Summary:        Python 3 interface to DNF
 %{?python_provide:%python_provide python3-%{name}}
@@ -267,7 +152,6 @@ BuildRequires:  python3-libcomps >= %{libcomps_version}
 BuildRequires:  python3-libdnf
 BuildRequires:  libmodulemd >= %{libmodulemd_version}
 Requires:       libmodulemd >= %{libmodulemd_version}
-BuildRequires:  python3-nose
 BuildRequires:  python3-gpg
 Requires:       python3-gpg
 Requires:       %{name}-data = %{version}-%{release}
@@ -290,7 +174,6 @@ Recommends:     rpm-plugin-systemd-inhibit
 
 %description -n python3-%{name}
 Python 3 interface to DNF.
-%endif
 
 %package automatic
 Summary:        %{pkg_summary} - automated upgrades
@@ -304,40 +187,22 @@ Systemd units that can periodically download package upgrades and apply them.
 
 %prep
 %autosetup -p1
-mkdir build-py2
-mkdir build-py3
 
+mkdir build-py3
 
 %build
-%if %{with python2}
-    pushd build-py2
-    %cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python2} -DDNF_VERSION=%{version}
-    %make_build
-    make doc-man
-    popd
-%endif
-
-%if %{with python3}
-    pushd build-py3
-    %cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python3} -DDNF_VERSION=%{version}
-    %make_build
-    make doc-man
-    popd
-%endif
 
+pushd build-py3
+%cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python3} -DDNF_VERSION=%{version}
+%make_build
+make doc-man
+popd
 
 %install
-%if %{with python2}
-    pushd build-py2
-    %make_install
-    popd
-%endif
 
-%if %{with python3}
-    pushd build-py3
-    %make_install
-    popd
-%endif
+pushd build-py3
+%make_install
+popd
 
 %find_lang %{name}
 mkdir -p %{buildroot}%{confdir}/vars
@@ -345,22 +210,12 @@ mkdir -p %{buildroot}%{confdir}/aliases.d
 mkdir -p %{buildroot}%{pluginconfpath}/
 mkdir -p %{buildroot}%{_sysconfdir}/%{name}/modules.d
 mkdir -p %{buildroot}%{_sysconfdir}/%{name}/modules.defaults.d
-%if %{with python2}
-mkdir -p %{buildroot}%{py2pluginpath}/
-%endif
-%if %{with python3}
 mkdir -p %{buildroot}%{py3pluginpath}/__pycache__/
-%endif
 mkdir -p %{buildroot}%{_localstatedir}/log/
 mkdir -p %{buildroot}%{_var}/cache/dnf/
 touch %{buildroot}%{_localstatedir}/log/%{name}.log
-%if %{with python3}
 ln -sr %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/dnf
 mv %{buildroot}%{_bindir}/dnf-automatic-3 %{buildroot}%{_bindir}/dnf-automatic
-%else
-ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/dnf
-mv %{buildroot}%{_bindir}/dnf-automatic-2 %{buildroot}%{_bindir}/dnf-automatic
-%endif
 rm -vf %{buildroot}%{_bindir}/dnf-automatic-*
 
 # Strict conf distribution
@@ -372,17 +227,7 @@ rm -vf %{buildroot}%{confdir}/%{name}-strict.conf
 
 # YUM compat layer
 ln -sr  %{buildroot}%{confdir}/%{name}.conf %{buildroot}%{_sysconfdir}/yum.conf
-%if %{with python3}
 ln -sr  %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/yum
-%else
-%if "%{yum_compat_level}" == "preview"
-ln -sr  %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum4
-ln -sr  %{buildroot}%{_mandir}/man8/dnf.8.gz %{buildroot}%{_mandir}/man8/yum4.8.gz
-rm -f %{buildroot}%{_mandir}/man8/yum.8.gz
-%else
-ln -sr  %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum
-%endif
-%endif
 %if "%{yum_compat_level}" == "full"
 mkdir -p %{buildroot}%{_sysconfdir}/yum
 ln -sr  %{buildroot}%{pluginconfpath} %{buildroot}%{_sysconfdir}/yum/pluginconf.d
@@ -392,17 +237,10 @@ ln -sr  %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars
 
 
 %check
-%if %{with python2}
-    pushd build-py2
-    ctest -VV
-    popd
-%endif
 
-%if %{with python3}
-    pushd build-py3
-    ctest -VV
-    popd
-%endif
+pushd build-py3
+ctest -VV
+popd
 
 
 %post
@@ -512,22 +350,12 @@ ln -sr  %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars
 %exclude %{_mandir}/man8/yum.8*
 %endif
 
-%if %{with python2}
-%files -n python2-%{name}
-%{_bindir}/%{name}-2
-%exclude %{python2_sitelib}/%{name}/automatic
-%{python2_sitelib}/%{name}/
-%dir %{py2pluginpath}
-%endif
-
-%if %{with python3}
 %files -n python3-%{name}
 %{_bindir}/%{name}-3
 %exclude %{python3_sitelib}/%{name}/automatic
 %{python3_sitelib}/%{name}/
 %dir %{py3pluginpath}
 %dir %{py3pluginpath}/__pycache__
-%endif
 
 %files automatic
 %{_bindir}/%{name}-automatic
@@ -541,15 +369,39 @@ ln -sr  %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars
 %{_unitdir}/%{name}-automatic-download.timer
 %{_unitdir}/%{name}-automatic-install.service
 %{_unitdir}/%{name}-automatic-install.timer
-%if %{with python3}
 %{python3_sitelib}/%{name}/automatic/
-%else
-%{python2_sitelib}/%{name}/automatic/
-%endif
 
 %changelog
-* Mon Mar 8 2021 Marek Blaha <mblaha@redhat.com> - 4.4.2-11
-- Update translations
+* Wed May 19 2021 Pavla Kratochvilova <pkratoch@redhat.com> - 4.7.0-1
+- Update to 4.7.0
+- New optional parameter for filter_modules enables following modular obsoletes based on a config option module_obsoletes
+- Fix module remove --all when no match spec (RhBug:1904490)
+- Make an error message more informative (RhBug:1814831)
+- Expand history to full term size when output is redirected (RhBug:1852577) (RhBug:1852577,1906970)
+- Print additional information when verifying GPG key using DNS
+- Enhanced detection of plugins removed in transaction (RhBug:1929163)
+- Improve repo config path ordering to fix a comps merging issue (RhBug:1928181)
+- Keep reason when package is removed (RhBug:1921063)
+- Improve mechanism for application of security filters (RhBug:1918475)
+- [API] Add new method for reset of security filters
+- Remove hardcoded logfile permissions (RhBug:1910084)
+- Preserve file mode during log rotation (RhBug:1910084)
+- Increase loglevel in case of invalid config options
+- Prevent traceback (catch ValueError) if pkg is from cmdline
+- Check for specific key string when verifing signatures (RhBug:1915990)
+- Use rpmkeys binary to verify package signature (RhBug:1915990)
+- [doc] Improve description of modular filtering
+- [doc] deprecated alias for dnf repoquery --deplist <deplist_option-label>
+- [doc] Describe install with just a name and obsoletes (RhBug:1902279)
+- [doc] Fix: "sslcacert" contains path to the file
+- [doc] Added proxy ssl configuration options, increase libdnf require
+- [doc] Update documentation for module_obsoletes and module_stream_switch
+- [doc] Improve documentation for Hotfix repositories
+- [doc] fix: "makecache" command downloads only enabled repositories
+- [doc] Add info that maximum parallel downloads is 20
+- [doc] installonly_limit documentation follows behavior
+- [doc] Add documentation for config option sslverifystatus (RhBug:1814383)
+- The noroot plugin no longer exists, remove mention
 
 * Thu Feb 11 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-10
 - Allow stream switching if option enabled