diff --git a/.dnf.metadata b/.dnf.metadata
index 0bcc7b5..9125cc8 100644
--- a/.dnf.metadata
+++ b/.dnf.metadata
@@ -1 +1 @@
-0da07a3e6ff19430ffe39699e474439eab63ee7d SOURCES/dnf-4.2.23.tar.gz
+5941a49cfd466aeed4ec882a33647912c2a89245 SOURCES/dnf-4.4.2.tar.gz
diff --git a/.gitignore b/.gitignore
index c0cb815..378380e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/dnf-4.2.23.tar.gz
+SOURCES/dnf-4.4.2.tar.gz
diff --git a/SOURCES/0001-Handle-empty-comps-group-name-RhBug1826198.patch b/SOURCES/0001-Handle-empty-comps-group-name-RhBug1826198.patch
deleted file mode 100644
index f6266a4..0000000
--- a/SOURCES/0001-Handle-empty-comps-group-name-RhBug1826198.patch
+++ /dev/null
@@ -1,238 +0,0 @@
-From 3c758a4ea670fab1f4b55fa878ebf2b2ff4b678b 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, 28 Apr 2020 09:08:05 +0200
-Subject: [PATCH] Handle empty comps group name (RhBug:1826198)
-
-Don't crash on empty comps group/environment name. In outputs, use the
-"<name-unset>" placeholder instead of the name.
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1826198
----
- dnf/cli/commands/group.py  |  4 ++--
- dnf/cli/output.py          | 16 ++++++++++------
- dnf/comps.py               | 11 ++++++++++-
- dnf/db/group.py            | 12 ++++++++----
- tests/repos/main_comps.xml |  7 +++++++
- tests/support.py           |  2 +-
- tests/test_comps.py        |  6 +++---
- tests/test_groups.py       |  9 +++++++++
- 8 files changed, 50 insertions(+), 17 deletions(-)
-
-diff --git a/dnf/cli/commands/group.py b/dnf/cli/commands/group.py
-index f535a50980..4ffd3b89c8 100644
---- a/dnf/cli/commands/group.py
-+++ b/dnf/cli/commands/group.py
-@@ -177,7 +177,7 @@ def _list(self, userlist):
-         def _out_grp(sect, group):
-             if not done:
-                 print(sect)
--            msg = '   %s' % group.ui_name
-+            msg = '   %s' % (group.ui_name if group.ui_name is not None else _("<name-unset>"))
-             if print_ids:
-                 msg += ' (%s)' % group.id
-             if group.lang_only:
-@@ -188,7 +188,7 @@ def _out_env(sect, envs):
-             if envs:
-                 print(sect)
-             for e in envs:
--                msg = '   %s' % e.ui_name
-+                msg = '   %s' % (e.ui_name if e.ui_name is not None else _("<name-unset>"))
-                 if print_ids:
-                     msg += ' (%s)' % e.id
-                 print(msg)
-diff --git a/dnf/cli/output.py b/dnf/cli/output.py
-index 67eab80b19..2585a5c773 100644
---- a/dnf/cli/output.py
-+++ b/dnf/cli/output.py
-@@ -1221,47 +1221,51 @@ def _add_line(lines, data, a_wid, po, obsoletes=[]):
-                 lines.append((name, "", "", "", "", "", ""))
-             pkglist_lines.append((action, lines))
-         if self.base._history:
-+            def format_line(group):
-+                name = group.getName()
-+                return (name if name else _("<name-unset>"), "", "", "", "", "", "")
-+
-             install_env_group = self.base._history.env._installed
-             if install_env_group:
-                 action = _("Installing Environment Groups")
-                 lines = []
-                 for group in install_env_group.values():
--                    lines.append((group.getName(), "", "", "", "", "", ""))
-+                    lines.append(format_line(group))
-                 pkglist_lines.append((action, lines))
-             upgrade_env_group = self.base._history.env._upgraded
-             if upgrade_env_group:
-                 action = _("Upgrading Environment Groups")
-                 lines = []
-                 for group in upgrade_env_group.values():
--                    lines.append((group.getName(), "", "", "", "", "", ""))
-+                    lines.append(format_line(group))
-                 pkglist_lines.append((action, lines))
-             remove_env_group = self.base._history.env._removed
-             if remove_env_group:
-                 action = _("Removing Environment Groups")
-                 lines = []
-                 for group in remove_env_group.values():
--                    lines.append((group.getName(), "", "", "", "", "", ""))
-+                    lines.append(format_line(group))
-                 pkglist_lines.append((action, lines))
-             install_group = self.base._history.group._installed
-             if install_group:
-                 action = _("Installing Groups")
-                 lines = []
-                 for group in install_group.values():
--                    lines.append((group.getName(), "", "", "", "", "", ""))
-+                    lines.append(format_line(group))
-                 pkglist_lines.append((action, lines))
-             upgrade_group = self.base._history.group._upgraded
-             if upgrade_group:
-                 action = _("Upgrading Groups")
-                 lines = []
-                 for group in upgrade_group.values():
--                    lines.append((group.getName(), "", "", "", "", "", ""))
-+                    lines.append(format_line(group))
-                 pkglist_lines.append((action, lines))
-             remove_group = self.base._history.group._removed
-             if remove_group:
-                 action = _("Removing Groups")
-                 lines = []
-                 for group in remove_group.values():
--                    lines.append((group.getName(), "", "", "", "", "", ""))
-+                    lines.append(format_line(group))
-                 pkglist_lines.append((action, lines))
-         # show skipped conflicting packages
-         if not self.conf.best and self.base._goal.actions & forward_actions:
-diff --git a/dnf/comps.py b/dnf/comps.py
-index 316d647087..4ca15b1e07 100644
---- a/dnf/comps.py
-+++ b/dnf/comps.py
-@@ -75,7 +75,16 @@ def _by_pattern(pattern, case_sensitive, sqn):
-     else:
-         match = re.compile(fnmatch.translate(pattern), flags=re.I).match
- 
--    return {g for g in sqn if match(g.name) or match(g.id) or match(g.ui_name)}
-+    ret = set()
-+    for g in sqn:
-+        if match(g.id):
-+            ret.add(g)
-+        elif g.name is not None and match(g.name):
-+            ret.add(g)
-+        elif g.ui_name is not None and match(g.ui_name):
-+            ret.add(g)
-+
-+    return ret
- 
- 
- def _fn_display_order(group):
-diff --git a/dnf/db/group.py b/dnf/db/group.py
-index e3a087760b..5d7e18d1a8 100644
---- a/dnf/db/group.py
-+++ b/dnf/db/group.py
-@@ -78,8 +78,10 @@ def _get_obj_id(self, obj):
-     def new(self, obj_id, name, translated_name, pkg_types):
-         swdb_group = self.history.swdb.createCompsGroupItem()
-         swdb_group.setGroupId(obj_id)
--        swdb_group.setName(name)
--        swdb_group.setTranslatedName(translated_name)
-+        if name is not None:
-+            swdb_group.setName(name)
-+        if translated_name is not None:
-+            swdb_group.setTranslatedName(translated_name)
-         swdb_group.setPackageTypes(pkg_types)
-         return swdb_group
- 
-@@ -136,8 +138,10 @@ def _get_obj_id(self, obj):
-     def new(self, obj_id, name, translated_name, pkg_types):
-         swdb_env = self.history.swdb.createCompsEnvironmentItem()
-         swdb_env.setEnvironmentId(obj_id)
--        swdb_env.setName(name)
--        swdb_env.setTranslatedName(translated_name)
-+        if name is not None:
-+            swdb_env.setName(name)
-+        if translated_name is not None:
-+            swdb_env.setTranslatedName(translated_name)
-         swdb_env.setPackageTypes(pkg_types)
-         return swdb_env
- 
-diff --git a/tests/repos/main_comps.xml b/tests/repos/main_comps.xml
-index 9e694d13a5..584bb25b3a 100644
---- a/tests/repos/main_comps.xml
-+++ b/tests/repos/main_comps.xml
-@@ -49,6 +49,13 @@
-       <packagereq type="optional">brokendeps</packagereq>
-     </packagelist>
-   </group>
-+  <group>
-+    <id>missing-name-group</id>
-+    <name></name>
-+    <packagelist>
-+      <packagereq type="mandatory">meaning-of-life</packagereq>
-+    </packagelist>
-+  </group>
-   <category>
-    <id>base-system</id>
-    <display_order>99</display_order>
-diff --git a/tests/support.py b/tests/support.py
-index e549ba5b95..a7d6a8542c 100644
---- a/tests/support.py
-+++ b/tests/support.py
-@@ -94,7 +94,7 @@ def mock_open(mock=None, data=None):
- MAIN_NSOLVABLES = 9
- UPDATES_NSOLVABLES = 4
- AVAILABLE_NSOLVABLES = MAIN_NSOLVABLES + UPDATES_NSOLVABLES
--TOTAL_GROUPS = 4
-+TOTAL_GROUPS = 5
- TOTAL_NSOLVABLES = SYSTEM_NSOLVABLES + AVAILABLE_NSOLVABLES
- 
- 
-diff --git a/tests/test_comps.py b/tests/test_comps.py
-index 30d468e3af..763218587f 100644
---- a/tests/test_comps.py
-+++ b/tests/test_comps.py
-@@ -107,7 +107,7 @@ def test_group_packages(self):
-     def test_iteration(self):
-         comps = self.comps
-         self.assertEqual([g.name for g in comps.groups_iter()],
--                         ['Base', 'Solid Ground', "Pepper's", "Broken Group"])
-+                         ['Base', 'Solid Ground', "Pepper's", "Broken Group", None])
-         self.assertEqual([c.name for c in comps.categories_iter()],
-                          ['Base System'])
-         g = dnf.util.first(comps.groups_iter())
-@@ -115,7 +115,7 @@ def test_iteration(self):
- 
-     def test_group_display_order(self):
-         self.assertEqual([g.name for g in self.comps.groups],
--                         ["Pepper's", 'Base', 'Solid Ground', 'Broken Group'])
-+                         ["Pepper's", 'Base', 'Solid Ground', 'Broken Group', None])
- 
-     def test_packages(self):
-         comps = self.comps
-@@ -127,7 +127,7 @@ def test_packages(self):
- 
-     def test_size(self):
-         comps = self.comps
--        self.assertLength(comps, 6)
-+        self.assertLength(comps, 7)
-         self.assertLength(comps.groups, tests.support.TOTAL_GROUPS)
-         self.assertLength(comps.categories, 1)
-         self.assertLength(comps.environments, 1)
-diff --git a/tests/test_groups.py b/tests/test_groups.py
-index fe388f96c0..8972da687e 100644
---- a/tests/test_groups.py
-+++ b/tests/test_groups.py
-@@ -295,6 +295,15 @@ def test_group_install_broken_optional_nonstrict(self):
-         self.assertLength(inst, 1)
-         self.assertEmpty(removed)
- 
-+    def test_group_install_missing_name(self):
-+        comps_group = self.base.comps.group_by_pattern('missing-name-group')
-+
-+        cnt = self.base.group_install(comps_group.id, ('mandatory', 'default', 'optional'),
-+                                      strict=False)
-+        self._swdb_commit()
-+        self.base.resolve()
-+        self.assertEqual(cnt, 1)
-+
- 
- class EnvironmentInstallTest(tests.support.ResultTestCase):
-     """Set up a test where sugar is considered not installed."""
diff --git a/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch b/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch
new file mode 100644
index 0000000..39780f4
--- /dev/null
+++ b/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch
@@ -0,0 +1,45 @@
+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-Add-logfilelevel-configuration-RhBug-1802074.patch b/SOURCES/0002-Add-logfilelevel-configuration-RhBug-1802074.patch
deleted file mode 100644
index bc02293..0000000
--- a/SOURCES/0002-Add-logfilelevel-configuration-RhBug-1802074.patch
+++ /dev/null
@@ -1,302 +0,0 @@
-From 9f9bfdfcb576846436f97275d6ee82004ceb4cb9 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Thu, 4 Jun 2020 16:02:58 +0200
-Subject: [PATCH 1/3] Add logfilelevel configuration (RhBug:1802074)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1802074
----
- dnf.spec         |  2 +-
- dnf/logging.py   | 17 +++++++++++------
- doc/conf_ref.rst |  6 ++++++
- 3 files changed, 18 insertions(+), 7 deletions(-)
-
-diff --git a/dnf.spec b/dnf.spec
-index 1423c6d5b5..27bae7aaa7 100644
---- a/dnf.spec
-+++ b/dnf.spec
-@@ -1,5 +1,5 @@
- # default dependencies
--%global hawkey_version 0.48.0
-+%global hawkey_version 0.50.0
- %global libcomps_version 0.1.8
- %global libmodulemd_version 1.4.0
- %global rpm_version 4.14.0
-diff --git a/dnf/logging.py b/dnf/logging.py
-index bd660470a3..c578575e1c 100644
---- a/dnf/logging.py
-+++ b/dnf/logging.py
-@@ -70,11 +70,14 @@ def filter(self, record):
-     4 : logging.DEBUG,
-     5 : logging.DEBUG,
-     6 : logging.DEBUG, # verbose value
-+    7 : DDEBUG,
-+    8 : SUBDEBUG,
-+    9 : TRACE,
-     }
- 
- def _cfg_verbose_val2level(cfg_errval):
-     assert 0 <= cfg_errval <= 10
--    return _VERBOSE_VAL_MAPPING.get(cfg_errval, DDEBUG)
-+    return _VERBOSE_VAL_MAPPING.get(cfg_errval, TRACE)
- 
- 
- # Both the DNF default and the verbose default are WARNING. Note that ERROR has
-@@ -157,13 +160,14 @@ def _presetup(self):
-         self.stderr_handler = stderr
- 
-     @only_once
--    def _setup_file_loggers(self, verbose_level, logdir, log_size, log_rotate):
-+    def _setup_file_loggers(self, logfile_level, verbose_level, logdir, log_size, log_rotate):
-         logger_dnf = logging.getLogger("dnf")
-         logger_dnf.setLevel(TRACE)
- 
-         # setup file logger
-         logfile = os.path.join(logdir, dnf.const.LOG)
-         handler = _create_filehandler(logfile, log_size, log_rotate)
-+        handler.setLevel(logfile_level)
-         logger_dnf.addHandler(handler)
-         # put the marker in the file now:
-         _paint_mark(logger_dnf)
-@@ -185,14 +189,14 @@ def _setup_file_loggers(self, verbose_level, logdir, log_size, log_rotate):
-         _paint_mark(logger_rpm)
- 
-     @only_once
--    def _setup(self, verbose_level, error_level, logdir, log_size, log_rotate):
-+    def _setup(self, verbose_level, error_level, logfile_level, logdir, log_size, log_rotate):
-         self._presetup()
- 
-         # temporarily turn off stdout/stderr handlers:
-         self.stdout_handler.setLevel(SUPERCRITICAL)
-         self.stderr_handler.setLevel(SUPERCRITICAL)
- 
--        self._setup_file_loggers(verbose_level, logdir, log_size, log_rotate)
-+        self._setup_file_loggers(logfile_level, verbose_level, logdir, log_size, log_rotate)
- 
-         logger_warnings = logging.getLogger("py.warnings")
-         logger_warnings.addHandler(self.stderr_handler)
-@@ -209,13 +213,14 @@ def _setup(self, verbose_level, error_level, logdir, log_size, log_rotate):
-     def _setup_from_dnf_conf(self, conf, file_loggers_only=False):
-         verbose_level_r = _cfg_verbose_val2level(conf.debuglevel)
-         error_level_r = _cfg_err_val2level(conf.errorlevel)
-+        logfile_level_r = _cfg_verbose_val2level(conf.logfilelevel)
-         logdir = conf.logdir
-         log_size = conf.log_size
-         log_rotate = conf.log_rotate
-         if file_loggers_only:
--            return self._setup_file_loggers(verbose_level_r, logdir, log_size, log_rotate)
-+            return self._setup_file_loggers(logfile_level_r, verbose_level_r, logdir, log_size, log_rotate)
-         else:
--            return self._setup(verbose_level_r, error_level_r, logdir, log_size, log_rotate)
-+            return self._setup(verbose_level_r, error_level_r, logfile_level_r, logdir, log_size, log_rotate)
- 
- 
- class Timer(object):
-diff --git a/doc/conf_ref.rst b/doc/conf_ref.rst
-index cf442770c9..fed6efcec7 100644
---- a/doc/conf_ref.rst
-+++ b/doc/conf_ref.rst
-@@ -268,6 +268,12 @@ configuration file by your distribution to override the DNF defaults.
- 
-     Directory where the log files will be stored. Default is ``/var/log``.
- 
-+``logfilelevel``
-+    :ref:`integer <integer-label>`
-+
-+    Log file messages output level, in the range 0 to 10. The higher the number the
-+    more debug output is put to logs. Default is 9.
-+
- .. _log_rotate-label:
- 
- ``log_rotate``
-
-From 1233d7da657ffbd03f9ffc274b648da0bb2898bf Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Fri, 5 Jun 2020 09:21:15 +0200
-Subject: [PATCH 2/3] Update unit logging test to reflect logfilelevel addition
-
----
- tests/test_logging.py | 16 +++++++++-------
- 1 file changed, 9 insertions(+), 7 deletions(-)
-
-diff --git a/tests/test_logging.py b/tests/test_logging.py
-index a7fee3e67c..80e219d882 100644
---- a/tests/test_logging.py
-+++ b/tests/test_logging.py
-@@ -88,7 +88,7 @@ def test_setup(self):
-         logger = logging.getLogger("dnf")
-         with tests.support.patch_std_streams() as (stdout, stderr):
-             self.logging._setup(
--                logging.INFO, logging.ERROR, self.logdir, self.log_size, self.log_rotate)
-+                logging.INFO, logging.ERROR, dnf.logging.TRACE, self.logdir, self.log_size, self.log_rotate)
-             self._bench(logger)
-         self.assertEqual("i\n", stdout.getvalue())
-         self.assertEqual("e\n", stderr.getvalue())
-@@ -97,7 +97,7 @@ def test_setup_verbose(self):
-         logger = logging.getLogger("dnf")
-         with tests.support.patch_std_streams() as (stdout, stderr):
-             self.logging._setup(
--                logging.DEBUG, logging.WARNING, self.logdir, self.log_size, self.log_rotate)
-+                logging.DEBUG, logging.WARNING, dnf.logging.TRACE, self.logdir, self.log_size, self.log_rotate)
-             self._bench(logger)
-         self.assertEqual("d\ni\n", stdout.getvalue())
-         self.assertEqual("w\ne\n", stderr.getvalue())
-@@ -105,20 +105,22 @@ def test_setup_verbose(self):
-     @mock.patch('dnf.logging.Logging._setup')
-     def test_setup_from_dnf_conf(self, setup_m):
-         conf = mock.Mock(
--            debuglevel=2, errorlevel=3, logdir=self.logdir,
-+            debuglevel=2, errorlevel=3, logfilelevel=2, logdir=self.logdir,
-             log_size=self.log_size, log_rotate=self.log_rotate)
-         self.logging._setup_from_dnf_conf(conf)
-         self.assertEqual(setup_m.call_args, mock.call(dnf.logging.INFO,
-                                                       dnf.logging.WARNING,
-+                                                      dnf.logging.INFO,
-                                                       self.logdir,
-                                                       self.log_size,
-                                                       self.log_rotate))
-         conf = mock.Mock(
--            debuglevel=6, errorlevel=6, logdir=self.logdir,
-+            debuglevel=6, errorlevel=6, logfilelevel=6, logdir=self.logdir,
-             log_size=self.log_size, log_rotate=self.log_rotate)
-         self.logging._setup_from_dnf_conf(conf)
-         self.assertEqual(setup_m.call_args, mock.call(dnf.logging.DEBUG,
-                                                       dnf.logging.WARNING,
-+                                                      dnf.logging.DEBUG,
-                                                       self.logdir,
-                                                       self.log_size,
-                                                       self.log_rotate))
-@@ -126,7 +128,7 @@ def test_setup_from_dnf_conf(self, setup_m):
-     def test_file_logging(self):
-         # log nothing to the console:
-         self.logging._setup(
--            dnf.logging.SUPERCRITICAL, dnf.logging.SUPERCRITICAL,
-+            dnf.logging.SUPERCRITICAL, dnf.logging.SUPERCRITICAL, dnf.logging.TRACE,
-             self.logdir, self.log_size, self.log_rotate)
-         logger = logging.getLogger("dnf")
-         with tests.support.patch_std_streams() as (stdout, stderr):
-@@ -145,7 +147,7 @@ def test_file_logging(self):
-     def test_rpm_logging(self):
-         # log everything to the console:
-         self.logging._setup(
--            dnf.logging.SUBDEBUG, dnf.logging.SUBDEBUG,
-+            dnf.logging.SUBDEBUG, dnf.logging.SUBDEBUG, dnf.logging.TRACE,
-             self.logdir, self.log_size, self.log_rotate)
-         logger = logging.getLogger("dnf.rpm")
-         with tests.support.patch_std_streams() as (stdout, stderr):
-@@ -167,7 +169,7 @@ def test_setup_only_once(self):
-         logger = logging.getLogger("dnf")
-         self.assertLength(logger.handlers, 0)
-         self.logging._setup(
--            dnf.logging.SUBDEBUG, dnf.logging.SUBDEBUG,
-+            dnf.logging.SUBDEBUG, dnf.logging.SUBDEBUG, dnf.logging.TRACE,
-             self.logdir, self.log_size, self.log_rotate)
-         cnt = len(logger.handlers)
-         self.assertGreater(cnt, 0)
-
-From 8a57da7229c67315d113b3c61cf981e1a7d81189 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
-Date: Thu, 25 Jun 2020 14:03:02 +0200
-Subject: [PATCH 3/3] Control hawkey and librepo log verbosity with
- logfilelevel
-
-= changelog =
-msg: New config option 'logfilelevel' now controls logging to dnf.log, dnf.librepo.log and hawkey.log
-type: enhancement
-resolves: 1802074
----
- dnf/logging.py   | 11 +++++++----
- dnf/sack.py      |  2 +-
- doc/conf_ref.rst |  3 +++
- 3 files changed, 11 insertions(+), 5 deletions(-)
-
-diff --git a/dnf/logging.py b/dnf/logging.py
-index c578575e1c..b5196988f7 100644
---- a/dnf/logging.py
-+++ b/dnf/logging.py
-@@ -43,6 +43,7 @@
- DDEBUG = 8  # used by anaconda (pyanaconda/payload/dnfpayload.py)
- SUBDEBUG = 6
- TRACE = 4
-+ALL = 2
- 
- def only_once(func):
-     """Method decorator turning the method into noop on second or later calls."""
-@@ -73,6 +74,7 @@ def filter(self, record):
-     7 : DDEBUG,
-     8 : SUBDEBUG,
-     9 : TRACE,
-+    10: ALL,   # more verbous librepo and hawkey
-     }
- 
- def _cfg_verbose_val2level(cfg_errval):
-@@ -138,6 +140,7 @@ def __init__(self):
-         logging.addLevelName(DDEBUG, "DDEBUG")
-         logging.addLevelName(SUBDEBUG, "SUBDEBUG")
-         logging.addLevelName(TRACE, "TRACE")
-+        logging.addLevelName(ALL, "ALL")
-         logging.captureWarnings(True)
-         logging.raiseExceptions = False
- 
-@@ -160,7 +163,7 @@ def _presetup(self):
-         self.stderr_handler = stderr
- 
-     @only_once
--    def _setup_file_loggers(self, logfile_level, verbose_level, logdir, log_size, log_rotate):
-+    def _setup_file_loggers(self, logfile_level, logdir, log_size, log_rotate):
-         logger_dnf = logging.getLogger("dnf")
-         logger_dnf.setLevel(TRACE)
- 
-@@ -177,7 +180,7 @@ def _setup_file_loggers(self, logfile_level, verbose_level, logdir, log_size, lo
-         logger_warnings.addHandler(handler)
- 
-         lr_logfile = os.path.join(logdir, dnf.const.LOG_LIBREPO)
--        libdnf.repo.LibrepoLog.addHandler(lr_logfile, verbose_level <= DEBUG)
-+        libdnf.repo.LibrepoLog.addHandler(lr_logfile, logfile_level <= ALL)
- 
-         # setup RPM callbacks logger
-         logger_rpm = logging.getLogger("dnf.rpm")
-@@ -196,7 +199,7 @@ def _setup(self, verbose_level, error_level, logfile_level, logdir, log_size, lo
-         self.stdout_handler.setLevel(SUPERCRITICAL)
-         self.stderr_handler.setLevel(SUPERCRITICAL)
- 
--        self._setup_file_loggers(logfile_level, verbose_level, logdir, log_size, log_rotate)
-+        self._setup_file_loggers(logfile_level, logdir, log_size, log_rotate)
- 
-         logger_warnings = logging.getLogger("py.warnings")
-         logger_warnings.addHandler(self.stderr_handler)
-@@ -218,7 +221,7 @@ def _setup_from_dnf_conf(self, conf, file_loggers_only=False):
-         log_size = conf.log_size
-         log_rotate = conf.log_rotate
-         if file_loggers_only:
--            return self._setup_file_loggers(logfile_level_r, verbose_level_r, logdir, log_size, log_rotate)
-+            return self._setup_file_loggers(logfile_level_r, logdir, log_size, log_rotate)
-         else:
-             return self._setup(verbose_level_r, error_level_r, logfile_level_r, logdir, log_size, log_rotate)
- 
-diff --git a/dnf/sack.py b/dnf/sack.py
-index fb8c70712f..3c6bc3bbe0 100644
---- a/dnf/sack.py
-+++ b/dnf/sack.py
-@@ -53,7 +53,7 @@ def _build_sack(base):
-                 arch=base.conf.substitutions["arch"],
-                 cachedir=cachedir, rootdir=base.conf.installroot,
-                 logfile=os.path.join(base.conf.logdir, dnf.const.LOG_HAWKEY),
--                logdebug=base.conf.debuglevel > 2)
-+                logdebug=base.conf.logfilelevel > 9)
- 
- 
- def _rpmdb_sack(base):
-diff --git a/doc/conf_ref.rst b/doc/conf_ref.rst
-index fed6efcec7..fdb44a657d 100644
---- a/doc/conf_ref.rst
-+++ b/doc/conf_ref.rst
-@@ -274,6 +274,9 @@ configuration file by your distribution to override the DNF defaults.
-     Log file messages output level, in the range 0 to 10. The higher the number the
-     more debug output is put to logs. Default is 9.
- 
-+    This option controls dnf.log, dnf.librepo.log and hawkey.log. Although dnf.librepo.log
-+    and hawkey.log are affected only by setting the logfilelevel to 10.
-+
- .. _log_rotate-label:
- 
- ``log_rotate``
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
new file mode 100644
index 0000000..a844311
--- /dev/null
+++ b/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch
@@ -0,0 +1,26 @@
+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-Enhance-repo-variables-documentation-RhBug-1848161-1848615.patch b/SOURCES/0003-Enhance-repo-variables-documentation-RhBug-1848161-1848615.patch
deleted file mode 100644
index 3473924..0000000
--- a/SOURCES/0003-Enhance-repo-variables-documentation-RhBug-1848161-1848615.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 03eac4f0b87bb9393e1662af76c433c996c702ab Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Tue, 14 Jul 2020 08:37:28 +0200
-Subject: [PATCH] [doc] Enhance repo variables documentation
- (RhBug:1848161,1848615)
-
-- clarify DNF_VAR_XXX variables usage
-- mention numeric variables
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1848615
-https://bugzilla.redhat.com/show_bug.cgi?id=1848161
----
- doc/conf_ref.rst | 15 +++++++++++++++
- 1 file changed, 15 insertions(+)
-
-diff --git a/doc/conf_ref.rst b/doc/conf_ref.rst
-index fdb44a657d..a0362d0779 100644
---- a/doc/conf_ref.rst
-+++ b/doc/conf_ref.rst
-@@ -629,6 +629,21 @@ In addition to these hard coded variables, user-defined ones can also be used. T
- 
-     $ DNF_VAR_MY_VARIABLE=value
- 
-+To use such variable in your repository configuration remove the prefix. E.g.::
-+
-+    [myrepo]
-+    baseurl=https://example.site/pub/fedora/$MY_VARIABLE/releases/$releasever
-+
-+Note that it is not possible to override the ``arch`` and ``basearch`` variables using either variable files or environmental variables.
-+
-+Although users are encouraged to use named variables, the numbered environmental variables ``DNF0`` - ``DNF9`` are still supported::
-+
-+    $ DNF1=value
-+
-+    [myrepo]
-+    baseurl=https://example.site/pub/fedora/$DNF1/releases/$releasever
-+
-+
- .. _conf_main_and_repo_options-label:
- 
- ==================================
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
new file mode 100644
index 0000000..d34928f
--- /dev/null
+++ b/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch
@@ -0,0 +1,567 @@
+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
new file mode 100644
index 0000000..8447353
--- /dev/null
+++ b/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch
@@ -0,0 +1,130 @@
+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/0004-Update-translations-RhBug-1820544.patch b/SOURCES/0004-Update-translations-RhBug-1820544.patch
deleted file mode 100644
index 2e75737..0000000
--- a/SOURCES/0004-Update-translations-RhBug-1820544.patch
+++ /dev/null
@@ -1,9957 +0,0 @@
-From f9154e5d51d35654dfd85f942e8de2c21ca75554 Mon Sep 17 00:00:00 2001
-From: Marek Blaha <mblaha@redhat.com>
-Date: Tue, 28 Jul 2020 16:24:25 +0200
-Subject: [PATCH] Update translations (RhBug:1820544)
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1820544
----
- po/fr.po    |  450 +++++++--------
- po/ja.po    |  877 +++++++++++++++--------------
- po/ko.po    | 1529 +++++++++++++++++++++++++++------------------------
- po/zh_CN.po |  819 ++++++++++++++-------------
- 4 files changed, 1916 insertions(+), 1759 deletions(-)
-
-diff --git a/po/fr.po b/po/fr.po
-index 4f9eca12..a75a9855 100644
---- a/po/fr.po
-+++ b/po/fr.po
-@@ -22,8 +22,8 @@ msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-03-19 09:18-0400\n"
--"PO-Revision-Date: 2020-03-22 12:29+0000\n"
-+"POT-Creation-Date: 2020-06-23 09:18-0400\n"
-+"PO-Revision-Date: 2020-06-22 21:40+0000\n"
- "Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
- "Language-Team: French <https://translate.fedoraproject.org/projects/dnf/dnf-master/fr/>\n"
- "Language: fr\n"
-@@ -31,7 +31,7 @@ msgstr ""
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
- "Plural-Forms: nplurals=2; plural=n > 1;\n"
--"X-Generator: Weblate 3.11.3\n"
-+"X-Generator: Weblate 4.1.1\n"
- 
- #: dnf/automatic/emitter.py:31
- #, python-format
-@@ -83,16 +83,20 @@ 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:236
-+#: dnf/automatic/main.py:228 dnf/cli/cli.py:298
-+msgid "GPG check FAILED"
-+msgstr "La vérification GPG a ÉCHOUÉ"
-+
-+#: dnf/automatic/main.py:247
- msgid "Started dnf-automatic."
- msgstr "dnf-automatic démarré."
- 
--#: dnf/automatic/main.py:240
-+#: dnf/automatic/main.py:251
- #, python-format
- msgid "Sleep for %s seconds"
- msgstr "Mise en sommeil pendant %s secondes"
- 
--#: dnf/automatic/main.py:271 dnf/cli/main.py:59 dnf/cli/main.py:80
-+#: dnf/automatic/main.py:283 dnf/cli/main.py:59 dnf/cli/main.py:80
- #: dnf/cli/main.py:83
- #, python-format
- msgid "Error: %s"
-@@ -215,7 +219,7 @@ msgstr "La vérification de la transaction a réussi."
- msgid "Running transaction test"
- msgstr "Lancement de la transaction de test"
- 
--#: dnf/base.py:848 dnf/base.py:995
-+#: dnf/base.py:848 dnf/base.py:990
- msgid "RPM: {}"
- msgstr "RPM : {}"
- 
-@@ -255,31 +259,31 @@ msgstr "Résumé des erreurs"
- msgid "RPMDB altered outside of {prog}."
- msgstr "RPMDB modifié en dehors de {prog}."
- 
--#: dnf/base.py:996 dnf/base.py:1004
-+#: dnf/base.py:991 dnf/base.py:999
- msgid "Could not run transaction."
- msgstr "Impossible d’exécuter la transaction."
- 
--#: dnf/base.py:999
-+#: dnf/base.py:994
- msgid "Transaction couldn't start:"
- msgstr "La transaction n’a pas pu démarrer :"
- 
--#: dnf/base.py:1013
-+#: dnf/base.py:1008
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "Échec de la suppression du fichier de transaction %s"
- 
--#: dnf/base.py:1095
-+#: dnf/base.py:1090
- msgid "Some packages were not downloaded. Retrying."
- msgstr "Certains paquets n’ont pas été téléchargés. Nouvel essai."
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1120
- #, 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:1128
-+#: dnf/base.py:1123
- #, python-format
- msgid ""
- "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)"
-@@ -287,56 +291,56 @@ 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:1170
-+#: dnf/base.py:1165
- 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:1184
-+#: dnf/base.py:1179
- msgid "Could not open: {}"
- msgstr "Impossible d’ouvrir : {}"
- 
--#: dnf/base.py:1222
-+#: dnf/base.py:1217
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr "La clé publique pour %s n’est pas installée"
- 
--#: dnf/base.py:1226
-+#: dnf/base.py:1221
- #, python-format
- msgid "Problem opening package %s"
- msgstr "Problème à l’ouverture du paquet %s"
- 
--#: dnf/base.py:1234
-+#: dnf/base.py:1229
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr "La clé publique pour %s n’est pas de confiance"
- 
--#: dnf/base.py:1238
-+#: dnf/base.py:1233
- #, python-format
- msgid "Package %s is not signed"
- msgstr "Le paquet %s n’est pas signé"
- 
--#: dnf/base.py:1253
-+#: dnf/base.py:1263
- #, python-format
- msgid "Cannot remove %s"
- msgstr "Impossible de supprimer %s"
- 
--#: dnf/base.py:1257
-+#: dnf/base.py:1267
- #, python-format
- msgid "%s removed"
- msgstr "%s supprimé"
- 
--#: dnf/base.py:1537
-+#: dnf/base.py:1547
- msgid "No match for group package \"{}\""
- msgstr "Aucune correspondance pour le paquet du groupe « {} »"
- 
--#: dnf/base.py:1624
-+#: dnf/base.py:1634
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "Ajout de paquets en provenance du groupe « %s » : %s"
- 
--#: dnf/base.py:1647 dnf/base.py:1699 dnf/cli/cli.py:218
-+#: dnf/base.py:1657 dnf/base.py:1709 dnf/cli/cli.py:218
- #: dnf/cli/commands/__init__.py:451 dnf/cli/commands/__init__.py:508
- #: dnf/cli/commands/__init__.py:601 dnf/cli/commands/__init__.py:650
- #: dnf/cli/commands/install.py:80 dnf/cli/commands/install.py:103
-@@ -344,21 +348,21 @@ msgstr "Ajout de paquets en provenance du groupe « %s » : %s"
- msgid "Nothing to do."
- msgstr "Rien à faire."
- 
--#: dnf/base.py:1665
-+#: dnf/base.py:1675
- msgid "No groups marked for removal."
- msgstr "Aucun groupe marqué pour suppression."
- 
--#: dnf/base.py:1701
-+#: dnf/base.py:1711
- msgid "No group marked for upgrade."
- msgstr "Aucun groupe marqué pour mise à jour."
- 
--#: dnf/base.py:1916
-+#: dnf/base.py:1926
- #, 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:1918 dnf/base.py:1937 dnf/base.py:1950 dnf/base.py:1971
--#: dnf/base.py:2020 dnf/base.py:2028 dnf/base.py:2163 dnf/cli/cli.py:410
-+#: dnf/base.py:1928 dnf/base.py:1947 dnf/base.py:1960 dnf/base.py:1981
-+#: dnf/base.py:2030 dnf/base.py:2038 dnf/base.py:2173 dnf/cli/cli.py:410
- #: dnf/cli/commands/__init__.py:434 dnf/cli/commands/__init__.py:491
- #: dnf/cli/commands/__init__.py:595 dnf/cli/commands/__init__.py:642
- #: dnf/cli/commands/__init__.py:720 dnf/cli/commands/install.py:147
-@@ -368,30 +372,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:1925
-+#: dnf/base.py:1935
- #, 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:1948
-+#: dnf/base.py:1958
- #, 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:1963
-+#: dnf/base.py:1973
- #, 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:1969
-+#: dnf/base.py:1979
- #, 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:1978
-+#: dnf/base.py:1988
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
-@@ -399,120 +403,120 @@ msgstr ""
- "La même une ou version supérieure de %s est déjà installée, mise à jour "
- "impossible."
- 
--#: dnf/base.py:2017 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2027 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:2023
-+#: dnf/base.py:2033
- #, 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:2048 dnf/base.py:2241 dnf/cli/cli.py:667 dnf/cli/cli.py:698
-+#: dnf/base.py:2058 dnf/base.py:2251 dnf/cli/cli.py:667 dnf/cli/cli.py:698
- #, python-format
- msgid "No package %s installed."
- msgstr "Aucun paquet %s installé."
- 
--#: dnf/base.py:2066 dnf/cli/commands/install.py:136
--#: dnf/cli/commands/remove.py:132
-+#: dnf/base.py:2076 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:2082 dnf/cli/commands/__init__.py:690
--#: dnf/cli/commands/remove.py:162
-+#: dnf/base.py:2092 dnf/cli/commands/__init__.py:690
-+#: dnf/cli/commands/remove.py:163
- msgid "No packages marked for removal."
- msgstr "Aucun paquet marqué pour suppression."
- 
--#: dnf/base.py:2170 dnf/cli/cli.py:421
-+#: dnf/base.py:2180 dnf/cli/cli.py:421
- #, 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:2175
-+#: dnf/base.py:2185
- #, 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:2233
-+#: dnf/base.py:2243
- msgid "Action not handled: {}"
- msgstr "Action non gérée : {}"
- 
--#: dnf/base.py:2247 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
-+#: dnf/base.py:2257 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
- #: dnf/cli/commands/__init__.py:913 dnf/cli/commands/group.py:398
- #, python-format
- msgid "No package %s available."
- msgstr "Aucun paquet %s n’est disponible."
- 
--#: dnf/base.py:2260
-+#: dnf/base.py:2270
- msgid "no package matched"
- msgstr "aucun paquet correspondant"
- 
--#: dnf/base.py:2281
-+#: dnf/base.py:2291
- 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:2283
-+#: dnf/base.py:2293
- 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:2287
-+#: dnf/base.py:2297
- 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:2289
-+#: dnf/base.py:2299
- 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"
- 
--#: dnf/base.py:2313
-+#: dnf/base.py:2323
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ". Le paquet en erreur est : %s"
- 
--#: dnf/base.py:2314
-+#: dnf/base.py:2324
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "Les clés GPG sont configurées comme : %s"
- 
--#: dnf/base.py:2326
-+#: dnf/base.py:2336
- #, 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:2359
-+#: dnf/base.py:2369
- msgid "The key has been approved."
- msgstr "La clef a été approuvée."
- 
--#: dnf/base.py:2362
-+#: dnf/base.py:2372
- msgid "The key has been rejected."
- msgstr "La clef a été rejetée."
- 
--#: dnf/base.py:2395
-+#: dnf/base.py:2405
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "L’import de la clé a échoué (code %d)"
- 
--#: dnf/base.py:2397
-+#: dnf/base.py:2407
- msgid "Key imported successfully"
- msgstr "La clé a bien été importée"
- 
--#: dnf/base.py:2401
-+#: dnf/base.py:2411
- msgid "Didn't install any keys"
- msgstr "Toutes les clés n’ont pas été installées"
- 
--#: dnf/base.py:2404
-+#: dnf/base.py:2414
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
-@@ -521,28 +525,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:2415
-+#: dnf/base.py:2425
- 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:2451
-+#: dnf/base.py:2478
- msgid "  * Maybe you meant: {}"
- msgstr "  * Peut-être vouliez-vous dire : {}"
- 
--#: dnf/base.py:2483
-+#: dnf/base.py:2510
- 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:2486
-+#: dnf/base.py:2513
- 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:2489
-+#: dnf/base.py:2516
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "Le paquet \"{}\" du dépôt \"{}\" a une somme de contrôle incorrecte"
- 
--#: dnf/base.py:2492
-+#: dnf/base.py:2519
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
-@@ -550,29 +554,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:2510 dnf/base.py:2530
-+#: dnf/base.py:2537 dnf/base.py:2557
- msgid "No match for argument"
- msgstr "Aucune correspondance pour le paramètre"
- 
--#: dnf/base.py:2518 dnf/base.py:2538
-+#: dnf/base.py:2545 dnf/base.py:2565
- 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:2520
-+#: dnf/base.py:2547
- 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:2536
-+#: dnf/base.py:2563
- 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:2552
-+#: dnf/base.py:2579
- #, python-format
- msgid "Package %s is already installed."
- msgstr "Le paquet %s est déjà installé."
-@@ -674,10 +678,6 @@ 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:298
--msgid "GPG check FAILED"
--msgstr "La vérification GPG a ÉCHOUÉ"
--
- #: dnf/cli/cli.py:330
- msgid "Changelogs for {}"
- msgstr "Changements pour {}"
-@@ -830,7 +830,7 @@ msgstr ""
- "Impossible de détecter le numéro de version (utilisez « --releasever » pour "
- "spécifier une version)"
- 
--#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:473
-+#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr "paramètre {} : non autorisé avec le paramètre {}"
- 
-@@ -994,7 +994,7 @@ msgid " (from %s)"
- msgstr " (depuis %s)"
- 
- #: dnf/cli/commands/__init__.py:442 dnf/cli/commands/__init__.py:499
--#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:104
-+#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:105
- #, python-format
- msgid "Installed package %s%s not available."
- msgstr "Le paquet installé %s%s est indisponible."
-@@ -1059,8 +1059,9 @@ msgid "No transaction ID or package name given."
- msgstr "Pas d’identifiant de transaction ou de nom de paquet fourni."
- 
- #: dnf/cli/commands/__init__.py:879
--msgid "You don't have access to the history DB."
--msgstr "Vous n’avez pas accès à la base de données de l’historique."
-+#, 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/__init__.py:891
- #, python-format
-@@ -1308,6 +1309,11 @@ msgstr "Attention : le groupe %s n’existe pas."
- msgid "Warning: No groups match:"
- msgstr "Attention : aucun groupe ne correspond à :"
- 
-+#: dnf/cli/commands/group.py:180 dnf/cli/commands/group.py:191
-+#: dnf/cli/output.py:1226
-+msgid "<name-unset>"
-+msgstr "<name-unset>"
-+
- #: dnf/cli/commands/group.py:197
- msgid "Available Environment Groups:"
- msgstr "Groupes d’environnements disponibles :"
-@@ -1548,16 +1554,16 @@ msgstr "supprimer les paquets dupliqués"
- msgid "remove installonly packages over the limit"
- msgstr "supprimer les paquets « installonly » dépassant la limite"
- 
--#: dnf/cli/commands/remove.py:94
-+#: dnf/cli/commands/remove.py:95
- msgid "No duplicated packages found for removal."
- msgstr "Aucun paquet dupliqué n’a été trouvé pour suppression."
- 
--#: dnf/cli/commands/remove.py:126
-+#: dnf/cli/commands/remove.py:127
- msgid "No old installonly packages found for removal."
- msgstr "Aucun ancien paquet « installonly » n’a été trouvé pour suppression."
- 
- #: dnf/cli/commands/repolist.py:38 dnf/cli/commands/updateinfo.py:47
--#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:359
-+#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:364
- msgid "unknown"
- msgstr "inconnu"
- 
-@@ -1688,20 +1694,20 @@ msgstr "Nom de fichier du dépôt : "
- 
- #. Work out the first (id) and last (enabled/disabled/count),
- #. then chop the middle (name)...
--#: dnf/cli/commands/repolist.py:245 dnf/cli/commands/repolist.py:272
-+#: dnf/cli/commands/repolist.py:246 dnf/cli/commands/repolist.py:273
- msgid "repo id"
- msgstr "id du dépôt"
- 
--#: dnf/cli/commands/repolist.py:258 dnf/cli/commands/repolist.py:259
--#: dnf/cli/commands/repolist.py:280
-+#: dnf/cli/commands/repolist.py:259 dnf/cli/commands/repolist.py:260
-+#: dnf/cli/commands/repolist.py:281
- msgid "status"
- msgstr "état"
- 
--#: dnf/cli/commands/repolist.py:274 dnf/cli/commands/repolist.py:276
-+#: dnf/cli/commands/repolist.py:275 dnf/cli/commands/repolist.py:277
- msgid "repo name"
- msgstr "nom du dépôt"
- 
--#: dnf/cli/commands/repolist.py:290
-+#: dnf/cli/commands/repolist.py:291
- msgid "Total packages: {}"
- msgstr "Total des paquets : {}"
- 
-@@ -2011,7 +2017,7 @@ msgstr "Le paquet {} ne contient aucun fichier"
- msgid "Available query-tags: use --queryformat \".. %{tag} ..\""
- msgstr "Balises de requêtes disponibles : utiliser --queryformat \"..%{tag}..\""
- 
--#: dnf/cli/commands/repoquery.py:562
-+#: dnf/cli/commands/repoquery.py:561
- #, python-brace-format
- msgid ""
- "No valid switch specified\n"
-@@ -2370,52 +2376,52 @@ msgstr "autre(s) alertes)"
- msgid "Unknown/Sec."
- msgstr "Sécurité/Niveau inconnu"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Bugs"
- msgstr "Anomalies"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Type"
- msgstr "Type"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Update ID"
- msgstr "ID de mise à jour"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Updated"
- msgstr "Mis à jour"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "CVEs"
- msgstr "CVE"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Description"
- msgstr "Description"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Rights"
- msgstr "Droits"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Severity"
- msgstr "Criticité"
- 
--#: dnf/cli/commands/updateinfo.py:354
-+#: dnf/cli/commands/updateinfo.py:359
- msgid "Files"
- msgstr "Fichiers"
- 
--#: dnf/cli/commands/updateinfo.py:354 dnf/cli/output.py:1491
--#: dnf/cli/output.py:1755 dnf/cli/output.py:1757
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Installed"
- msgstr "Installé"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "false"
- msgstr "faux"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "true"
- msgstr "vrai"
- 
-@@ -2785,13 +2791,13 @@ 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:1327
-+#: dnf/cli/output.py:512 dnf/cli/output.py:1335
- msgctxt "short"
- msgid "Version"
- msgstr "Version"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:513 dnf/cli/output.py:1337
- msgctxt "long"
- msgid "Version"
- msgstr "Version"
-@@ -2803,20 +2809,20 @@ 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:1318
-+#: dnf/cli/output.py:517 dnf/cli/output.py:1326
- 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:1321
-+#: dnf/cli/output.py:518 dnf/cli/output.py:1329
- msgctxt "long"
- msgid "Architecture"
- msgstr "Architecture"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1352
- msgctxt "long"
- msgid "Size"
- msgstr "Taille"
-@@ -2825,7 +2831,7 @@ 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:1342
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1350
- msgctxt "short"
- msgid "Size"
- msgstr "Taille"
-@@ -2837,14 +2843,14 @@ 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:1333
-+#: dnf/cli/output.py:525 dnf/cli/output.py:1341
- 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:1336
-+#: dnf/cli/output.py:526 dnf/cli/output.py:1344
- msgctxt "long"
- msgid "Repository"
- msgstr "Dépôt"
-@@ -3143,31 +3149,31 @@ msgstr "Désactivation des modules"
- msgid "Resetting modules"
- msgstr "Réinitialisation des modules"
- 
--#: dnf/cli/output.py:1226
-+#: dnf/cli/output.py:1230
- msgid "Installing Environment Groups"
- msgstr "Installation des groupes d’environnement"
- 
--#: dnf/cli/output.py:1233
-+#: dnf/cli/output.py:1237
- msgid "Upgrading Environment Groups"
- msgstr "Mise à niveau des groupes d’environnement"
- 
--#: dnf/cli/output.py:1240
-+#: dnf/cli/output.py:1244
- msgid "Removing Environment Groups"
- msgstr "Suppression des groupes d’environnement"
- 
--#: dnf/cli/output.py:1247
-+#: dnf/cli/output.py:1251
- msgid "Installing Groups"
- msgstr "Installation des groupes"
- 
--#: dnf/cli/output.py:1254
-+#: dnf/cli/output.py:1258
- msgid "Upgrading Groups"
- msgstr "Mise à niveau des groupes"
- 
--#: dnf/cli/output.py:1261
-+#: dnf/cli/output.py:1265
- msgid "Removing Groups"
- msgstr "Suppression des groupes"
- 
--#: dnf/cli/output.py:1277
-+#: dnf/cli/output.py:1281
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
-@@ -3176,12 +3182,12 @@ msgstr ""
- "Ignorer les paquets en conflit :\n"
- "(ajouter « %s » à la ligne de commande pour forcer leur mise à niveau)"
- 
--#: dnf/cli/output.py:1285
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr "Ignorer les paquets ayant des dépendances cassées %s"
- 
--#: dnf/cli/output.py:1289
-+#: dnf/cli/output.py:1295
- msgid " or part of a group"
- msgstr " ou qui fait parti d’un groupe"
- 
-@@ -3189,23 +3195,23 @@ 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:1312
-+#: dnf/cli/output.py:1320
- msgctxt "short"
- msgid "Package"
- msgstr "Paquet"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
- #. This is also a hack to resolve RhBug 1302935 correctly.
--#: dnf/cli/output.py:1314 dnf/cli/output.py:2007
-+#: dnf/cli/output.py:1322 dnf/cli/output.py:2023
- msgctxt "long"
- msgid "Package"
- msgstr "Paquet"
- 
--#: dnf/cli/output.py:1363
-+#: dnf/cli/output.py:1371
- msgid "replacing"
- msgstr "remplacement"
- 
--#: dnf/cli/output.py:1370
-+#: dnf/cli/output.py:1378
- #, python-format
- msgid ""
- "\n"
-@@ -3217,294 +3223,294 @@ msgstr ""
- "%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1375 dnf/cli/output.py:1914 dnf/cli/output.py:1915
-+#: dnf/cli/output.py:1383 dnf/cli/output.py:1930 dnf/cli/output.py:1931
- msgid "Install"
- msgstr "Installer"
- 
--#: dnf/cli/output.py:1379 dnf/cli/output.py:1923
-+#: dnf/cli/output.py:1387 dnf/cli/output.py:1939
- msgid "Upgrade"
- msgstr "Mettre à niveau"
- 
--#: dnf/cli/output.py:1380
-+#: dnf/cli/output.py:1388
- msgid "Remove"
- msgstr "Supprimer"
- 
--#: dnf/cli/output.py:1382 dnf/cli/output.py:1921
-+#: dnf/cli/output.py:1390 dnf/cli/output.py:1937
- msgid "Downgrade"
- msgstr "Retrograder"
- 
--#: dnf/cli/output.py:1383
-+#: dnf/cli/output.py:1391
- msgid "Skip"
- msgstr "Ignorer"
- 
--#: dnf/cli/output.py:1392 dnf/cli/output.py:1408
-+#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] "Paquet"
- msgstr[1] "Paquets"
- 
--#: dnf/cli/output.py:1410
-+#: dnf/cli/output.py:1418
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "Paquet dépendant"
- msgstr[1] "Paquets dépendants"
- 
--#: dnf/cli/output.py:1489 dnf/cli/output.py:1756 dnf/cli/output.py:1924
-+#: dnf/cli/output.py:1497 dnf/cli/output.py:1771 dnf/cli/output.py:1940
- msgid "Upgraded"
- msgstr "Mis à niveau"
- 
--#: dnf/cli/output.py:1490 dnf/cli/output.py:1756 dnf/cli/output.py:1922
-+#: dnf/cli/output.py:1498 dnf/cli/output.py:1771 dnf/cli/output.py:1938
- msgid "Downgraded"
- msgstr "Rétrogradé"
- 
--#: dnf/cli/output.py:1495
-+#: dnf/cli/output.py:1503
- msgid "Reinstalled"
- msgstr "Réinstallé"
- 
--#: dnf/cli/output.py:1496
-+#: dnf/cli/output.py:1504
- msgid "Skipped"
- msgstr "Ignoré"
- 
--#: dnf/cli/output.py:1497
-+#: dnf/cli/output.py:1505
- msgid "Removed"
- msgstr "Supprimé"
- 
--#: dnf/cli/output.py:1500
-+#: dnf/cli/output.py:1508
- msgid "Failed"
- msgstr "Échec"
- 
--#: dnf/cli/output.py:1551
-+#: dnf/cli/output.py:1559
- msgid "Total"
- msgstr "Total"
- 
--#: dnf/cli/output.py:1579
-+#: dnf/cli/output.py:1587
- msgid "<unset>"
- msgstr "<unset>"
- 
--#: dnf/cli/output.py:1580
-+#: dnf/cli/output.py:1588
- msgid "System"
- msgstr "Système"
- 
--#: dnf/cli/output.py:1630
-+#: dnf/cli/output.py:1638
- msgid "Command line"
- msgstr "Ligne de commande"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1634
-+#: dnf/cli/output.py:1649
- msgid "User name"
- msgstr "Nom d’utilisateur"
- 
- #. REALLY Needs to use columns!
--#: dnf/cli/output.py:1636 dnf/cli/output.py:2004
-+#: dnf/cli/output.py:1651 dnf/cli/output.py:2020
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1653
- msgid "Date and time"
- msgstr "Date et heure"
- 
--#: dnf/cli/output.py:1639 dnf/cli/output.py:2005
-+#: dnf/cli/output.py:1654 dnf/cli/output.py:2021
- msgid "Action(s)"
- msgstr "Action(s)"
- 
--#: dnf/cli/output.py:1640
-+#: dnf/cli/output.py:1655
- msgid "Altered"
- msgstr "Modifié"
- 
--#: dnf/cli/output.py:1681
-+#: dnf/cli/output.py:1696
- msgid "No transactions"
- msgstr "Pas de transaction"
- 
--#: dnf/cli/output.py:1682 dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1697 dnf/cli/output.py:1713
- msgid "Failed history info"
- msgstr "Infos sur l’historique des échecs"
- 
--#: dnf/cli/output.py:1697
-+#: dnf/cli/output.py:1712
- msgid "No transaction ID, or package, given"
- msgstr "Pas de paquet ou d’identifiant de transaction fourni"
- 
--#: dnf/cli/output.py:1755
-+#: dnf/cli/output.py:1770
- msgid "Erased"
- msgstr "Effacé"
- 
--#: dnf/cli/output.py:1757
-+#: dnf/cli/output.py:1772
- msgid "Not installed"
- msgstr "Non installé"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Newer"
- msgstr "Plus récent"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Older"
- msgstr "Plus ancien"
- 
--#: dnf/cli/output.py:1806 dnf/cli/output.py:1808
-+#: dnf/cli/output.py:1821 dnf/cli/output.py:1823
- msgid "Transaction ID :"
- msgstr "Identifiant de transaction :"
- 
--#: dnf/cli/output.py:1811
-+#: dnf/cli/output.py:1826
- msgid "Begin time     :"
- msgstr "Temps de début    :"
- 
--#: dnf/cli/output.py:1814 dnf/cli/output.py:1816
-+#: dnf/cli/output.py:1829 dnf/cli/output.py:1831
- msgid "Begin rpmdb    :"
- msgstr "Début de RPMDB    :"
- 
--#: dnf/cli/output.py:1822
-+#: dnf/cli/output.py:1837
- #, python-format
- msgid "(%u seconds)"
- msgstr "(%u secondes)"
- 
--#: dnf/cli/output.py:1824
-+#: dnf/cli/output.py:1839
- #, python-format
- msgid "(%u minutes)"
- msgstr "(%u minutes)"
- 
--#: dnf/cli/output.py:1826
-+#: dnf/cli/output.py:1841
- #, python-format
- msgid "(%u hours)"
- msgstr "(%u heures)"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1843
- #, python-format
- msgid "(%u days)"
- msgstr "(%u jours)"
- 
--#: dnf/cli/output.py:1829
-+#: dnf/cli/output.py:1844
- msgid "End time       :"
- msgstr "Temps de fin :"
- 
--#: dnf/cli/output.py:1832 dnf/cli/output.py:1834
-+#: dnf/cli/output.py:1847 dnf/cli/output.py:1849
- msgid "End rpmdb      :"
- msgstr "Fin de RPMDB :"
- 
--#: dnf/cli/output.py:1841 dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1856 dnf/cli/output.py:1858
- msgid "User           :"
- msgstr "Utilisateur  :"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1854
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1869
- msgid "Aborted"
- msgstr "Avorté"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1850 dnf/cli/output.py:1852
--#: dnf/cli/output.py:1854 dnf/cli/output.py:1856 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1865 dnf/cli/output.py:1867
-+#: dnf/cli/output.py:1869 dnf/cli/output.py:1871 dnf/cli/output.py:1873
- msgid "Return-Code    :"
- msgstr "Code de retour  :"
- 
--#: dnf/cli/output.py:1850 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1865 dnf/cli/output.py:1873
- msgid "Success"
- msgstr "Réussi"
- 
--#: dnf/cli/output.py:1852
-+#: dnf/cli/output.py:1867
- msgid "Failures:"
- msgstr "Échecs :"
- 
--#: dnf/cli/output.py:1856
-+#: dnf/cli/output.py:1871
- msgid "Failure:"
- msgstr "Échec :"
- 
--#: dnf/cli/output.py:1866 dnf/cli/output.py:1868
-+#: dnf/cli/output.py:1881 dnf/cli/output.py:1883
- msgid "Releasever     :"
- msgstr "Releasever     :"
- 
--#: dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1888 dnf/cli/output.py:1890
- msgid "Command Line   :"
- msgstr "Ligne de commande :"
- 
--#: dnf/cli/output.py:1881
-+#: dnf/cli/output.py:1895 dnf/cli/output.py:1897
- msgid "Comment        :"
- msgstr "Commentaire :"
- 
--#: dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1901
- msgid "Transaction performed with:"
- msgstr "Transaction effectuée avec :"
- 
--#: dnf/cli/output.py:1894
-+#: dnf/cli/output.py:1910
- msgid "Packages Altered:"
- msgstr "Paquets modifiés :"
- 
--#: dnf/cli/output.py:1900
-+#: dnf/cli/output.py:1916
- msgid "Scriptlet output:"
- msgstr "Sortie du mini script :"
- 
--#: dnf/cli/output.py:1907
-+#: dnf/cli/output.py:1923
- msgid "Errors:"
- msgstr "Erreurs :"
- 
--#: dnf/cli/output.py:1916
-+#: dnf/cli/output.py:1932
- msgid "Dep-Install"
- msgstr "Installation des dépendances"
- 
--#: dnf/cli/output.py:1917
-+#: dnf/cli/output.py:1933
- msgid "Obsoleted"
- msgstr "Rendu obsolète"
- 
--#: dnf/cli/output.py:1918 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1934 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "Rend obsolète"
- 
--#: dnf/cli/output.py:1919
-+#: dnf/cli/output.py:1935
- msgid "Erase"
- msgstr "Effacement"
- 
--#: dnf/cli/output.py:1920
-+#: dnf/cli/output.py:1936
- msgid "Reinstall"
- msgstr "Réinstallation"
- 
--#: dnf/cli/output.py:1995
-+#: dnf/cli/output.py:2011
- msgid "Bad transaction IDs, or package(s), given"
- msgstr "Des paquets ou identifiants de transaction fournis sont erronés"
- 
--#: dnf/cli/output.py:2094
-+#: dnf/cli/output.py:2110
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr "---> Le paquet %s.%s %s sera installé"
- 
--#: dnf/cli/output.py:2096
-+#: dnf/cli/output.py:2112
- #, 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:2098
-+#: dnf/cli/output.py:2114
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr "---> Le paquet %s.%s %s sera supprimé"
- 
--#: dnf/cli/output.py:2100
-+#: dnf/cli/output.py:2116
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr "---> Le paquet %s.%s %s sera réinstallé"
- 
--#: dnf/cli/output.py:2102
-+#: dnf/cli/output.py:2118
- #, 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:2104
-+#: dnf/cli/output.py:2120
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr "---> Le paquet %s.%s %s sera rendu obsolète"
- 
--#: dnf/cli/output.py:2106
-+#: dnf/cli/output.py:2122
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr "---> Le paquet %s.%s %s sera mis à jour"
- 
--#: dnf/cli/output.py:2108
-+#: dnf/cli/output.py:2124
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr "---> Le paquet %s.%s %s sera rendu obsolète"
- 
--#: dnf/cli/output.py:2117
-+#: dnf/cli/output.py:2133
- msgid "--> Starting dependency resolution"
- msgstr "--> Début de la résolution des dépendances"
- 
--#: dnf/cli/output.py:2122
-+#: dnf/cli/output.py:2138
- msgid "--> Finished dependency resolution"
- msgstr "--> Résolution des dépendances terminée"
- 
--#: dnf/cli/output.py:2136 dnf/crypto.py:132
-+#: dnf/cli/output.py:2152 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3568,36 +3574,36 @@ msgstr "    A débuté  : %s - il y a %s"
- msgid "    State  : %s"
- msgstr "    État : %s"
- 
--#: dnf/comps.py:95
-+#: dnf/comps.py:104
- msgid "skipping."
- msgstr "ignorer."
- 
--#: dnf/comps.py:187 dnf/comps.py:689
-+#: dnf/comps.py:196 dnf/comps.py:698
- #, python-format
- msgid "Module or Group '%s' is not installed."
- msgstr "Module ou Groupe « %s » non installé."
- 
--#: dnf/comps.py:189 dnf/comps.py:691
-+#: dnf/comps.py:198 dnf/comps.py:700
- #, python-format
- msgid "Module or Group '%s' is not available."
- msgstr "Module ou Groupe « %s » non disponible."
- 
--#: dnf/comps.py:191
-+#: dnf/comps.py:200
- #, python-format
- msgid "Module or Group '%s' does not exist."
- msgstr "Module ou Groupe « %s » n’existe pas."
- 
--#: dnf/comps.py:610 dnf/comps.py:627
-+#: dnf/comps.py:619 dnf/comps.py:636
- #, python-format
- msgid "Environment '%s' is not installed."
- msgstr "L’environnement « %s » n’est pas installé."
- 
--#: dnf/comps.py:629
-+#: dnf/comps.py:638
- #, python-format
- msgid "Environment '%s' is not available."
- msgstr "L’environnement « %s » n’est pas disponible."
- 
--#: dnf/comps.py:657
-+#: dnf/comps.py:666
- #, python-format
- msgid "Group_id '%s' does not exist."
- msgstr "L’identifiant de groupe « %s » n’existe pas."
-@@ -3696,7 +3702,7 @@ 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/db/group.py:289
-+#: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
- "installed on the system"
-@@ -3704,43 +3710,43 @@ msgstr ""
- "Aucune métadonnée de module disponible pour le paquet modulaire « {} », ne "
- "peut pas être installé dans le système"
- 
--#: dnf/db/group.py:339
-+#: dnf/db/group.py:343
- msgid "No available modular metadata for modular package"
- msgstr "Aucune métadonnée de module disponible pour le paquet modulaire"
- 
--#: dnf/db/group.py:373
-+#: dnf/db/group.py:377
- #, python-format
- msgid "Will not install a source rpm package (%s)."
- msgstr "Un paquet source rpm ne sera pas installé (%s)."
- 
--#: dnf/dnssec.py:169
-+#: dnf/dnssec.py:168
- msgid ""
- "Configuration option 'gpgkey_dns_verification' requires libunbound ({})"
- msgstr ""
- "L’option de configuration « gpgkey_dns_verification » nécessite libunbound "
- "({})"
- 
--#: dnf/dnssec.py:240
-+#: dnf/dnssec.py:239
- msgid "DNSSEC extension: Key for user "
- msgstr "Extension DNSSEC : clef pour l’utilisateur "
- 
--#: dnf/dnssec.py:242
-+#: dnf/dnssec.py:241
- msgid "is valid."
- msgstr "est valide."
- 
--#: dnf/dnssec.py:244
-+#: dnf/dnssec.py:243
- msgid "has unknown status."
- msgstr "a un statut inconnu."
- 
--#: dnf/dnssec.py:252
-+#: dnf/dnssec.py:251
- msgid "DNSSEC extension: "
- msgstr "extension DNSSEC : "
- 
--#: dnf/dnssec.py:284
-+#: dnf/dnssec.py:283
- msgid "Testing already imported keys for their validity."
- msgstr "Test de validité des clefs déjà importées."
- 
--#: dnf/drpm.py:62 dnf/repo.py:267
-+#: dnf/drpm.py:62 dnf/repo.py:268
- #, python-format
- msgid "unsupported checksum type: %s"
- msgstr "type de somme de contrôle non pris en charge : %s"
-@@ -3757,33 +3763,33 @@ msgstr "La somme de contrôle du delta-rebuilt RPM a échoué"
- msgid "done"
- msgstr "terminé"
- 
--#: dnf/exceptions.py:109
-+#: dnf/exceptions.py:113
- msgid "Problems in request:"
- msgstr "Problèmes dans la requête :"
- 
--#: dnf/exceptions.py:111
-+#: dnf/exceptions.py:115
- msgid "missing packages: "
- msgstr "paquets manquants : "
- 
--#: dnf/exceptions.py:113
-+#: dnf/exceptions.py:117
- msgid "broken packages: "
- msgstr "paquets cassés : "
- 
--#: dnf/exceptions.py:115
-+#: dnf/exceptions.py:119
- msgid "missing groups or modules: "
- msgstr "groupes ou modules manquants : "
- 
--#: dnf/exceptions.py:117
-+#: dnf/exceptions.py:121
- msgid "broken groups or modules: "
- msgstr "groupes ou modules cassés : "
- 
--#: dnf/exceptions.py:122
-+#: dnf/exceptions.py:126
- msgid "Modular dependency problem with Defaults:"
- 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:127 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:686
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] "Problème de dépendance modulaire :"
-@@ -3923,7 +3929,7 @@ msgstr ""
- "Seul le nom du module est nécessaire. Les paramètres inutiles ont été "
- "ignorés : « {} »"
- 
--#: dnf/package.py:295
-+#: dnf/package.py:298
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s : %s vérification a échoué : %s vs %s"
-@@ -3968,17 +3974,17 @@ msgstr ""
- "Aucun élément correspondant aux modèles de plugin de désactivation suivants "
- ": {}"
- 
--#: dnf/repo.py:83
-+#: dnf/repo.py:84
- #, python-format
- msgid "no matching payload factory for %s"
- msgstr "aucune fabrique de contenu ne correspond à %s"
- 
--#: dnf/repo.py:110
-+#: dnf/repo.py:111
- msgid "Already downloaded"
- msgstr "Déjà téléchargé"
- 
- #. pinging mirrors, this might take a while
--#: dnf/repo.py:346
-+#: dnf/repo.py:347
- #, python-format
- msgid "determining the fastest mirror (%s hosts).. "
- msgstr "détermination du miroir le plus rapide (%s hôtes).. "
-@@ -4029,7 +4035,7 @@ msgstr "Suppression de"
- #: dnf/transaction.py:92
- msgctxt "currently"
- msgid "Upgrading"
--msgstr "Mise à jour de"
-+msgstr "Mise à jour"
- 
- #: dnf/transaction.py:96
- msgid "Verifying"
-@@ -4058,9 +4064,3 @@ msgstr "TransactionSWDBItem n’a pas été trouvé pour la clef : {}"
- #: dnf/util.py:457
- msgid "Errors occurred during transaction."
- msgstr "Des erreurs sont survenues lors de la transaction."
--
--#~ msgid ""
--#~ "Display capabilities that the package depends on for running a %%pre script."
--#~ msgstr ""
--#~ "Affiche les fonctionnalités dont le paquet dépend pour le lancement d’un "
--#~ "script %%pre."
-diff --git a/po/ja.po b/po/ja.po
-index 84e5be57..cb9b8be4 100644
---- a/po/ja.po
-+++ b/po/ja.po
-@@ -20,20 +20,21 @@
- # Hajime Taira <htaira@fedoraproject.org>, 2019. #zanata
- # Ooyama Yosiyuki <qqke6wd9k@apricot.ocn.ne.jp>, 2019. #zanata
- # Julien Humbert <julroy67@gmail.com>, 2020.
-+# Casey Jones <nahareport@yahoo.com>, 2020.
- msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-03-19 09:18-0400\n"
--"PO-Revision-Date: 2020-02-13 04:33+0000\n"
--"Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
-+"POT-Creation-Date: 2020-06-23 09:18-0400\n"
-+"PO-Revision-Date: 2020-05-05 07:40+0000\n"
-+"Last-Translator: Casey Jones <nahareport@yahoo.com>\n"
- "Language-Team: Japanese <https://translate.fedoraproject.org/projects/dnf/dnf-master/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 3.10.3\n"
-+"X-Generator: Weblate 4.0.3\n"
- 
- #: dnf/automatic/emitter.py:31
- #, python-format
-@@ -85,16 +86,20 @@ msgstr "不明な設定値: %s=%s in %s; %s"
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr "不明な設定オプション: %s = %s in %s"
- 
--#: dnf/automatic/main.py:236
-+#: dnf/automatic/main.py:228 dnf/cli/cli.py:298
-+msgid "GPG check FAILED"
-+msgstr "GPG の確認に失敗しました"
-+
-+#: dnf/automatic/main.py:247
- msgid "Started dnf-automatic."
- msgstr "dnf-automatic を開始しました。"
- 
--#: dnf/automatic/main.py:240
-+#: dnf/automatic/main.py:251
- #, python-format
- msgid "Sleep for %s seconds"
- msgstr "%s 秒スリープします"
- 
--#: dnf/automatic/main.py:271 dnf/cli/main.py:59 dnf/cli/main.py:80
-+#: dnf/automatic/main.py:283 dnf/cli/main.py:59 dnf/cli/main.py:80
- #: dnf/cli/main.py:83
- #, python-format
- msgid "Error: %s"
-@@ -126,7 +131,7 @@ msgstr "メタデータキャッシュは最近、リフレッシュされまし
- 
- #: dnf/base.py:341 dnf/cli/commands/__init__.py:100
- msgid "There are no enabled repositories in \"{}\"."
--msgstr ""
-+msgstr "\"{}\" には有効化されたリポジトリーがありません。"
- 
- #: dnf/base.py:348
- #, python-format
-@@ -162,7 +167,7 @@ msgstr "%s: は %s から取得したメタデータを使用中"
- #: dnf/base.py:409
- #, python-format
- msgid "Ignoring repositories: %s"
--msgstr ""
-+msgstr "リポジトリーを無視します: %s"
- 
- #: dnf/base.py:412
- #, python-format
-@@ -206,13 +211,13 @@ msgstr "トランザクションの確認に成功しました。"
- msgid "Running transaction test"
- msgstr "トランザクションのテストを実行中"
- 
--#: dnf/base.py:848 dnf/base.py:995
-+#: dnf/base.py:848 dnf/base.py:990
- msgid "RPM: {}"
--msgstr ""
-+msgstr "RPM: {}"
- 
- #: dnf/base.py:849
- msgid "Transaction test error:"
--msgstr ""
-+msgstr "トランザクションテストエラー:"
- 
- #: dnf/base.py:860
- msgid "Transaction test succeeded."
-@@ -230,7 +235,7 @@ msgstr "ディスク要件"
- #, 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[0] "{1} ファイルシステムに最低 {0}MB の追加スペースが必要です。"
- 
- #: dnf/base.py:919
- msgid "Error Summary"
-@@ -239,84 +244,84 @@ msgstr "エラーの概要"
- #: dnf/base.py:945
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
--msgstr ""
-+msgstr "RPMDBは {prog} のサポート外に変更されました。"
- 
--#: dnf/base.py:996 dnf/base.py:1004
-+#: dnf/base.py:991 dnf/base.py:999
- msgid "Could not run transaction."
- msgstr "トランザクションを実行できませんでした。"
- 
--#: dnf/base.py:999
-+#: dnf/base.py:994
- msgid "Transaction couldn't start:"
- msgstr "トランザクションを開始できませんでした:"
- 
--#: dnf/base.py:1013
-+#: dnf/base.py:1008
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "トランザクションファイル %s の削除に失敗しました"
- 
--#: dnf/base.py:1095
-+#: dnf/base.py:1090
- msgid "Some packages were not downloaded. Retrying."
- msgstr "一部のパッケージはダウンロードされませんでした。再試行中です。"
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1120
- #, 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:1128
-+#: dnf/base.py:1123
- #, 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:1170
-+#: dnf/base.py:1165
- msgid "Cannot add local packages, because transaction job already exists"
--msgstr ""
-+msgstr "ローカルパッケージを追加できません、トランザクションジョブがすでに存在するためです"
- 
--#: dnf/base.py:1184
-+#: dnf/base.py:1179
- msgid "Could not open: {}"
- msgstr "開くことができませんでした: {}"
- 
--#: dnf/base.py:1222
-+#: dnf/base.py:1217
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr "%s の公開鍵がインストールされていません"
- 
--#: dnf/base.py:1226
-+#: dnf/base.py:1221
- #, python-format
- msgid "Problem opening package %s"
- msgstr "パッケージ %s を開くことができません"
- 
--#: dnf/base.py:1234
-+#: dnf/base.py:1229
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr "%s の公開鍵は信頼されていません"
- 
--#: dnf/base.py:1238
-+#: dnf/base.py:1233
- #, python-format
- msgid "Package %s is not signed"
- msgstr "パッケージ %s は署名されていません"
- 
--#: dnf/base.py:1253
-+#: dnf/base.py:1263
- #, python-format
- msgid "Cannot remove %s"
- msgstr "%s を削除できません"
- 
--#: dnf/base.py:1257
-+#: dnf/base.py:1267
- #, python-format
- msgid "%s removed"
- msgstr "%s を削除しました"
- 
--#: dnf/base.py:1537
-+#: dnf/base.py:1547
- msgid "No match for group package \"{}\""
- msgstr "グループパッケージ  \"{}\" に一致するものはありません"
- 
--#: dnf/base.py:1624
-+#: dnf/base.py:1634
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "グループ '%s' からのパッケージを追加します: %s"
- 
--#: dnf/base.py:1647 dnf/base.py:1699 dnf/cli/cli.py:218
-+#: dnf/base.py:1657 dnf/base.py:1709 dnf/cli/cli.py:218
- #: dnf/cli/commands/__init__.py:451 dnf/cli/commands/__init__.py:508
- #: dnf/cli/commands/__init__.py:601 dnf/cli/commands/__init__.py:650
- #: dnf/cli/commands/install.py:80 dnf/cli/commands/install.py:103
-@@ -324,21 +329,21 @@ msgstr "グループ '%s' からのパッケージを追加します: %s"
- msgid "Nothing to do."
- msgstr "行うべきことはありません。"
- 
--#: dnf/base.py:1665
-+#: dnf/base.py:1675
- msgid "No groups marked for removal."
- msgstr "削除対象のパッケージはありません。"
- 
--#: dnf/base.py:1701
-+#: dnf/base.py:1711
- msgid "No group marked for upgrade."
- msgstr "アップグレード対象のグループはありません。"
- 
--#: dnf/base.py:1916
-+#: dnf/base.py:1926
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
- msgstr "パッケージ %s はインストールされていないので、ダウングレードできません。"
- 
--#: dnf/base.py:1918 dnf/base.py:1937 dnf/base.py:1950 dnf/base.py:1971
--#: dnf/base.py:2020 dnf/base.py:2028 dnf/base.py:2163 dnf/cli/cli.py:410
-+#: dnf/base.py:1928 dnf/base.py:1947 dnf/base.py:1960 dnf/base.py:1981
-+#: dnf/base.py:2030 dnf/base.py:2038 dnf/base.py:2173 dnf/cli/cli.py:410
- #: dnf/cli/commands/__init__.py:434 dnf/cli/commands/__init__.py:491
- #: dnf/cli/commands/__init__.py:595 dnf/cli/commands/__init__.py:642
- #: dnf/cli/commands/__init__.py:720 dnf/cli/commands/install.py:147
-@@ -348,135 +353,135 @@ msgstr "パッケージ %s はインストールされていないので、ダ
- msgid "No match for argument: %s"
- msgstr "一致した引数がありません: %s"
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1935
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
- msgstr "下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。"
- 
--#: dnf/base.py:1948
-+#: dnf/base.py:1958
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
- msgstr "パッケージ %s はインストールされていないのでの、再インストールできません。"
- 
--#: dnf/base.py:1963
-+#: dnf/base.py:1973
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr "ファイル %s はソースパッケージで更新できません。無視します。"
- 
--#: dnf/base.py:1969
-+#: dnf/base.py:1979
- #, python-format
- msgid "Package %s not installed, cannot update it."
- msgstr "パッケージ %s はインストールされていないので、更新できません。"
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:1988
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
--msgstr ""
-+msgstr "同じまたはさらに新しいバージョンの %s が既にインストールされています、アップデートできません。"
- 
--#: dnf/base.py:2017 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2027 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
- msgstr "パッケージ %s は利用可能ですが、インストールされていません。"
- 
--#: dnf/base.py:2023
-+#: dnf/base.py:2033
- #, python-format
- msgid "Package %s available, but installed for different architecture."
- msgstr "パッケージ %s は利用可能ですが、他のアーキテクチャー用にインストールされています。"
- 
--#: dnf/base.py:2048 dnf/base.py:2241 dnf/cli/cli.py:667 dnf/cli/cli.py:698
-+#: dnf/base.py:2058 dnf/base.py:2251 dnf/cli/cli.py:667 dnf/cli/cli.py:698
- #, python-format
- msgid "No package %s installed."
- msgstr "パッケージ %s はインストールされていません。"
- 
--#: dnf/base.py:2066 dnf/cli/commands/install.py:136
--#: dnf/cli/commands/remove.py:132
-+#: dnf/base.py:2076 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:2082 dnf/cli/commands/__init__.py:690
--#: dnf/cli/commands/remove.py:162
-+#: dnf/base.py:2092 dnf/cli/commands/__init__.py:690
-+#: dnf/cli/commands/remove.py:163
- msgid "No packages marked for removal."
- msgstr "削除対象のパッケージはありません。"
- 
--#: dnf/base.py:2170 dnf/cli/cli.py:421
-+#: dnf/base.py:2180 dnf/cli/cli.py:421
- #, python-format
- msgid "Packages for argument %s available, but not installed."
- msgstr "引数  %s のパッケージは利用可能ですが、インストールされていません。"
- 
--#: dnf/base.py:2175
-+#: dnf/base.py:2185
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
- msgstr "最下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。"
- 
--#: dnf/base.py:2233
-+#: dnf/base.py:2243
- msgid "Action not handled: {}"
- msgstr "動作は対処されていません: {}"
- 
--#: dnf/base.py:2247 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
-+#: dnf/base.py:2257 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
- #: dnf/cli/commands/__init__.py:913 dnf/cli/commands/group.py:398
- #, python-format
- msgid "No package %s available."
- msgstr "利用可能なパッケージ %s がありません。"
- 
--#: dnf/base.py:2260
-+#: dnf/base.py:2270
- msgid "no package matched"
- msgstr "一致したパッケージはありません。"
- 
--#: dnf/base.py:2281
-+#: dnf/base.py:2291
- msgid "No security updates needed, but {} update available"
- msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
--#: dnf/base.py:2283
-+#: dnf/base.py:2293
- msgid "No security updates needed, but {} updates available"
- msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
--#: dnf/base.py:2287
-+#: dnf/base.py:2297
- msgid "No security updates needed for \"{}\", but {} update available"
- msgstr "\"{}\" のセキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
--#: dnf/base.py:2289
-+#: dnf/base.py:2299
- msgid "No security updates needed for \"{}\", but {} updates available"
- msgstr "\"{}\" のセキュリティー更新は必要ありませんが、{} 更新が利用可能です"
- 
--#: dnf/base.py:2313
-+#: dnf/base.py:2323
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ". 失敗したパッケージは: %s"
- 
--#: dnf/base.py:2314
-+#: dnf/base.py:2324
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "GPG 鍵が設定されています: %s"
- 
--#: dnf/base.py:2326
-+#: dnf/base.py:2336
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
- msgstr "%s (0x%s) の GPG 鍵はインストール済みです"
- 
--#: dnf/base.py:2359
-+#: dnf/base.py:2369
- msgid "The key has been approved."
--msgstr ""
-+msgstr "鍵が承認されました。"
- 
--#: dnf/base.py:2362
-+#: dnf/base.py:2372
- msgid "The key has been rejected."
--msgstr ""
-+msgstr "鍵が拒否されました。"
- 
--#: dnf/base.py:2395
-+#: dnf/base.py:2405
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "鍵のインポートに失敗しました (コード: %d)"
- 
--#: dnf/base.py:2397
-+#: dnf/base.py:2407
- msgid "Key imported successfully"
- msgstr "鍵のインポートに成功しました"
- 
--#: dnf/base.py:2401
-+#: dnf/base.py:2411
- msgid "Didn't install any keys"
- msgstr "鍵を 1 つもインストールしませんでした"
- 
--#: dnf/base.py:2404
-+#: dnf/base.py:2414
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
-@@ -485,49 +490,49 @@ msgstr ""
- "\"%s\" リポジトリーに一覧表示されている GPG 鍵はインストール済みですが、このパッケージには適切ではありません。\n"
- "正しい鍵 URL がこのリポジトリー用に設定されているか確認してください。"
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2425
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr "鍵をインポートしても役に立ちませんでした。鍵が間違っていませんか?"
- 
--#: dnf/base.py:2451
-+#: dnf/base.py:2478
- msgid "  * Maybe you meant: {}"
- msgstr "  * おそらく: {}"
- 
--#: dnf/base.py:2483
-+#: dnf/base.py:2510
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr "ローカルリポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません"
- 
--#: dnf/base.py:2486
-+#: dnf/base.py:2513
- msgid "Some packages from local repository have incorrect checksum"
- msgstr "ローカルリポジトリーのいくつかのパッケージのチェックサムは正しくありません"
- 
--#: dnf/base.py:2489
-+#: dnf/base.py:2516
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "リポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません"
- 
--#: dnf/base.py:2492
-+#: dnf/base.py:2519
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
- msgstr "いくつかのパッケージには無効なキャッシュがありますが、\"--cacheonly\" オプションによりダウンロードできません"
- 
--#: dnf/base.py:2510 dnf/base.py:2530
-+#: dnf/base.py:2537 dnf/base.py:2557
- msgid "No match for argument"
--msgstr ""
-+msgstr "一致した引数がありません"
- 
--#: dnf/base.py:2518 dnf/base.py:2538
-+#: dnf/base.py:2545 dnf/base.py:2565
- msgid "All matches were filtered out by exclude filtering for argument"
--msgstr ""
-+msgstr "すべての検索結果は引数の除外フィルタリングに一致しません(filter out)"
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2547
- msgid "All matches were filtered out by modular filtering for argument"
--msgstr ""
-+msgstr "すべての検出結果は引数のモジュラーフィルタリングに一致しません(filter out)"
- 
--#: dnf/base.py:2536
-+#: dnf/base.py:2563
- msgid "All matches were installed from a different repository for argument"
--msgstr ""
-+msgstr "すべての検索結果は引数に対し異なるレポジトリからインストールされたものです"
- 
--#: dnf/base.py:2552
-+#: dnf/base.py:2579
- #, python-format
- msgid "Package %s is already installed."
- msgstr "パッケージ %s は既にインストールされています。"
-@@ -535,7 +540,7 @@ msgstr "パッケージ %s は既にインストールされています。"
- #: dnf/cli/aliases.py:96
- #, python-format
- msgid "Unexpected value of environment variable: DNF_DISABLE_ALIASES=%s"
--msgstr ""
-+msgstr "環境変数の予期しない値: DNF_DISABLE_ALIASES=%s"
- 
- #: dnf/cli/aliases.py:105 dnf/conf/config.py:457
- #, python-format
-@@ -545,7 +550,7 @@ msgstr "ファイル \"%s\" の解析に失敗しました: %s"
- #: dnf/cli/aliases.py:108
- #, python-format
- msgid "Cannot read file \"%s\": %s"
--msgstr ""
-+msgstr "ファイル \"%s\" を読み込めません: %s"
- 
- #: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:898
- #: dnf/cli/cli.py:902 dnf/cli/commands/alias.py:108
-@@ -555,12 +560,12 @@ msgstr "設定エラー: %s"
- 
- #: dnf/cli/aliases.py:191
- msgid "Aliases contain infinite recursion"
--msgstr ""
-+msgstr "エイリアスには無限再帰が含まれます"
- 
- #: dnf/cli/aliases.py:209
- #, python-format
- msgid "%s, using original arguments."
--msgstr ""
-+msgstr "%s、オリジナルの引数を使用しています。"
- 
- #: dnf/cli/cli.py:136
- #, python-format
-@@ -577,7 +582,7 @@ msgstr "  ビルド      : %s  (日時: %s)"
- msgid ""
- "The operation would result in switching of module '{0}' stream '{1}' to "
- "stream '{2}'"
--msgstr ""
-+msgstr "オペレーションは、モジュール '{0}' ストリーム '{1}' を ストリーム '{2}' へと切り替える結果となります"
- 
- #: dnf/cli/cli.py:171
- #, python-brace-format
-@@ -585,18 +590,20 @@ msgid ""
- "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."
- msgstr ""
-+"モジュールの有効なストリームを切り替えることはできません。\n"
-+"モジュールからインストールされた全てのコンテンツを削除し、 '{prog} module reset <module_name>' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。"
- 
- #: dnf/cli/cli.py:209
- #, python-brace-format
- msgid "{prog} will only download packages for the transaction."
--msgstr ""
-+msgstr "{prog} はトランザクションでパッケージのダウンロードのみ行います。"
- 
- #: dnf/cli/cli.py:212
- #, python-brace-format
- msgid ""
- "{prog} will only download packages, install gpg keys, and check the "
- "transaction."
--msgstr ""
-+msgstr "{prog} はパッケージのダウンロード、gpgキーのインストール、トランザクションのチェックのみ行います。"
- 
- #: dnf/cli/cli.py:216
- msgid "Operation aborted."
-@@ -622,13 +629,9 @@ msgstr ""
- "無人での実行中に鍵の自動インポートを拒否します。\n"
- "オーバーライドするには \"-y\" を使用してください。"
- 
--#: dnf/cli/cli.py:298
--msgid "GPG check FAILED"
--msgstr "GPG の確認に失敗しました"
--
- #: dnf/cli/cli.py:330
- msgid "Changelogs for {}"
--msgstr ""
-+msgstr "{} の Changelogs"
- 
- #: dnf/cli/cli.py:363 dnf/cli/cli.py:504 dnf/cli/cli.py:510
- msgid "Obsoleting Packages"
-@@ -714,7 +717,7 @@ msgstr "一致するリポジトリーがありません: %s"
- msgid ""
- "This command has to be run with superuser privileges (under the root user on"
- " most systems)."
--msgstr ""
-+msgstr "このコマンドはスーパーユーザー特権(大概のシステムではrootユーザー)で実行しなければいけません。"
- 
- #: dnf/cli/cli.py:843
- #, python-format
-@@ -726,14 +729,14 @@ msgstr "そのようなコマンドはありません: %s. %s --help を使用
- msgid ""
- "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-"
- "command(%s)'\""
--msgstr ""
-+msgstr "{PROG} プラグインコマンドを実行できません、試してください: \"{prog} install 'dnf-command(%s)'\""
- 
- #: dnf/cli/cli.py:850
- #, python-brace-format
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
- "disabled."
--msgstr ""
-+msgstr "{prog} プラグインコマンドを実行できません、プラグインのロードが現在無効になっているようです。"
- 
- #: dnf/cli/cli.py:908
- msgid ""
-@@ -748,16 +751,20 @@ 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:996
- 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:1016
- msgid "Config file \"{}\" does not exist"
--msgstr ""
-+msgstr "設定ファイル \"{}\" は存在しません"
- 
- #: dnf/cli/cli.py:1036
- msgid ""
-@@ -765,7 +772,7 @@ msgid ""
- "version)"
- msgstr "リリースバージョンを検出できません (リリースバージョンを指定するには '--releasever' を使用してください)"
- 
--#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:473
-+#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr "引数 {}: 引数 {} と許可されていません"
- 
-@@ -816,6 +823,18 @@ msgid ""
- "\n"
- "For more information contact your distribution or package provider."
- msgstr ""
-+"GPG キーによるパッケージのチェックが可能になりました。これは良いことです。\n"
-+"しかしGPG 公開鍵が無いようです。インストールしたいパッケージのキーを\n"
-+"ダウンロードしてからインストールする必要があります。\n"
-+"このコマンドで行えます:\n"
-+"    rpm --import public.gpg.key\n"
-+"\n"
-+"\n"
-+"代わりにレポジトリーセクションの 'gpgkey' オプションにあるレポジトリーを使用し\n"
-+"キーのurlを特定したのち、 {prog} がインストールされます。\n"
-+"\n"
-+"\n"
-+"詳細情報はディストリビューションまたはパッケージプロバイダーにコンタクトしてください。"
- 
- #: dnf/cli/commands/__init__.py:80
- #, python-format
-@@ -865,7 +884,7 @@ msgstr "パッケージ"
- 
- #: dnf/cli/commands/__init__.py:202
- msgid "Package name specification"
--msgstr ""
-+msgstr "パッケージ名spec"
- 
- #: dnf/cli/commands/__init__.py:230
- msgid "list a package or groups of packages"
-@@ -877,11 +896,11 @@ msgstr "どのパッケージが特定の値を提供するか見つけます"
- 
- #: dnf/cli/commands/__init__.py:248
- msgid "PROVIDE"
--msgstr ""
-+msgstr "PROVIDE"
- 
- #: dnf/cli/commands/__init__.py:249
- msgid "Provide specification to search for"
--msgstr ""
-+msgstr "検索するspecを提供"
- 
- #: dnf/cli/commands/__init__.py:258 dnf/cli/commands/search.py:159
- msgid "Searching Packages: "
-@@ -893,7 +912,7 @@ msgstr "利用可能なパッケージのアップグレードを確認します
- 
- #: dnf/cli/commands/__init__.py:273
- msgid "show changelogs before update"
--msgstr ""
-+msgstr "更新前に changelogs を表示します"
- 
- #: dnf/cli/commands/__init__.py:370 dnf/cli/commands/__init__.py:423
- #: dnf/cli/commands/__init__.py:479
-@@ -915,7 +934,7 @@ msgid " (from %s)"
- msgstr " (%s から)"
- 
- #: dnf/cli/commands/__init__.py:442 dnf/cli/commands/__init__.py:499
--#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:104
-+#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:105
- #, python-format
- msgid "Installed package %s%s not available."
- msgstr "インストール済みパッケージ %s%s は利用できません。"
-@@ -939,16 +958,16 @@ msgstr "特定のリポジトリーのすべてのパッケージに対して、
- 
- #: dnf/cli/commands/__init__.py:774
- msgid "REPOID"
--msgstr ""
-+msgstr "REPOID"
- 
- #: dnf/cli/commands/__init__.py:774
- msgid "Repository ID"
--msgstr ""
-+msgstr "リポジトリーID"
- 
- #: dnf/cli/commands/__init__.py:785 dnf/cli/commands/mark.py:48
- #: dnf/cli/commands/updateinfo.py:108
- msgid "Package specification"
--msgstr ""
-+msgstr "パッケージspec"
- 
- #: dnf/cli/commands/__init__.py:809
- msgid "display a helpful usage message"
-@@ -961,7 +980,7 @@ msgstr "コマンド"
- #: dnf/cli/commands/__init__.py:814
- #, python-brace-format
- msgid "{prog} command to get help for"
--msgstr ""
-+msgstr "{prog} コマンドでヘルプ表示"
- 
- #: dnf/cli/commands/__init__.py:831
- msgid "display, or use, the transaction history"
-@@ -980,8 +999,9 @@ msgid "No transaction ID or package name given."
- msgstr "トランザクション ID、またはパッケージ名が指定されていません。"
- 
- #: dnf/cli/commands/__init__.py:879
--msgid "You don't have access to the history DB."
--msgstr "履歴 DB にアクセスできません。"
-+#, python-format
-+msgid "You don't have access to the history DB: %s"
-+msgstr "履歴 DB にアクセスできません: %s"
- 
- #: dnf/cli/commands/__init__.py:891
- #, python-format
-@@ -1010,6 +1030,8 @@ msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
- msgstr ""
-+"'{}' をトランザクション IDに変換できません。\n"
-+"'<number>', 'last', 'last-<number>' を使用してください。"
- 
- #: dnf/cli/commands/__init__.py:999
- msgid "No transaction which manipulates package '{}' was found."
-@@ -1017,87 +1039,87 @@ msgstr "パッケージ '{}' を操作するトランザクションが見つか
- 
- #: dnf/cli/commands/alias.py:40
- msgid "List or create command aliases"
--msgstr ""
-+msgstr "コマンドエイリアスを一覧表示するか作成します"
- 
- #: dnf/cli/commands/alias.py:47
- msgid "enable aliases resolving"
--msgstr ""
-+msgstr "エイリアスの解決を有効にします"
- 
- #: dnf/cli/commands/alias.py:50
- msgid "disable aliases resolving"
--msgstr ""
-+msgstr "エイリアスの解決を無効にします"
- 
- #: dnf/cli/commands/alias.py:53
- msgid "action to do with aliases"
--msgstr ""
-+msgstr "エイリアスに関係するアクション"
- 
- #: dnf/cli/commands/alias.py:55
- msgid "alias definition"
--msgstr ""
-+msgstr "エイリアス定義"
- 
- #: dnf/cli/commands/alias.py:70
- msgid "Aliases are now enabled"
--msgstr ""
-+msgstr "エイリアスは有効化されました"
- 
- #: dnf/cli/commands/alias.py:73
- msgid "Aliases are now disabled"
--msgstr ""
-+msgstr "エイリアスは無効化されました"
- 
- #: dnf/cli/commands/alias.py:90 dnf/cli/commands/alias.py:93
- #, python-format
- msgid "Invalid alias key: %s"
--msgstr ""
-+msgstr "無効なエイリアス鍵: %s"
- 
- #: dnf/cli/commands/alias.py:96
- #, python-format
- msgid "Alias argument has no value: %s"
--msgstr ""
-+msgstr "エイリアスの引数に値はありません: %s"
- 
- #: dnf/cli/commands/alias.py:130
- #, python-format
- msgid "Aliases added: %s"
--msgstr ""
-+msgstr "エイリアスが追加されました: %s"
- 
- #: dnf/cli/commands/alias.py:144
- #, python-format
- msgid "Alias not found: %s"
--msgstr ""
-+msgstr "エイリアスは見つかりません: %s"
- 
- #: dnf/cli/commands/alias.py:147
- #, python-format
- msgid "Aliases deleted: %s"
--msgstr ""
-+msgstr "エイリアスが削除されました: %s"
- 
- #: dnf/cli/commands/alias.py:155
- #, python-format
- msgid "%s, alias %s=\"%s\""
--msgstr ""
-+msgstr "%s エイリアス %s=\"%s\""
- 
- #: dnf/cli/commands/alias.py:157
- #, python-format
- msgid "Alias %s='%s'"
--msgstr ""
-+msgstr "エイリアス %s='%s'"
- 
- #: dnf/cli/commands/alias.py:161
- msgid "Aliases resolving is disabled."
--msgstr ""
-+msgstr "エイリアスの解決は無効化されました。"
- 
- #: dnf/cli/commands/alias.py:166
- msgid "No aliases specified."
--msgstr ""
-+msgstr "エイリアスが指定されていません。"
- 
- #: dnf/cli/commands/alias.py:173
- msgid "No alias specified."
--msgstr ""
-+msgstr "エイリアスが指定されていません。"
- 
- #: dnf/cli/commands/alias.py:179
- msgid "No aliases defined."
--msgstr ""
-+msgstr "エイリアスが定義されていません。"
- 
- #: dnf/cli/commands/alias.py:186
- #, python-format
- msgid "No match for alias: %s"
--msgstr ""
-+msgstr "一致するエイリアスがありません: %s"
- 
- #: dnf/cli/commands/autoremove.py:41
- msgid ""
-@@ -1217,6 +1239,12 @@ msgstr "警告: グループ %s は存在しません。"
- msgid "Warning: No groups match:"
- msgstr "警告: 一致するグループはありません:"
- 
-+#: dnf/cli/commands/group.py:180 dnf/cli/commands/group.py:191
-+#: dnf/cli/output.py:1226
-+#| msgid "<unset>"
-+msgid "<name-unset>"
-+msgstr "<name-unset>"
-+
- #: dnf/cli/commands/group.py:197
- msgid "Available Environment Groups:"
- msgstr "利用可能な環境グループ:"
-@@ -1259,15 +1287,15 @@ msgstr "利用可能なグループのみを表示します"
- 
- #: dnf/cli/commands/group.py:329
- msgid "show also ID of groups"
--msgstr ""
-+msgstr "グループIDも表示"
- 
- #: dnf/cli/commands/group.py:331
- msgid "available subcommands: {} (default), {}"
--msgstr ""
-+msgstr "利用可能なサブコマンド: {} (default), {}"
- 
- #: dnf/cli/commands/group.py:335
- msgid "argument for group subcommand"
--msgstr ""
-+msgstr "グループサブコマンドの引数"
- 
- #: dnf/cli/commands/group.py:344
- #, python-format
-@@ -1318,6 +1346,9 @@ msgid ""
- "remove: unmark as installed by user\n"
- "group: mark as installed by group"
- msgstr ""
-+"インストール: ユーザーによりインストールにマーク\n"
-+"削除: ユーザーによりインストールからマーク解除\n"
-+"グループ: グループによりインストールにマーク"
- 
- #: dnf/cli/commands/mark.py:52
- #, python-format
-@@ -1348,11 +1379,11 @@ msgstr "パッケージ %s はインストールされていません。"
- msgid ""
- "Only module name, stream, architecture or profile is used. Ignoring unneeded"
- " information in argument: '{}'"
--msgstr ""
-+msgstr "モジュール名、ストリーム、アーキテクチャーまたはプロファイルのみが使用されています。引数: '{}' の不要な情報は無視します"
- 
- #: dnf/cli/commands/module.py:77
- msgid "list all module streams, profiles and states"
--msgstr ""
-+msgstr "全てのモジュールストリーム、プロファイル、状態をリスト"
- 
- #: dnf/cli/commands/module.py:105 dnf/cli/commands/module.py:128
- msgid "No matching Modules to list"
-@@ -1360,43 +1391,43 @@ msgstr "表示する一致モジュールはありません"
- 
- #: dnf/cli/commands/module.py:111
- msgid "print detailed information about a module"
--msgstr ""
-+msgstr "モジュールに関する詳細情報を表示"
- 
- #: dnf/cli/commands/module.py:133
- msgid "enable a module stream"
--msgstr ""
-+msgstr "モジュールストリームを有効化"
- 
- #: dnf/cli/commands/module.py:157
- msgid "disable a module with all its streams"
--msgstr ""
-+msgstr "すべてのストリームのモジュールを無効化"
- 
- #: dnf/cli/commands/module.py:181
- msgid "reset a module"
--msgstr ""
-+msgstr "モジュールのリセット"
- 
- #: dnf/cli/commands/module.py:202
- msgid "install a module profile including its packages"
--msgstr ""
-+msgstr "パッケージを含むモジュールプロファイルのインストール"
- 
- #: dnf/cli/commands/module.py:223
- msgid "update packages associated with an active stream"
--msgstr ""
-+msgstr "アクティブストリームに紐づいたパッケージをアップデート"
- 
- #: dnf/cli/commands/module.py:240
- msgid "remove installed module profiles and their packages"
--msgstr ""
-+msgstr "インストールされたモジュールプロファイルとそのパッケージを削除"
- 
- #: dnf/cli/commands/module.py:264
- msgid "Package {} belongs to multiple modules, skipping"
--msgstr ""
-+msgstr "パッケージ {} は複数のモジュールに属しています、スキップします"
- 
- #: dnf/cli/commands/module.py:277
- msgid "list modular packages"
--msgstr ""
-+msgstr "モジュラーパッケージをリスト"
- 
- #: dnf/cli/commands/module.py:292
- msgid "list packages belonging to a module"
--msgstr ""
-+msgstr "モジュールに属するパッケージをリスト"
- 
- #: dnf/cli/commands/module.py:327
- msgid "Interact with Modules."
-@@ -1412,7 +1443,7 @@ msgstr "無効なモジュールのみを表示します"
- 
- #: dnf/cli/commands/module.py:346
- msgid "show only installed modules or packages"
--msgstr ""
-+msgstr "インストールされたモジュールまたはパッケージのみ表示"
- 
- #: dnf/cli/commands/module.py:349
- msgid "show profile content"
-@@ -1420,15 +1451,15 @@ msgstr "プロファイルコンテンツを表示します"
- 
- #: dnf/cli/commands/module.py:354
- msgid "remove all modular packages"
--msgstr ""
-+msgstr "すべてのモジュラーパッケージを削除"
- 
- #: dnf/cli/commands/module.py:364
- msgid "Module specification"
--msgstr ""
-+msgstr "モジュールspec"
- 
- #: dnf/cli/commands/module.py:386
- msgid "{} {} {}: too few arguments"
--msgstr ""
-+msgstr "{} {} {}: 引数が足りません"
- 
- #: dnf/cli/commands/reinstall.py:38
- msgid "reinstall a package"
-@@ -1450,16 +1481,16 @@ msgstr "重複するパッケージを削除します"
- msgid "remove installonly packages over the limit"
- msgstr "制限を超えた installonly パッケージを削除します"
- 
--#: dnf/cli/commands/remove.py:94
-+#: dnf/cli/commands/remove.py:95
- msgid "No duplicated packages found for removal."
- msgstr "削除対象の重複するパッケージはありません。"
- 
--#: dnf/cli/commands/remove.py:126
-+#: dnf/cli/commands/remove.py:127
- msgid "No old installonly packages found for removal."
- msgstr "削除対象の古い installonly パッケージはありません。"
- 
- #: dnf/cli/commands/repolist.py:38 dnf/cli/commands/updateinfo.py:47
--#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:359
-+#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:364
- msgid "unknown"
- msgstr "不明"
- 
-@@ -1496,7 +1527,7 @@ msgstr "無効な repo を表示します"
- 
- #: dnf/cli/commands/repolist.py:93
- msgid "Repository specification"
--msgstr ""
-+msgstr "レポジトリspec"
- 
- #: dnf/cli/commands/repolist.py:125
- msgid "No repositories available"
-@@ -1512,100 +1543,100 @@ msgstr "無効化"
- 
- #: dnf/cli/commands/repolist.py:162
- msgid "Repo-id            : "
--msgstr ""
-+msgstr "Repo-id            : "
- 
- #: dnf/cli/commands/repolist.py:163
- msgid "Repo-name          : "
--msgstr ""
-+msgstr "Repo-name          : "
- 
- #: dnf/cli/commands/repolist.py:166
- msgid "Repo-status        : "
--msgstr ""
-+msgstr "Repo-status        : "
- 
- #: dnf/cli/commands/repolist.py:169
- msgid "Repo-revision      : "
--msgstr ""
-+msgstr "Repo-revision      : "
- 
- #: dnf/cli/commands/repolist.py:173
- msgid "Repo-tags          : "
--msgstr ""
-+msgstr "Repo-tags          : "
- 
- #: dnf/cli/commands/repolist.py:180
- msgid "Repo-distro-tags      : "
--msgstr ""
-+msgstr "Repo-distro-tags      : "
- 
- #: dnf/cli/commands/repolist.py:192
- msgid "Repo-updated       : "
--msgstr ""
-+msgstr "Repo-updated       : "
- 
- #: dnf/cli/commands/repolist.py:194
- msgid "Repo-pkgs          : "
--msgstr ""
-+msgstr "Repo-pkgs          : "
- 
- #: dnf/cli/commands/repolist.py:195
- msgid "Repo-available-pkgs: "
--msgstr ""
-+msgstr "Repo-available-pkgs: "
- 
- #: dnf/cli/commands/repolist.py:196
- msgid "Repo-size          : "
--msgstr ""
-+msgstr "Repo-size          : "
- 
- #: dnf/cli/commands/repolist.py:199
- msgid "Repo-metalink      : "
--msgstr ""
-+msgstr "Repo-metalink      : "
- 
- #: dnf/cli/commands/repolist.py:204
- msgid "  Updated          : "
--msgstr ""
-+msgstr "  Updated          : "
- 
- #: dnf/cli/commands/repolist.py:206
- msgid "Repo-mirrors       : "
--msgstr ""
-+msgstr "Repo-mirrors       : "
- 
- #: dnf/cli/commands/repolist.py:210 dnf/cli/commands/repolist.py:216
- msgid "Repo-baseurl       : "
--msgstr ""
-+msgstr "Repo-baseurl       : "
- 
- #: dnf/cli/commands/repolist.py:219
- msgid "Repo-expire        : "
--msgstr ""
-+msgstr "Repo-expire        : "
- 
- #. TRANSLATORS: Packages that are excluded - their names like (dnf systemd)
- #: dnf/cli/commands/repolist.py:223
- msgid "Repo-exclude       : "
--msgstr ""
-+msgstr "Repo-exclude       : "
- 
- #: dnf/cli/commands/repolist.py:227
- msgid "Repo-include       : "
--msgstr ""
-+msgstr "Repo-include       : "
- 
- #. TRANSLATORS: Number of packages that where excluded (5)
- #: dnf/cli/commands/repolist.py:232
- msgid "Repo-excluded      : "
--msgstr ""
-+msgstr "Repo-excluded      : "
- 
- #: dnf/cli/commands/repolist.py:236
- msgid "Repo-filename      : "
--msgstr ""
-+msgstr "Repo-filename      : "
- 
- #. Work out the first (id) and last (enabled/disabled/count),
- #. then chop the middle (name)...
--#: dnf/cli/commands/repolist.py:245 dnf/cli/commands/repolist.py:272
-+#: dnf/cli/commands/repolist.py:246 dnf/cli/commands/repolist.py:273
- msgid "repo id"
- msgstr "repo id"
- 
--#: dnf/cli/commands/repolist.py:258 dnf/cli/commands/repolist.py:259
--#: dnf/cli/commands/repolist.py:280
-+#: dnf/cli/commands/repolist.py:259 dnf/cli/commands/repolist.py:260
-+#: dnf/cli/commands/repolist.py:281
- msgid "status"
- msgstr "状態"
- 
--#: dnf/cli/commands/repolist.py:274 dnf/cli/commands/repolist.py:276
-+#: dnf/cli/commands/repolist.py:275 dnf/cli/commands/repolist.py:277
- msgid "repo name"
- msgstr "repo の名前"
- 
--#: dnf/cli/commands/repolist.py:290
-+#: dnf/cli/commands/repolist.py:291
- msgid "Total packages: {}"
--msgstr ""
-+msgstr "総パッケージ: {}"
- 
- #: dnf/cli/commands/repoquery.py:108
- msgid "search for packages matching keyword"
-@@ -1709,7 +1740,7 @@ msgstr "特定の name.arch に最新パッケージ N を表示します (ま
- 
- #: dnf/cli/commands/repoquery.py:181
- msgid "list also packages of inactive module streams"
--msgstr ""
-+msgstr "非アクティブモジュールストリームのパッケージもリスト"
- 
- #: dnf/cli/commands/repoquery.py:186
- msgid "show detailed information about the package"
-@@ -1803,6 +1834,9 @@ msgid ""
- "running %%pre and %%post scriptlets. If the package is installed display "
- "capabilities that is depends for %%pre, %%post, %%preun and %%postun."
- msgstr ""
-+"このパッケージがインストールされていない場合、 %%pre と %%post "
-+"スクリプトレット実行に依存するケイパビリティを表示します。このパッケージがインストールされている場合、 %%pre, %%post, %%preun と"
-+" %%postun に依存するケイパビリティを表示します。"
- 
- #: dnf/cli/commands/repoquery.py:242
- msgid "Display capabilities that the package suggests."
-@@ -1835,7 +1869,7 @@ msgstr "インストール済みのパッケージの一部にアップグレー
- #, python-brace-format
- msgid ""
- "Display only packages that can be removed by \"{prog} autoremove\" command."
--msgstr ""
-+msgstr "\"{prog} autoremove\" コマンドにより削除可能なパッケージのみを表示。"
- 
- #: dnf/cli/commands/repoquery.py:257
- msgid "Display only packages that were installed by user."
-@@ -1865,6 +1899,8 @@ msgid ""
- "with '--alldeps', but not with '--exactdeps'), or with '--requires <REQ> "
- "--resolve'"
- msgstr ""
-+"オプションの '--recursive' は、'--whatrequires <REQ>' (オプションでは '--exactdeps' ではなく、'"
-+"--alldeps' と共に使用) または '--requires <REQ> --resolve' と共に使用する必要があります。"
- 
- #: dnf/cli/commands/repoquery.py:311
- msgid "argument {} requires --whatrequires or --whatdepends option"
-@@ -1879,7 +1915,7 @@ msgstr "パッケージ {} はファイルを含んでいません"
- msgid "Available query-tags: use --queryformat \".. %{tag} ..\""
- msgstr "利用可能な query-tags: --queryformat \".. %{tag} ..\" を使用します"
- 
--#: dnf/cli/commands/repoquery.py:562
-+#: dnf/cli/commands/repoquery.py:561
- #, python-brace-format
- msgid ""
- "No valid switch specified\n"
-@@ -1888,6 +1924,11 @@ msgid ""
- "description:\n"
- "  For the given packages print a tree of thepackages."
- msgstr ""
-+"正規のスイッチが特定されません\n"
-+"usage: {prog} repoquery [--conflicts|--enhances|--obsoletes|--provides|--recommends|--requires|--suggest|--supplements|--whatrequires] [key] [--tree]\n"
-+"\n"
-+"説明:\n"
-+"  与えられたパッケージではパッケージのツリーを表示します。"
- 
- #: dnf/cli/commands/search.py:46
- msgid "search package details for the given string"
-@@ -1899,26 +1940,26 @@ msgstr "パッケージの説明と URL も検索します"
- 
- #: dnf/cli/commands/search.py:52
- msgid "KEYWORD"
--msgstr ""
-+msgstr "KEYWORD"
- 
- #: dnf/cli/commands/search.py:55
- msgid "Keyword to search for"
--msgstr ""
-+msgstr "検索のキーワード"
- 
- #: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
- msgctxt "long"
- msgid "Name"
--msgstr ""
-+msgstr "名前"
- 
- #: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
- msgctxt "long"
- msgid "Summary"
--msgstr ""
-+msgstr "概要"
- 
- #: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
- msgctxt "long"
- msgid "Description"
--msgstr ""
-+msgstr "説明"
- 
- #: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
- msgid "URL"
-@@ -1951,7 +1992,7 @@ msgstr "一致する項目はありませんでした。"
- #: dnf/cli/commands/shell.py:47
- #, python-brace-format
- msgid "run an interactive {prog} shell"
--msgstr ""
-+msgstr "インタラクティブ {prog} シェルの実行"
- 
- #: dnf/cli/commands/shell.py:68
- msgid "SCRIPT"
-@@ -1960,7 +2001,7 @@ msgstr "スクリプト"
- #: dnf/cli/commands/shell.py:69
- #, python-brace-format
- msgid "Script to run in {prog} shell"
--msgstr ""
-+msgstr "{prog} シェルで実行するスクリプト"
- 
- #: dnf/cli/commands/shell.py:142
- msgid "Unsupported key value."
-@@ -2079,7 +2120,7 @@ msgstr "シェルを終了します"
- #: dnf/cli/commands/swap.py:35
- #, python-brace-format
- msgid "run an interactive {prog} mod for remove and install one spec"
--msgstr ""
-+msgstr "一つのspecを削除またはインストールするためインタラクティブ {prog} モジュールを実行"
- 
- #: dnf/cli/commands/swap.py:40
- msgid "The specs that will be removed"
-@@ -2157,11 +2198,11 @@ msgstr "勧告の情報を表示します"
- 
- #: dnf/cli/commands/updateinfo.py:101
- msgid "show only advisories with CVE reference"
--msgstr ""
-+msgstr "CVE参照のアドバイザリーのみ表示"
- 
- #: dnf/cli/commands/updateinfo.py:104
- msgid "show only advisories with bugzilla reference"
--msgstr ""
-+msgstr "bugzilla参照のアドバイザリーのみ表示"
- 
- #: dnf/cli/commands/updateinfo.py:168
- msgid "installed"
-@@ -2227,52 +2268,52 @@ msgstr "その他の通知"
- msgid "Unknown/Sec."
- msgstr "不明/セキュリティ"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Bugs"
- msgstr "バグ"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Type"
- msgstr "タイプ"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Update ID"
- msgstr "更新 ID"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Updated"
- msgstr "更新済み"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "CVEs"
- msgstr "CVE"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Description"
- msgstr "説明"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Rights"
- msgstr "権利"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Severity"
- msgstr "重大度"
- 
--#: dnf/cli/commands/updateinfo.py:354
-+#: dnf/cli/commands/updateinfo.py:359
- msgid "Files"
- msgstr "ファイル"
- 
--#: dnf/cli/commands/updateinfo.py:354 dnf/cli/output.py:1491
--#: dnf/cli/output.py:1755 dnf/cli/output.py:1757
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Installed"
- msgstr "インストール済み"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "false"
- msgstr "誤"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "true"
- msgstr "正"
- 
-@@ -2300,23 +2341,23 @@ msgstr "現在のディレクトリーには読み取り/実行権限があり
- 
- #: dnf/cli/main.py:135
- msgid "try to add '{}' to command line to replace conflicting packages"
--msgstr ""
-+msgstr "競合するパッケージを置き換えるには、コマンドラインに '{}' を追加してみてください"
- 
- #: dnf/cli/main.py:139
- msgid "try to add '{}' to skip uninstallable packages"
--msgstr ""
-+msgstr "インストール不可のパッケージをスキップするには、'{}' を追加してみてください"
- 
- #: dnf/cli/main.py:142
- msgid " or '{}' to skip uninstallable packages"
--msgstr ""
-+msgstr " または、'{}' を追加して、インストール不可のパッケージをスキップしてください"
- 
- #: dnf/cli/main.py:147
- msgid "try to add '{}' to use not only best candidate packages"
--msgstr ""
-+msgstr "最適候補のパッケージのみを使用しないためには、'{}' を追加してみてください"
- 
- #: dnf/cli/main.py:150
- msgid " or '{}' to use not only best candidate packages"
--msgstr ""
-+msgstr " または、'{}' を追加して、最適候補のパッケージのみを使用しないでください"
- 
- #: dnf/cli/main.py:167
- msgid "Dependencies resolved."
-@@ -2347,7 +2388,7 @@ msgstr "Setopt 引数には値はありません: %s"
- #: dnf/cli/option_parser.py:174
- #, python-brace-format
- msgid "General {prog} options"
--msgstr ""
-+msgstr "全般 {prog} オプション"
- 
- #: dnf/cli/option_parser.py:178
- msgid "config file location"
-@@ -2364,7 +2405,7 @@ msgstr "詳細な操作"
- #: dnf/cli/option_parser.py:185
- #, python-brace-format
- msgid "show {prog} version and exit"
--msgstr ""
-+msgstr "{prog} バージョンを表示して終了する"
- 
- #: dnf/cli/option_parser.py:187
- msgid "set install root"
-@@ -2412,7 +2453,7 @@ msgstr "トランザクションにおいて利用可能な最適なパッケー
- 
- #: dnf/cli/option_parser.py:223
- msgid "do not limit the transaction to the best candidate"
--msgstr ""
-+msgstr "トランザクションを最良候補に限定しません"
- 
- #: dnf/cli/option_parser.py:226
- msgid "run entirely from system cache, don't update cache"
-@@ -2444,6 +2485,8 @@ msgid ""
- "enables {prog}'s obsoletes processing logic for upgrade or display "
- "capabilities that the package obsoletes for info, list and repoquery"
- msgstr ""
-+"アップグレードまたは、info, list, repoquery で旧パッケージのケイパビリティを表示するため、 {prog} "
-+"の旧プロセスロジックを有効化"
- 
- #: dnf/cli/option_parser.py:251
- msgid "debugging output level for rpm"
-@@ -2461,13 +2504,13 @@ msgstr "すべての質問に「いいえ」(no) と自動的に答えます"
- msgid ""
- "Enable additional repositories. List option. Supports globs, can be "
- "specified multiple times."
--msgstr ""
-+msgstr "追加レポジトリを有効化、オプションのリスト、globsのサポートは何度でも指定可能です。"
- 
- #: dnf/cli/option_parser.py:266
- msgid ""
- "Disable repositories. List option. Supports globs, can be specified multiple"
- " times."
--msgstr ""
-+msgstr "追加レポジトリを無効化、オプションのリスト、globsのサポートは何度でも指定可能です。"
- 
- #: dnf/cli/option_parser.py:270
- msgid ""
-@@ -2477,11 +2520,11 @@ msgstr "id または glob により特定のリポジトリーだけを有効に
- 
- #: dnf/cli/option_parser.py:275
- msgid "enable repos with config-manager command (automatically saves)"
--msgstr ""
-+msgstr "config-manager コマンドで repos を有効にします (自動的に保存)"
- 
- #: dnf/cli/option_parser.py:279
- msgid "disable repos with config-manager command (automatically saves)"
--msgstr ""
-+msgstr "config-manager コマンドで repos を無効にします (自動的に保存)"
- 
- #: dnf/cli/option_parser.py:283
- msgid "exclude packages by name or glob"
-@@ -2495,7 +2538,7 @@ msgstr "excludepkgs を無効にします"
- msgid ""
- "label and path to an additional repository to use (same path as in a "
- "baseurl), can be specified multiple times."
--msgstr ""
-+msgstr "利用する追加レポジトリ(baseurlと同じパス)のラベルとパスは何度でも指定可能です。"
- 
- #: dnf/cli/option_parser.py:297
- msgid "disable removal of dependencies that are no longer used"
-@@ -2503,7 +2546,7 @@ msgstr "もはや使用されていない依存関係の削除を無効にしま
- 
- #: dnf/cli/option_parser.py:300
- msgid "disable gpg signature checking (if RPM policy allows)"
--msgstr ""
-+msgstr "GPG 署名の確認を無効にします (RPM ポリシーが許可する場合)"
- 
- #: dnf/cli/option_parser.py:302
- msgid "control whether color is used"
-@@ -2578,10 +2621,9 @@ msgid "List of Plugin Commands:"
- msgstr "プラグインコマンドの一覧"
- 
- #: dnf/cli/option_parser.py:413
--#, fuzzy, python-format
--#| msgid "No match for argument: %s"
-+#, python-format
- msgid "Cannot encode argument '%s': %s"
--msgstr "一致した引数がありません: %s"
-+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
-@@ -2589,7 +2631,7 @@ msgstr "一致した引数がありません: %s"
- #: dnf/cli/output.py:505
- msgctxt "short"
- msgid "Name"
--msgstr ""
-+msgstr "名前"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:511
-@@ -2600,16 +2642,16 @@ 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:1327
-+#: dnf/cli/output.py:512 dnf/cli/output.py:1335
- msgctxt "short"
- msgid "Version"
--msgstr ""
-+msgstr "バージョン"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:513 dnf/cli/output.py:1337
- msgctxt "long"
- msgid "Version"
--msgstr ""
-+msgstr "バージョン"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:516
-@@ -2618,32 +2660,32 @@ 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:1318
-+#: dnf/cli/output.py:517 dnf/cli/output.py:1326
- msgctxt "short"
- msgid "Arch"
--msgstr ""
-+msgstr "Arch"
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1321
-+#: dnf/cli/output.py:518 dnf/cli/output.py:1329
- msgctxt "long"
- msgid "Architecture"
--msgstr ""
-+msgstr "アーキテクチャー"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1352
- msgctxt "long"
- msgid "Size"
--msgstr ""
-+msgstr "サイズ"
- 
- #. Translators: This is the short version of 'Size'. It should
- #. 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:1342
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1350
- msgctxt "short"
- msgid "Size"
--msgstr ""
-+msgstr "サイズ"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:524
-@@ -2652,17 +2694,17 @@ 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:1333
-+#: dnf/cli/output.py:525 dnf/cli/output.py:1341
- msgctxt "short"
- msgid "Repo"
--msgstr ""
-+msgstr "Repo"
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1336
-+#: dnf/cli/output.py:526 dnf/cli/output.py:1344
- msgctxt "long"
- msgid "Repository"
--msgstr ""
-+msgstr "リポジトリー"
- 
- #. Translators: This message should be no longer than 12 chars.
- #: dnf/cli/output.py:533
-@@ -2698,7 +2740,7 @@ msgstr "インストール済み"
- #: dnf/cli/output.py:558
- msgctxt "short"
- msgid "Summary"
--msgstr ""
-+msgstr "概要"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:564
-@@ -2711,11 +2753,11 @@ msgstr "ライセンス"
- #: dnf/cli/output.py:568
- msgctxt "short"
- msgid "Description"
--msgstr ""
-+msgstr "説明"
- 
- #: dnf/cli/output.py:695
- msgid "No packages to list"
--msgstr ""
-+msgstr "一覧表示するパッケージはありません"
- 
- #: dnf/cli/output.py:706
- msgid "y"
-@@ -2932,53 +2974,53 @@ msgstr "ダウングレード"
- 
- #: dnf/cli/output.py:1176
- msgid "Installing module profiles"
--msgstr ""
-+msgstr "モジュールプロファイルのインストール中"
- 
- #: dnf/cli/output.py:1185
- msgid "Disabling module profiles"
--msgstr ""
-+msgstr "モジュールプロファイルの無効化中"
- 
- #: dnf/cli/output.py:1194
- msgid "Enabling module streams"
--msgstr ""
-+msgstr "モジュールストリームの有効化中"
- 
- #: dnf/cli/output.py:1202
- msgid "Switching module streams"
--msgstr ""
-+msgstr "モジュールストリームの切り替え中"
- 
- #: dnf/cli/output.py:1210
- msgid "Disabling modules"
--msgstr ""
-+msgstr "モジュールの無効化"
- 
- #: dnf/cli/output.py:1218
- msgid "Resetting modules"
--msgstr ""
-+msgstr "モジュールの再設定中"
- 
--#: dnf/cli/output.py:1226
-+#: dnf/cli/output.py:1230
- msgid "Installing Environment Groups"
--msgstr ""
-+msgstr "環境グループのインストール中"
- 
--#: dnf/cli/output.py:1233
-+#: dnf/cli/output.py:1237
- msgid "Upgrading Environment Groups"
--msgstr ""
-+msgstr "環境グループのアップグレード中"
- 
--#: dnf/cli/output.py:1240
-+#: dnf/cli/output.py:1244
- msgid "Removing Environment Groups"
--msgstr ""
-+msgstr "環境グループの削除中"
- 
--#: dnf/cli/output.py:1247
-+#: dnf/cli/output.py:1251
- msgid "Installing Groups"
--msgstr ""
-+msgstr "グループのインストール中"
- 
--#: dnf/cli/output.py:1254
-+#: dnf/cli/output.py:1258
- msgid "Upgrading Groups"
--msgstr ""
-+msgstr "グループのアップグレード中"
- 
--#: dnf/cli/output.py:1261
-+#: dnf/cli/output.py:1265
- msgid "Removing Groups"
--msgstr ""
-+msgstr "グループの削除中"
- 
--#: dnf/cli/output.py:1277
-+#: dnf/cli/output.py:1281
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
-@@ -2987,12 +3029,12 @@ msgstr ""
- "競合するパッケージをスキップします:\n"
- "(アップグレードを強制するにはコマンドラインに '%s' を追加します)"
- 
--#: dnf/cli/output.py:1285
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr "壊れた dependencies%s のパッケージをスキップします"
- 
--#: dnf/cli/output.py:1289
-+#: dnf/cli/output.py:1295
- msgid " or part of a group"
- msgstr " またはグループの一部"
- 
-@@ -3000,23 +3042,23 @@ 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:1312
-+#: dnf/cli/output.py:1320
- msgctxt "short"
- msgid "Package"
--msgstr ""
-+msgstr "パッケージ"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
- #. This is also a hack to resolve RhBug 1302935 correctly.
--#: dnf/cli/output.py:1314 dnf/cli/output.py:2007
-+#: dnf/cli/output.py:1322 dnf/cli/output.py:2023
- msgctxt "long"
- msgid "Package"
--msgstr ""
-+msgstr "パッケージ"
- 
--#: dnf/cli/output.py:1363
-+#: dnf/cli/output.py:1371
- msgid "replacing"
- msgstr "置き換え"
- 
--#: dnf/cli/output.py:1370
-+#: dnf/cli/output.py:1378
- #, python-format
- msgid ""
- "\n"
-@@ -3028,292 +3070,292 @@ msgstr ""
- "%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1375 dnf/cli/output.py:1914 dnf/cli/output.py:1915
-+#: dnf/cli/output.py:1383 dnf/cli/output.py:1930 dnf/cli/output.py:1931
- msgid "Install"
- msgstr "インストール"
- 
--#: dnf/cli/output.py:1379 dnf/cli/output.py:1923
-+#: dnf/cli/output.py:1387 dnf/cli/output.py:1939
- msgid "Upgrade"
- msgstr "アップグレード"
- 
--#: dnf/cli/output.py:1380
-+#: dnf/cli/output.py:1388
- msgid "Remove"
- msgstr "削除"
- 
--#: dnf/cli/output.py:1382 dnf/cli/output.py:1921
-+#: dnf/cli/output.py:1390 dnf/cli/output.py:1937
- msgid "Downgrade"
- msgstr "ダウングレード"
- 
--#: dnf/cli/output.py:1383
-+#: dnf/cli/output.py:1391
- msgid "Skip"
- msgstr "スキップ"
- 
--#: dnf/cli/output.py:1392 dnf/cli/output.py:1408
-+#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] "パッケージ"
- 
--#: dnf/cli/output.py:1410
-+#: dnf/cli/output.py:1418
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "依存パッケージ"
- 
--#: dnf/cli/output.py:1489 dnf/cli/output.py:1756 dnf/cli/output.py:1924
-+#: dnf/cli/output.py:1497 dnf/cli/output.py:1771 dnf/cli/output.py:1940
- msgid "Upgraded"
- msgstr "アップグレード済み"
- 
--#: dnf/cli/output.py:1490 dnf/cli/output.py:1756 dnf/cli/output.py:1922
-+#: dnf/cli/output.py:1498 dnf/cli/output.py:1771 dnf/cli/output.py:1938
- msgid "Downgraded"
- msgstr "ダウングレード済み"
- 
--#: dnf/cli/output.py:1495
-+#: dnf/cli/output.py:1503
- msgid "Reinstalled"
- msgstr "再インストール済み"
- 
--#: dnf/cli/output.py:1496
-+#: dnf/cli/output.py:1504
- msgid "Skipped"
--msgstr ""
-+msgstr "スキップ済み"
- 
--#: dnf/cli/output.py:1497
-+#: dnf/cli/output.py:1505
- msgid "Removed"
- msgstr "削除しました"
- 
--#: dnf/cli/output.py:1500
-+#: dnf/cli/output.py:1508
- msgid "Failed"
- msgstr "失敗しました"
- 
--#: dnf/cli/output.py:1551
-+#: dnf/cli/output.py:1559
- msgid "Total"
- msgstr "合計"
- 
--#: dnf/cli/output.py:1579
-+#: dnf/cli/output.py:1587
- msgid "<unset>"
- msgstr "<未設定>"
- 
--#: dnf/cli/output.py:1580
-+#: dnf/cli/output.py:1588
- msgid "System"
- msgstr "システム"
- 
--#: dnf/cli/output.py:1630
-+#: dnf/cli/output.py:1638
- msgid "Command line"
- msgstr "コマンドライン"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1634
-+#: dnf/cli/output.py:1649
- msgid "User name"
- msgstr "ユーザー名"
- 
- #. REALLY Needs to use columns!
--#: dnf/cli/output.py:1636 dnf/cli/output.py:2004
-+#: dnf/cli/output.py:1651 dnf/cli/output.py:2020
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1653
- msgid "Date and time"
- msgstr "日時"
- 
--#: dnf/cli/output.py:1639 dnf/cli/output.py:2005
-+#: dnf/cli/output.py:1654 dnf/cli/output.py:2021
- msgid "Action(s)"
- msgstr "動作"
- 
--#: dnf/cli/output.py:1640
-+#: dnf/cli/output.py:1655
- msgid "Altered"
- msgstr "変更されました"
- 
--#: dnf/cli/output.py:1681
-+#: dnf/cli/output.py:1696
- msgid "No transactions"
- msgstr "トランザクションがありません"
- 
--#: dnf/cli/output.py:1682 dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1697 dnf/cli/output.py:1713
- msgid "Failed history info"
--msgstr ""
-+msgstr "失敗した履歴情報"
- 
--#: dnf/cli/output.py:1697
-+#: dnf/cli/output.py:1712
- msgid "No transaction ID, or package, given"
- msgstr "トランザクション ID、またはパッケージが指定されていません"
- 
--#: dnf/cli/output.py:1755
-+#: dnf/cli/output.py:1770
- msgid "Erased"
- msgstr "削除されました"
- 
--#: dnf/cli/output.py:1757
-+#: dnf/cli/output.py:1772
- msgid "Not installed"
- msgstr "インストールされていません"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Newer"
- msgstr "新しい"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Older"
- msgstr "古い"
- 
--#: dnf/cli/output.py:1806 dnf/cli/output.py:1808
-+#: dnf/cli/output.py:1821 dnf/cli/output.py:1823
- msgid "Transaction ID :"
- msgstr "トランザクション ID :"
- 
--#: dnf/cli/output.py:1811
-+#: dnf/cli/output.py:1826
- msgid "Begin time     :"
- msgstr "開始時間            :"
- 
--#: dnf/cli/output.py:1814 dnf/cli/output.py:1816
-+#: dnf/cli/output.py:1829 dnf/cli/output.py:1831
- msgid "Begin rpmdb    :"
- msgstr "開始 rpmdb          :"
- 
--#: dnf/cli/output.py:1822
-+#: dnf/cli/output.py:1837
- #, python-format
- msgid "(%u seconds)"
- msgstr "(%u 秒)"
- 
--#: dnf/cli/output.py:1824
-+#: dnf/cli/output.py:1839
- #, python-format
- msgid "(%u minutes)"
- msgstr "(%u 分)"
- 
--#: dnf/cli/output.py:1826
-+#: dnf/cli/output.py:1841
- #, python-format
- msgid "(%u hours)"
- msgstr "(%u 時間)"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1843
- #, python-format
- msgid "(%u days)"
- msgstr "(%u 日)"
- 
--#: dnf/cli/output.py:1829
-+#: dnf/cli/output.py:1844
- msgid "End time       :"
- msgstr "終了時間            :"
- 
--#: dnf/cli/output.py:1832 dnf/cli/output.py:1834
-+#: dnf/cli/output.py:1847 dnf/cli/output.py:1849
- msgid "End rpmdb      :"
- msgstr "終了 rpmdb          :"
- 
--#: dnf/cli/output.py:1841 dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1856 dnf/cli/output.py:1858
- msgid "User           :"
- msgstr "ユーザー            :"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1854
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1869
- msgid "Aborted"
- msgstr "中断しました"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1850 dnf/cli/output.py:1852
--#: dnf/cli/output.py:1854 dnf/cli/output.py:1856 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1865 dnf/cli/output.py:1867
-+#: dnf/cli/output.py:1869 dnf/cli/output.py:1871 dnf/cli/output.py:1873
- msgid "Return-Code    :"
- msgstr "終了コード          :"
- 
--#: dnf/cli/output.py:1850 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1865 dnf/cli/output.py:1873
- msgid "Success"
- msgstr "成功"
- 
--#: dnf/cli/output.py:1852
-+#: dnf/cli/output.py:1867
- msgid "Failures:"
- msgstr "失敗:"
- 
--#: dnf/cli/output.py:1856
-+#: dnf/cli/output.py:1871
- msgid "Failure:"
- msgstr "失敗しました:"
- 
--#: dnf/cli/output.py:1866 dnf/cli/output.py:1868
-+#: dnf/cli/output.py:1881 dnf/cli/output.py:1883
- msgid "Releasever     :"
- msgstr "Releasever     :"
- 
--#: dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1888 dnf/cli/output.py:1890
- msgid "Command Line   :"
- msgstr "コマンドライン      :"
- 
--#: dnf/cli/output.py:1881
-+#: dnf/cli/output.py:1895 dnf/cli/output.py:1897
- msgid "Comment        :"
- msgstr "コメント        :"
- 
--#: dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1901
- msgid "Transaction performed with:"
- msgstr "実行されたトランザクション:"
- 
--#: dnf/cli/output.py:1894
-+#: dnf/cli/output.py:1910
- msgid "Packages Altered:"
- msgstr "変更されたパッケージ:"
- 
--#: dnf/cli/output.py:1900
-+#: dnf/cli/output.py:1916
- msgid "Scriptlet output:"
- msgstr "Scriptlet の出力:"
- 
--#: dnf/cli/output.py:1907
-+#: dnf/cli/output.py:1923
- msgid "Errors:"
- msgstr "エラー:"
- 
--#: dnf/cli/output.py:1916
-+#: dnf/cli/output.py:1932
- msgid "Dep-Install"
- msgstr "Dep-Install"
- 
--#: dnf/cli/output.py:1917
-+#: dnf/cli/output.py:1933
- msgid "Obsoleted"
- msgstr "廃止された"
- 
--#: dnf/cli/output.py:1918 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1934 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "廃止"
- 
--#: dnf/cli/output.py:1919
-+#: dnf/cli/output.py:1935
- msgid "Erase"
- msgstr "削除"
- 
--#: dnf/cli/output.py:1920
-+#: dnf/cli/output.py:1936
- msgid "Reinstall"
- msgstr "再インストール"
- 
--#: dnf/cli/output.py:1995
-+#: dnf/cli/output.py:2011
- msgid "Bad transaction IDs, or package(s), given"
- msgstr "不正なトランザクション ID、またはパッケージが指定されました"
- 
--#: dnf/cli/output.py:2094
-+#: dnf/cli/output.py:2110
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr "---> パッケージ %s.%s %s はインストールされます"
- 
--#: dnf/cli/output.py:2096
-+#: dnf/cli/output.py:2112
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
- msgstr "---> パッケージ %s.%s %s はアップグレードされます"
- 
--#: dnf/cli/output.py:2098
-+#: dnf/cli/output.py:2114
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr "---> パッケージ %s.%s %s は消去されます"
- 
--#: dnf/cli/output.py:2100
-+#: dnf/cli/output.py:2116
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr "---> パッケージ %s.%s %s は再インストールされます"
- 
--#: dnf/cli/output.py:2102
-+#: dnf/cli/output.py:2118
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
- msgstr "---> パッケージ %s.%s %s はダウングレードされます"
- 
--#: dnf/cli/output.py:2104
-+#: dnf/cli/output.py:2120
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr "---> パッケージ %s.%s %s は廃止となります"
- 
--#: dnf/cli/output.py:2106
-+#: dnf/cli/output.py:2122
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr "---> パッケージ %s.%s %s はアップグレードされます"
- 
--#: dnf/cli/output.py:2108
-+#: dnf/cli/output.py:2124
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr "---> パッケージ %s.%s %s は廃止されます"
- 
--#: dnf/cli/output.py:2117
-+#: dnf/cli/output.py:2133
- msgid "--> Starting dependency resolution"
- msgstr "--> 依存関係の解決を開始しました"
- 
--#: dnf/cli/output.py:2122
-+#: dnf/cli/output.py:2138
- msgid "--> Finished dependency resolution"
- msgstr "--> 依存関係の解決が完了しました"
- 
--#: dnf/cli/output.py:2136 dnf/crypto.py:132
-+#: dnf/cli/output.py:2152 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3375,36 +3417,36 @@ msgstr "    開始しました   : %s - %s 秒経過"
- msgid "    State  : %s"
- msgstr "    状態  : %s"
- 
--#: dnf/comps.py:95
-+#: dnf/comps.py:104
- msgid "skipping."
- msgstr "スキップします。"
- 
--#: dnf/comps.py:187 dnf/comps.py:689
-+#: dnf/comps.py:196 dnf/comps.py:698
- #, python-format
- msgid "Module or Group '%s' is not installed."
--msgstr ""
-+msgstr "モジュールまたはグループ '%s' がインストールされていません。"
- 
--#: dnf/comps.py:189 dnf/comps.py:691
-+#: dnf/comps.py:198 dnf/comps.py:700
- #, python-format
- msgid "Module or Group '%s' is not available."
--msgstr ""
-+msgstr "モジュールまたはグループ '%s' は利用不可です。"
- 
--#: dnf/comps.py:191
-+#: dnf/comps.py:200
- #, python-format
- msgid "Module or Group '%s' does not exist."
--msgstr ""
-+msgstr "モジュールまたはグループ '%s' は存在しません。"
- 
--#: dnf/comps.py:610 dnf/comps.py:627
-+#: dnf/comps.py:619 dnf/comps.py:636
- #, python-format
- msgid "Environment '%s' is not installed."
- msgstr "環境 '%s' はインストールされていません。"
- 
--#: dnf/comps.py:629
-+#: dnf/comps.py:638
- #, python-format
- msgid "Environment '%s' is not available."
--msgstr ""
-+msgstr "環境 '%s' は利用不可です。"
- 
--#: dnf/comps.py:657
-+#: dnf/comps.py:666
- #, python-format
- msgid "Group_id '%s' does not exist."
- msgstr "Group_id '%s' は存在しません。"
-@@ -3423,6 +3465,8 @@ msgid ""
- "Configuration file URL \"{}\" could not be downloaded:\n"
- "  {}"
- msgstr ""
-+"設定ファイル URL \"{}\" はダウンロードできませんでした:\n"
-+"  {}"
- 
- #: dnf/conf/config.py:355 dnf/conf/config.py:391
- #, python-format
-@@ -3432,7 +3476,7 @@ msgstr "不明な設定オプション: %s = %s"
- #: dnf/conf/config.py:372
- #, python-format
- msgid "Error parsing --setopt with key '%s', value '%s': %s"
--msgstr ""
-+msgstr "鍵 '%s'、値 '%s' の --setopt を解析中にエラーが発生しました: %s"
- 
- #: dnf/conf/config.py:380
- #, python-format
-@@ -3446,7 +3490,7 @@ msgstr "誤りかまたは不明な \"{}\": {}"
- #: dnf/conf/config.py:501
- #, python-format
- msgid "Error parsing --setopt with key '%s.%s', value '%s': %s"
--msgstr ""
-+msgstr "鍵 '%s.%s'、値 '%s' の --setopt を解析中にエラーが発生しました: %s"
- 
- #: dnf/conf/config.py:504
- #, python-format
-@@ -3460,31 +3504,31 @@ msgstr "警告:  '%s' のロードに失敗、スキップします。"
- 
- #: dnf/conf/read.py:63
- msgid "Bad id for repo: {} ({}), byte = {} {}"
--msgstr ""
-+msgstr "repo: {} ({}) に正しくないid、 byte = {} {}"
- 
- #: dnf/conf/read.py:67
- msgid "Bad id for repo: {}, byte = {} {}"
--msgstr ""
-+msgstr "repo: {} に正しくないid、byte = {} {}"
- 
- #: dnf/conf/read.py:75
- msgid "Repository '{}' ({}): Error parsing config: {}"
--msgstr ""
-+msgstr "レポジトリ '{}' ({}): 設定変更エラー: {}"
- 
- #: dnf/conf/read.py:78
- msgid "Repository '{}': Error parsing config: {}"
--msgstr ""
-+msgstr "レポジトリ '{}': 設定変更エラー: {}"
- 
- #: dnf/conf/read.py:84
- msgid "Repository '{}' ({}) is missing name in configuration, using id."
--msgstr ""
-+msgstr "レポジトリ '{}' ({}) はidを使用した設定内に見つかりません。"
- 
- #: dnf/conf/read.py:87
- msgid "Repository '{}' is missing name in configuration, using id."
--msgstr ""
-+msgstr "レポジトリ '{}' idを使用した設定内に見つかりません。"
- 
- #: dnf/conf/read.py:104
- msgid "Parsing file \"{}\" failed: {}"
--msgstr ""
-+msgstr "ファイル \"{}\" の解析に失敗しました: {}"
- 
- #: dnf/crypto.py:108
- #, python-format
-@@ -3496,47 +3540,47 @@ msgstr "repo %s: 0x%s はインポート済みです"
- msgid "repo %s: imported key 0x%s."
- msgstr "repo %s: インポート済みの鍵 0x%s。"
- 
--#: dnf/db/group.py:289
-+#: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
- "installed on the system"
--msgstr ""
-+msgstr "モジュラーパッケージ '{}' のモジュラーメタデータは利用不可です、システムにインストールはできません"
- 
--#: dnf/db/group.py:339
-+#: dnf/db/group.py:343
- msgid "No available modular metadata for modular package"
--msgstr ""
-+msgstr "モジュラーパッケージ のモジュラーメタデータは利用不可です"
- 
--#: dnf/db/group.py:373
-+#: dnf/db/group.py:377
- #, python-format
- msgid "Will not install a source rpm package (%s)."
- msgstr "ソース rpm パッケージ (%s) をインストールしません。"
- 
--#: dnf/dnssec.py:169
-+#: dnf/dnssec.py:168
- msgid ""
- "Configuration option 'gpgkey_dns_verification' requires libunbound ({})"
--msgstr ""
-+msgstr "設定オプション 'gpgkey_dns_verification' は libunbound ({}) が必要です"
- 
--#: dnf/dnssec.py:240
-+#: dnf/dnssec.py:239
- msgid "DNSSEC extension: Key for user "
--msgstr ""
-+msgstr "DNSSEC 拡張: ユーザー用の鍵 "
- 
--#: dnf/dnssec.py:242
-+#: dnf/dnssec.py:241
- msgid "is valid."
--msgstr ""
-+msgstr "は有効です。"
- 
--#: dnf/dnssec.py:244
-+#: dnf/dnssec.py:243
- msgid "has unknown status."
--msgstr ""
-+msgstr "の状態は不明です。"
- 
--#: dnf/dnssec.py:252
-+#: dnf/dnssec.py:251
- msgid "DNSSEC extension: "
--msgstr ""
-+msgstr "DNSSEC 拡張: "
- 
--#: dnf/dnssec.py:284
-+#: dnf/dnssec.py:283
- msgid "Testing already imported keys for their validity."
--msgstr ""
-+msgstr "すでにインポートされた鍵の有効性をテストします。"
- 
--#: dnf/drpm.py:62 dnf/repo.py:267
-+#: dnf/drpm.py:62 dnf/repo.py:268
- #, python-format
- msgid "unsupported checksum type: %s"
- msgstr "サポートされていないチェックサム形式: %s"
-@@ -3553,32 +3597,32 @@ msgstr "delta-rebuild RPM のチェックサムは失敗しました"
- msgid "done"
- msgstr "完了"
- 
--#: dnf/exceptions.py:109
-+#: dnf/exceptions.py:113
- msgid "Problems in request:"
- msgstr "リクエスト中の問題:"
- 
--#: dnf/exceptions.py:111
-+#: dnf/exceptions.py:115
- msgid "missing packages: "
- msgstr "足りないパッケージ: "
- 
--#: dnf/exceptions.py:113
-+#: dnf/exceptions.py:117
- msgid "broken packages: "
- msgstr "破損したパッケージ: "
- 
--#: dnf/exceptions.py:115
-+#: dnf/exceptions.py:119
- msgid "missing groups or modules: "
- msgstr "足りないグループまたはモジュール: "
- 
--#: dnf/exceptions.py:117
-+#: dnf/exceptions.py:121
- msgid "broken groups or modules: "
- msgstr "破損したグループまたはモジュール: "
- 
--#: dnf/exceptions.py:122
-+#: dnf/exceptions.py:126
- msgid "Modular dependency problem with Defaults:"
- msgid_plural "Modular dependency problems with Defaults:"
--msgstr[0] ""
-+msgstr[0] "デフォルトのモジュラー依存問題:"
- 
--#: dnf/exceptions.py:127 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:686
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] "モジュラーの依存に関する問題:"
-@@ -3589,6 +3633,8 @@ msgid ""
- "Malformed lock file found: %s.\n"
- "Ensure no other dnf/yum process is running and remove the lock file manually or run systemd-tmpfiles --remove dnf.conf."
- msgstr ""
-+"不正な形式のロックファイル: %s 。\n"
-+"他のdnf/yum プロセスが実行されていないことを確認し、ロックファイルを手動削除するかsystemd-tmpfiles --remove dnf.conf を実行してください。"
- 
- #: dnf/module/__init__.py:26
- msgid "Enabling different stream for '{}'."
-@@ -3626,6 +3672,9 @@ msgid ""
- "\n"
- "Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive"
- msgstr ""
-+"\n"
-+"\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
-@@ -3635,37 +3684,37 @@ msgstr "不要なプロファイルを無視します: '{}/{}'"
- #: dnf/module/module_base.py:84
- #, python-brace-format
- msgid "All matches for argument '{0}' in module '{1}:{2}' are not active"
--msgstr ""
-+msgstr "モジュール '{1}:{2}' の引数 '{0}' に一致するものはすべて非アクティブです"
- 
- #: dnf/module/module_base.py:92
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
--msgstr ""
-+msgstr "フェイルセーフレポジトリー {1} からのモジュール '{0}' インストールは許可されていません"
- 
- #: dnf/module/module_base.py:102
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
--msgstr ""
-+msgstr "引数 {} でプロファイルが見つかりません。利用可能プロファイル '{}:{}': {}"
- 
- #: dnf/module/module_base.py:106
- msgid "Unable to match profile for argument {}"
--msgstr ""
-+msgstr "引数 {} でプロファイルが見つかりません"
- 
- #: dnf/module/module_base.py:118
- msgid "No default profiles for module {}:{}. Available profiles: {}"
--msgstr ""
-+msgstr "モジュール {}:{} にデフォルトのプロファイルがありません。利用可能プロファイル: {}"
- 
- #: dnf/module/module_base.py:122
- msgid "No profiles for module {}:{}"
--msgstr ""
-+msgstr "モジュール {}:{} にプロファイルがありません"
- 
- #: dnf/module/module_base.py:129
- msgid "Default profile {} not available in module {}:{}"
--msgstr ""
-+msgstr "デフォルトのプロファイル {} はモジュール {}:{} で利用不可です"
- 
- #: dnf/module/module_base.py:142
- msgid "Installing module from Fail-Safe repository is not allowed"
--msgstr ""
-+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
-@@ -3681,7 +3730,7 @@ msgstr "パッケージ {} に一致するものはありません"
- #: dnf/module/module_base.py:204
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
--msgstr ""
-+msgstr "フェイルセーフレポジトリー {1} からのモジュール '{0}' アップグレードは許可されていません"
- 
- #: dnf/module/module_base.py:223 dnf/module/module_base.py:251
- msgid "Unable to match profile in argument {}"
-@@ -3689,15 +3738,15 @@ msgstr "引数 {} でプロファイルを一致できません"
- 
- #: dnf/module/module_base.py:231
- msgid "Upgrading module from Fail-Safe repository is not allowed"
--msgstr ""
-+msgstr "フェイルセーフレポジトリーからのモジュールアップグレードは許可されていません"
- 
- #: dnf/module/module_base.py:367
- msgid ""
- "Only module name is required. Ignoring unneeded information in argument: "
- "'{}'"
--msgstr ""
-+msgstr "モジュール名のみが必要です。引数で不必要な情報を無視します: '{}'"
- 
--#: dnf/package.py:295
-+#: dnf/package.py:298
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s: %s の確認に失敗しました: %s vs %s"
-@@ -3729,27 +3778,27 @@ msgstr "ロードされたプラグイン: %s"
- #: dnf/plugin.py:199
- #, python-format
- msgid "Failed loading plugin \"%s\": %s"
--msgstr ""
-+msgstr "plugin \"%s\" のロードに失敗しました: %s"
- 
- #: dnf/plugin.py:231
- msgid "No matches found for the following enable plugin patterns: {}"
--msgstr ""
-+msgstr "以下有効プラグインパターンが見つかりません: {}"
- 
- #: dnf/plugin.py:235
- msgid "No matches found for the following disable plugin patterns: {}"
--msgstr ""
-+msgstr "以下無効プラグインパターンが見つかりません: {}"
- 
--#: dnf/repo.py:83
-+#: dnf/repo.py:84
- #, python-format
- msgid "no matching payload factory for %s"
- msgstr "%s と一致するペイロードファクトリーはありません"
- 
--#: dnf/repo.py:110
-+#: dnf/repo.py:111
- msgid "Already downloaded"
- msgstr "ダウンロード済み"
- 
- #. pinging mirrors, this might take a while
--#: dnf/repo.py:346
-+#: dnf/repo.py:347
- #, python-format
- msgid "determining the fastest mirror (%s hosts).. "
- msgstr "最速のミラーを確定しています (%s hosts).. "
-@@ -3766,13 +3815,13 @@ msgstr "%s から %s repo を追加しました"
- 
- #: dnf/rpm/transaction.py:119
- msgid "Errors occurred during test transaction."
--msgstr ""
-+msgstr "テストトランザクション中にエラーが発生しました。"
- 
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
- msgctxt "currently"
- msgid "Downgrading"
--msgstr "ダウングレード中"
-+msgstr "ダウングレード"
- 
- #: dnf/transaction.py:81 dnf/transaction.py:88 dnf/transaction.py:93
- #: dnf/transaction.py:95
-@@ -3783,13 +3832,13 @@ msgstr "整理"
- #: dnf/transaction.py:83
- msgctxt "currently"
- msgid "Installing"
--msgstr "インストール中"
-+msgstr "インストール"
- 
- #. TRANSLATORS: This is for a single package currently being reinstalled.
- #: dnf/transaction.py:87
- msgctxt "currently"
- msgid "Reinstalling"
--msgstr "再インストール中"
-+msgstr "再インストール"
- 
- #. TODO: 'Removing'?
- #: dnf/transaction.py:90
-@@ -3800,7 +3849,7 @@ msgstr "削除"
- #: dnf/transaction.py:92
- msgctxt "currently"
- msgid "Upgrading"
--msgstr "アップグレード中"
-+msgstr "アップグレード"
- 
- #: dnf/transaction.py:96
- msgid "Verifying"
-@@ -3824,16 +3873,12 @@ msgstr "問題"
- 
- #: dnf/util.py:444
- msgid "TransactionItem not found for key: {}"
--msgstr ""
-+msgstr "TransactionItemが見つかりません鍵: {}"
- 
- #: dnf/util.py:454
- msgid "TransactionSWDBItem not found for key: {}"
--msgstr ""
-+msgstr "TransactionSWDBItemが見つかりません鍵: {}"
- 
- #: dnf/util.py:457
- msgid "Errors occurred during transaction."
- msgstr "トランザクション中にエラーが発生しました。"
--
--#~ msgid ""
--#~ "Display capabilities that the package depends on for running a %%pre script."
--#~ msgstr "%%pre スクリプトを実行するためにパッケージが依存する機能を表示します。"
-diff --git a/po/ko.po b/po/ko.po
-index 98bc5687..08adef54 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-03-19 09:18-0400\n"
-+"POT-Creation-Date: 2020-06-23 09:18-0400\n"
- "PO-Revision-Date: 2018-11-12 10:05+0000\n"
- "Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
- "Language-Team: Korean\n"
-@@ -19,12 +19,12 @@ msgstr ""
- #: dnf/automatic/emitter.py:31
- #, python-format
- msgid "The following updates have been applied on '%s':"
--msgstr "해당 업데이트들은  '%s'에 적용되었습니다:"
-+msgstr "해당 업데이트들은 '%s'에 적용되었습니다:"
- 
- #: dnf/automatic/emitter.py:32
- #, python-format
- msgid "The following updates are available on '%s':"
--msgstr "해당 업데이트들은  '%s'에 적용 가능합니다:"
-+msgstr "해당 업데이트들은 '%s'에 적용 가능합니다:"
- 
- #: dnf/automatic/emitter.py:33
- #, python-format
-@@ -54,7 +54,7 @@ msgstr "'%s'를 통한 이메일 전송을 실패하였습니다: %s"
- #: dnf/automatic/emitter.py:137
- #, python-format
- msgid "Failed to execute command '%s': returned %d"
--msgstr "명령 '을 실행하지 못했습니다.%s': 반환 됨 %d"
-+msgstr "명령’%s'을 실행하지 못했습니다: 반환됨 %d"
- 
- #: dnf/automatic/main.py:156 dnf/conf/config.py:151
- #, python-format
-@@ -66,16 +66,20 @@ msgstr "알 수없는 구성 값 : %s=%s ...에서 %s; %s"
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr "알 수없는 구성 옵션 : %s = %s ...에서 %s"
- 
--#: dnf/automatic/main.py:236
-+#: dnf/automatic/main.py:228 dnf/cli/cli.py:298
-+msgid "GPG check FAILED"
-+msgstr "GPG 확인 실패"
-+
-+#: dnf/automatic/main.py:247
- msgid "Started dnf-automatic."
- msgstr "dnf-automatic을 시작했습니다."
- 
--#: dnf/automatic/main.py:240
-+#: dnf/automatic/main.py:251
- #, python-format
- msgid "Sleep for %s seconds"
- msgstr "수면 용 %s 초"
- 
--#: dnf/automatic/main.py:271 dnf/cli/main.py:59 dnf/cli/main.py:80
-+#: dnf/automatic/main.py:283 dnf/cli/main.py:59 dnf/cli/main.py:80
- #: dnf/cli/main.py:83
- #, python-format
- msgid "Error: %s"
-@@ -107,7 +111,7 @@ msgstr "최근에 메타 데이터 캐시가 새로 고쳐졌습니다."
- 
- #: dnf/base.py:341 dnf/cli/commands/__init__.py:100
- msgid "There are no enabled repositories in \"{}\"."
--msgstr ""
-+msgstr "\"{}\"에 사용 가능한 저장소가 없습니다."
- 
- #: dnf/base.py:348
- #, python-format
-@@ -123,7 +127,7 @@ msgstr "%s: 만료되어 새로 고침됩니다."
- #: dnf/base.py:354
- #, python-format
- msgid "%s: metadata will expire after %d seconds and will be refreshed now"
--msgstr "%s: 메타 데이터는 이후에 만료됩니다. %d 초 단위로 업데이트됩니다."
-+msgstr "%s: 메타 데이터는 이후에 만료됩니다. %d 초 단위로 업데이트됩니다"
- 
- #: dnf/base.py:358
- #, python-format
-@@ -143,7 +147,7 @@ msgstr "%s:에서 메타 데이터 사용 %s."
- #: dnf/base.py:409
- #, python-format
- msgid "Ignoring repositories: %s"
--msgstr ""
-+msgstr "리포지토리 무시: %s"
- 
- #: dnf/base.py:412
- #, python-format
-@@ -187,13 +191,13 @@ msgstr "트랜잭션 검사가 성공했습니다."
- msgid "Running transaction test"
- msgstr "트랜잭션 테스트 실행 중"
- 
--#: dnf/base.py:848 dnf/base.py:995
-+#: dnf/base.py:848 dnf/base.py:990
- msgid "RPM: {}"
--msgstr ""
-+msgstr "RPM: {}"
- 
- #: dnf/base.py:849
- msgid "Transaction test error:"
--msgstr ""
-+msgstr "트랜잭션 테스트 오류:"
- 
- #: dnf/base.py:860
- msgid "Transaction test succeeded."
-@@ -201,7 +205,7 @@ msgstr "트랜잭션 테스트가 완료되었습니다."
- 
- #: dnf/base.py:881
- msgid "Running transaction"
--msgstr "거래 실행 중"
-+msgstr "트랜잭션 실행 중"
- 
- #: dnf/base.py:909
- msgid "Disk Requirements:"
-@@ -211,7 +215,7 @@ msgstr "디스크 요구 사항 :"
- #, 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[0] "{1} 파일 시스템에사 적어도 {0}MB의 공간이 더 필요합니다."
- 
- #: dnf/base.py:919
- msgid "Error Summary"
-@@ -220,84 +224,84 @@ msgstr "오류 요약"
- #: dnf/base.py:945
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
--msgstr ""
-+msgstr "RPMDB는 {prog} 외부에서 변경되었습니다."
- 
--#: dnf/base.py:996 dnf/base.py:1004
-+#: dnf/base.py:991 dnf/base.py:999
- msgid "Could not run transaction."
- msgstr "트랜잭션을 실행할 수 없습니다."
- 
--#: dnf/base.py:999
-+#: dnf/base.py:994
- msgid "Transaction couldn't start:"
--msgstr "거래를 시작할 수 없습니다 :"
-+msgstr "트랜잭션을 시작할 수 없습니다 :"
- 
--#: dnf/base.py:1013
-+#: dnf/base.py:1008
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "트랜잭션 파일을 제거하지 못했습니다. %s"
- 
--#: dnf/base.py:1095
-+#: dnf/base.py:1090
- msgid "Some packages were not downloaded. Retrying."
- msgstr "일부 패키지가 다운로드되지 않았습니다. 다시 시도 중입니다."
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1120
- #, python-format
- msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)"
--msgstr ""
-+msgstr "Delta RPM은 %.1f MB의 업데이트를 %.1f MB (%d.1 %% 저장)로 줄입니다"
- 
--#: dnf/base.py:1128
-+#: dnf/base.py:1123
- #, python-format
- msgid ""
- "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)"
--msgstr ""
-+msgstr "Delta RPM은 %.1f MB의 업데이트를 %.1f MB (%d.1 %% 손실)로 줄이는데 실패했습니다"
- 
--#: dnf/base.py:1170
-+#: dnf/base.py:1165
- msgid "Cannot add local packages, because transaction job already exists"
--msgstr ""
-+msgstr "트랜잭션 작업이 이미 있으므로 로컬 패키지를 추가할 수 없습니다"
- 
--#: dnf/base.py:1184
-+#: dnf/base.py:1179
- msgid "Could not open: {}"
- msgstr "열 수 없습니다 : {}"
- 
--#: dnf/base.py:1222
-+#: dnf/base.py:1217
- #, python-format
- msgid "Public key for %s is not installed"
--msgstr "공개 키 %s 설치되어 있지 않다."
-+msgstr "공개 키 %s 설치되어 있지 않다"
- 
--#: dnf/base.py:1226
-+#: dnf/base.py:1221
- #, python-format
- msgid "Problem opening package %s"
- msgstr "문제가되는 패키지 열기 %s"
- 
--#: dnf/base.py:1234
-+#: dnf/base.py:1229
- #, python-format
- msgid "Public key for %s is not trusted"
--msgstr "공개 키 %s 신뢰할 수 없다"
-+msgstr "공개 키 %s 신뢰할 수 없습니다"
- 
--#: dnf/base.py:1238
-+#: dnf/base.py:1233
- #, python-format
- msgid "Package %s is not signed"
--msgstr "꾸러미 %s 서명되지 않았습니다."
-+msgstr "패키지 %s이/가 서명되지 않았습니다"
- 
--#: dnf/base.py:1253
-+#: dnf/base.py:1263
- #, python-format
- msgid "Cannot remove %s"
- msgstr "제거 할 수 없습니다. %s"
- 
--#: dnf/base.py:1257
-+#: dnf/base.py:1267
- #, python-format
- msgid "%s removed"
- msgstr "%s 제거 된"
- 
--#: dnf/base.py:1537
-+#: dnf/base.py:1547
- msgid "No match for group package \"{}\""
--msgstr "그룹 패키지 \"{}\"에 일치하는 항목이 없습니다."
-+msgstr "그룹 패키지 \"{}\"에 일치하는 항목이 없습니다"
- 
--#: dnf/base.py:1624
-+#: dnf/base.py:1634
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "그룹 '%s': %s"
- 
--#: dnf/base.py:1647 dnf/base.py:1699 dnf/cli/cli.py:218
-+#: dnf/base.py:1657 dnf/base.py:1709 dnf/cli/cli.py:218
- #: dnf/cli/commands/__init__.py:451 dnf/cli/commands/__init__.py:508
- #: dnf/cli/commands/__init__.py:601 dnf/cli/commands/__init__.py:650
- #: dnf/cli/commands/install.py:80 dnf/cli/commands/install.py:103
-@@ -305,21 +309,21 @@ msgstr "그룹 '%s': %s"
- msgid "Nothing to do."
- msgstr "할 것이 없음."
- 
--#: dnf/base.py:1665
-+#: dnf/base.py:1675
- msgid "No groups marked for removal."
- msgstr "삭제 표시된 그룹이 없습니다."
- 
--#: dnf/base.py:1701
-+#: dnf/base.py:1711
- msgid "No group marked for upgrade."
- msgstr "업그레이드가 표시된 그룹이 없습니다."
- 
--#: dnf/base.py:1916
-+#: dnf/base.py:1926
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
--msgstr "꾸러미 %s 설치되어 있지 않으면 다운 그레이드 할 수 없습니다."
-+msgstr "패키지 %s이/가 설치되어 있지 않으면 다운 그레이드할 수 없습니다."
- 
--#: dnf/base.py:1918 dnf/base.py:1937 dnf/base.py:1950 dnf/base.py:1971
--#: dnf/base.py:2020 dnf/base.py:2028 dnf/base.py:2163 dnf/cli/cli.py:410
-+#: dnf/base.py:1928 dnf/base.py:1947 dnf/base.py:1960 dnf/base.py:1981
-+#: dnf/base.py:2030 dnf/base.py:2038 dnf/base.py:2173 dnf/cli/cli.py:410
- #: dnf/cli/commands/__init__.py:434 dnf/cli/commands/__init__.py:491
- #: dnf/cli/commands/__init__.py:595 dnf/cli/commands/__init__.py:642
- #: dnf/cli/commands/__init__.py:720 dnf/cli/commands/install.py:147
-@@ -329,194 +333,194 @@ msgstr "꾸러미 %s 설치되어 있지 않으면 다운 그레이드 할 수 
- msgid "No match for argument: %s"
- msgstr "인수와 일치하는 항목 없음 : %s"
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1935
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
--msgstr "꾸러미 %s 이미 설치된 하위 버전은 다운 그레이드 할 수 없습니다."
-+msgstr "패키지 %s이/가 이미 설치된 하위 버전은 다운 그레이드 할 수 없습니다."
- 
--#: dnf/base.py:1948
-+#: dnf/base.py:1958
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
--msgstr "꾸러미 %s 설치되지 않았 으면 다시 설치할 수 없습니다."
-+msgstr "패키지 %s이/가 설치되지 않았으면 다시 설치할 수 없습니다."
- 
--#: dnf/base.py:1963
-+#: dnf/base.py:1973
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr "파일 %s 소스 패키지이므로 무시하고 업데이트 할 수 없습니다."
- 
--#: dnf/base.py:1969
-+#: dnf/base.py:1979
- #, python-format
- msgid "Package %s not installed, cannot update it."
--msgstr "꾸러미 %s 설치되지 않았 으면 업데이트 할 수 없습니다."
-+msgstr "패키지 %s이/가 설치되지 않았으면 업데이트 할 수 없습니다."
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:1988
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
--msgstr ""
-+msgstr "%s 이상의 버전이 이미 설치되어 있으므로 업데이트할 수 없습니다."
- 
--#: dnf/base.py:2017 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2027 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
--msgstr "꾸러미 %s 사용할 수는 있지만 설치되지 않았습니다."
-+msgstr "패키지 %s이/가 사용할 수는 있지만 설치되지 않았습니다."
- 
--#: dnf/base.py:2023
-+#: dnf/base.py:2033
- #, python-format
- msgid "Package %s available, but installed for different architecture."
--msgstr "꾸러미 %s 사용 가능하지만 다른 아키텍처에 설치됩니다."
-+msgstr "패키지 %s이/가 사용 가능하지만 다른 아키텍처에 설치됩니다."
- 
--#: dnf/base.py:2048 dnf/base.py:2241 dnf/cli/cli.py:667 dnf/cli/cli.py:698
-+#: dnf/base.py:2058 dnf/base.py:2251 dnf/cli/cli.py:667 dnf/cli/cli.py:698
- #, python-format
- msgid "No package %s installed."
- msgstr "패키지 없음 %s 설치."
- 
--#: dnf/base.py:2066 dnf/cli/commands/install.py:136
--#: dnf/cli/commands/remove.py:132
-+#: dnf/base.py:2076 dnf/cli/commands/install.py:136
-+#: dnf/cli/commands/remove.py:133
- #, python-format
- msgid "Not a valid form: %s"
--msgstr ""
-+msgstr "유효한 양식이 아닙니다 : %s"
- 
--#: dnf/base.py:2082 dnf/cli/commands/__init__.py:690
--#: dnf/cli/commands/remove.py:162
-+#: dnf/base.py:2092 dnf/cli/commands/__init__.py:690
-+#: dnf/cli/commands/remove.py:163
- msgid "No packages marked for removal."
- msgstr "제거 할 수있는 패키지가 없습니다."
- 
--#: dnf/base.py:2170 dnf/cli/cli.py:421
-+#: dnf/base.py:2180 dnf/cli/cli.py:421
- #, python-format
- msgid "Packages for argument %s available, but not installed."
- msgstr "인수 용 패키지 %s 사용할 수는 있지만 설치되지 않았습니다."
- 
--#: dnf/base.py:2175
-+#: dnf/base.py:2185
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
--msgstr "꾸러미 %s 이미 설치된 가장 낮은 버전의 버전을 다운 그레이드 할 수 없습니다."
-+msgstr "패키지 %s이/가 이미 설치된 가장 낮은 버전의 버전을 다운 그레이드 할 수 없습니다."
- 
--#: dnf/base.py:2233
-+#: dnf/base.py:2243
- msgid "Action not handled: {}"
- msgstr "처리되지 않은 작업 : {}"
- 
--#: dnf/base.py:2247 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
-+#: dnf/base.py:2257 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
- #: dnf/cli/commands/__init__.py:913 dnf/cli/commands/group.py:398
- #, python-format
- msgid "No package %s available."
- msgstr "패키지 없음 %s 유효한."
- 
--#: dnf/base.py:2260
-+#: dnf/base.py:2270
- msgid "no package matched"
- msgstr "일치하는 패키지 없음"
- 
--#: dnf/base.py:2281
-+#: dnf/base.py:2291
- msgid "No security updates needed, but {} update available"
--msgstr "보안 업데이트가 필요하지 않지만 {} 업데이트가 사용 가능합니다."
-+msgstr "보안 업데이트가 필요하지 않지만 {} 업데이트가 사용 가능합니다"
- 
--#: dnf/base.py:2283
-+#: dnf/base.py:2293
- msgid "No security updates needed, but {} updates available"
--msgstr "보안 업데이트는 필요하지 않지만 {} 업데이트가 제공됩니다."
-+msgstr "보안 업데이트는 필요하지 않지만 {} 업데이트가 제공됩니다"
- 
--#: dnf/base.py:2287
-+#: dnf/base.py:2297
- msgid "No security updates needed for \"{}\", but {} update available"
--msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트는 사용 가능하지 않습니다."
-+msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트는 사용 가능하지 않습니다"
- 
--#: dnf/base.py:2289
-+#: dnf/base.py:2299
- msgid "No security updates needed for \"{}\", but {} updates available"
--msgstr "\"{}\"은 (는) 필요한 보안 업데이트가 없지만 {} 업데이트는 사용 가능합니다."
-+msgstr "\"{}\"은 (는) 필요한 보안 업데이트가 없지만 {} 업데이트는 사용 가능합니다"
- 
--#: dnf/base.py:2313
-+#: dnf/base.py:2323
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ". 실패한 패키지는 다음과 같습니다. %s"
- 
--#: dnf/base.py:2314
-+#: dnf/base.py:2324
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "GPG 키는 다음과 같이 구성됩니다. %s"
- 
--#: dnf/base.py:2326
-+#: dnf/base.py:2336
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
--msgstr "GPG 키 %s (0x%s)가 이미 설치되어 있습니다."
-+msgstr "GPG 키 %s (0x%s)가 이미 설치되어 있습니다"
- 
--#: dnf/base.py:2359
-+#: dnf/base.py:2369
- msgid "The key has been approved."
--msgstr ""
-+msgstr "키가 승인되었습니다."
- 
--#: dnf/base.py:2362
-+#: dnf/base.py:2372
- msgid "The key has been rejected."
--msgstr ""
-+msgstr "키가 거부되었습니다."
- 
--#: dnf/base.py:2395
-+#: dnf/base.py:2405
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "키 가져 오기가 실패했습니다 (코드 %d)"
- 
--#: dnf/base.py:2397
-+#: dnf/base.py:2407
- msgid "Key imported successfully"
- msgstr "성공적으로 가져온 키"
- 
--#: dnf/base.py:2401
-+#: dnf/base.py:2411
- msgid "Didn't install any keys"
--msgstr "아무 키도 설치하지 않았습니다."
-+msgstr "아무 키도 설치하지 않았습니다"
- 
--#: dnf/base.py:2404
-+#: dnf/base.py:2414
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
- "Check that the correct key URLs are configured for this repository."
- msgstr ""
--"해당 GPG 키는 \"%s\"저장소가 이미 설치되어 있지만이 패키지에 맞지 않습니다.이 저장소에 대해 올바른 키 URL이 구성되었는지 "
--"확인하십시오."
-+"해당 GPG 키는 \"%s\"저장소가 이미 설치되어 있지만이 패키지에 맞지 않습니다.\n"
-+"이 저장소에 대해 올바른 키 URL이 구성되었는지 확인하십시오."
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2425
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr "키 가져 오기가 잘못된 키를 가져 오지 못 했습니까?"
- 
--#: dnf/base.py:2451
-+#: dnf/base.py:2478
- msgid "  * Maybe you meant: {}"
- msgstr "  * 어쩌면 당신은 의미 : {}"
- 
--#: dnf/base.py:2483
-+#: dnf/base.py:2510
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr "로컬 저장소 \"{}\"의 \"{}\"패키지에 잘못된 체크섬이 있습니다"
- 
--#: dnf/base.py:2486
-+#: dnf/base.py:2513
- msgid "Some packages from local repository have incorrect checksum"
--msgstr "로컬 저장소의 일부 패키지에 잘못된 체크섬이 있습니다."
-+msgstr "로컬 저장소의 일부 패키지에 잘못된 체크섬이 있습니다"
- 
--#: dnf/base.py:2489
-+#: dnf/base.py:2516
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "저장소 \"{}\"의 패키지 \"{}\"에 잘못된 체크섬이 있습니다"
- 
--#: dnf/base.py:2492
-+#: dnf/base.py:2519
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
- msgstr "일부 패키지에는 유효하지 않은 캐시가 있지만 \"--cacheonly\"옵션으로 인해 다운로드 할 수 없습니다"
- 
--#: dnf/base.py:2510 dnf/base.py:2530
-+#: dnf/base.py:2537 dnf/base.py:2557
- msgid "No match for argument"
--msgstr ""
-+msgstr "인수와 일치하는 항목 없습니다"
- 
--#: dnf/base.py:2518 dnf/base.py:2538
-+#: dnf/base.py:2545 dnf/base.py:2565
- msgid "All matches were filtered out by exclude filtering for argument"
--msgstr ""
-+msgstr "모든 일치 항목이 인수의 제외 필터로 필터링되었습니다"
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2547
- msgid "All matches were filtered out by modular filtering for argument"
--msgstr ""
-+msgstr "모든 일치 항목이 인수의 모듈식 필터로 필터링되었습니다"
- 
--#: dnf/base.py:2536
-+#: dnf/base.py:2563
- msgid "All matches were installed from a different repository for argument"
--msgstr ""
-+msgstr "모든 일치 항목이 인수의 다른 리포지토리에서 설치되었습니다"
- 
--#: dnf/base.py:2552
-+#: dnf/base.py:2579
- #, python-format
- msgid "Package %s is already installed."
--msgstr ""
-+msgstr "패키지 %s이/가 이미 설치되어 있습니다."
- 
- #: dnf/cli/aliases.py:96
- #, python-format
- msgid "Unexpected value of environment variable: DNF_DISABLE_ALIASES=%s"
--msgstr ""
-+msgstr "예상치 못한 환경 변수 값 : DNF_DISABLE_ALIASES =%s"
- 
- #: dnf/cli/aliases.py:105 dnf/conf/config.py:457
- #, python-format
-@@ -526,27 +530,27 @@ msgstr "구문 분석 파일 \"%s\"실패 : %s"
- #: dnf/cli/aliases.py:108
- #, python-format
- msgid "Cannot read file \"%s\": %s"
--msgstr ""
-+msgstr "\"%s\" 파일을 읽을 수 없습니다: %s"
- 
- #: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:898
- #: dnf/cli/cli.py:902 dnf/cli/commands/alias.py:108
- #, python-format
- msgid "Config error: %s"
--msgstr ""
-+msgstr "구성 오류: %s"
- 
- #: dnf/cli/aliases.py:191
- msgid "Aliases contain infinite recursion"
--msgstr ""
-+msgstr "별칭에는 무한 재귀가 포함되어 있습니다"
- 
- #: dnf/cli/aliases.py:209
- #, python-format
- msgid "%s, using original arguments."
--msgstr ""
-+msgstr "%s, 원래 인수를 사용합니다."
- 
- #: dnf/cli/cli.py:136
--#, fuzzy, python-format
-+#, python-format
- msgid "  Installed: %s-%s at %s"
--msgstr "  %s-%s 일 %s 에 설치됨"
-+msgstr "  설치됨: %s에서 %s-%s"
- 
- #: dnf/cli/cli.py:138
- #, python-format
-@@ -558,7 +562,7 @@ msgstr "  %s 일 %s 에 빌드됨"
- msgid ""
- "The operation would result in switching of module '{0}' stream '{1}' to "
- "stream '{2}'"
--msgstr ""
-+msgstr "이 작업은 '{0}' 모듈을 '{1}' 스트림에서 ‘{2}' 스트림으로 전환합니다"
- 
- #: dnf/cli/cli.py:171
- #, python-brace-format
-@@ -566,18 +570,20 @@ msgid ""
- "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."
- msgstr ""
-+"활성화된 모듈 스트림을 전환 할 수 없습니다.\n"
-+"설치된 모든 내용을 모듈에서 제거하고 ‘{prog} module reset <module_name>' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후 다른 스트림을 설치할 수 있습니다."
- 
- #: dnf/cli/cli.py:209
- #, python-brace-format
- msgid "{prog} will only download packages for the transaction."
--msgstr ""
-+msgstr "{prog}은/는 트랜잭션용 패키지 만 다운로드합니다."
- 
- #: dnf/cli/cli.py:212
- #, python-brace-format
- msgid ""
- "{prog} will only download packages, install gpg keys, and check the "
- "transaction."
--msgstr ""
-+msgstr "{prog}은/는 패키지 만 다운로드하고 gpg 키를 설치하며 트랜잭션을 확인합니다."
- 
- #: dnf/cli/cli.py:216
- msgid "Operation aborted."
-@@ -589,30 +595,27 @@ msgstr "패키지 다운로드중:"
- 
- #: dnf/cli/cli.py:229
- msgid "Error downloading packages:"
--msgstr ""
-+msgstr "패키지 다운로드중 오류 발생:"
- 
- #: dnf/cli/cli.py:257
- msgid "Transaction failed"
--msgstr ""
-+msgstr "트랜잭션 실패"
- 
- #: dnf/cli/cli.py:280
- msgid ""
- "Refusing to automatically import keys when running unattended.\n"
- "Use \"-y\" to override."
- msgstr ""
--
--#: dnf/cli/cli.py:298
--msgid "GPG check FAILED"
--msgstr ""
-+"키를 자동으로 가져 오는 것을 거부합니다.\n"
-+"동작을 무시하려면 \"-y\"를 사용하십시오."
- 
- #: dnf/cli/cli.py:330
- msgid "Changelogs for {}"
--msgstr ""
-+msgstr "{}의 변경 사항"
- 
- #: dnf/cli/cli.py:363 dnf/cli/cli.py:504 dnf/cli/cli.py:510
--#, fuzzy
- msgid "Obsoleting Packages"
--msgstr "오래된 패키지들"
-+msgstr "더 이상 사용되지 않는 패키지"
- 
- #: dnf/cli/cli.py:392
- msgid "No packages marked for distribution synchronization."
-@@ -649,7 +652,7 @@ msgstr "최근에 추가 된 패키지"
- 
- #: dnf/cli/cli.py:517
- msgid "No matching Packages to list"
--msgstr "목록과 일치하는 패키지가 없습니다."
-+msgstr "목록과 일치하는 패키지가 없습니다"
- 
- #: dnf/cli/cli.py:598
- msgid "No Matches found"
-@@ -657,117 +660,123 @@ msgstr "검색 결과가 없습니다"
- 
- #: dnf/cli/cli.py:608
- msgid "No transaction ID given"
--msgstr "주어진 거래 ID가 없습니다."
-+msgstr "지정된 트랜잭션 ID가 없습니다"
- 
- #: dnf/cli/cli.py:613
- msgid "Not found given transaction ID"
--msgstr "주어진 거래 ID를 찾을 수 없습니다."
-+msgstr "주어진 트랜잭션 ID를 찾을 수 없습니다"
- 
- #: dnf/cli/cli.py:622
- msgid "Found more than one transaction ID!"
--msgstr "두 개 이상의 거래 ID를 찾았습니다!"
-+msgstr "두 개 이상의 트랜잭션 ID를 찾았습니다!"
- 
- #: dnf/cli/cli.py:639
- #, python-format
- msgid "Transaction history is incomplete, before %u."
--msgstr "거래 내역이 불완전합니다. %u."
-+msgstr "트랜잭션 내역이 불완전합니다. %u."
- 
- #: dnf/cli/cli.py:641
- #, python-format
- msgid "Transaction history is incomplete, after %u."
--msgstr "거래 내역이 불완전합니다. %u."
-+msgstr "트랜잭션 내역이 불완전합니다. %u."
- 
- #: dnf/cli/cli.py:688
- msgid "Undoing transaction {}, from {}"
--msgstr "{}에서 트랜잭션 {}을 (를) 취소하고 있습니다."
-+msgstr "{}에서 트랜잭션 {}을 (를) 취소하고 있습니다"
- 
- #: dnf/cli/cli.py:768 dnf/cli/commands/shell.py:237
- #, python-format
- msgid "Unknown repo: '%s'"
--msgstr ""
-+msgstr "알 수 없는 저장소: '%s'"
- 
- #: dnf/cli/cli.py:782
- #, python-format
- msgid "No repository match: %s"
--msgstr ""
-+msgstr "일치하는 저장소가 없습니다 : %s"
- 
- #: dnf/cli/cli.py:813
- msgid ""
- "This command has to be run with superuser privileges (under the root user on"
- " most systems)."
--msgstr ""
-+msgstr "이 명령은 수퍼 유저 권한으로 실행해야합니다 (대부분의 시스템에서 root 사용자로 실행)."
- 
- #: dnf/cli/cli.py:843
- #, python-format
- msgid "No such command: %s. Please use %s --help"
--msgstr ""
-+msgstr "명령을 찾을 수 없습니다: %s . %s --help를 사용하십시오"
- 
- #: dnf/cli/cli.py:846
- #, python-format, python-brace-format
- msgid ""
- "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-"
- "command(%s)'\""
--msgstr ""
-+msgstr "{PROG} 플러그인 명령일 수 있습니다: \"{prog} 'dnf-command(%s)'\""
- 
- #: dnf/cli/cli.py:850
- #, python-brace-format
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
- "disabled."
--msgstr ""
-+msgstr "{prog} 플러그인 명령일 수 있지만 플러그인 로딩은 현재 비활성화되어 있습니다."
- 
- #: dnf/cli/cli.py:908
- msgid ""
- "--destdir or --downloaddir must be used with --downloadonly or download or "
- "system-upgrade command."
- msgstr ""
-+"--destdir 또는 --downloaddir은 --downloadonly 또는 download 또는 system-upgrade 명령과"
-+" 함께 사용해야합니다."
- 
- #: dnf/cli/cli.py:914
- 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:996
- 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:1016
- msgid "Config file \"{}\" does not exist"
--msgstr ""
-+msgstr "구성 파일 \"{}\"이 (가) 없습니다"
- 
- #: dnf/cli/cli.py:1036
- msgid ""
- "Unable to detect release version (use '--releasever' to specify release "
- "version)"
--msgstr ""
-+msgstr "릴리스 버전을 찾을 수 없습니다 ('--releasever'를 사용하여 릴리스 버전을 지정하십시오)"
- 
--#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:473
-+#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
--msgstr ""
-+msgstr "인수 {}: 인수 {}과 함께 사용할 수 없습니다"
- 
- #: dnf/cli/cli.py:1130
- #, python-format
- msgid "Command \"%s\" already defined"
--msgstr ""
-+msgstr "명령 \"%s\"이/가 이미 정의되어 있습니다"
- 
- #: dnf/cli/cli.py:1150
- msgid "Excludes in dnf.conf: "
--msgstr ""
-+msgstr "dnf.conf에서 제외합니다. "
- 
- #: dnf/cli/cli.py:1153
- msgid "Includes in dnf.conf: "
--msgstr ""
-+msgstr "dnf.conf에 포함됩니다. "
- 
- #: dnf/cli/cli.py:1156
- msgid "Excludes in repo "
--msgstr ""
-+msgstr "리포지토리에서 제외 "
- 
- #: dnf/cli/cli.py:1159
- msgid "Includes in repo "
--msgstr ""
-+msgstr "리포지토리에 포함 "
- 
- #: dnf/cli/commands/__init__.py:47
- #, python-format
-@@ -795,6 +804,17 @@ msgid ""
- "\n"
- "For more information contact your distribution or package provider."
- msgstr ""
-+"GPG 키를 통해 패키지 검사를 활성화했습니다. 이는 적절한 작업 실행입니다. \n"
-+"그러나 GPG 공개 키가 설치되어 있지 않습니다. 설치하려는 패키지의 키를 다운로드하여 설치해야합니다.\n"
-+"다음 명령으로 이 작업을 수행할 수 있습니다:\n"
-+"    rpm --import public.gpg.key\n"
-+"\n"
-+"\n"
-+"또는 리포지토리 섹션의 'gpgkey' 옵션을 사용하여 \n"
-+"리포지토리에 사용할 키의 URL을 지정할 수 있으며 {prog}이/가 \n"
-+"이를 설치합니다 \n"
-+"\n"
-+"자세한 내용은 배포 또는 패키지 공급 업체에 문의하십시오."
- 
- #: dnf/cli/commands/__init__.py:80
- #, python-format
-@@ -840,11 +860,11 @@ msgstr "최근에 변경된 패키지 만 표시"
- #: dnf/cli/commands/install.py:51 dnf/cli/commands/reinstall.py:44
- #: dnf/cli/commands/remove.py:61 dnf/cli/commands/upgrade.py:46
- msgid "PACKAGE"
--msgstr "꾸러미"
-+msgstr "패키지"
- 
- #: dnf/cli/commands/__init__.py:202
- msgid "Package name specification"
--msgstr ""
-+msgstr "패키지 이름 사양"
- 
- #: dnf/cli/commands/__init__.py:230
- msgid "list a package or groups of packages"
-@@ -856,15 +876,15 @@ msgstr "주어진 값을 제공하는 패키지 찾기"
- 
- #: dnf/cli/commands/__init__.py:248
- msgid "PROVIDE"
--msgstr ""
-+msgstr "PROVIDE"
- 
- #: dnf/cli/commands/__init__.py:249
- msgid "Provide specification to search for"
--msgstr ""
-+msgstr "검색할 사양 제공"
- 
- #: dnf/cli/commands/__init__.py:258 dnf/cli/commands/search.py:159
- msgid "Searching Packages: "
--msgstr ""
-+msgstr "패키지 검색 : "
- 
- #: dnf/cli/commands/__init__.py:267
- msgid "check for available package upgrades"
-@@ -872,7 +892,7 @@ msgstr "사용 가능한 패키지 업그레이드 확인"
- 
- #: dnf/cli/commands/__init__.py:273
- msgid "show changelogs before update"
--msgstr ""
-+msgstr "업데이트 전에 변경 로그 표시"
- 
- #: dnf/cli/commands/__init__.py:370 dnf/cli/commands/__init__.py:423
- #: dnf/cli/commands/__init__.py:479
-@@ -894,7 +914,7 @@ msgid " (from %s)"
- msgstr " (에서 %s)"
- 
- #: dnf/cli/commands/__init__.py:442 dnf/cli/commands/__init__.py:499
--#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:104
-+#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:105
- #, python-format
- msgid "Installed package %s%s not available."
- msgstr "설치된 패키지 %s%s 사용 불가."
-@@ -914,20 +934,20 @@ msgstr "업그레이드 할 패키지 없음."
- 
- #: dnf/cli/commands/__init__.py:735
- msgid "run commands on top of all packages in given repository"
--msgstr "지정된 저장소의 모든 패키지 위에 명령을 실행합니다."
-+msgstr "지정된 저장소의 모든 패키지 위에 명령을 실행합니다"
- 
- #: dnf/cli/commands/__init__.py:774
- msgid "REPOID"
--msgstr ""
-+msgstr "REPOID"
- 
- #: dnf/cli/commands/__init__.py:774
- msgid "Repository ID"
--msgstr ""
-+msgstr "리포지터리 ID"
- 
- #: dnf/cli/commands/__init__.py:785 dnf/cli/commands/mark.py:48
- #: dnf/cli/commands/updateinfo.py:108
- msgid "Package specification"
--msgstr ""
-+msgstr "패키지 사양"
- 
- #: dnf/cli/commands/__init__.py:809
- msgid "display a helpful usage message"
-@@ -935,144 +955,151 @@ msgstr "유용한 메시지 표시"
- 
- #: dnf/cli/commands/__init__.py:813
- msgid "COMMAND"
--msgstr "<명령>"
-+msgstr "명령"
- 
- #: dnf/cli/commands/__init__.py:814
- #, python-brace-format
- msgid "{prog} command to get help for"
--msgstr ""
-+msgstr "도움을 받기 위한 {prog} 명령"
- 
- #: dnf/cli/commands/__init__.py:831
- msgid "display, or use, the transaction history"
--msgstr "표시 또는 사용, 거래 내역"
-+msgstr "표시 또는 사용, 트랜잭션 내역"
- 
- #: dnf/cli/commands/__init__.py:859
- msgid ""
- "Found more than one transaction ID.\n"
- "'{}' requires one transaction ID or package name."
- msgstr ""
-+"둘 이상의 트랜잭션 ID를 찾았습니다.\n"
-+"'{}'에는 하나의 트랜잭션 ID 또는 패키지 이름이 필요합니다."
- 
- #: dnf/cli/commands/__init__.py:867
- msgid "No transaction ID or package name given."
--msgstr ""
-+msgstr "트랜잭션 ID 또는 패키지 이름이 없습니다."
- 
- #: dnf/cli/commands/__init__.py:879
--msgid "You don't have access to the history DB."
--msgstr ""
-+#, python-format
-+msgid "You don't have access to the history DB: %s"
-+msgstr "기록 DB에 액세스할 수 없습니다: %s"
- 
- #: dnf/cli/commands/__init__.py:891
- #, python-format
- msgid ""
- "Cannot undo transaction %s, doing so would result in an inconsistent package"
- " database."
--msgstr ""
-+msgstr "%s 트랜잭션을 취소할 수 없습니다. 취소하면 패키지 데이터베이스가 일치하지 않게 됩니다."
- 
- #: dnf/cli/commands/__init__.py:896
- #, python-format
- msgid ""
- "Cannot rollback transaction %s, doing so would result in an inconsistent "
- "package database."
--msgstr ""
-+msgstr "%s 트랜잭션을 롤백할 수 없습니다. 이렇게하면 패키지 데이터베이스가 일치하지 않습니다."
- 
- #: dnf/cli/commands/__init__.py:966
- msgid ""
- "Invalid transaction ID range definition '{}'.\n"
- "Use '<transaction-id>..<transaction-id>'."
- msgstr ""
-+"잘못된 트랜잭션 ID 범위 정의 '{}'. \n"
-+"'<transaction-id>..<transaction-id>' 사용."
- 
- #: dnf/cli/commands/__init__.py:970
- msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
- msgstr ""
-+"'{}'을 (를) 트랜잭션 ID로 변환할 수 없습니다. \n"
-+"'<number>', 'last', 'last-<number>' 사용."
- 
- #: dnf/cli/commands/__init__.py:999
- msgid "No transaction which manipulates package '{}' was found."
--msgstr ""
-+msgstr "패키지 '{}'을 (를) 조정하는 트랜잭션이 없습니다."
- 
- #: dnf/cli/commands/alias.py:40
- msgid "List or create command aliases"
--msgstr ""
-+msgstr "명령 별칭 나열 또는 작성"
- 
- #: dnf/cli/commands/alias.py:47
- msgid "enable aliases resolving"
--msgstr ""
-+msgstr "별칭 분석 활성화"
- 
- #: dnf/cli/commands/alias.py:50
- msgid "disable aliases resolving"
--msgstr ""
-+msgstr "별칭 분석 비활성화"
- 
- #: dnf/cli/commands/alias.py:53
- msgid "action to do with aliases"
--msgstr ""
-+msgstr "별칭과 관련된 동작"
- 
- #: dnf/cli/commands/alias.py:55
- msgid "alias definition"
--msgstr ""
-+msgstr "별칭 정의"
- 
- #: dnf/cli/commands/alias.py:70
- msgid "Aliases are now enabled"
--msgstr ""
-+msgstr "별칭이 활성화되었습니다"
- 
- #: dnf/cli/commands/alias.py:73
- msgid "Aliases are now disabled"
--msgstr ""
-+msgstr "별칭이 비활성화되었습니다"
- 
- #: dnf/cli/commands/alias.py:90 dnf/cli/commands/alias.py:93
- #, python-format
- msgid "Invalid alias key: %s"
--msgstr ""
-+msgstr "잘못된 별칭 키 : %s"
- 
- #: dnf/cli/commands/alias.py:96
- #, python-format
- msgid "Alias argument has no value: %s"
--msgstr ""
-+msgstr "별칭 인수에 값이 없습니다. %s"
- 
- #: dnf/cli/commands/alias.py:130
- #, python-format
- msgid "Aliases added: %s"
--msgstr ""
-+msgstr "별칭이 추가되었습니다 : %s"
- 
- #: dnf/cli/commands/alias.py:144
- #, python-format
- msgid "Alias not found: %s"
--msgstr ""
-+msgstr "별칭을 찾을 수 없음 : %s"
- 
- #: dnf/cli/commands/alias.py:147
- #, python-format
- msgid "Aliases deleted: %s"
--msgstr ""
-+msgstr "별칭 삭제 : %s"
- 
- #: dnf/cli/commands/alias.py:155
- #, python-format
- msgid "%s, alias %s=\"%s\""
--msgstr ""
-+msgstr "%s, 별칭 %s=\"%s\""
- 
- #: dnf/cli/commands/alias.py:157
- #, python-format
- msgid "Alias %s='%s'"
--msgstr ""
-+msgstr "별칭 %s='%s'"
- 
- #: dnf/cli/commands/alias.py:161
- msgid "Aliases resolving is disabled."
--msgstr ""
-+msgstr "별칭 해결이 비활성화되었습니다."
- 
- #: dnf/cli/commands/alias.py:166
- msgid "No aliases specified."
--msgstr ""
-+msgstr "별칭이 지정되지 않았습니다."
- 
- #: dnf/cli/commands/alias.py:173
- msgid "No alias specified."
--msgstr ""
-+msgstr "별칭이 지정되지 않았습니다."
- 
- #: dnf/cli/commands/alias.py:179
- msgid "No aliases defined."
--msgstr ""
-+msgstr "별명이 정의되지 않았습니다."
- 
- #: dnf/cli/commands/alias.py:186
- #, python-format
- msgid "No match for alias: %s"
--msgstr ""
-+msgstr "일치하는 별칭이 없습니다 : %s"
- 
- #: dnf/cli/commands/autoremove.py:41
- msgid ""
-@@ -1081,74 +1108,74 @@ msgstr "원래 종속물로 설치된 모든 불필요한 패키지 제거"
- 
- #: dnf/cli/commands/autoremove.py:46 dnf/cli/commands/remove.py:59
- msgid "Package to remove"
--msgstr "제거 할 패키지"
-+msgstr "제거할 패키지"
- 
- #: dnf/cli/commands/check.py:34
- msgid "check for problems in the packagedb"
--msgstr ""
-+msgstr "packagedb에 문제가 있는지 확인"
- 
- #: dnf/cli/commands/check.py:40
- msgid "show all problems; default"
--msgstr ""
-+msgstr "모든 문제 표시; 기본값"
- 
- #: dnf/cli/commands/check.py:43
- msgid "show dependency problems"
--msgstr ""
-+msgstr "종속성 문제 표시"
- 
- #: dnf/cli/commands/check.py:46
- msgid "show duplicate problems"
--msgstr ""
-+msgstr "중복된 문제를 표시"
- 
- #: dnf/cli/commands/check.py:49
- msgid "show obsoleted packages"
--msgstr ""
-+msgstr "더 이상 사용되지 않는 패키지 표시"
- 
- #: dnf/cli/commands/check.py:52
- msgid "show problems with provides"
--msgstr ""
-+msgstr "제공된 정보를 기반으로 문제 표시"
- 
- #: dnf/cli/commands/check.py:97
- msgid "{} has missing requires of {}"
--msgstr ""
-+msgstr "{}에 {} 요구 사항이 누락되어 있습니다"
- 
- #: dnf/cli/commands/check.py:117
- msgid "{} is a duplicate with {}"
--msgstr ""
-+msgstr "{}은 {}와 중복됩니다"
- 
- #: dnf/cli/commands/check.py:128
- msgid "{} is obsoleted by {}"
--msgstr ""
-+msgstr "{}는 {}에 의해 폐기되었습니다"
- 
- #: dnf/cli/commands/check.py:137
- msgid "{} provides {} but it cannot be found"
--msgstr ""
-+msgstr "{}은 {}을 제공했지만 찾을 수 없습니다"
- 
- #: dnf/cli/commands/clean.py:68
- #, python-format
- msgid "Removing file %s"
--msgstr ""
-+msgstr "파일 %s 제거 중"
- 
- #: dnf/cli/commands/clean.py:87
- msgid "remove cached data"
--msgstr ""
-+msgstr "캐시된 데이터 제거"
- 
- #: dnf/cli/commands/clean.py:93
- msgid "Metadata type to clean"
--msgstr ""
-+msgstr "메타 데이터 지우기"
- 
- #: dnf/cli/commands/clean.py:105
- msgid "Cleaning data:  "
--msgstr ""
-+msgstr "데이터 정리 중:  "
- 
- #: dnf/cli/commands/clean.py:111
- msgid "Cache was expired"
--msgstr ""
-+msgstr "캐시가 만료되었습니다"
- 
- #: dnf/cli/commands/clean.py:115
- #, python-format
- msgid "%d file removed"
- msgid_plural "%d files removed"
--msgstr[0] ""
-+msgstr[0] "%d 파일이 삭제되었습니다"
- 
- #: dnf/cli/commands/clean.py:119 dnf/lock.py:139
- #, python-format
-@@ -1157,11 +1184,11 @@ msgstr "PID %d 프로세스가 종료되기를 기다리고 있습니다."
- 
- #: dnf/cli/commands/deplist.py:32
- msgid "List package's dependencies and what packages provide them"
--msgstr ""
-+msgstr "패키지의 종속성 및 패키지를 제공하는 소스 목록 나열"
- 
- #: dnf/cli/commands/distrosync.py:32
- msgid "synchronize installed packages to the latest available versions"
--msgstr "설치된 패키지를 최신 버전과 동기화한다."
-+msgstr "설치된 패키지를 최신 버전과 동기화한다"
- 
- #: dnf/cli/commands/distrosync.py:36
- msgid "Package to synchronize"
-@@ -1169,15 +1196,15 @@ msgstr "동기화 할 패키지"
- 
- #: dnf/cli/commands/downgrade.py:34
- msgid "Downgrade a package"
--msgstr ""
-+msgstr "패키지 다운그레이드"
- 
- #: dnf/cli/commands/downgrade.py:38
- msgid "Package to downgrade"
--msgstr ""
-+msgstr "다운그레이드할 패키지"
- 
- #: dnf/cli/commands/group.py:44
- msgid "display, or use, the groups information"
--msgstr "표시하거나 사용하십시오."
-+msgstr "표시하거나 사용하십시오"
- 
- #: dnf/cli/commands/group.py:70
- msgid "No group data available for configured repositories."
-@@ -1192,6 +1219,12 @@ msgstr "경고 : 그룹 %s 존재하지 않는다."
- msgid "Warning: No groups match:"
- msgstr "경고 : 일치하는 그룹 없음 :"
- 
-+#: dnf/cli/commands/group.py:180 dnf/cli/commands/group.py:191
-+#: dnf/cli/output.py:1226
-+#| msgid "<unset>"
-+msgid "<name-unset>"
-+msgstr "<name-unset>"
-+
- #: dnf/cli/commands/group.py:197
- msgid "Available Environment Groups:"
- msgstr "사용 가능한 환경 그룹 :"
-@@ -1218,11 +1251,11 @@ msgstr "사용 가능한 언어 그룹 :"
- 
- #: dnf/cli/commands/group.py:320
- msgid "include optional packages from group"
--msgstr "그룹의 선택 패키지를 포함하십시오."
-+msgstr "그룹의 선택 패키지를 포함하십시오"
- 
- #: dnf/cli/commands/group.py:323
- msgid "show also hidden groups"
--msgstr "또한 숨겨진 그룹을 보여준다."
-+msgstr "또한 숨겨진 그룹을 보여준다"
- 
- #: dnf/cli/commands/group.py:325
- msgid "show only installed groups"
-@@ -1234,15 +1267,15 @@ msgstr "사용 가능한 그룹 만 표시"
- 
- #: dnf/cli/commands/group.py:329
- msgid "show also ID of groups"
--msgstr ""
-+msgstr "그룹 ID도 표시"
- 
- #: dnf/cli/commands/group.py:331
- msgid "available subcommands: {} (default), {}"
--msgstr ""
-+msgstr "사용 가능한 부속 명령: {} (기본값), {}"
- 
- #: dnf/cli/commands/group.py:335
- msgid "argument for group subcommand"
--msgstr ""
-+msgstr "그룹 부속 명령의 인수"
- 
- #: dnf/cli/commands/group.py:344
- #, python-format
-@@ -1255,7 +1288,7 @@ msgstr "필수 그룹 패키지를 찾을 수 없습니다."
- 
- #: dnf/cli/commands/install.py:47
- msgid "install a package or packages on your system"
--msgstr ""
-+msgstr "시스템에 패키지를 설치하십시오"
- 
- #: dnf/cli/commands/install.py:53
- msgid "Package to install"
-@@ -1263,7 +1296,7 @@ msgstr "설치할 패키지"
- 
- #: dnf/cli/commands/install.py:118
- msgid "Unable to find a match"
--msgstr "경기를 찾을 수 없습니다."
-+msgstr "경기를 찾을 수 없습니다"
- 
- #: dnf/cli/commands/install.py:131
- #, python-format
-@@ -1273,11 +1306,11 @@ msgstr "올바른 rpm 파일 경로가 아닙니다. %s"
- #: dnf/cli/commands/install.py:167
- #, python-brace-format
- msgid "There are following alternatives for \"{0}\": {1}"
--msgstr ""
-+msgstr "다음은 “{0}\"의 대안입니다. {1}"
- 
- #: dnf/cli/commands/makecache.py:37
- msgid "generate the metadata cache"
--msgstr "메타 데이터 캐시를 생성한다."
-+msgstr "메타 데이터 캐시를 생성한다"
- 
- #: dnf/cli/commands/makecache.py:48
- msgid "Making cache files for all metadata files."
-@@ -1285,7 +1318,7 @@ msgstr "모든 메타 데이터 파일에 대한 캐시 파일 만들기."
- 
- #: dnf/cli/commands/mark.py:39
- msgid "mark or unmark installed packages as installed by user."
--msgstr ""
-+msgstr "설치된 패키지를 사용자가 설치한 것으로 표시 또는 표시 해제합니다."
- 
- #: dnf/cli/commands/mark.py:44
- msgid ""
-@@ -1293,117 +1326,120 @@ msgid ""
- "remove: unmark as installed by user\n"
- "group: mark as installed by group"
- msgstr ""
-+"설치 : 사용자가 설치한 것으로 표시\n"
-+"제거 : 사용자가 설치한 것으로 표시 해제\n"
-+"그룹: 그룹이 설치한 것으로 표시"
- 
- #: dnf/cli/commands/mark.py:52
- #, python-format
- msgid "%s marked as user installed."
--msgstr ""
-+msgstr "%s은/는 사용자가 설치한 것으로 표시됩니다."
- 
- #: dnf/cli/commands/mark.py:56
- #, python-format
- msgid "%s unmarked as user installed."
--msgstr ""
-+msgstr "%s은/는 사용자가 설치한 것으로 표시되지 않았습니다."
- 
- #: dnf/cli/commands/mark.py:60
- #, python-format
- msgid "%s marked as group installed."
--msgstr ""
-+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
- msgid "Error:"
--msgstr ""
-+msgstr "오류:"
- 
- #: dnf/cli/commands/mark.py:87
- #, python-format
- msgid "Package %s is not installed."
--msgstr ""
-+msgstr "패키지 %s이/가 설치되지 않았습니다."
- 
- #: dnf/cli/commands/module.py:51
- msgid ""
- "Only module name, stream, architecture or profile is used. Ignoring unneeded"
- " information in argument: '{}'"
--msgstr ""
-+msgstr "모듈 이름, 스트림, 아키텍처 또는 프로파일만 사용됩니다. '{}'인수에서 불필요한 정보는 무시하십시오"
- 
- #: dnf/cli/commands/module.py:77
- msgid "list all module streams, profiles and states"
--msgstr ""
-+msgstr "모든 모듈 스트림, 프로파일 및 상태 나열"
- 
- #: dnf/cli/commands/module.py:105 dnf/cli/commands/module.py:128
- msgid "No matching Modules to list"
--msgstr ""
-+msgstr "나열할 수 있는 일치하는 모듈이 없습니다"
- 
- #: dnf/cli/commands/module.py:111
- msgid "print detailed information about a module"
--msgstr ""
-+msgstr "모듈 세부 사항을 인쇄"
- 
- #: dnf/cli/commands/module.py:133
- msgid "enable a module stream"
--msgstr ""
-+msgstr "모듈 스트림을 활성화합니다"
- 
- #: dnf/cli/commands/module.py:157
- msgid "disable a module with all its streams"
--msgstr ""
-+msgstr "모듈의 모든 스트림을 비활성화합니다"
- 
- #: dnf/cli/commands/module.py:181
- msgid "reset a module"
--msgstr ""
-+msgstr "모듈 재설정"
- 
- #: dnf/cli/commands/module.py:202
- msgid "install a module profile including its packages"
--msgstr ""
-+msgstr "패키지를 포함한 모듈 프로파일 설치"
- 
- #: dnf/cli/commands/module.py:223
- msgid "update packages associated with an active stream"
--msgstr ""
-+msgstr "활성 스트림과 관련된 패키지 업데이트"
- 
- #: dnf/cli/commands/module.py:240
- msgid "remove installed module profiles and their packages"
--msgstr ""
-+msgstr "설치된 모듈 프로파일과 패키지를 제거"
- 
- #: dnf/cli/commands/module.py:264
- msgid "Package {} belongs to multiple modules, skipping"
--msgstr ""
-+msgstr "{} 패키지는 여러 모듈에 속합니다. 건너 뛰기"
- 
- #: dnf/cli/commands/module.py:277
- msgid "list modular packages"
--msgstr ""
-+msgstr "모듈 패키지 목록"
- 
- #: dnf/cli/commands/module.py:292
- msgid "list packages belonging to a module"
--msgstr ""
-+msgstr "모듈에 속하는 패키지를 나열하십시오"
- 
- #: dnf/cli/commands/module.py:327
- msgid "Interact with Modules."
--msgstr ""
-+msgstr "모듈과 상호 작용합니다."
- 
- #: dnf/cli/commands/module.py:340
- msgid "show only enabled modules"
--msgstr ""
-+msgstr "활성화된 모듈 만 표시"
- 
- #: dnf/cli/commands/module.py:343
- msgid "show only disabled modules"
--msgstr ""
-+msgstr "비활성화된 모듈 만 표시"
- 
- #: dnf/cli/commands/module.py:346
- msgid "show only installed modules or packages"
--msgstr ""
-+msgstr "설치된 모듈 또는 패키지 만 표시"
- 
- #: dnf/cli/commands/module.py:349
- msgid "show profile content"
--msgstr ""
-+msgstr "프로파일 내용 표시"
- 
- #: dnf/cli/commands/module.py:354
- msgid "remove all modular packages"
--msgstr ""
-+msgstr "모든 모듈 패키지 삭제"
- 
- #: dnf/cli/commands/module.py:364
- msgid "Module specification"
--msgstr ""
-+msgstr "모듈 사양"
- 
- #: dnf/cli/commands/module.py:386
- msgid "{} {} {}: too few arguments"
--msgstr ""
-+msgstr "{} {} {}: 인수가 너무 적습니다"
- 
- #: dnf/cli/commands/reinstall.py:38
- msgid "reinstall a package"
-@@ -1415,67 +1451,67 @@ msgstr "다시 설치할 패키지"
- 
- #: dnf/cli/commands/remove.py:46
- msgid "remove a package or packages from your system"
--msgstr ""
-+msgstr "시스템에서 패키지를 제거합니다"
- 
- #: dnf/cli/commands/remove.py:53
- msgid "remove duplicated packages"
--msgstr ""
-+msgstr "중복된 패키지 제거"
- 
- #: dnf/cli/commands/remove.py:58
- msgid "remove installonly packages over the limit"
--msgstr ""
-+msgstr "오래된 설치 전용 패키지 제거"
- 
--#: dnf/cli/commands/remove.py:94
-+#: dnf/cli/commands/remove.py:95
- msgid "No duplicated packages found for removal."
--msgstr ""
-+msgstr "제거할 중복 패키지가 없습니다."
- 
--#: dnf/cli/commands/remove.py:126
-+#: dnf/cli/commands/remove.py:127
- msgid "No old installonly packages found for removal."
--msgstr ""
-+msgstr "제거할 오래된 설치 전용 패키지가 없습니다."
- 
- #: dnf/cli/commands/repolist.py:38 dnf/cli/commands/updateinfo.py:47
--#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:359
-+#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:364
- msgid "unknown"
--msgstr "알려지지 않음"
-+msgstr "알 수 없음"
- 
- #: dnf/cli/commands/repolist.py:40
- #, python-format
- msgid "Never (last: %s)"
--msgstr ""
-+msgstr "없음 (가장 최근: %s )"
- 
- #: dnf/cli/commands/repolist.py:42
- #, python-format
- msgid "Instant (last: %s)"
--msgstr ""
-+msgstr "즉시 (가장 최근: %s )"
- 
- #: dnf/cli/commands/repolist.py:45
- #, python-format
- msgid "%s second(s) (last: %s)"
--msgstr ""
-+msgstr "%s 초 (가장 최근: %s )"
- 
- #: dnf/cli/commands/repolist.py:76
- msgid "display the configured software repositories"
--msgstr ""
-+msgstr "구성된 소프트웨어 리포지토리를 표시"
- 
- #: dnf/cli/commands/repolist.py:83
- msgid "show all repos"
--msgstr ""
-+msgstr "모든 리포지토리를 표시"
- 
- #: dnf/cli/commands/repolist.py:86
- msgid "show enabled repos (default)"
--msgstr ""
-+msgstr "활성화된 리포지토리를 표시 (기본값)"
- 
- #: dnf/cli/commands/repolist.py:89
- msgid "show disabled repos"
--msgstr ""
-+msgstr "비활성화된 리포지토리를 표시"
- 
- #: dnf/cli/commands/repolist.py:93
- msgid "Repository specification"
--msgstr ""
-+msgstr "리포지토리 사양"
- 
- #: dnf/cli/commands/repolist.py:125
- msgid "No repositories available"
--msgstr ""
-+msgstr "사용 가능한 리포지토리가 없습니다"
- 
- #: dnf/cli/commands/repolist.py:143 dnf/cli/commands/repolist.py:144
- msgid "enabled"
-@@ -1487,100 +1523,100 @@ msgstr "사용 않음"
- 
- #: dnf/cli/commands/repolist.py:162
- msgid "Repo-id            : "
--msgstr ""
-+msgstr "Repo-id            : "
- 
- #: dnf/cli/commands/repolist.py:163
- msgid "Repo-name          : "
--msgstr ""
-+msgstr "Repo-name          : "
- 
- #: dnf/cli/commands/repolist.py:166
- msgid "Repo-status        : "
--msgstr ""
-+msgstr "Repo-status        : "
- 
- #: dnf/cli/commands/repolist.py:169
- msgid "Repo-revision      : "
--msgstr ""
-+msgstr "Repo-revision      : "
- 
- #: dnf/cli/commands/repolist.py:173
- msgid "Repo-tags          : "
--msgstr ""
-+msgstr "Repo-tags          : "
- 
- #: dnf/cli/commands/repolist.py:180
- msgid "Repo-distro-tags      : "
--msgstr ""
-+msgstr "Repo-distro-tags      : "
- 
- #: dnf/cli/commands/repolist.py:192
- msgid "Repo-updated       : "
--msgstr ""
-+msgstr "Repo-updated       : "
- 
- #: dnf/cli/commands/repolist.py:194
- msgid "Repo-pkgs          : "
--msgstr ""
-+msgstr "Repo-pkgs          : "
- 
- #: dnf/cli/commands/repolist.py:195
- msgid "Repo-available-pkgs: "
--msgstr ""
-+msgstr "Repo-available-pkgs: "
- 
- #: dnf/cli/commands/repolist.py:196
- msgid "Repo-size          : "
--msgstr ""
-+msgstr "Repo-size          : "
- 
- #: dnf/cli/commands/repolist.py:199
- msgid "Repo-metalink      : "
--msgstr ""
-+msgstr "Repo-metalink      : "
- 
- #: dnf/cli/commands/repolist.py:204
- msgid "  Updated          : "
--msgstr ""
-+msgstr "  Updated          : "
- 
- #: dnf/cli/commands/repolist.py:206
- msgid "Repo-mirrors       : "
--msgstr ""
-+msgstr "Repo-mirrors       : "
- 
- #: dnf/cli/commands/repolist.py:210 dnf/cli/commands/repolist.py:216
- msgid "Repo-baseurl       : "
--msgstr ""
-+msgstr "Repo-baseurl       : "
- 
- #: dnf/cli/commands/repolist.py:219
- msgid "Repo-expire        : "
--msgstr ""
-+msgstr "Repo-expire        : "
- 
- #. TRANSLATORS: Packages that are excluded - their names like (dnf systemd)
- #: dnf/cli/commands/repolist.py:223
- msgid "Repo-exclude       : "
--msgstr ""
-+msgstr "Repo-exclude       : "
- 
- #: dnf/cli/commands/repolist.py:227
- msgid "Repo-include       : "
--msgstr ""
-+msgstr "Repo-include       : "
- 
- #. TRANSLATORS: Number of packages that where excluded (5)
- #: dnf/cli/commands/repolist.py:232
- msgid "Repo-excluded      : "
--msgstr ""
-+msgstr "Repo-excluded      : "
- 
- #: dnf/cli/commands/repolist.py:236
- msgid "Repo-filename      : "
--msgstr ""
-+msgstr "Repo-filename      : "
- 
- #. Work out the first (id) and last (enabled/disabled/count),
- #. then chop the middle (name)...
--#: dnf/cli/commands/repolist.py:245 dnf/cli/commands/repolist.py:272
-+#: dnf/cli/commands/repolist.py:246 dnf/cli/commands/repolist.py:273
- msgid "repo id"
--msgstr ""
-+msgstr "리포지터리 ID"
- 
--#: dnf/cli/commands/repolist.py:258 dnf/cli/commands/repolist.py:259
--#: dnf/cli/commands/repolist.py:280
-+#: dnf/cli/commands/repolist.py:259 dnf/cli/commands/repolist.py:260
-+#: dnf/cli/commands/repolist.py:281
- msgid "status"
--msgstr ""
-+msgstr "상태"
- 
--#: dnf/cli/commands/repolist.py:274 dnf/cli/commands/repolist.py:276
-+#: dnf/cli/commands/repolist.py:275 dnf/cli/commands/repolist.py:277
- msgid "repo name"
--msgstr ""
-+msgstr "리포지터리 이름"
- 
--#: dnf/cli/commands/repolist.py:290
-+#: dnf/cli/commands/repolist.py:291
- msgid "Total packages: {}"
--msgstr ""
-+msgstr "총 패키지: {}"
- 
- #: dnf/cli/commands/repoquery.py:108
- msgid "search for packages matching keyword"
-@@ -1624,7 +1660,7 @@ msgstr "REQ를 제공하는 결과 만 표시"
- 
- #: dnf/cli/commands/repoquery.py:146
- msgid "shows results that requires package provides and files REQ"
--msgstr "패키지 제공 및 파일 REQ가 필요한 결과를 보여줍니다."
-+msgstr "패키지 제공 및 파일 REQ가 필요한 결과를 보여줍니다"
- 
- #: dnf/cli/commands/repoquery.py:149
- msgid "show only results that recommend REQ"
-@@ -1648,7 +1684,7 @@ msgstr "비 명시 적 종속성 검사 (파일 및 제공). 태만"
- 
- #: dnf/cli/commands/repoquery.py:163
- msgid "check dependencies exactly as given, opposite of --alldeps"
--msgstr "의존성을 정확하게 주어진대로 검사한다. --alldeps와 반대이다."
-+msgstr "의존성을 정확하게 주어진대로 검사한다. --alldeps와 반대이다"
- 
- #: dnf/cli/commands/repoquery.py:165
- msgid ""
-@@ -1658,19 +1694,19 @@ msgstr "--whatrequires와 함께 사용되며 --requires --resolve, 패키지를
- 
- #: dnf/cli/commands/repoquery.py:167
- msgid "show a list of all dependencies and what packages provide them"
--msgstr "모든 의존성 목록과 패키지를 제공하는 패키지를 보여줍니다."
-+msgstr "모든 의존성 목록과 패키지를 제공하는 패키지를 보여줍니다"
- 
- #: dnf/cli/commands/repoquery.py:169
- msgid "show available tags to use with --queryformat"
--msgstr "--queryformat과 함께 사용할 수있는 태그를 보여줍니다."
-+msgstr "--queryformat과 함께 사용할 수있는 태그를 보여줍니다"
- 
- #: dnf/cli/commands/repoquery.py:172
- msgid "resolve capabilities to originating package(s)"
--msgstr "역량을 원래 패키지로 해결한다."
-+msgstr "역량을 원래 패키지로 해결한다"
- 
- #: dnf/cli/commands/repoquery.py:174
- msgid "show recursive tree for package(s)"
--msgstr "패키지에 재귀 트리를 보여라."
-+msgstr "패키지에 재귀 트리를 보여라"
- 
- #: dnf/cli/commands/repoquery.py:176
- msgid "operate on corresponding source RPM"
-@@ -1684,7 +1720,7 @@ msgstr "주어진 name.arch (또는 최신이지만 N이 음수이면 N)에 대
- 
- #: dnf/cli/commands/repoquery.py:181
- msgid "list also packages of inactive module streams"
--msgstr ""
-+msgstr "비활성 모듈 스트림 패키지 목록"
- 
- #: dnf/cli/commands/repoquery.py:186
- msgid "show detailed information about the package"
-@@ -1700,7 +1736,7 @@ msgstr "패키지 소스 RPM 이름 표시"
- 
- #: dnf/cli/commands/repoquery.py:195
- msgid "show changelogs of the package"
--msgstr ""
-+msgstr "패키지의 변경 로그 표시"
- 
- #: dnf/cli/commands/repoquery.py:198
- msgid "format for displaying found packages"
-@@ -1717,13 +1753,13 @@ msgstr ""
- msgid ""
- "use name-version-release format for displaying found packages (rpm query "
- "default)"
--msgstr "발견 된 패키지를 표시하기 위해 name-version-release 형식을 사용하십시오 (rpm 쿼리 기본값)."
-+msgstr "발견 된 패키지를 표시하기 위해 name-version-release 형식을 사용하십시오 (rpm 쿼리 기본값)"
- 
- #: dnf/cli/commands/repoquery.py:210
- msgid ""
- "use epoch:name-version-release.architecture format for displaying found "
- "packages"
--msgstr "epoch : name-version-release.architecture 형식을 사용하여 발견 된 패키지를 표시합니다."
-+msgstr "epoch : name-version-release.architecture 형식을 사용하여 발견 된 패키지를 표시합니다"
- 
- #: dnf/cli/commands/repoquery.py:213
- msgid "Display in which comps groups are presented selected packages"
-@@ -1739,7 +1775,7 @@ msgstr "설치된 installonly 패키지로 쿼리 제한"
- 
- #: dnf/cli/commands/repoquery.py:227
- msgid "limit the query to installed packages with unsatisfied dependencies"
--msgstr "만족스럽지 않은 의존성이있는 설치된 패키지로 쿼리를 제한하십시오."
-+msgstr "만족스럽지 않은 의존성이있는 설치된 패키지로 쿼리를 제한하십시오"
- 
- #: dnf/cli/commands/repoquery.py:229
- msgid "show a location from where packages can be downloaded"
-@@ -1778,6 +1814,8 @@ msgid ""
- "running %%pre and %%post scriptlets. If the package is installed display "
- "capabilities that is depends for %%pre, %%post, %%preun and %%postun."
- msgstr ""
-+"패키지가 설치되어 있지 않은 경우 %%pre 과 %%post 스크립트를 실행할 수 있는 기능이 표시됩니다. 패키지가 설치되어있는 경우 "
-+"%%pre, %%post , %%preun, %%postun에 종속된 기능이 표시됩니다."
- 
- #: dnf/cli/commands/repoquery.py:242
- msgid "Display capabilities that the package suggests."
-@@ -1810,7 +1848,7 @@ msgstr "이미 설치된 일부 패키지에 대한 업그레이드를 제공하
- #, python-brace-format
- msgid ""
- "Display only packages that can be removed by \"{prog} autoremove\" command."
--msgstr ""
-+msgstr "\"{prog} autoremove\" 명령으로 제거할 수 있는 패키지 만 표시하십시오."
- 
- #: dnf/cli/commands/repoquery.py:257
- msgid "Display only packages that were installed by user."
-@@ -1840,21 +1878,23 @@ msgid ""
- "with '--alldeps', but not with '--exactdeps'), or with '--requires <REQ> "
- "--resolve'"
- msgstr ""
-+"옵션 '--reative'를 '--whatrequires'와 함께 사용해야합니다. <REQ>' (다른 옵션으로 '--alldeps'와 "
-+"함께 사용하지만 '--exactdeps'와는 사용하지 않음), 또는 '--requires <REQ> --resolve'와 함께 사용"
- 
- #: dnf/cli/commands/repoquery.py:311
- msgid "argument {} requires --whatrequires or --whatdepends option"
--msgstr "인수 {}에는 --whatrequires 또는 --whatdepends 옵션이 필요합니다."
-+msgstr "인수 {}에는 --whatrequires 또는 --whatdepends 옵션이 필요합니다"
- 
- #: dnf/cli/commands/repoquery.py:343
- msgid "Package {} contains no files"
--msgstr "패키지 {}에 파일이 없습니다."
-+msgstr "패키지 {}에 파일이 없습니다"
- 
- #: dnf/cli/commands/repoquery.py:436
- #, python-brace-format
- msgid "Available query-tags: use --queryformat \".. %{tag} ..\""
- msgstr "사용 가능한 쿼리 태그 : use --queryformat \".. %{tag} .. \""
- 
--#: dnf/cli/commands/repoquery.py:562
-+#: dnf/cli/commands/repoquery.py:561
- #, python-brace-format
- msgid ""
- "No valid switch specified\n"
-@@ -1863,88 +1903,93 @@ msgid ""
- "description:\n"
- "  For the given packages print a tree of thepackages."
- msgstr ""
-+"유효한 매개 변수를 지정하지 않았습니다.\n"
-+"사용법: {prog} repoquery [--conflicts|--enhances|--obsoletes|--provides|--recommends|--requires|--suggest|--supplements|--whatrequires] [key] [--tree]\n"
-+"\n"
-+"설명:\n"
-+"  지정된 패키지의 경우 패키지 트리를 출력하십시오."
- 
- #: dnf/cli/commands/search.py:46
- msgid "search package details for the given string"
--msgstr ""
-+msgstr "주어진 문자열에 대한 패키지 세부 사항 검색"
- 
- #: dnf/cli/commands/search.py:51
- msgid "search also package description and URL"
--msgstr ""
-+msgstr "패키지 설명 및 URL도 검색"
- 
- #: dnf/cli/commands/search.py:52
- msgid "KEYWORD"
--msgstr ""
-+msgstr "KEYWORD"
- 
- #: dnf/cli/commands/search.py:55
- msgid "Keyword to search for"
--msgstr ""
-+msgstr "키워드 검색"
- 
- #: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
- msgctxt "long"
- msgid "Name"
--msgstr ""
-+msgstr "이름"
- 
- #: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
- msgctxt "long"
- msgid "Summary"
--msgstr ""
-+msgstr "요약"
- 
- #: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
- msgctxt "long"
- msgid "Description"
--msgstr ""
-+msgstr "설명"
- 
- #: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
- msgid "URL"
--msgstr ""
-+msgstr "URL"
- 
- #. TRANSLATORS: separator used between package attributes (eg. Name & Summary
- #. & URL)
- #: dnf/cli/commands/search.py:76
- msgid " & "
--msgstr ""
-+msgstr " & "
- 
- #. TRANSLATORS: %s  - translated package attributes,
- #. %%s - found keys (in listed attributes)
- #: dnf/cli/commands/search.py:80
- #, python-format
- msgid "%s Exactly Matched: %%s"
--msgstr ""
-+msgstr "%s 정확히 일치하는 항목: %%s"
- 
- #. TRANSLATORS: %s  - translated package attributes,
- #. %%s - found keys (in listed attributes)
- #: dnf/cli/commands/search.py:84
- #, python-format
- msgid "%s Matched: %%s"
--msgstr ""
-+msgstr "%s 일치하는 항목: %%s"
- 
- #: dnf/cli/commands/search.py:134
- msgid "No matches found."
--msgstr ""
-+msgstr "일치하는 항목이 없습니다."
- 
- #: dnf/cli/commands/shell.py:47
- #, python-brace-format
- msgid "run an interactive {prog} shell"
--msgstr ""
-+msgstr "대화식 {prog} 쉘 실행"
- 
- #: dnf/cli/commands/shell.py:68
- msgid "SCRIPT"
--msgstr ""
-+msgstr "스크립트"
- 
- #: dnf/cli/commands/shell.py:69
- #, python-brace-format
- msgid "Script to run in {prog} shell"
--msgstr ""
-+msgstr "{prog} 쉘에서 실행할 스크립트"
- 
- #: dnf/cli/commands/shell.py:142
- msgid "Unsupported key value."
--msgstr ""
-+msgstr "지원되지 않는 키."
- 
- #: dnf/cli/commands/shell.py:158
- #, python-format
- msgid "Could not find repository: %s"
--msgstr ""
-+msgstr "저장소를 찾을 수 없습니다: %s"
- 
- #: dnf/cli/commands/shell.py:174
- msgid ""
-@@ -1954,12 +1999,19 @@ msgid ""
- "    If no value is given it prints the current value.\n"
- "    If value is given it sets that value."
- msgstr ""
-+"{} arg [value]\n"
-+"  arg: 디버그 수준, 오류 수준, 사용되지 않음, gpgcheck, 가정, 제외,\n"
-+"        repo_id.gpgcheck, repo_id.exclude \n"
-+"      값이 지정되어 있지 않으면 현재 값이 출력됩니다.\n"
-+"      값이 지정되어 있으면 해당 값으로 설정합니다."
- 
- #: dnf/cli/commands/shell.py:181
- msgid ""
- "{} [command]\n"
- "    print help"
- msgstr ""
-+"{} [command]\n"
-+"    도움말 인쇄"
- 
- #: dnf/cli/commands/shell.py:185
- msgid ""
-@@ -1968,14 +2020,18 @@ msgid ""
- "  enable: enable repositories. option = repository id\n"
- "  disable: disable repositories. option = repository id"
- msgstr ""
--"{} arg [option] list : 저장소와 저장소의 상태를 나열합니다. 옵션 = [모두 | 이드 | glob] enable : "
--"저장소를 활성화합니다. option = repository id disable : 저장소를 비활성화합니다. 옵션 = 저장소 ID"
-+"{} arg [option]\n"
-+"  list : 저장소와 저장소의 상태를 나열합니다. 옵션 = [모두 | 이드 | glob]\n"
-+"enable : 저장소를 활성화합니다. option = repository id\n"
-+"  disable : 저장소를 비활성화합니다. 옵션 = 저장소 ID"
- 
- #: dnf/cli/commands/shell.py:191
- msgid ""
- "{}\n"
- "    resolve the transaction set"
--msgstr "{} 트랜잭션 집합을 해결합니다."
-+msgstr ""
-+"{}\n"
-+"    트랜잭션 집합을 해결합니다"
- 
- #: dnf/cli/commands/shell.py:195
- msgid ""
-@@ -1984,19 +2040,26 @@ msgid ""
- "  reset: reset (zero-out) the transaction\n"
- "  run: run the transaction"
- msgstr ""
--"{} arg list : 트랜잭션 내용을 나열합니다. reset : 트랜잭션 실행 재설정 (zero-out) : 트랜잭션 실행"
-+"{} arg\n"
-+"  list : 트랜잭션 내용을 나열합니다\n"
-+"  reset : 트랜잭션 실행 재설정 (zero-out)\n"
-+"  run: 트랜잭션 실행"
- 
- #: dnf/cli/commands/shell.py:201
- msgid ""
- "{}\n"
- "    run the transaction"
--msgstr "{} 트랜잭션을 실행합니다."
-+msgstr ""
-+"{}\n"
-+"    트랜잭션을 실행합니다."
- 
- #: dnf/cli/commands/shell.py:205
- msgid ""
- "{}\n"
- "    exit the shell"
--msgstr "{} 쉘 종료"
-+msgstr ""
-+"{}\n"
-+"   쉘 종료"
- 
- #: dnf/cli/commands/shell.py:210
- msgid ""
-@@ -2010,8 +2073,15 @@ msgid ""
- "run                      resolve and run the transaction set\n"
- "exit (or quit)           exit the shell"
- msgstr ""
--"(또는 repo) 저장소를 활성화, 비활성화 또는 나열합니다. resolvedep 트랜잭션 세트 트랜잭션 (또는 ts) 목록을 확인하고,"
--" 재설정하거나 트랜잭션 세트를 실행합니다. run resolve 및 트랜잭션 세트 종료를 실행합니다. 종료) 셸 종료"
-+"쉘 특정 인수:\n"
-+"\n"
-+"config                   설정 옵션 설정\n"
-+"help                     인쇄 도움\n"
-+"repository (or repo)     저장소 활성화,비활성화 또는 목록\n"
-+"resolvedep               트랜잭션 세트 해결\n"
-+"transaction (or ts)      트랜잭션 집합 목록,재설정 또는 실행\n"
-+"run                      트랜잭션 집합 해결 및 실행\n"
-+"exit (or quit)           셸 종료"
- 
- #: dnf/cli/commands/shell.py:259
- #, python-format
-@@ -2029,7 +2099,7 @@ msgstr "쉘을 떠나기"
- #: dnf/cli/commands/swap.py:35
- #, python-brace-format
- msgid "run an interactive {prog} mod for remove and install one spec"
--msgstr ""
-+msgstr "대화 형 {prog} 모드를 실행하여 사양을 제거하거나 설치하십시오"
- 
- #: dnf/cli/commands/swap.py:40
- msgid "The specs that will be removed"
-@@ -2041,11 +2111,11 @@ msgstr "설치 될 사양"
- 
- #: dnf/cli/commands/updateinfo.py:44
- msgid "bugfix"
--msgstr ""
-+msgstr "버그 수정"
- 
- #: dnf/cli/commands/updateinfo.py:45
- msgid "enhancement"
--msgstr ""
-+msgstr "기능 개선"
- 
- #: dnf/cli/commands/updateinfo.py:46
- msgid "security"
-@@ -2053,73 +2123,73 @@ msgstr "security"
- 
- #: dnf/cli/commands/updateinfo.py:48
- msgid "newpackage"
--msgstr ""
-+msgstr "newpackage"
- 
- #: dnf/cli/commands/updateinfo.py:50
- msgid "Critical/Sec."
--msgstr ""
-+msgstr "심각/초"
- 
- #: dnf/cli/commands/updateinfo.py:51
- msgid "Important/Sec."
--msgstr ""
-+msgstr "중요/초"
- 
- #: dnf/cli/commands/updateinfo.py:52
- msgid "Moderate/Sec."
--msgstr ""
-+msgstr "보통/초"
- 
- #: dnf/cli/commands/updateinfo.py:53
- msgid "Low/Sec."
--msgstr ""
-+msgstr "낮음/초"
- 
- #: dnf/cli/commands/updateinfo.py:63
- msgid "display advisories about packages"
--msgstr ""
-+msgstr "패키지관련 권고 표시"
- 
- #: dnf/cli/commands/updateinfo.py:77
- msgid "advisories about newer versions of installed packages (default)"
--msgstr ""
-+msgstr "설치된 최신 버전의 패키지에 대한 권고 (기본값)"
- 
- #: dnf/cli/commands/updateinfo.py:80
- msgid "advisories about equal and older versions of installed packages"
--msgstr ""
-+msgstr "설치된 패키지의 동일하거나 이전 버전에 대한 권고"
- 
- #: dnf/cli/commands/updateinfo.py:83
- msgid ""
- "advisories about newer versions of those installed packages for which a "
- "newer version is available"
--msgstr ""
-+msgstr "최신 버전을 사용할 수있는 설치된 패키지의 최신 버전에 대한 권고"
- 
- #: dnf/cli/commands/updateinfo.py:87
- msgid "advisories about any versions of installed packages"
--msgstr ""
-+msgstr "설치된 패키지 버전에 대한 권고"
- 
- #: dnf/cli/commands/updateinfo.py:92
- msgid "show summary of advisories (default)"
--msgstr ""
-+msgstr "권고 요약 표시 (기본값)"
- 
- #: dnf/cli/commands/updateinfo.py:95
- msgid "show list of advisories"
--msgstr ""
-+msgstr "권고 목록 표시"
- 
- #: dnf/cli/commands/updateinfo.py:98
- msgid "show info of advisories"
--msgstr ""
-+msgstr "권고 정보 표시"
- 
- #: dnf/cli/commands/updateinfo.py:101
- msgid "show only advisories with CVE reference"
--msgstr ""
-+msgstr "CVE 참조가있는 권고 만 표시"
- 
- #: dnf/cli/commands/updateinfo.py:104
- msgid "show only advisories with bugzilla reference"
--msgstr ""
-+msgstr "bugzilla 참조가있는 권고 만 표시"
- 
- #: dnf/cli/commands/updateinfo.py:168
- msgid "installed"
--msgstr ""
-+msgstr "설치됨"
- 
- #: dnf/cli/commands/updateinfo.py:171
- msgid "updates"
--msgstr ""
-+msgstr "업데이트"
- 
- #: dnf/cli/commands/updateinfo.py:174
- msgid "all"
-@@ -2131,100 +2201,100 @@ msgstr "사용 가능"
- 
- #: dnf/cli/commands/updateinfo.py:278
- msgid "Updates Information Summary: "
--msgstr ""
-+msgstr "정보 요약 업데이트: "
- 
- #: dnf/cli/commands/updateinfo.py:281
- msgid "New Package notice(s)"
--msgstr ""
-+msgstr "새로운 패키지 통지"
- 
- #: dnf/cli/commands/updateinfo.py:282
- msgid "Security notice(s)"
--msgstr ""
-+msgstr "보안 공지"
- 
- #: dnf/cli/commands/updateinfo.py:283
- msgid "Critical Security notice(s)"
--msgstr ""
-+msgstr "심각한 보안 공지"
- 
- #: dnf/cli/commands/updateinfo.py:285
- msgid "Important Security notice(s)"
--msgstr ""
-+msgstr "중요한 보안 공지"
- 
- #: dnf/cli/commands/updateinfo.py:287
- msgid "Moderate Security notice(s)"
--msgstr ""
-+msgstr "보통 보안 공지"
- 
- #: dnf/cli/commands/updateinfo.py:289
- msgid "Low Security notice(s)"
--msgstr ""
-+msgstr "낮은 보안 공지"
- 
- #: dnf/cli/commands/updateinfo.py:291
- msgid "Unknown Security notice(s)"
--msgstr ""
-+msgstr "알 수 없는 보안 공지"
- 
- #: dnf/cli/commands/updateinfo.py:293
- msgid "Bugfix notice(s)"
--msgstr ""
-+msgstr "버그 픽스 공지"
- 
- #: dnf/cli/commands/updateinfo.py:294
- msgid "Enhancement notice(s)"
--msgstr ""
-+msgstr "기능 개선 공지"
- 
- #: dnf/cli/commands/updateinfo.py:295
- msgid "other notice(s)"
--msgstr ""
-+msgstr "다른 공지"
- 
- #: dnf/cli/commands/updateinfo.py:316
- msgid "Unknown/Sec."
--msgstr ""
-+msgstr "알 수 없음 / 초"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Bugs"
--msgstr ""
-+msgstr "버그"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Type"
- msgstr "유형"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Update ID"
--msgstr ""
-+msgstr "ID 업데이트"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Updated"
- msgstr "업데이트됨"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "CVEs"
- msgstr "CVE"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Description"
--msgstr ""
-+msgstr "설명"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Rights"
--msgstr ""
-+msgstr "권한"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Severity"
- msgstr "심각도"
- 
--#: dnf/cli/commands/updateinfo.py:354
-+#: dnf/cli/commands/updateinfo.py:359
- msgid "Files"
- msgstr "파일"
- 
- # translation auto-copied from project subscription-manager, version 1.11.X,
- # document keys
--#: dnf/cli/commands/updateinfo.py:354 dnf/cli/output.py:1491
--#: dnf/cli/output.py:1755 dnf/cli/output.py:1757
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Installed"
- msgstr "설치됨"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "false"
- msgstr "false"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "true"
- msgstr "true"
- 
-@@ -2240,7 +2310,7 @@ msgstr "업그레이드 할 패키지"
- msgid ""
- "upgrade, but only 'newest' package match which fixes a problem that affects "
- "your system"
--msgstr ""
-+msgstr "업그레이드하지만 ‘최신' 패키지만 시스템에 영향을 주는 수정된 문제가 있습니다"
- 
- #: dnf/cli/main.py:88
- msgid "Terminated."
-@@ -2252,103 +2322,103 @@ msgstr "현재 디렉토리에서 읽기 / 실행 액세스가 없으며 /"
- 
- #: dnf/cli/main.py:135
- msgid "try to add '{}' to command line to replace conflicting packages"
--msgstr ""
-+msgstr "충돌하는 패키지를 바꾸려면 명령 줄에 '{}'을 (를) 추가하십시오."
- 
- #: dnf/cli/main.py:139
- msgid "try to add '{}' to skip uninstallable packages"
--msgstr ""
-+msgstr "설치할 수 없는 패키지를 건너 뛰려면 '{}'을 (를) 추가하십시오."
- 
- #: dnf/cli/main.py:142
- msgid " or '{}' to skip uninstallable packages"
--msgstr ""
-+msgstr " 또는 '{}'은/는 설치할 수 없는 패키지를 건너 뜁니다"
- 
- #: dnf/cli/main.py:147
- msgid "try to add '{}' to use not only best candidate packages"
--msgstr ""
-+msgstr "최상의 선택된 패키지만을 사용하려면 '{}'을 (를) 추가하십시오."
- 
- #: dnf/cli/main.py:150
- msgid " or '{}' to use not only best candidate packages"
--msgstr ""
-+msgstr " 또는 '{}'은/는 최상의 선택된 패키지만 사용합니다"
- 
- #: dnf/cli/main.py:167
- msgid "Dependencies resolved."
--msgstr ""
-+msgstr "종속성이 해결되었습니다."
- 
- #: dnf/cli/option_parser.py:65
- #, python-format
- msgid "Command line error: %s"
--msgstr ""
-+msgstr "명령줄 오류: %s"
- 
- #: dnf/cli/option_parser.py:104
- #, python-format
- msgid "bad format: %s"
--msgstr ""
-+msgstr "잘못된 형식: %s"
- 
- #: dnf/cli/option_parser.py:115
- #, python-format
- msgid "Setopt argument has multiple values: %s"
--msgstr ""
-+msgstr "Setopt 인수는 여러 값을 갖습니다. %s"
- 
- #: dnf/cli/option_parser.py:118
- #, python-format
- msgid "Setopt argument has no value: %s"
--msgstr ""
-+msgstr "Setopt 인수에 값이 없습니다 : %s"
- 
- #. All defaults need to be a None, so we can always tell whether the user
- #. has set something or whether we are getting a default.
- #: dnf/cli/option_parser.py:174
- #, python-brace-format
- msgid "General {prog} options"
--msgstr ""
-+msgstr "일반 {prog} 옵션"
- 
- #: dnf/cli/option_parser.py:178
- msgid "config file location"
--msgstr ""
-+msgstr "구성 파일 위치"
- 
- #: dnf/cli/option_parser.py:181
- msgid "quiet operation"
--msgstr ""
-+msgstr "자동 실행"
- 
- #: dnf/cli/option_parser.py:183
- msgid "verbose operation"
--msgstr ""
-+msgstr "상세 작업"
- 
- #: dnf/cli/option_parser.py:185
- #, python-brace-format
- msgid "show {prog} version and exit"
--msgstr ""
-+msgstr "{prog} 버전 표시 및 종료"
- 
- #: dnf/cli/option_parser.py:187
- msgid "set install root"
--msgstr ""
-+msgstr "설치 root 설정"
- 
- #: dnf/cli/option_parser.py:190
- msgid "do not install documentations"
--msgstr ""
-+msgstr "문서를 설치하지 마십시오"
- 
- #: dnf/cli/option_parser.py:193
- msgid "disable all plugins"
--msgstr ""
-+msgstr "모든 플러그인 비활성화"
- 
- #: dnf/cli/option_parser.py:196
- msgid "enable plugins by name"
--msgstr ""
-+msgstr "지정된 이름으로 플러그인 활성화"
- 
- #: dnf/cli/option_parser.py:200
- msgid "disable plugins by name"
--msgstr ""
-+msgstr "지정된 이름으로 플러그인 비활성화"
- 
- #: dnf/cli/option_parser.py:203
- msgid "override the value of $releasever in config and repo files"
--msgstr ""
-+msgstr "구성 파일 및 저장소 파일에서 $releasever 값을 무시합니다"
- 
- #: dnf/cli/option_parser.py:207
- msgid "set arbitrary config and repo options"
--msgstr ""
-+msgstr "임의의 구성 및 저장소 옵션 설정"
- 
- #: dnf/cli/option_parser.py:210
- msgid "resolve depsolve problems by skipping packages"
--msgstr ""
-+msgstr "패키지를 건너 뛰어 종속성 문제 해결"
- 
- #: dnf/cli/option_parser.py:213
- msgid "show command help"
-@@ -2364,7 +2434,7 @@ msgstr "트랜잭션에서 사용 가능한 최상의 패키지 버전을 사용
- 
- #: dnf/cli/option_parser.py:223
- msgid "do not limit the transaction to the best candidate"
--msgstr ""
-+msgstr "트랜잭션을 최선의 선택으로 제한하지 마십시오"
- 
- #: dnf/cli/option_parser.py:226
- msgid "run entirely from system cache, don't update cache"
-@@ -2396,6 +2466,8 @@ msgid ""
- "enables {prog}'s obsoletes processing logic for upgrade or display "
- "capabilities that the package obsoletes for info, list and repoquery"
- msgstr ""
-+"패키지가 정보, 목록 및 repoquery에 더 이상 사용하지 않는 업그레이드 또는 표시 기능을 위해 {prog}의 더 이상 사용되지 "
-+"않는 처리 로직을 활성화합니다."
- 
- #: dnf/cli/option_parser.py:251
- msgid "debugging output level for rpm"
-@@ -2407,37 +2479,37 @@ msgstr "모든 질문에 대해 자동으로 대답하십시오."
- 
- #: dnf/cli/option_parser.py:257
- msgid "automatically answer no for all questions"
--msgstr "모든 질문에 대해 자동으로 대답합니다."
-+msgstr "모든 질문에 대해 자동으로 대답합니다"
- 
- #: dnf/cli/option_parser.py:261
- msgid ""
- "Enable additional repositories. List option. Supports globs, can be "
- "specified multiple times."
--msgstr ""
-+msgstr "추가 리포지토리를 활성화하십시오. 리스트 옵션. glob를 지원하며 여러 번 지정할 수 있습니다."
- 
- #: dnf/cli/option_parser.py:266
- msgid ""
- "Disable repositories. List option. Supports globs, can be specified multiple"
- " times."
--msgstr ""
-+msgstr "리포지토리를 비활성화합니다. 리스트 옵션. glob를 지원하며 여러 번 지정할 수 있습니다."
- 
- #: dnf/cli/option_parser.py:270
- msgid ""
- "enable just specific repositories by an id or a glob, can be specified "
- "multiple times"
--msgstr "id 나 glob로 특정 리포지토리를 활성화 할 수 있습니다. 여러 번 지정할 수 있습니다."
-+msgstr "id 나 glob로 특정 리포지토리를 활성화 할 수 있습니다. 여러 번 지정할 수 있습니다"
- 
- #: dnf/cli/option_parser.py:275
- msgid "enable repos with config-manager command (automatically saves)"
--msgstr ""
-+msgstr "config-manager 명령으로 repos를 활성화합니다 (자동 저장)"
- 
- #: dnf/cli/option_parser.py:279
- msgid "disable repos with config-manager command (automatically saves)"
--msgstr ""
-+msgstr "config-manager 명령으로 repos를 비활성화합니다 (자동 저장)"
- 
- #: dnf/cli/option_parser.py:283
- msgid "exclude packages by name or glob"
--msgstr "패키지를 이름이나 glob로 제외합니다."
-+msgstr "패키지를 이름이나 glob로 제외합니다"
- 
- #: dnf/cli/option_parser.py:288
- msgid "disable excludepkgs"
-@@ -2447,7 +2519,7 @@ msgstr "excludepkgs 사용 중지"
- msgid ""
- "label and path to an additional repository to use (same path as in a "
- "baseurl), can be specified multiple times."
--msgstr ""
-+msgstr "사용할 추가 저장소에 대한 레이블 및 경로 (baseurl과 동일한 경로)를 여러 번 지정할 수 있습니다."
- 
- #: dnf/cli/option_parser.py:297
- msgid "disable removal of dependencies that are no longer used"
-@@ -2455,7 +2527,7 @@ msgstr "더 이상 사용되지 않는 종속성 제거 사용 안 함"
- 
- #: dnf/cli/option_parser.py:300
- msgid "disable gpg signature checking (if RPM policy allows)"
--msgstr ""
-+msgstr "gpg 서명 확인 비활성화 (RPM 정책이 허용하는 경우)"
- 
- #: dnf/cli/option_parser.py:302
- msgid "control whether color is used"
-@@ -2475,7 +2547,7 @@ msgstr "IPv6 주소로만 해결"
- 
- #: dnf/cli/option_parser.py:314
- msgid "set directory to copy packages to"
--msgstr "패키지를 복사 할 디렉토리를 설정하십시오."
-+msgstr "패키지를 복사 할 디렉토리를 설정하십시오"
- 
- #: dnf/cli/option_parser.py:317
- msgid "only download packages"
-@@ -2483,11 +2555,11 @@ msgstr "다운로드 패키지 만"
- 
- #: dnf/cli/option_parser.py:319
- msgid "add a comment to transaction"
--msgstr "거래에 의견을 추가하십시오."
-+msgstr "트랜잭션에 의견을 추가하십시오"
- 
- #: dnf/cli/option_parser.py:322
- msgid "Include bugfix relevant packages, in updates"
--msgstr "버그 수정 관련 패키지를 업데이트에 포함 시키십시오."
-+msgstr "버그 수정 관련 패키지를 업데이트에 포함 시키십시오"
- 
- #: dnf/cli/option_parser.py:325
- msgid "Include enhancement relevant packages, in updates"
-@@ -2495,7 +2567,7 @@ msgstr "업데이트 관련 향상 패키지 포함"
- 
- #: dnf/cli/option_parser.py:328
- msgid "Include newpackage relevant packages, in updates"
--msgstr "새 패키지 관련 패키지를 업데이트에 포함하십시오."
-+msgstr "새 패키지 관련 패키지를 업데이트에 포함하십시오"
- 
- #: dnf/cli/option_parser.py:331
- msgid "Include security relevant packages, in updates"
-@@ -2503,11 +2575,11 @@ msgstr "업데이트에 보안 관련 패키지 포함"
- 
- #: dnf/cli/option_parser.py:335
- msgid "Include packages needed to fix the given advisory, in updates"
--msgstr "업데이트에서 주어진 권고를 수정하는 데 필요한 패키지를 포함하십시오."
-+msgstr "업데이트에서 주어진 권고를 수정하는 데 필요한 패키지를 포함하십시오"
- 
- #: dnf/cli/option_parser.py:339
- msgid "Include packages needed to fix the given BZ, in updates"
--msgstr "업데이트에서 주어진 BZ를 수정하는 데 필요한 패키지를 포함하십시오."
-+msgstr "업데이트에서 주어진 BZ를 수정하는 데 필요한 패키지를 포함하십시오"
- 
- #: dnf/cli/option_parser.py:342
- msgid "Include packages needed to fix the given CVE, in updates"
-@@ -2515,7 +2587,7 @@ msgstr "업데이트에서 주어진 CVE를 수정하는 데 필요한 패키지
- 
- #: dnf/cli/option_parser.py:347
- msgid "Include security relevant packages matching the severity, in updates"
--msgstr "업데이트에서 심각도와 일치하는 보안 관련 패키지를 포함합니다."
-+msgstr "업데이트에서 심각도와 일치하는 보안 관련 패키지를 포함합니다"
- 
- #: dnf/cli/option_parser.py:353
- msgid "Force the use of an architecture"
-@@ -2530,10 +2602,10 @@ msgid "List of Plugin Commands:"
- msgstr "플러그인 명령리스트 :"
- 
- #: dnf/cli/option_parser.py:413
--#, fuzzy, python-format
-+#, python-format
- #| msgid "No match for argument: %s"
- msgid "Cannot encode argument '%s': %s"
--msgstr "인수와 일치하는 항목 없음 : %s"
-+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
-@@ -2541,7 +2613,7 @@ msgstr "인수와 일치하는 항목 없음 : %s"
- #: dnf/cli/output.py:505
- msgctxt "short"
- msgid "Name"
--msgstr ""
-+msgstr "이름"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:511
-@@ -2552,16 +2624,16 @@ 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:1327
-+#: dnf/cli/output.py:512 dnf/cli/output.py:1335
- msgctxt "short"
- msgid "Version"
--msgstr ""
-+msgstr "버전"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:513 dnf/cli/output.py:1337
- msgctxt "long"
- msgid "Version"
--msgstr ""
-+msgstr "버전"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:516
-@@ -2570,32 +2642,32 @@ 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:1318
-+#: dnf/cli/output.py:517 dnf/cli/output.py:1326
- msgctxt "short"
- msgid "Arch"
--msgstr ""
-+msgstr "아키텍처"
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1321
-+#: dnf/cli/output.py:518 dnf/cli/output.py:1329
- msgctxt "long"
- msgid "Architecture"
--msgstr ""
-+msgstr "아키텍처"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1352
- msgctxt "long"
- msgid "Size"
--msgstr ""
-+msgstr "크기"
- 
- #. Translators: This is the short version of 'Size'. It should
- #. 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:1342
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1350
- msgctxt "short"
- msgid "Size"
--msgstr ""
-+msgstr "크기"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:524
-@@ -2604,22 +2676,22 @@ 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:1333
-+#: dnf/cli/output.py:525 dnf/cli/output.py:1341
- msgctxt "short"
- msgid "Repo"
--msgstr ""
-+msgstr "리포지터리"
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1336
-+#: dnf/cli/output.py:526 dnf/cli/output.py:1344
- msgctxt "long"
- msgid "Repository"
--msgstr ""
-+msgstr "리포지터리"
- 
- #. Translators: This message should be no longer than 12 chars.
- #: dnf/cli/output.py:533
- msgid "From repo"
--msgstr "레포에서"
-+msgstr "리포지터리에서"
- 
- #. :hawkey does not support changelog information
- #. print(_("Committer   : %s") % ucd(pkg.committer))
-@@ -2627,22 +2699,22 @@ msgstr "레포에서"
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:539
- msgid "Packager"
--msgstr ""
-+msgstr "패키저"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:541
- msgid "Buildtime"
--msgstr ""
-+msgstr "빌드 타임"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:545
- msgid "Install time"
--msgstr ""
-+msgstr "설치 시간"
- 
- #. Translators: This message should be no longer than 12 chars.
- #: dnf/cli/output.py:554
- msgid "Installed by"
--msgstr ""
-+msgstr "설치됨"
- 
- #. Translators: This is abbreviated 'Summary'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
-@@ -2650,12 +2722,12 @@ msgstr ""
- #: dnf/cli/output.py:558
- msgctxt "short"
- msgid "Summary"
--msgstr ""
-+msgstr "요약"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:564
- msgid "License"
--msgstr ""
-+msgstr "특허"
- 
- #. Translators: This is abbreviated 'Description'. Should be no longer
- #. than 12 characters. You can use the full version if it is short
-@@ -2663,163 +2735,163 @@ msgstr ""
- #: dnf/cli/output.py:568
- msgctxt "short"
- msgid "Description"
--msgstr ""
-+msgstr "설명"
- 
- #: dnf/cli/output.py:695
- msgid "No packages to list"
--msgstr ""
-+msgstr "목록에 패키지가 없습니다"
- 
- #: dnf/cli/output.py:706
- msgid "y"
--msgstr ""
-+msgstr "y"
- 
- #: dnf/cli/output.py:706
- msgid "yes"
--msgstr ""
-+msgstr "예"
- 
- #: dnf/cli/output.py:707
- msgid "n"
--msgstr ""
-+msgstr "n"
- 
- #: dnf/cli/output.py:707
- msgid "no"
--msgstr ""
-+msgstr "아니요"
- 
- #: dnf/cli/output.py:711
- msgid "Is this ok [y/N]: "
--msgstr ""
-+msgstr "정말입니까 [y/N]: "
- 
- #: dnf/cli/output.py:715
- msgid "Is this ok [Y/n]: "
--msgstr ""
-+msgstr "정말입니까 [Y/n]: "
- 
- #: dnf/cli/output.py:795
- #, python-format
- msgid "Group: %s"
--msgstr ""
-+msgstr "그룹 %s"
- 
- #: dnf/cli/output.py:799
- #, python-format
- msgid " Group-Id: %s"
--msgstr ""
-+msgstr " 그룹 ID: %s"
- 
- #: dnf/cli/output.py:801 dnf/cli/output.py:840
- #, python-format
- msgid " Description: %s"
--msgstr ""
-+msgstr " 설명: %s"
- 
- #: dnf/cli/output.py:803
- #, python-format
- msgid " Language: %s"
--msgstr ""
-+msgstr " 언어: %s"
- 
- #: dnf/cli/output.py:806
- msgid " Mandatory Packages:"
--msgstr ""
-+msgstr " 필수 패키지 :"
- 
- #: dnf/cli/output.py:807
- msgid " Default Packages:"
--msgstr ""
-+msgstr " 기본 패키지 :"
- 
- #: dnf/cli/output.py:808
- msgid " Optional Packages:"
--msgstr ""
-+msgstr " 선택적인 패키지 :"
- 
- #: dnf/cli/output.py:809
- msgid " Conditional Packages:"
--msgstr ""
-+msgstr " 추가 패키지 :"
- 
- #: dnf/cli/output.py:834
- #, python-format
- msgid "Environment Group: %s"
--msgstr ""
-+msgstr "환경 그룹 : %s"
- 
- #: dnf/cli/output.py:837
- #, python-format
- msgid " Environment-Id: %s"
--msgstr ""
-+msgstr " 환경 -ID : %s"
- 
- #: dnf/cli/output.py:843
- msgid " Mandatory Groups:"
--msgstr ""
-+msgstr " 필수 그룹 :"
- 
- #: dnf/cli/output.py:844
- msgid " Optional Groups:"
--msgstr ""
-+msgstr " 선택적인 그룹 :"
- 
- #: dnf/cli/output.py:865
- msgid "Matched from:"
--msgstr ""
-+msgstr "일치하는 항목 :"
- 
- #: dnf/cli/output.py:879
- #, python-format
- msgid "Filename    : %s"
--msgstr ""
-+msgstr "파일 이름 : %s"
- 
- #: dnf/cli/output.py:904
- #, python-format
- msgid "Repo        : %s"
--msgstr ""
-+msgstr "리포지토리      : %s"
- 
- #: dnf/cli/output.py:913
- msgid "Description : "
--msgstr ""
-+msgstr "설명 : "
- 
- #: dnf/cli/output.py:917
- #, python-format
- msgid "URL         : %s"
--msgstr ""
-+msgstr "URL         : %s"
- 
- #: dnf/cli/output.py:921
- #, python-format
- msgid "License     : %s"
--msgstr ""
-+msgstr "라이센스    : %s"
- 
- #: dnf/cli/output.py:927
- #, python-format
- msgid "Provide    : %s"
--msgstr ""
-+msgstr "제공        : %s"
- 
- #: dnf/cli/output.py:947
- #, python-format
- msgid "Other       : %s"
--msgstr ""
-+msgstr "기타       : %s"
- 
- #: dnf/cli/output.py:996
- msgid "There was an error calculating total download size"
--msgstr ""
-+msgstr "총 다운로드 크기를 계산하는 중에 오류가 발생했습니다"
- 
- #: dnf/cli/output.py:1002
- #, python-format
- msgid "Total size: %s"
--msgstr ""
-+msgstr "전체 크기: %s"
- 
- #: dnf/cli/output.py:1005
- #, python-format
- msgid "Total download size: %s"
--msgstr ""
-+msgstr "총 다운로드 크기 : %s"
- 
- #: dnf/cli/output.py:1008
- #, python-format
- msgid "Installed size: %s"
--msgstr ""
-+msgstr "설치된 크기 : %s"
- 
- #: dnf/cli/output.py:1026
- msgid "There was an error calculating installed size"
--msgstr ""
-+msgstr "설치된 크기를 계산하는 동안 오류가 발생했습니다"
- 
- #: dnf/cli/output.py:1030
- #, python-format
- msgid "Freed space: %s"
--msgstr ""
-+msgstr "사용 가능한 공간 : %s"
- 
- #: dnf/cli/output.py:1039
- msgid "Marking packages as installed by the group:"
--msgstr ""
-+msgstr "그룹이 설치한 패키지 표시:"
- 
- #: dnf/cli/output.py:1046
- msgid "Marking packages as removed by the group:"
--msgstr ""
-+msgstr "그룹에 의해 제거된 패키지 표시:"
- 
- #: dnf/cli/output.py:1056
- msgid "Group"
-@@ -2831,37 +2903,37 @@ msgstr "패키지"
- 
- #: dnf/cli/output.py:1133
- msgid "Installing group/module packages"
--msgstr ""
-+msgstr "그룹 / 모듈 패키지 설치"
- 
- #: dnf/cli/output.py:1134
- msgid "Installing group packages"
--msgstr ""
-+msgstr "패키지 그룹 설치"
- 
- #. TRANSLATORS: This is for a list of packages to be installed.
- #: dnf/cli/output.py:1138
- msgctxt "summary"
- msgid "Installing"
--msgstr ""
-+msgstr "설치 중"
- 
- #. TRANSLATORS: This is for a list of packages to be upgraded.
- #: dnf/cli/output.py:1140
- msgctxt "summary"
- msgid "Upgrading"
--msgstr ""
-+msgstr "업그레이드"
- 
- #. TRANSLATORS: This is for a list of packages to be reinstalled.
- #: dnf/cli/output.py:1142
- msgctxt "summary"
- msgid "Reinstalling"
--msgstr ""
-+msgstr "재설치"
- 
- #: dnf/cli/output.py:1144
- msgid "Installing dependencies"
--msgstr ""
-+msgstr "종속 패키지 설치"
- 
- #: dnf/cli/output.py:1145
- msgid "Installing weak dependencies"
--msgstr ""
-+msgstr "취약한 종속 패키지 설치"
- 
- #. TRANSLATORS: This is for a list of packages to be removed.
- # translation auto-copied from project subscription-manager, version 1.11.X,
-@@ -2872,402 +2944,407 @@ msgstr "삭제 중"
- 
- #: dnf/cli/output.py:1148
- msgid "Removing dependent packages"
--msgstr ""
-+msgstr "종속 패키지 제거"
- 
- #: dnf/cli/output.py:1149
- msgid "Removing unused dependencies"
--msgstr ""
-+msgstr "사용하지 않는 종속 패키지 제거"
- 
- #. TRANSLATORS: This is for a list of packages to be downgraded.
- #: dnf/cli/output.py:1151
- msgctxt "summary"
- msgid "Downgrading"
--msgstr ""
-+msgstr "다운그레이드 중"
- 
- #: dnf/cli/output.py:1176
- msgid "Installing module profiles"
--msgstr ""
-+msgstr "모듈 프로파일 설치"
- 
- #: dnf/cli/output.py:1185
- msgid "Disabling module profiles"
--msgstr ""
-+msgstr "모듈 프로파일 비활성화"
- 
- #: dnf/cli/output.py:1194
- msgid "Enabling module streams"
--msgstr ""
-+msgstr "모듈 스트림 활성화"
- 
- #: dnf/cli/output.py:1202
- msgid "Switching module streams"
--msgstr ""
-+msgstr "모듈 스트림 전환"
- 
- #: dnf/cli/output.py:1210
- msgid "Disabling modules"
--msgstr ""
-+msgstr "모듈 비활성화"
- 
- #: dnf/cli/output.py:1218
- msgid "Resetting modules"
--msgstr ""
-+msgstr "모듈 재설정"
- 
--#: dnf/cli/output.py:1226
-+#: dnf/cli/output.py:1230
- msgid "Installing Environment Groups"
--msgstr ""
-+msgstr "환경 그룹 설치"
- 
--#: dnf/cli/output.py:1233
-+#: dnf/cli/output.py:1237
- msgid "Upgrading Environment Groups"
--msgstr ""
-+msgstr "환경 그룹 업그레이드"
- 
--#: dnf/cli/output.py:1240
-+#: dnf/cli/output.py:1244
- msgid "Removing Environment Groups"
--msgstr ""
-+msgstr "환경 그룹 제거"
- 
--#: dnf/cli/output.py:1247
-+#: dnf/cli/output.py:1251
- msgid "Installing Groups"
--msgstr ""
-+msgstr "그룹 설치"
- 
--#: dnf/cli/output.py:1254
-+#: dnf/cli/output.py:1258
- msgid "Upgrading Groups"
--msgstr ""
-+msgstr "그룹 업그레이드"
- 
--#: dnf/cli/output.py:1261
-+#: dnf/cli/output.py:1265
- msgid "Removing Groups"
--msgstr ""
-+msgstr "그룹 제거"
- 
--#: dnf/cli/output.py:1277
-+#: dnf/cli/output.py:1281
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
- "(add '%s' to command line to force their upgrade)"
- msgstr ""
-+"충돌 패키지 건너 뛰기 :\n"
-+"(업그리에드를 강제하기 위해 명령행에 '%s'을/를 추가하십시오)"
- 
--#: dnf/cli/output.py:1285
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
--msgstr ""
-+msgstr "%s 종속성이 깨진 패키지 건너 뛰기"
- 
--#: dnf/cli/output.py:1289
-+#: dnf/cli/output.py:1295
- msgid " or part of a group"
--msgstr ""
-+msgstr " 또는 그룹의 일부"
- 
- #. Translators: This is the short version of 'Package'. You can
- #. 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:1312
-+#: dnf/cli/output.py:1320
- msgctxt "short"
- msgid "Package"
--msgstr ""
-+msgstr "패키지"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
- #. This is also a hack to resolve RhBug 1302935 correctly.
--#: dnf/cli/output.py:1314 dnf/cli/output.py:2007
-+#: dnf/cli/output.py:1322 dnf/cli/output.py:2023
- msgctxt "long"
- msgid "Package"
--msgstr ""
-+msgstr "패키지"
- 
--#: dnf/cli/output.py:1363
-+#: dnf/cli/output.py:1371
- msgid "replacing"
--msgstr ""
-+msgstr "교체"
- 
--#: dnf/cli/output.py:1370
-+#: dnf/cli/output.py:1378
- #, python-format
- msgid ""
- "\n"
- "Transaction Summary\n"
- "%s\n"
- msgstr ""
-+"\n"
-+"트랜잭션 요약\n"
-+"%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1375 dnf/cli/output.py:1914 dnf/cli/output.py:1915
-+#: dnf/cli/output.py:1383 dnf/cli/output.py:1930 dnf/cli/output.py:1931
- msgid "Install"
- msgstr "설치"
- 
- # ctx::sourcefile::Navigation Menu
--#: dnf/cli/output.py:1379 dnf/cli/output.py:1923
-+#: dnf/cli/output.py:1387 dnf/cli/output.py:1939
- msgid "Upgrade"
- msgstr "업그레이드"
- 
--#: dnf/cli/output.py:1380
-+#: dnf/cli/output.py:1388
- msgid "Remove"
- msgstr "삭제"
- 
--#: dnf/cli/output.py:1382 dnf/cli/output.py:1921
-+#: dnf/cli/output.py:1390 dnf/cli/output.py:1937
- msgid "Downgrade"
- msgstr "다운 그레이드"
- 
--#: dnf/cli/output.py:1383
-+#: dnf/cli/output.py:1391
- msgid "Skip"
- msgstr "버킷"
- 
--#: dnf/cli/output.py:1392 dnf/cli/output.py:1408
-+#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
- msgid "Package"
- msgid_plural "Packages"
--msgstr[0] ""
-+msgstr[0] "패키지"
- 
--#: dnf/cli/output.py:1410
-+#: dnf/cli/output.py:1418
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "의존 패키지"
- 
--#: dnf/cli/output.py:1489 dnf/cli/output.py:1756 dnf/cli/output.py:1924
-+#: dnf/cli/output.py:1497 dnf/cli/output.py:1771 dnf/cli/output.py:1940
- msgid "Upgraded"
- msgstr "업그레이드 됨"
- 
--#: dnf/cli/output.py:1490 dnf/cli/output.py:1756 dnf/cli/output.py:1922
-+#: dnf/cli/output.py:1498 dnf/cli/output.py:1771 dnf/cli/output.py:1938
- msgid "Downgraded"
- msgstr "다운 그레이드"
- 
--#: dnf/cli/output.py:1495
-+#: dnf/cli/output.py:1503
- msgid "Reinstalled"
- msgstr "다시 설치됨"
- 
--#: dnf/cli/output.py:1496
-+#: dnf/cli/output.py:1504
- msgid "Skipped"
--msgstr ""
-+msgstr "건너 뛰기됨"
- 
--#: dnf/cli/output.py:1497
-+#: dnf/cli/output.py:1505
- msgid "Removed"
- msgstr "제거됨"
- 
--#: dnf/cli/output.py:1500
-+#: 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:1551
-+#: dnf/cli/output.py:1559
- msgid "Total"
- msgstr "합계"
- 
--#: dnf/cli/output.py:1579
-+#: dnf/cli/output.py:1587
- msgid "<unset>"
- msgstr "<unset>"
- 
--#: dnf/cli/output.py:1580
-+#: dnf/cli/output.py:1588
- msgid "System"
- msgstr "시스템"
- 
--#: dnf/cli/output.py:1630
-+#: dnf/cli/output.py:1638
- msgid "Command line"
- msgstr "명령행"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1634
-+#: dnf/cli/output.py:1649
- msgid "User name"
- msgstr "사용자 이름"
- 
- #. REALLY Needs to use columns!
- # translation auto-copied from project subscription-manager, version 1.11.X,
- # document keys
--#: dnf/cli/output.py:1636 dnf/cli/output.py:2004
-+#: dnf/cli/output.py:1651 dnf/cli/output.py:2020
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1653
- msgid "Date and time"
- msgstr "날짜와 시간"
- 
--#: dnf/cli/output.py:1639 dnf/cli/output.py:2005
-+#: dnf/cli/output.py:1654 dnf/cli/output.py:2021
- msgid "Action(s)"
--msgstr "행위)"
-+msgstr "동작"
- 
--#: dnf/cli/output.py:1640
-+#: dnf/cli/output.py:1655
- msgid "Altered"
--msgstr ""
-+msgstr "변경"
- 
--#: dnf/cli/output.py:1681
-+#: dnf/cli/output.py:1696
- msgid "No transactions"
--msgstr "거래 없음"
-+msgstr "트랜잭션 없음"
- 
--#: dnf/cli/output.py:1682 dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1697 dnf/cli/output.py:1713
- msgid "Failed history info"
--msgstr ""
-+msgstr "실패 기록 정보"
- 
--#: dnf/cli/output.py:1697
-+#: dnf/cli/output.py:1712
- msgid "No transaction ID, or package, given"
--msgstr ""
-+msgstr "트랜잭션 ID 또는 패키지가 지정되지 않았습니다"
- 
--#: dnf/cli/output.py:1755
-+#: dnf/cli/output.py:1770
- msgid "Erased"
--msgstr ""
-+msgstr "삭제됨"
- 
--#: dnf/cli/output.py:1757
-+#: dnf/cli/output.py:1772
- msgid "Not installed"
- msgstr "설치되지 않음"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Newer"
--msgstr ""
-+msgstr "최신"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Older"
--msgstr ""
-+msgstr "이전"
- 
--#: dnf/cli/output.py:1806 dnf/cli/output.py:1808
-+#: dnf/cli/output.py:1821 dnf/cli/output.py:1823
- msgid "Transaction ID :"
--msgstr ""
-+msgstr "트랜잭션 ID :"
- 
--#: dnf/cli/output.py:1811
-+#: dnf/cli/output.py:1826
- msgid "Begin time     :"
--msgstr ""
-+msgstr "시작 시간 :"
- 
--#: dnf/cli/output.py:1814 dnf/cli/output.py:1816
-+#: dnf/cli/output.py:1829 dnf/cli/output.py:1831
- msgid "Begin rpmdb    :"
--msgstr ""
-+msgstr "rpmdb 시작 :"
- 
--#: dnf/cli/output.py:1822
-+#: dnf/cli/output.py:1837
- #, python-format
- msgid "(%u seconds)"
--msgstr ""
-+msgstr "(%u 초)"
- 
--#: dnf/cli/output.py:1824
-+#: dnf/cli/output.py:1839
- #, python-format
- msgid "(%u minutes)"
--msgstr ""
-+msgstr "(%u 분)"
- 
--#: dnf/cli/output.py:1826
-+#: dnf/cli/output.py:1841
- #, python-format
- msgid "(%u hours)"
--msgstr ""
-+msgstr "(%u 시간)"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1843
- #, python-format
- msgid "(%u days)"
--msgstr ""
-+msgstr "(%u 일)"
- 
--#: dnf/cli/output.py:1829
-+#: dnf/cli/output.py:1844
- msgid "End time       :"
--msgstr ""
-+msgstr "종료 시간 :"
- 
--#: dnf/cli/output.py:1832 dnf/cli/output.py:1834
-+#: dnf/cli/output.py:1847 dnf/cli/output.py:1849
- msgid "End rpmdb      :"
--msgstr ""
-+msgstr "rpmdb 종료:"
- 
--#: dnf/cli/output.py:1841 dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1856 dnf/cli/output.py:1858
- msgid "User           :"
--msgstr ""
-+msgstr "사용자            :"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1854
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1869
- msgid "Aborted"
--msgstr ""
-+msgstr "중지됨"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1850 dnf/cli/output.py:1852
--#: dnf/cli/output.py:1854 dnf/cli/output.py:1856 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1865 dnf/cli/output.py:1867
-+#: dnf/cli/output.py:1869 dnf/cli/output.py:1871 dnf/cli/output.py:1873
- msgid "Return-Code    :"
--msgstr ""
-+msgstr "반환 코드 :"
- 
--#: dnf/cli/output.py:1850 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1865 dnf/cli/output.py:1873
- msgid "Success"
- msgstr "성공"
- 
--#: dnf/cli/output.py:1852
-+#: dnf/cli/output.py:1867
- msgid "Failures:"
--msgstr ""
-+msgstr "실패 :"
- 
--#: dnf/cli/output.py:1856
-+#: dnf/cli/output.py:1871
- msgid "Failure:"
- msgstr "실패:"
- 
--#: dnf/cli/output.py:1866 dnf/cli/output.py:1868
-+#: dnf/cli/output.py:1881 dnf/cli/output.py:1883
- msgid "Releasever     :"
- msgstr "릴리스 자 :"
- 
--#: dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1888 dnf/cli/output.py:1890
- msgid "Command Line   :"
- msgstr "명령 줄 :"
- 
--#: dnf/cli/output.py:1881
-+#: dnf/cli/output.py:1895 dnf/cli/output.py:1897
- msgid "Comment        :"
- msgstr "댓글 :"
- 
--#: dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1901
- msgid "Transaction performed with:"
--msgstr "수행 된 거래 :"
-+msgstr "수행된 트랜잭션:"
- 
--#: dnf/cli/output.py:1894
-+#: dnf/cli/output.py:1910
- msgid "Packages Altered:"
- msgstr "변경된 패키지 :"
- 
--#: dnf/cli/output.py:1900
-+#: dnf/cli/output.py:1916
- msgid "Scriptlet output:"
- msgstr "스크립트 렛 출력 :"
- 
--#: dnf/cli/output.py:1907
-+#: dnf/cli/output.py:1923
- msgid "Errors:"
- msgstr "오류 :"
- 
--#: dnf/cli/output.py:1916
-+#: dnf/cli/output.py:1932
- msgid "Dep-Install"
- msgstr "설치 제거"
- 
--#: dnf/cli/output.py:1917
-+#: dnf/cli/output.py:1933
- msgid "Obsoleted"
- msgstr "폐기 된"
- 
--#: dnf/cli/output.py:1918 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1934 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "폐기"
- 
--#: dnf/cli/output.py:1919
-+#: dnf/cli/output.py:1935
- msgid "Erase"
- msgstr "삭제"
- 
--#: dnf/cli/output.py:1920
-+#: dnf/cli/output.py:1936
- msgid "Reinstall"
- msgstr "재설치"
- 
--#: dnf/cli/output.py:1995
-+#: dnf/cli/output.py:2011
- msgid "Bad transaction IDs, or package(s), given"
- msgstr "잘못된 트랜잭션 ID 또는 주어진 패키지"
- 
--#: dnf/cli/output.py:2094
-+#: dnf/cli/output.py:2110
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
--msgstr "---> 패키지 %s.%s %s 설치 될 것이다"
-+msgstr "---> 패키지 %s.%s %s이/가 설치됩니다"
- 
--#: dnf/cli/output.py:2096
-+#: dnf/cli/output.py:2112
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
--msgstr "---> 패키지 %s.%s %s 업그레이드 될 것이다."
-+msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다"
- 
--#: dnf/cli/output.py:2098
-+#: dnf/cli/output.py:2114
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
--msgstr "---> 패키지 %s.%s %s 지워질거야."
-+msgstr "---> 패키지 %s.%s %s이/가 제거됩니다"
- 
--#: dnf/cli/output.py:2100
-+#: dnf/cli/output.py:2116
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
--msgstr "---> 패키지 %s.%s %s 다시 설치됩니다."
-+msgstr "---> 패키지 %s.%s %s이/가 다시 설치됩니다"
- 
--#: dnf/cli/output.py:2102
-+#: dnf/cli/output.py:2118
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
--msgstr "---> 패키지 %s.%s %s 다운 그레이드 될 것이다"
-+msgstr "---> 패키지 %s.%s %s이/가 다운그레이드됩니다"
- 
--#: dnf/cli/output.py:2104
-+#: dnf/cli/output.py:2120
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
--msgstr "---> 패키지 %s.%s %s 쓸데없는"
-+msgstr "---> 패키지 %s.%s %s이/가 폐기됩니다"
- 
--#: dnf/cli/output.py:2106
-+#: dnf/cli/output.py:2122
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
--msgstr "---> 패키지 %s.%s %s 업그레이드 될 것이다."
-+msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다"
- 
--#: dnf/cli/output.py:2108
-+#: dnf/cli/output.py:2124
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
--msgstr "---> 패키지 %s.%s %s 쓸모 없게 될 것이다."
-+msgstr "---> 패키지 %s.%s %s이/가 폐기됩니다"
- 
--#: dnf/cli/output.py:2117
-+#: dnf/cli/output.py:2133
- msgid "--> Starting dependency resolution"
--msgstr ""
-+msgstr "-> 종석성 해결 시작"
- 
--#: dnf/cli/output.py:2122
-+#: dnf/cli/output.py:2138
- msgid "--> Finished dependency resolution"
--msgstr ""
-+msgstr "-> 종속성 해결 완료"
- 
--#: dnf/cli/output.py:2136 dnf/crypto.py:132
-+#: dnf/cli/output.py:2152 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3329,36 +3406,36 @@ msgstr "    시작: %s - %s 분 전"
- msgid "    State  : %s"
- msgstr "    상태  : %s"
- 
--#: dnf/comps.py:95
-+#: dnf/comps.py:104
- msgid "skipping."
- msgstr "건너 뛰기."
- 
--#: dnf/comps.py:187 dnf/comps.py:689
-+#: dnf/comps.py:196 dnf/comps.py:698
- #, python-format
- msgid "Module or Group '%s' is not installed."
--msgstr ""
-+msgstr "모듈 또는 그룹 '%s'이/가 설치되지 않았습니다."
- 
--#: dnf/comps.py:189 dnf/comps.py:691
-+#: dnf/comps.py:198 dnf/comps.py:700
- #, python-format
- msgid "Module or Group '%s' is not available."
--msgstr ""
-+msgstr "모듈 또는 그룹 '%s'을/를 사용할 수 없습니다."
- 
--#: dnf/comps.py:191
-+#: dnf/comps.py:200
- #, python-format
- msgid "Module or Group '%s' does not exist."
--msgstr ""
-+msgstr "모듈 또는 그룹 '%s'이/가 존재하지 않습니다."
- 
--#: dnf/comps.py:610 dnf/comps.py:627
-+#: dnf/comps.py:619 dnf/comps.py:636
- #, python-format
- msgid "Environment '%s' is not installed."
- msgstr "환경 '%s'이 설치되지 않았습니다."
- 
--#: dnf/comps.py:629
-+#: dnf/comps.py:638
- #, python-format
- msgid "Environment '%s' is not available."
--msgstr ""
-+msgstr "환경 '%s'을/를 사용할 수 없습니다."
- 
--#: dnf/comps.py:657
-+#: dnf/comps.py:666
- #, python-format
- msgid "Group_id '%s' does not exist."
- msgstr "Group_id '%s' 존재하지 않는다."
-@@ -3370,13 +3447,15 @@ msgstr "구문 분석 중 오류 '%s': %s"
- 
- #: dnf/conf/config.py:226
- msgid "Could not set cachedir: {}"
--msgstr "cachedir : {}을 (를) 설정할 수 없습니다."
-+msgstr "cachedir : {}을 (를) 설정할 수 없습니다"
- 
- #: dnf/conf/config.py:275
- msgid ""
- "Configuration file URL \"{}\" could not be downloaded:\n"
- "  {}"
- msgstr ""
-+"구성 파일 URL \"{}\"을 (를) 다운로드 할 수 없습니다:\n"
-+"  {}"
- 
- #: dnf/conf/config.py:355 dnf/conf/config.py:391
- #, python-format
-@@ -3386,7 +3465,7 @@ msgstr "알 수없는 구성 옵션 : %s = %s"
- #: dnf/conf/config.py:372
- #, python-format
- msgid "Error parsing --setopt with key '%s', value '%s': %s"
--msgstr ""
-+msgstr "키 ‘%s', 값 '%s'을/를 사용하여 --setopt 구문 분석 오류: %s"
- 
- #: dnf/conf/config.py:380
- #, python-format
-@@ -3400,97 +3479,97 @@ msgstr "올바르지 않거나 알 수없는 \"{}\": {}"
- #: dnf/conf/config.py:501
- #, python-format
- msgid "Error parsing --setopt with key '%s.%s', value '%s': %s"
--msgstr ""
-+msgstr "키 %s.%s', 값 '%s'을/를 사용하여 --setopt 구문 분석 중 오류 발생: %s"
- 
- #: dnf/conf/config.py:504
- #, python-format
- msgid "Repo %s did not have a %s attr. before setopt"
--msgstr "레포 %s ~을 가지지 않았다. %s attr. setopt 전에"
-+msgstr "리포지터리 %s에 setopt 전에 %s 속성이 없습니다"
- 
- #: 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 = {} {}"
--msgstr ""
-+msgstr "리포지터리의 ID가 잘못되었습니다. {} ({}), byte = {} {}"
- 
- #: dnf/conf/read.py:67
- msgid "Bad id for repo: {}, byte = {} {}"
--msgstr ""
-+msgstr "리포지터리의 ID가 잘못되었습니다. {}, byte = {} {}"
- 
- #: dnf/conf/read.py:75
- msgid "Repository '{}' ({}): Error parsing config: {}"
--msgstr ""
-+msgstr "Repository '{}' ({}): 구문 분석 구성 오류: {}"
- 
- #: dnf/conf/read.py:78
- msgid "Repository '{}': Error parsing config: {}"
--msgstr ""
-+msgstr "Repository '{}' : 구문 분석 구성 오류: {}"
- 
- #: dnf/conf/read.py:84
- msgid "Repository '{}' ({}) is missing name in configuration, using id."
--msgstr ""
-+msgstr "Repository '{}' ({})의 구성에 이름이 누락되어 있습니다. id를 사용하십시오."
- 
- #: dnf/conf/read.py:87
- msgid "Repository '{}' is missing name in configuration, using id."
--msgstr ""
-+msgstr "Repository '{}'의 구성에 이름이 누락되어 있습니다. id를 사용하십시오."
- 
- #: dnf/conf/read.py:104
- msgid "Parsing file \"{}\" failed: {}"
--msgstr ""
-+msgstr "\"{}\" 파일을 구문 분석하지 못했습니다: {}"
- 
- #: dnf/crypto.py:108
- #, python-format
- msgid "repo %s: 0x%s already imported"
--msgstr "레포 %s: 0x%s 이미 수입"
-+msgstr "리포지터리 %s: 0x%s을/를 이미 가져왔습니다"
- 
- #: dnf/crypto.py:115
- #, python-format
- msgid "repo %s: imported key 0x%s."
--msgstr "레포 %s: 가져온 키 0x%s."
-+msgstr "리포지터리 %s: 0x%s 키를 가져왔습니다."
- 
--#: dnf/db/group.py:289
-+#: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
- "installed on the system"
--msgstr ""
-+msgstr "모듈 패키지 '{}'에 사용 가능한 메타 데이터가 없으며 시스템에 설치할 수 없습니다"
- 
--#: dnf/db/group.py:339
-+#: dnf/db/group.py:343
- msgid "No available modular metadata for modular package"
--msgstr ""
-+msgstr "모듈 패키지에 사용 가능한 모듈 메타 데이터가 없습니다"
- 
--#: dnf/db/group.py:373
-+#: dnf/db/group.py:377
- #, python-format
- msgid "Will not install a source rpm package (%s)."
- msgstr "소스 RPM패키지를 설치하지 않습니다 (%s)."
- 
--#: dnf/dnssec.py:169
-+#: dnf/dnssec.py:168
- msgid ""
- "Configuration option 'gpgkey_dns_verification' requires libunbound ({})"
--msgstr ""
-+msgstr "구성 옵션 'gpgkey_dns_verification'에는 libunbound ({})가 필요합니다"
- 
--#: dnf/dnssec.py:240
-+#: dnf/dnssec.py:239
- msgid "DNSSEC extension: Key for user "
--msgstr ""
-+msgstr "DNSSEC 확장 : 사용자 키 "
- 
--#: dnf/dnssec.py:242
-+#: dnf/dnssec.py:241
- msgid "is valid."
--msgstr ""
-+msgstr "유효합니다."
- 
--#: dnf/dnssec.py:244
-+#: dnf/dnssec.py:243
- msgid "has unknown status."
--msgstr ""
-+msgstr "알 수 없는 상태입니다."
- 
--#: dnf/dnssec.py:252
-+#: dnf/dnssec.py:251
- msgid "DNSSEC extension: "
--msgstr ""
-+msgstr "DNSSEC 확장: "
- 
--#: dnf/dnssec.py:284
-+#: dnf/dnssec.py:283
- msgid "Testing already imported keys for their validity."
--msgstr ""
-+msgstr "유효성 검사를 위해 이미 가져온 키를 테스트 중입니다."
- 
--#: dnf/drpm.py:62 dnf/repo.py:267
-+#: dnf/drpm.py:62 dnf/repo.py:268
- #, python-format
- msgid "unsupported checksum type: %s"
- msgstr "지원되지 않는 유형: %s"
-@@ -3501,7 +3580,7 @@ msgstr "델타 RPM을 다시 빌드하지 못했습니다"
- 
- #: dnf/drpm.py:146
- msgid "Checksum of the delta-rebuilt RPM failed"
--msgstr "델타 RPM의 체크섬이 일치하지 않습니다."
-+msgstr "델타 RPM의 체크섬이 일치하지 않습니다"
- 
- # translation auto-copied from project subscription-manager, version 1.9.X,
- # document keys
-@@ -3509,35 +3588,35 @@ msgstr "델타 RPM의 체크섬이 일치하지 않습니다."
- msgid "done"
- msgstr "완료"
- 
--#: dnf/exceptions.py:109
-+#: dnf/exceptions.py:113
- msgid "Problems in request:"
--msgstr ""
-+msgstr "요청 중인 문제 :"
- 
--#: dnf/exceptions.py:111
-+#: dnf/exceptions.py:115
- msgid "missing packages: "
--msgstr ""
-+msgstr "누락된 패키지: "
- 
--#: dnf/exceptions.py:113
-+#: dnf/exceptions.py:117
- msgid "broken packages: "
--msgstr ""
-+msgstr "잘못된 패키지: "
- 
--#: dnf/exceptions.py:115
-+#: dnf/exceptions.py:119
- msgid "missing groups or modules: "
--msgstr ""
-+msgstr "누락된 그룹 또는 모듈 : "
- 
--#: dnf/exceptions.py:117
-+#: dnf/exceptions.py:121
- msgid "broken groups or modules: "
--msgstr ""
-+msgstr "잘못된 그룹 또는 모듈: "
- 
--#: dnf/exceptions.py:122
-+#: dnf/exceptions.py:126
- msgid "Modular dependency problem with Defaults:"
- msgid_plural "Modular dependency problems with Defaults:"
--msgstr[0] ""
-+msgstr[0] "기본값의 모듈 종속성 문제 :"
- 
--#: dnf/exceptions.py:127 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:686
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
--msgstr[0] ""
-+msgstr[0] "모듈 종속성 문제 :"
- 
- #: dnf/lock.py:100
- #, python-format
-@@ -3545,6 +3624,8 @@ msgid ""
- "Malformed lock file found: %s.\n"
- "Ensure no other dnf/yum process is running and remove the lock file manually or run systemd-tmpfiles --remove dnf.conf."
- msgstr ""
-+"잘못된 잠금 파일이 발견되었습니다. %s \n"
-+"다른 dnf / yum 프로세스가 실행되고 있는지 확인하고 잠금 파일을 수동으로 제거하거나 systemd-tmpfiles --remove dnf.conf를 실행하십시오."
- 
- #: dnf/module/__init__.py:26
- msgid "Enabling different stream for '{}'."
-@@ -3572,6 +3653,9 @@ msgid ""
- "\n"
- "Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled"
- msgstr ""
-+"\n"
-+"\n"
-+"힌트 : [d] efault, [e] nabled, [x] disabled, [i] stalled"
- 
- #: dnf/module/module_base.py:34
- msgid ""
-@@ -3579,78 +3663,81 @@ msgid ""
- "\n"
- "Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive"
- msgstr ""
-+"\n"
-+"\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
- msgid "Ignoring unnecessary profile: '{}/{}'"
--msgstr ""
-+msgstr "불필요한 프로파일을 무시합니다: '{}/{}'"
- 
- #: dnf/module/module_base.py:84
- #, python-brace-format
- msgid "All matches for argument '{0}' in module '{1}:{2}' are not active"
--msgstr ""
-+msgstr "모듈 '{1}:{2}'의 인수 '{0}'에 대한 모든 일치 항목이 활성화되지 않았습니다"
- 
- #: dnf/module/module_base.py:92
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
--msgstr ""
-+msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 설치할 수 없습니다"
- 
- #: dnf/module/module_base.py:102
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
--msgstr ""
-+msgstr "인수 {}의 프로파일을 일치시킬 수 없습니다. '{}:{}'에 사용 가능한 프로파일: {}"
- 
- #: dnf/module/module_base.py:106
- msgid "Unable to match profile for argument {}"
--msgstr ""
-+msgstr "인수 {}에 대한 프로파일을 일치시킬 수 없습니다"
- 
- #: dnf/module/module_base.py:118
- msgid "No default profiles for module {}:{}. Available profiles: {}"
--msgstr ""
-+msgstr "{} : {} 모듈에 대한 기본 프로파일이 없습니다. 사용 가능한 프로파일: {}"
- 
- #: dnf/module/module_base.py:122
- msgid "No profiles for module {}:{}"
--msgstr ""
-+msgstr "{} : {} 모듈에 대한 프로파일이 없습니다"
- 
- #: dnf/module/module_base.py:129
- msgid "Default profile {} not available in module {}:{}"
--msgstr ""
-+msgstr "{} 모듈에서 기본 프로필 {}을 (를) 사용할 수 없음 : {}"
- 
- #: dnf/module/module_base.py:142
- msgid "Installing module from Fail-Safe repository is not allowed"
--msgstr ""
-+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
- msgid "Unable to resolve argument {}"
--msgstr ""
-+msgstr "인수 {}을 (를) 구문 분석할 수 없습니다"
- 
- #: dnf/module/module_base.py:160
- msgid "No match for package {}"
--msgstr ""
-+msgstr "{} 패키지와 일치하지 않습니다"
- 
- #: dnf/module/module_base.py:204
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
--msgstr ""
-+msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 업그레이드할 수 없습니다"
- 
- #: dnf/module/module_base.py:223 dnf/module/module_base.py:251
- msgid "Unable to match profile in argument {}"
--msgstr ""
-+msgstr "인수 {}에서 프로파일을 일치시킬 수 없습니다"
- 
- #: dnf/module/module_base.py:231
- msgid "Upgrading module from Fail-Safe repository is not allowed"
--msgstr ""
-+msgstr "Fail-Safe 리포지토리에서 모듈을 업그레이드할 수 없습니다"
- 
- #: dnf/module/module_base.py:367
- msgid ""
- "Only module name is required. Ignoring unneeded information in argument: "
- "'{}'"
--msgstr ""
-+msgstr "모듈 이름만 필요합니다. '{}'인수에서 불필요한 정보를 무시합니다"
- 
--#: dnf/package.py:295
-+#: dnf/package.py:298
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s: %s 확인 실패 : %s 대 %s"
-@@ -3659,7 +3746,7 @@ msgstr "%s: %s 확인 실패 : %s 대 %s"
- #: dnf/persistor.py:54
- #, python-format
- msgid "%s is empty file"
--msgstr "%s는 빈 파일입니다."
-+msgstr "%s는 빈 파일입니다"
- 
- #: dnf/persistor.py:98
- msgid "Failed storing last makecache time."
-@@ -3682,30 +3769,30 @@ msgstr "로드 된 플러그인 : %s"
- #: dnf/plugin.py:199
- #, python-format
- msgid "Failed loading plugin \"%s\": %s"
--msgstr ""
-+msgstr "플러그인 \"%s\"을/를 불러오지 못했습니다: %s"
- 
- #: dnf/plugin.py:231
- msgid "No matches found for the following enable plugin patterns: {}"
--msgstr ""
-+msgstr "다음의 활성 플러그인 패턴과 일치하는 항목이 없습니다: {}"
- 
- #: dnf/plugin.py:235
- msgid "No matches found for the following disable plugin patterns: {}"
--msgstr ""
-+msgstr "다음의 비활성화 플러그인 패턴과 일치하는 항목이 없습니다: {}"
- 
--#: dnf/repo.py:83
-+#: dnf/repo.py:84
- #, python-format
- msgid "no matching payload factory for %s"
- msgstr "에 대한 일치하는 페이로드 팩터가 없습니다. %s"
- 
--#: dnf/repo.py:110
-+#: dnf/repo.py:111
- msgid "Already downloaded"
- msgstr "이미 다운로드 됨"
- 
- #. pinging mirrors, this might take a while
--#: dnf/repo.py:346
-+#: dnf/repo.py:347
- #, python-format
- msgid "determining the fastest mirror (%s hosts).. "
--msgstr ""
-+msgstr "가장 빠른 미러 지정 (%s 호스트).. "
- 
- #: dnf/repodict.py:58
- #, python-format
-@@ -3719,13 +3806,13 @@ msgstr "추가됨 %s 에서 repo %s"
- 
- #: dnf/rpm/transaction.py:119
- msgid "Errors occurred during test transaction."
--msgstr ""
-+msgstr "트랜잭션 테스트 중에 오류가 발생했습니다."
- 
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
- msgctxt "currently"
- msgid "Downgrading"
--msgstr ""
-+msgstr "다운그레이드 중"
- 
- #: dnf/transaction.py:81 dnf/transaction.py:88 dnf/transaction.py:93
- #: dnf/transaction.py:95
-@@ -3736,13 +3823,13 @@ msgstr "정리"
- #: dnf/transaction.py:83
- msgctxt "currently"
- msgid "Installing"
--msgstr ""
-+msgstr "설치 중"
- 
- #. TRANSLATORS: This is for a single package currently being reinstalled.
- #: dnf/transaction.py:87
- msgctxt "currently"
- msgid "Reinstalling"
--msgstr ""
-+msgstr "재설치"
- 
- #. TODO: 'Removing'?
- #: dnf/transaction.py:90
-@@ -3753,7 +3840,7 @@ msgstr "삭제 중"
- #: dnf/transaction.py:92
- msgctxt "currently"
- msgid "Upgrading"
--msgstr ""
-+msgstr "업그레이드"
- 
- #: dnf/transaction.py:96
- msgid "Verifying"
-@@ -3773,12 +3860,12 @@ msgstr "문제"
- 
- #: dnf/util.py:444
- msgid "TransactionItem not found for key: {}"
--msgstr ""
-+msgstr "{} 키에 대한 트랜잭션 항목을 찾을 수 없습니다"
- 
- #: dnf/util.py:454
- msgid "TransactionSWDBItem not found for key: {}"
--msgstr ""
-+msgstr "{} 키에 대한 TransactionSWDBItem을 찾을 수 없습니다"
- 
- #: dnf/util.py:457
- msgid "Errors occurred during transaction."
--msgstr "거래 중에 오류가 발생했습니다."
-+msgstr "트랜잭션 중에 오류가 발생했습니다."
-diff --git a/po/zh_CN.po b/po/zh_CN.po
-index 8391f6bb..158a7ab0 100644
---- a/po/zh_CN.po
-+++ b/po/zh_CN.po
-@@ -29,7 +29,7 @@ msgid ""
- msgstr ""
- "Project-Id-Version: PACKAGE VERSION\n"
- "Report-Msgid-Bugs-To: \n"
--"POT-Creation-Date: 2020-03-19 09:18-0400\n"
-+"POT-Creation-Date: 2020-06-23 09:18-0400\n"
- "PO-Revision-Date: 2020-03-22 12:29+0000\n"
- "Last-Translator: Hongqiao Chen <harrychen0314@gmail.com>\n"
- "Language-Team: Chinese (Simplified) <https://translate.fedoraproject.org/projects/dnf/dnf-master/zh_CN/>\n"
-@@ -78,7 +78,7 @@ msgstr "使用 '%s' 发送邮件失败: %s"
- #: dnf/automatic/emitter.py:137
- #, python-format
- msgid "Failed to execute command '%s': returned %d"
--msgstr "无法执行命令  '%s' :返回 %d"
-+msgstr "无法执行命令 '%s' :返回 %d"
- 
- #: dnf/automatic/main.py:156 dnf/conf/config.py:151
- #, python-format
-@@ -90,16 +90,20 @@ msgstr "未知配置值: %s=%s 在 %s 中; %s"
- msgid "Unknown configuration option: %s = %s in %s"
- msgstr "未知配置选项:%s = %s 在 %s 中"
- 
--#: dnf/automatic/main.py:236
-+#: dnf/automatic/main.py:228 dnf/cli/cli.py:298
-+msgid "GPG check FAILED"
-+msgstr "GPG 检查失败"
-+
-+#: dnf/automatic/main.py:247
- msgid "Started dnf-automatic."
- msgstr "启动的 dnf-automatic。"
- 
--#: dnf/automatic/main.py:240
-+#: dnf/automatic/main.py:251
- #, python-format
- msgid "Sleep for %s seconds"
- msgstr "休眠 %s 秒"
- 
--#: dnf/automatic/main.py:271 dnf/cli/main.py:59 dnf/cli/main.py:80
-+#: dnf/automatic/main.py:283 dnf/cli/main.py:59 dnf/cli/main.py:80
- #: dnf/cli/main.py:83
- #, python-format
- msgid "Error: %s"
-@@ -211,7 +215,7 @@ msgstr "事务检查成功。"
- msgid "Running transaction test"
- msgstr "运行事务测试"
- 
--#: dnf/base.py:848 dnf/base.py:995
-+#: dnf/base.py:848 dnf/base.py:990
- msgid "RPM: {}"
- msgstr "RPM软件包: {}"
- 
-@@ -244,84 +248,84 @@ msgstr "错误汇总"
- #: dnf/base.py:945
- #, python-brace-format
- msgid "RPMDB altered outside of {prog}."
--msgstr ""
-+msgstr "RPMDB 在 {prog} 以外被修改。"
- 
--#: dnf/base.py:996 dnf/base.py:1004
-+#: dnf/base.py:991 dnf/base.py:999
- msgid "Could not run transaction."
- msgstr "不能执行事务。"
- 
--#: dnf/base.py:999
-+#: dnf/base.py:994
- msgid "Transaction couldn't start:"
- msgstr "事务无法启动:"
- 
--#: dnf/base.py:1013
-+#: dnf/base.py:1008
- #, python-format
- msgid "Failed to remove transaction file %s"
- msgstr "移除事务文件 %s 失败"
- 
--#: dnf/base.py:1095
-+#: dnf/base.py:1090
- msgid "Some packages were not downloaded. Retrying."
- msgstr "某些软件包没有被下载。正在重试。"
- 
--#: dnf/base.py:1125
-+#: dnf/base.py:1120
- #, 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:1128
-+#: dnf/base.py:1123
- #, 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:1170
-+#: dnf/base.py:1165
- msgid "Cannot add local packages, because transaction job already exists"
- msgstr "由于事物已经存在,无法添加本地软件包"
- 
--#: dnf/base.py:1184
-+#: dnf/base.py:1179
- msgid "Could not open: {}"
- msgstr "无法打开: {}"
- 
--#: dnf/base.py:1222
-+#: dnf/base.py:1217
- #, python-format
- msgid "Public key for %s is not installed"
- msgstr "%s 的公钥没有安装"
- 
--#: dnf/base.py:1226
-+#: dnf/base.py:1221
- #, python-format
- msgid "Problem opening package %s"
- msgstr "打开软件包 %s 出现问题"
- 
--#: dnf/base.py:1234
-+#: dnf/base.py:1229
- #, python-format
- msgid "Public key for %s is not trusted"
- msgstr "%s 的公钥不可信任"
- 
--#: dnf/base.py:1238
-+#: dnf/base.py:1233
- #, python-format
- msgid "Package %s is not signed"
- msgstr "软件包 %s 没有签名"
- 
--#: dnf/base.py:1253
-+#: dnf/base.py:1263
- #, python-format
- msgid "Cannot remove %s"
- msgstr "无法删除 %s"
- 
--#: dnf/base.py:1257
-+#: dnf/base.py:1267
- #, python-format
- msgid "%s removed"
- msgstr "%s 已删除"
- 
--#: dnf/base.py:1537
-+#: dnf/base.py:1547
- msgid "No match for group package \"{}\""
- msgstr "没有和组 \"{}\" 匹配的"
- 
--#: dnf/base.py:1624
-+#: dnf/base.py:1634
- #, python-format
- msgid "Adding packages from group '%s': %s"
- msgstr "从组 '%s': %s 添加软件包"
- 
--#: dnf/base.py:1647 dnf/base.py:1699 dnf/cli/cli.py:218
-+#: dnf/base.py:1657 dnf/base.py:1709 dnf/cli/cli.py:218
- #: dnf/cli/commands/__init__.py:451 dnf/cli/commands/__init__.py:508
- #: dnf/cli/commands/__init__.py:601 dnf/cli/commands/__init__.py:650
- #: dnf/cli/commands/install.py:80 dnf/cli/commands/install.py:103
-@@ -329,21 +333,21 @@ msgstr "从组 '%s': %s 添加软件包"
- msgid "Nothing to do."
- msgstr "无需任何处理。"
- 
--#: dnf/base.py:1665
-+#: dnf/base.py:1675
- msgid "No groups marked for removal."
- msgstr "没有软件包组需要移除。"
- 
--#: dnf/base.py:1701
-+#: dnf/base.py:1711
- msgid "No group marked for upgrade."
- msgstr "没有标记为要升级的组。"
- 
--#: dnf/base.py:1916
-+#: dnf/base.py:1926
- #, python-format
- msgid "Package %s not installed, cannot downgrade it."
- msgstr "软件包 %s 并没有能够安装,无法进行降级操作。"
- 
--#: dnf/base.py:1918 dnf/base.py:1937 dnf/base.py:1950 dnf/base.py:1971
--#: dnf/base.py:2020 dnf/base.py:2028 dnf/base.py:2163 dnf/cli/cli.py:410
-+#: dnf/base.py:1928 dnf/base.py:1947 dnf/base.py:1960 dnf/base.py:1981
-+#: dnf/base.py:2030 dnf/base.py:2038 dnf/base.py:2173 dnf/cli/cli.py:410
- #: dnf/cli/commands/__init__.py:434 dnf/cli/commands/__init__.py:491
- #: dnf/cli/commands/__init__.py:595 dnf/cli/commands/__init__.py:642
- #: dnf/cli/commands/__init__.py:720 dnf/cli/commands/install.py:147
-@@ -353,186 +357,184 @@ msgstr "软件包 %s 并没有能够安装,无法进行降级操作。"
- msgid "No match for argument: %s"
- msgstr "未找到匹配的参数: %s"
- 
--#: dnf/base.py:1925
-+#: dnf/base.py:1935
- #, python-format
- msgid "Package %s of lower version already installed, cannot downgrade it."
- msgstr "软件包 %s 的低版本已经安装,无法进行降级。"
- 
--#: dnf/base.py:1948
-+#: dnf/base.py:1958
- #, python-format
- msgid "Package %s not installed, cannot reinstall it."
- msgstr "软件包 %s 未能够安装成功,无法进行重新安装。"
- 
--#: dnf/base.py:1963
-+#: dnf/base.py:1973
- #, python-format
- msgid "File %s is a source package and cannot be updated, ignoring."
- msgstr "%s 文件无法被升级,已忽略。"
- 
--#: dnf/base.py:1969
-+#: dnf/base.py:1979
- #, python-format
- msgid "Package %s not installed, cannot update it."
- msgstr "软件包 %s 未安装,无法更新。"
- 
--#: dnf/base.py:1978
-+#: dnf/base.py:1988
- #, python-format
- msgid ""
- "The same or higher version of %s is already installed, cannot update it."
- msgstr "已经安装了软件包%s的相同或更高版本,无法更新。"
- 
--#: dnf/base.py:2017 dnf/cli/commands/reinstall.py:81
-+#: dnf/base.py:2027 dnf/cli/commands/reinstall.py:81
- #, python-format
- msgid "Package %s available, but not installed."
- msgstr "软件包 %s 可用,但不会被安装"
- 
--#: dnf/base.py:2023
-+#: dnf/base.py:2033
- #, python-format
- msgid "Package %s available, but installed for different architecture."
- msgstr "软件包 %s 可用,当是为其它架构安装。"
- 
--#: dnf/base.py:2048 dnf/base.py:2241 dnf/cli/cli.py:667 dnf/cli/cli.py:698
-+#: dnf/base.py:2058 dnf/base.py:2251 dnf/cli/cli.py:667 dnf/cli/cli.py:698
- #, python-format
- msgid "No package %s installed."
- msgstr "没有软件包 %s 安装。"
- 
--#: dnf/base.py:2066 dnf/cli/commands/install.py:136
--#: dnf/cli/commands/remove.py:132
-+#: dnf/base.py:2076 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:2082 dnf/cli/commands/__init__.py:690
--#: dnf/cli/commands/remove.py:162
-+#: dnf/base.py:2092 dnf/cli/commands/__init__.py:690
-+#: dnf/cli/commands/remove.py:163
- msgid "No packages marked for removal."
- msgstr "没有软件包需要移除。"
- 
--#: dnf/base.py:2170 dnf/cli/cli.py:421
-+#: dnf/base.py:2180 dnf/cli/cli.py:421
- #, python-format
- msgid "Packages for argument %s available, but not installed."
- msgstr "针对于参数 %s 的软件包可用, 但是目前没有安装。"
- 
--#: dnf/base.py:2175
-+#: dnf/base.py:2185
- #, python-format
- msgid "Package %s of lowest version already installed, cannot downgrade it."
- msgstr "软件包 %s 的最低版本已经安装,无法再进行降级。"
- 
--#: dnf/base.py:2233
-+#: dnf/base.py:2243
- msgid "Action not handled: {}"
- msgstr "操作没被处理:{}"
- 
--#: dnf/base.py:2247 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
-+#: dnf/base.py:2257 dnf/cli/cli.py:418 dnf/cli/cli.py:672 dnf/cli/cli.py:702
- #: dnf/cli/commands/__init__.py:913 dnf/cli/commands/group.py:398
- #, python-format
- msgid "No package %s available."
- msgstr "无可用软件包 %s。"
- 
--#: dnf/base.py:2260
-+#: dnf/base.py:2270
- msgid "no package matched"
- msgstr "没有能够与之匹配的软件包"
- 
--#: dnf/base.py:2281
-+#: dnf/base.py:2291
- msgid "No security updates needed, but {} update available"
- msgstr "没有必须的安全更新, 但是 {} 的更新可用"
- 
--#: dnf/base.py:2283
-+#: dnf/base.py:2293
- msgid "No security updates needed, but {} updates available"
- msgstr "没有必须的安全更新, 但是 {} 的更新可用"
- 
--#: dnf/base.py:2287
-+#: dnf/base.py:2297
- msgid "No security updates needed for \"{}\", but {} update available"
- msgstr "没有针对于\"{}\" 所必须的安全更新, 但是 {} 的更新可用"
- 
--#: dnf/base.py:2289
-+#: dnf/base.py:2299
- msgid "No security updates needed for \"{}\", but {} updates available"
- msgstr "没有针对于\"{}\" 所必须的安全更新, 但是 {} 的更新可用"
- 
--#: dnf/base.py:2313
-+#: dnf/base.py:2323
- #, python-format
- msgid ". Failing package is: %s"
- msgstr ". 失败的软件包是:%s"
- 
--#: dnf/base.py:2314
-+#: dnf/base.py:2324
- #, python-format
- msgid "GPG Keys are configured as: %s"
- msgstr "GPG密钥配置为:%s"
- 
--#: dnf/base.py:2326
-+#: dnf/base.py:2336
- #, python-format
- msgid "GPG key at %s (0x%s) is already installed"
- msgstr "%s 的 GPG 公钥(0x%s)已安装"
- 
--#: dnf/base.py:2359
--#, fuzzy
-+#: dnf/base.py:2369
- msgid "The key has been approved."
- msgstr "密钥已被确认"
- 
--#: dnf/base.py:2362
--#, fuzzy
-+#: dnf/base.py:2372
- msgid "The key has been rejected."
--msgstr "密钥已被否认"
-+msgstr "密钥已被拒绝"
- 
--#: dnf/base.py:2395
-+#: dnf/base.py:2405
- #, python-format
- msgid "Key import failed (code %d)"
- msgstr "导入公钥失败(代码 %d)"
- 
--#: dnf/base.py:2397
-+#: dnf/base.py:2407
- msgid "Key imported successfully"
- msgstr "导入公钥成功"
- 
--#: dnf/base.py:2401
-+#: dnf/base.py:2411
- msgid "Didn't install any keys"
- msgstr "没有安装任何公钥"
- 
--#: dnf/base.py:2404
-+#: dnf/base.py:2414
- #, python-format
- msgid ""
- "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n"
- "Check that the correct key URLs are configured for this repository."
- msgstr "仓库 \"%s\" 的 GPG 公钥已安装,但是不适用于此软件包。请检查仓库的公钥 URL 是否配置正确。"
- 
--#: dnf/base.py:2415
-+#: dnf/base.py:2425
- msgid "Import of key(s) didn't help, wrong key(s)?"
- msgstr "导入的密钥没有公钥,错误的公钥?"
- 
--#: dnf/base.py:2451
-+#: dnf/base.py:2478
- msgid "  * Maybe you meant: {}"
- msgstr "  * 可能您的意思是:{}"
- 
--#: dnf/base.py:2483
-+#: dnf/base.py:2510
- msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum"
- msgstr "软件包 \"{}\"(来自于本地仓库 \"{}\")的 checksum 不正确"
- 
--#: dnf/base.py:2486
-+#: dnf/base.py:2513
- msgid "Some packages from local repository have incorrect checksum"
- msgstr "本地仓库的一些软件包校验值(checksum)不正确,无法确定软件包完整"
- 
--#: dnf/base.py:2489
-+#: dnf/base.py:2516
- msgid "Package \"{}\" from repository \"{}\" has incorrect checksum"
- msgstr "软件包 \"{}\"(来自仓库 \"{}\")的 checksum 不正确"
- 
--#: dnf/base.py:2492
-+#: dnf/base.py:2519
- msgid ""
- "Some packages have invalid cache, but cannot be downloaded due to \"--"
- "cacheonly\" option"
- msgstr "以下软件包有无效缓存,因为使用了 \"--cacheonly\" 选项不能下载"
- 
--#: dnf/base.py:2510 dnf/base.py:2530
-+#: dnf/base.py:2537 dnf/base.py:2557
- msgid "No match for argument"
- msgstr "未找到匹配的参数"
- 
--#: dnf/base.py:2518 dnf/base.py:2538
-+#: dnf/base.py:2545 dnf/base.py:2565
- msgid "All matches were filtered out by exclude filtering for argument"
- msgstr "由于您的搜索参数,所有相关结果都已被滤掉"
- 
--#: dnf/base.py:2520
-+#: dnf/base.py:2547
- msgid "All matches were filtered out by modular filtering for argument"
--msgstr ""
-+msgstr "所有匹配已被模块的排除过滤过滤掉。"
- 
--#: dnf/base.py:2536
-+#: dnf/base.py:2563
- msgid "All matches were installed from a different repository for argument"
--msgstr ""
-+msgstr "所有匹配项都已从参数的其他存储库安装"
- 
--#: dnf/base.py:2552
-+#: dnf/base.py:2579
- #, python-format
- msgid "Package %s is already installed."
- msgstr "软件包 %s 已安装。"
-@@ -540,7 +542,7 @@ msgstr "软件包 %s 已安装。"
- #: dnf/cli/aliases.py:96
- #, python-format
- msgid "Unexpected value of environment variable: DNF_DISABLE_ALIASES=%s"
--msgstr ""
-+msgstr "错误的环境变量 : DNF_DISABLE_ALIASES=%s"
- 
- #: dnf/cli/aliases.py:105 dnf/conf/config.py:457
- #, python-format
-@@ -565,7 +567,7 @@ msgstr "别名中包含无限递归"
- #: dnf/cli/aliases.py:209
- #, python-format
- msgid "%s, using original arguments."
--msgstr ""
-+msgstr "%s, 使用原始参数。"
- 
- #: dnf/cli/cli.py:136
- #, python-format
-@@ -582,7 +584,7 @@ msgstr "  构建    :%s 在 %s"
- msgid ""
- "The operation would result in switching of module '{0}' stream '{1}' to "
- "stream '{2}'"
--msgstr ""
-+msgstr "这个操作会把模块 '{0}' 从流 '{1}' 切换到流 '{2}'"
- 
- #: dnf/cli/cli.py:171
- #, python-brace-format
-@@ -590,6 +592,8 @@ msgid ""
- "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."
- msgstr ""
-+"无法切换一个模块已启用的流。\n"
-+"建议从模块中删除所有安装的内容,使用 '{prog} module reset <module_name>' 命令重置模块。在重置模块后,您可以安装其他流。command. After you reset the module, you can install the other stream."
- 
- #: dnf/cli/cli.py:209
- #, python-brace-format
-@@ -627,10 +631,6 @@ msgstr ""
- "如果不加干预,拒绝自动导入公钥。\n"
- "指定 \"-y\" 改变这个行为。"
- 
--#: dnf/cli/cli.py:298
--msgid "GPG check FAILED"
--msgstr "GPG 检查失败"
--
- #: dnf/cli/cli.py:330
- msgid "Changelogs for {}"
- msgstr "{}的变更记录"
-@@ -738,7 +738,7 @@ msgstr "它可能是一个{PROG}插件命令,尝试:\"{prog} install 'dnf-co
- msgid ""
- "It could be a {prog} plugin command, but loading of plugins is currently "
- "disabled."
--msgstr ""
-+msgstr "它可能是一个 {prog} 插件命令,但加载插件当前已被禁用。"
- 
- #: dnf/cli/cli.py:908
- msgid ""
-@@ -773,7 +773,7 @@ msgid ""
- "version)"
- msgstr "无法找到发布版本(可用 '--releasever' 指定版本)"
- 
--#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:473
-+#: dnf/cli/cli.py:1123 dnf/cli/commands/repoquery.py:471
- msgid "argument {}: not allowed with argument {}"
- msgstr "参数 {}:不允许与参数 {} 一起使用"
- 
-@@ -885,7 +885,7 @@ msgstr "软件包"
- 
- #: dnf/cli/commands/__init__.py:202
- msgid "Package name specification"
--msgstr ""
-+msgstr "软件包名称规格"
- 
- #: dnf/cli/commands/__init__.py:230
- msgid "list a package or groups of packages"
-@@ -897,11 +897,11 @@ msgstr "查找提供指定内容的软件包"
- 
- #: dnf/cli/commands/__init__.py:248
- msgid "PROVIDE"
--msgstr ""
-+msgstr "PROVIDE"
- 
- #: dnf/cli/commands/__init__.py:249
- msgid "Provide specification to search for"
--msgstr ""
-+msgstr "提供规格进行搜索"
- 
- #: dnf/cli/commands/__init__.py:258 dnf/cli/commands/search.py:159
- msgid "Searching Packages: "
-@@ -935,7 +935,7 @@ msgid " (from %s)"
- msgstr " (来自 %s)"
- 
- #: dnf/cli/commands/__init__.py:442 dnf/cli/commands/__init__.py:499
--#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:104
-+#: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:105
- #, python-format
- msgid "Installed package %s%s not available."
- msgstr "已安装的软件包%s%s已不可用。"
-@@ -959,7 +959,7 @@ msgstr "对指定仓库中的所有软件包运行命令"
- 
- #: dnf/cli/commands/__init__.py:774
- msgid "REPOID"
--msgstr ""
-+msgstr "REPOID"
- 
- #: dnf/cli/commands/__init__.py:774
- msgid "Repository ID"
-@@ -968,7 +968,7 @@ msgstr "仓库ID"
- #: dnf/cli/commands/__init__.py:785 dnf/cli/commands/mark.py:48
- #: dnf/cli/commands/updateinfo.py:108
- msgid "Package specification"
--msgstr ""
-+msgstr "软件包规格"
- 
- #: dnf/cli/commands/__init__.py:809
- msgid "display a helpful usage message"
-@@ -981,7 +981,7 @@ msgstr "命令"
- #: dnf/cli/commands/__init__.py:814
- #, python-brace-format
- msgid "{prog} command to get help for"
--msgstr ""
-+msgstr "{prog} 命令获得帮助"
- 
- #: dnf/cli/commands/__init__.py:831
- msgid "display, or use, the transaction history"
-@@ -1000,8 +1000,10 @@ msgid "No transaction ID or package name given."
- msgstr "没有提供事务 ID 或软件包名。"
- 
- #: dnf/cli/commands/__init__.py:879
--msgid "You don't have access to the history DB."
--msgstr "你没有权限到历史数据。"
-+#, python-format
-+#| msgid "You don't have access to the history DB."
-+msgid "You don't have access to the history DB: %s"
-+msgstr "您没有权限访问历史数据库:%s"
- 
- #: dnf/cli/commands/__init__.py:891
- #, python-format
-@@ -1030,10 +1032,12 @@ msgid ""
- "Can't convert '{}' to transaction ID.\n"
- "Use '<number>', 'last', 'last-<number>'."
- msgstr ""
-+"无法将 '{}' 转换为事务 ID。\n"
-+"使用 '<number>'、'last'、'last-<number>'。"
- 
- #: dnf/cli/commands/__init__.py:999
- msgid "No transaction which manipulates package '{}' was found."
--msgstr "没有找到管理软件包  '{}' 的事务"
-+msgstr "没有找到管理软件包 '{}' 的事务"
- 
- #: dnf/cli/commands/alias.py:40
- msgid "List or create command aliases"
-@@ -1041,83 +1045,83 @@ msgstr "列出或新建命令别名"
- 
- #: dnf/cli/commands/alias.py:47
- msgid "enable aliases resolving"
--msgstr ""
-+msgstr "启用别名解析"
- 
- #: dnf/cli/commands/alias.py:50
- msgid "disable aliases resolving"
--msgstr ""
-+msgstr "禁用别名解析"
- 
- #: dnf/cli/commands/alias.py:53
- msgid "action to do with aliases"
--msgstr ""
-+msgstr "与别名有关的操作"
- 
- #: dnf/cli/commands/alias.py:55
- msgid "alias definition"
--msgstr ""
-+msgstr "别名定义"
- 
- #: dnf/cli/commands/alias.py:70
- msgid "Aliases are now enabled"
--msgstr ""
-+msgstr "别名现已被启用"
- 
- #: dnf/cli/commands/alias.py:73
- msgid "Aliases are now disabled"
--msgstr ""
-+msgstr "别名现已被禁用"
- 
- #: dnf/cli/commands/alias.py:90 dnf/cli/commands/alias.py:93
- #, python-format
- msgid "Invalid alias key: %s"
--msgstr ""
-+msgstr "无效的别名键 : %s"
- 
- #: dnf/cli/commands/alias.py:96
- #, python-format
- msgid "Alias argument has no value: %s"
--msgstr ""
-+msgstr "别名参数没有值 : %s"
- 
- #: dnf/cli/commands/alias.py:130
- #, python-format
- msgid "Aliases added: %s"
--msgstr ""
-+msgstr "别名已添加 : %s"
- 
- #: dnf/cli/commands/alias.py:144
- #, python-format
- msgid "Alias not found: %s"
--msgstr ""
-+msgstr "别名未找到 : %s"
- 
- #: dnf/cli/commands/alias.py:147
- #, python-format
- msgid "Aliases deleted: %s"
--msgstr ""
-+msgstr "别名被删除 : %s"
- 
- #: dnf/cli/commands/alias.py:155
- #, python-format
- msgid "%s, alias %s=\"%s\""
--msgstr ""
-+msgstr "%s,别名 %s=\"%s\""
- 
- #: dnf/cli/commands/alias.py:157
- #, python-format
- msgid "Alias %s='%s'"
--msgstr ""
-+msgstr "别名 %s='%s'"
- 
- #: dnf/cli/commands/alias.py:161
- msgid "Aliases resolving is disabled."
--msgstr ""
-+msgstr "别名解析被禁用"
- 
- #: dnf/cli/commands/alias.py:166
- msgid "No aliases specified."
--msgstr ""
-+msgstr "没有指定别名。"
- 
- #: dnf/cli/commands/alias.py:173
- msgid "No alias specified."
--msgstr ""
-+msgstr "没有指定别名。"
- 
- #: dnf/cli/commands/alias.py:179
- msgid "No aliases defined."
--msgstr ""
-+msgstr "没有定义别名。"
- 
- #: dnf/cli/commands/alias.py:186
- #, python-format
- msgid "No match for alias: %s"
--msgstr ""
-+msgstr "没有匹配的别名 : %s"
- 
- #: dnf/cli/commands/autoremove.py:41
- msgid ""
-@@ -1237,6 +1241,12 @@ msgstr "警告:组 %s 不存在。"
- msgid "Warning: No groups match:"
- msgstr "警告:没有匹配的组"
- 
-+#: dnf/cli/commands/group.py:180 dnf/cli/commands/group.py:191
-+#: dnf/cli/output.py:1226
-+#| msgid "<unset>"
-+msgid "<name-unset>"
-+msgstr "<name-unset>"
-+
- #: dnf/cli/commands/group.py:197
- msgid "Available Environment Groups:"
- msgstr "可用环境组:"
-@@ -1279,15 +1289,15 @@ msgstr "只显示可获得的团队"
- 
- #: dnf/cli/commands/group.py:329
- msgid "show also ID of groups"
--msgstr ""
-+msgstr "同时显示组 ID"
- 
- #: dnf/cli/commands/group.py:331
- msgid "available subcommands: {} (default), {}"
--msgstr ""
-+msgstr "可用的子命令:{}(默认),{}"
- 
- #: dnf/cli/commands/group.py:335
- msgid "argument for group subcommand"
--msgstr ""
-+msgstr "组子命令参数"
- 
- #: dnf/cli/commands/group.py:344
- #, python-format
-@@ -1318,7 +1328,7 @@ msgstr "RPM文件路径错误:%s"
- #: dnf/cli/commands/install.py:167
- #, python-brace-format
- msgid "There are following alternatives for \"{0}\": {1}"
--msgstr ""
-+msgstr "以下是 \"{0}\" 的替代 : {1}"
- 
- #: dnf/cli/commands/makecache.py:37
- msgid "generate the metadata cache"
-@@ -1338,6 +1348,9 @@ msgid ""
- "remove: unmark as installed by user\n"
- "group: mark as installed by group"
- msgstr ""
-+"install: 标记为由用户安装\n"
-+"remove: 取消由用户安装标记\n"
-+"group: 标记为由组安装"
- 
- #: dnf/cli/commands/mark.py:52
- #, python-format
-@@ -1368,11 +1381,11 @@ msgstr "软件包 %s 尚未安装。"
- msgid ""
- "Only module name, stream, architecture or profile is used. Ignoring unneeded"
- " information in argument: '{}'"
--msgstr ""
-+msgstr "仅使用模块名称,流,体系结构或配置文件。忽略参数“ {}”中不需要的信息"
- 
- #: dnf/cli/commands/module.py:77
- msgid "list all module streams, profiles and states"
--msgstr ""
-+msgstr "列出所有模块流、配置集和状态"
- 
- #: dnf/cli/commands/module.py:105 dnf/cli/commands/module.py:128
- msgid "No matching Modules to list"
-@@ -1380,43 +1393,43 @@ msgstr "没有匹配的模块可以列出"
- 
- #: dnf/cli/commands/module.py:111
- msgid "print detailed information about a module"
--msgstr ""
-+msgstr "打印模块的详细信息"
- 
- #: dnf/cli/commands/module.py:133
- msgid "enable a module stream"
--msgstr ""
-+msgstr "启用一个模块流"
- 
- #: dnf/cli/commands/module.py:157
- msgid "disable a module with all its streams"
--msgstr ""
-+msgstr "禁用一个模块的所有流"
- 
- #: dnf/cli/commands/module.py:181
- msgid "reset a module"
--msgstr ""
-+msgstr "重置模块"
- 
- #: dnf/cli/commands/module.py:202
- msgid "install a module profile including its packages"
--msgstr ""
-+msgstr "安装一个包括它的软件包在内的模块配置集"
- 
- #: dnf/cli/commands/module.py:223
- msgid "update packages associated with an active stream"
--msgstr ""
-+msgstr "更新与一个活动流相关的软件包"
- 
- #: dnf/cli/commands/module.py:240
- msgid "remove installed module profiles and their packages"
--msgstr ""
-+msgstr "移除已安装的模块配置集和它们的软件包"
- 
- #: dnf/cli/commands/module.py:264
- msgid "Package {} belongs to multiple modules, skipping"
--msgstr ""
-+msgstr "软件包{}属于多个模块,正在跳过"
- 
- #: dnf/cli/commands/module.py:277
- msgid "list modular packages"
--msgstr ""
-+msgstr "列出模块软件包"
- 
- #: dnf/cli/commands/module.py:292
- msgid "list packages belonging to a module"
--msgstr ""
-+msgstr "列出属于某个模块的软件包"
- 
- #: dnf/cli/commands/module.py:327
- msgid "Interact with Modules."
-@@ -1432,7 +1445,7 @@ msgstr "只显示禁用的模块"
- 
- #: dnf/cli/commands/module.py:346
- msgid "show only installed modules or packages"
--msgstr ""
-+msgstr "只显示安装的模块或软件包"
- 
- #: dnf/cli/commands/module.py:349
- msgid "show profile content"
-@@ -1440,15 +1453,15 @@ msgstr "显示档案内容"
- 
- #: dnf/cli/commands/module.py:354
- msgid "remove all modular packages"
--msgstr ""
-+msgstr "删除所有模块化程序包"
- 
- #: dnf/cli/commands/module.py:364
- msgid "Module specification"
--msgstr ""
-+msgstr "模块规格"
- 
- #: dnf/cli/commands/module.py:386
- msgid "{} {} {}: too few arguments"
--msgstr ""
-+msgstr "{} {} {}: 参数太少"
- 
- #: dnf/cli/commands/reinstall.py:38
- msgid "reinstall a package"
-@@ -1470,16 +1483,16 @@ msgstr "删除已安装(重复)的软件包"
- msgid "remove installonly packages over the limit"
- msgstr "移除过期的“仅安装”软件包"
- 
--#: dnf/cli/commands/remove.py:94
-+#: dnf/cli/commands/remove.py:95
- msgid "No duplicated packages found for removal."
- msgstr "没有重复的软件包需要删除"
- 
--#: dnf/cli/commands/remove.py:126
-+#: dnf/cli/commands/remove.py:127
- msgid "No old installonly packages found for removal."
- msgstr "没有已过时且已安装的软件包需要删除"
- 
- #: dnf/cli/commands/repolist.py:38 dnf/cli/commands/updateinfo.py:47
--#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:359
-+#: dnf/cli/commands/updateinfo.py:318 dnf/cli/commands/updateinfo.py:364
- msgid "unknown"
- msgstr "未知"
- 
-@@ -1516,7 +1529,7 @@ msgstr "显示被禁用的软件仓库"
- 
- #: dnf/cli/commands/repolist.py:93
- msgid "Repository specification"
--msgstr ""
-+msgstr "储存库规格"
- 
- #: dnf/cli/commands/repolist.py:125
- msgid "No repositories available"
-@@ -1532,100 +1545,100 @@ msgstr "禁用"
- 
- #: dnf/cli/commands/repolist.py:162
- msgid "Repo-id            : "
--msgstr ""
-+msgstr "Repo-id            : "
- 
- #: dnf/cli/commands/repolist.py:163
- msgid "Repo-name          : "
--msgstr ""
-+msgstr "Repo-name          : "
- 
- #: dnf/cli/commands/repolist.py:166
- msgid "Repo-status        : "
--msgstr ""
-+msgstr "Repo-status        : "
- 
- #: dnf/cli/commands/repolist.py:169
- msgid "Repo-revision      : "
--msgstr ""
-+msgstr "Repo-revision      : "
- 
- #: dnf/cli/commands/repolist.py:173
- msgid "Repo-tags          : "
--msgstr ""
-+msgstr "Repo-tags          : "
- 
- #: dnf/cli/commands/repolist.py:180
- msgid "Repo-distro-tags      : "
--msgstr ""
-+msgstr "Repo-distro-tags      : "
- 
- #: dnf/cli/commands/repolist.py:192
- msgid "Repo-updated       : "
--msgstr ""
-+msgstr "Repo-updated       : "
- 
- #: dnf/cli/commands/repolist.py:194
- msgid "Repo-pkgs          : "
--msgstr ""
-+msgstr "Repo-pkgs          : "
- 
- #: dnf/cli/commands/repolist.py:195
- msgid "Repo-available-pkgs: "
--msgstr ""
-+msgstr "Repo-available-pkgs: "
- 
- #: dnf/cli/commands/repolist.py:196
- msgid "Repo-size          : "
--msgstr ""
-+msgstr "Repo-size          : "
- 
- #: dnf/cli/commands/repolist.py:199
- msgid "Repo-metalink      : "
--msgstr ""
-+msgstr "Repo-metalink      : "
- 
- #: dnf/cli/commands/repolist.py:204
- msgid "  Updated          : "
--msgstr ""
-+msgstr "  Updated          : "
- 
- #: dnf/cli/commands/repolist.py:206
- msgid "Repo-mirrors       : "
--msgstr ""
-+msgstr "Repo-mirrors       : "
- 
- #: dnf/cli/commands/repolist.py:210 dnf/cli/commands/repolist.py:216
- msgid "Repo-baseurl       : "
--msgstr ""
-+msgstr "Repo-baseurl       : "
- 
- #: dnf/cli/commands/repolist.py:219
- msgid "Repo-expire        : "
--msgstr ""
-+msgstr "Repo-expire        : "
- 
- #. TRANSLATORS: Packages that are excluded - their names like (dnf systemd)
- #: dnf/cli/commands/repolist.py:223
- msgid "Repo-exclude       : "
--msgstr ""
-+msgstr "Repo-exclude       : "
- 
- #: dnf/cli/commands/repolist.py:227
- msgid "Repo-include       : "
--msgstr ""
-+msgstr "Repo-include       : "
- 
- #. TRANSLATORS: Number of packages that where excluded (5)
- #: dnf/cli/commands/repolist.py:232
- msgid "Repo-excluded      : "
--msgstr ""
-+msgstr "Repo-excluded      : "
- 
- #: dnf/cli/commands/repolist.py:236
- msgid "Repo-filename      : "
--msgstr ""
-+msgstr "Repo-filename      : "
- 
- #. Work out the first (id) and last (enabled/disabled/count),
- #. then chop the middle (name)...
--#: dnf/cli/commands/repolist.py:245 dnf/cli/commands/repolist.py:272
-+#: dnf/cli/commands/repolist.py:246 dnf/cli/commands/repolist.py:273
- msgid "repo id"
- msgstr "仓库标识"
- 
--#: dnf/cli/commands/repolist.py:258 dnf/cli/commands/repolist.py:259
--#: dnf/cli/commands/repolist.py:280
-+#: dnf/cli/commands/repolist.py:259 dnf/cli/commands/repolist.py:260
-+#: dnf/cli/commands/repolist.py:281
- msgid "status"
- msgstr "状态"
- 
--#: dnf/cli/commands/repolist.py:274 dnf/cli/commands/repolist.py:276
-+#: dnf/cli/commands/repolist.py:275 dnf/cli/commands/repolist.py:277
- msgid "repo name"
- msgstr "仓库名称"
- 
--#: dnf/cli/commands/repolist.py:290
-+#: dnf/cli/commands/repolist.py:291
- msgid "Total packages: {}"
--msgstr ""
-+msgstr "Total packages: {}"
- 
- #: dnf/cli/commands/repoquery.py:108
- msgid "search for packages matching keyword"
-@@ -1729,7 +1742,7 @@ msgstr "显示 N 个指定 name.arch 下最新的软件包(或者最旧的如
- 
- #: dnf/cli/commands/repoquery.py:181
- msgid "list also packages of inactive module streams"
--msgstr ""
-+msgstr "同时列出非活动模块流的软件包"
- 
- #: dnf/cli/commands/repoquery.py:186
- msgid "show detailed information about the package"
-@@ -1822,6 +1835,8 @@ msgid ""
- "running %%pre and %%post scriptlets. If the package is installed display "
- "capabilities that is depends for %%pre, %%post, %%preun and %%postun."
- msgstr ""
-+"如果没有安装软件包,则显示它所依赖的运行%%pre和%%post 脚本程序的能力。如果安装了软件包,则显示%%pre, %%post,%%preun和 "
-+"%%postun 所依赖的能力。"
- 
- #: dnf/cli/commands/repoquery.py:242
- msgid "Display capabilities that the package suggests."
-@@ -1854,7 +1869,7 @@ msgstr "仅显示为已安装的软件包提供升级的软件包。"
- #, python-brace-format
- msgid ""
- "Display only packages that can be removed by \"{prog} autoremove\" command."
--msgstr ""
-+msgstr "仅显示可被 {prog} autoremove\" 命令所移除的软件包"
- 
- #: dnf/cli/commands/repoquery.py:257
- msgid "Display only packages that were installed by user."
-@@ -1884,6 +1899,8 @@ msgid ""
- "with '--alldeps', but not with '--exactdeps'), or with '--requires <REQ> "
- "--resolve'"
- msgstr ""
-+"选项 '--recursive' 需要和 '--whatrequires <REQ>' 一起使用(以及可选的 '--alldeps',但不能是 '--"
-+"exactdeps'),或和 '--requires <REQ> --resolve' 一起使用"
- 
- #: dnf/cli/commands/repoquery.py:311
- msgid "argument {} requires --whatrequires or --whatdepends option"
-@@ -1898,7 +1915,7 @@ msgstr "软件包 {} 不包含文件"
- msgid "Available query-tags: use --queryformat \".. %{tag} ..\""
- msgstr "可用的查询标签:使用 --queryformat \".. %{tag} ..\""
- 
--#: dnf/cli/commands/repoquery.py:562
-+#: dnf/cli/commands/repoquery.py:561
- #, python-brace-format
- msgid ""
- "No valid switch specified\n"
-@@ -1907,6 +1924,11 @@ msgid ""
- "description:\n"
- "  For the given packages print a tree of thepackages."
- msgstr ""
-+"没有指定有效参数\n"
-+"用法:{prog} repoquery [--conflicts|--enhances|--obsoletes|--provides|--recommends|--requires|--suggest|--supplements|--whatrequires] [key] [--tree]\n"
-+"\n"
-+"描述:\n"
-+"  对于指定的软件包,打印软件包树。"
- 
- #: dnf/cli/commands/search.py:46
- msgid "search package details for the given string"
-@@ -1918,26 +1940,26 @@ msgstr "同时搜索软件包描述和 URL"
- 
- #: dnf/cli/commands/search.py:52
- msgid "KEYWORD"
--msgstr ""
-+msgstr "KEYWORD"
- 
- #: dnf/cli/commands/search.py:55
- msgid "Keyword to search for"
--msgstr ""
-+msgstr "搜索关键字"
- 
- #: dnf/cli/commands/search.py:61 dnf/cli/output.py:506
- msgctxt "long"
- msgid "Name"
--msgstr ""
-+msgstr "名称"
- 
- #: dnf/cli/commands/search.py:62 dnf/cli/output.py:559
- msgctxt "long"
- msgid "Summary"
--msgstr ""
-+msgstr "概况"
- 
- #: dnf/cli/commands/search.py:63 dnf/cli/output.py:569
- msgctxt "long"
- msgid "Description"
--msgstr ""
-+msgstr "描述"
- 
- #: dnf/cli/commands/search.py:64 dnf/cli/output.py:562
- msgid "URL"
-@@ -1970,7 +1992,7 @@ msgstr "未找到匹配项。"
- #: dnf/cli/commands/shell.py:47
- #, python-brace-format
- msgid "run an interactive {prog} shell"
--msgstr ""
-+msgstr "运行一个非交互式的 {prog} shell"
- 
- #: dnf/cli/commands/shell.py:68
- msgid "SCRIPT"
-@@ -1979,7 +2001,7 @@ msgstr "脚本"
- #: dnf/cli/commands/shell.py:69
- #, python-brace-format
- msgid "Script to run in {prog} shell"
--msgstr ""
-+msgstr "在 {prog} shell 中运行的脚本"
- 
- #: dnf/cli/commands/shell.py:142
- msgid "Unsupported key value."
-@@ -2098,7 +2120,7 @@ msgstr "离开终端"
- #: dnf/cli/commands/swap.py:35
- #, python-brace-format
- msgid "run an interactive {prog} mod for remove and install one spec"
--msgstr ""
-+msgstr "运行交互式的 {prog} mod 以删除或安装 spec"
- 
- #: dnf/cli/commands/swap.py:40
- msgid "The specs that will be removed"
-@@ -2176,11 +2198,11 @@ msgstr "显示公告信息"
- 
- #: dnf/cli/commands/updateinfo.py:101
- msgid "show only advisories with CVE reference"
--msgstr ""
-+msgstr "仅显示具有 CVE 参考的公告"
- 
- #: dnf/cli/commands/updateinfo.py:104
- msgid "show only advisories with bugzilla reference"
--msgstr ""
-+msgstr "仅显示具有 bugzilla 参考的公告"
- 
- #: dnf/cli/commands/updateinfo.py:168
- msgid "installed"
-@@ -2246,52 +2268,52 @@ msgstr "其他通知"
- msgid "Unknown/Sec."
- msgstr "未知/安全漏洞"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Bugs"
- msgstr "错误"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Type"
- msgstr "类型"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Update ID"
- msgstr "更新 ID"
- 
--#: dnf/cli/commands/updateinfo.py:352
-+#: dnf/cli/commands/updateinfo.py:357
- msgid "Updated"
- msgstr "更新完毕"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "CVEs"
- msgstr "安全漏洞"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Description"
- msgstr "描述"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Rights"
- msgstr "权限"
- 
--#: dnf/cli/commands/updateinfo.py:353
-+#: dnf/cli/commands/updateinfo.py:358
- msgid "Severity"
- msgstr "严重性"
- 
--#: dnf/cli/commands/updateinfo.py:354
-+#: dnf/cli/commands/updateinfo.py:359
- msgid "Files"
- msgstr "文件"
- 
--#: dnf/cli/commands/updateinfo.py:354 dnf/cli/output.py:1491
--#: dnf/cli/output.py:1755 dnf/cli/output.py:1757
-+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499
-+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772
- msgid "Installed"
- msgstr "已安装"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "false"
- msgstr "否"
- 
--#: dnf/cli/commands/updateinfo.py:380
-+#: dnf/cli/commands/updateinfo.py:385
- msgid "true"
- msgstr "是"
- 
-@@ -2319,23 +2341,23 @@ msgstr "没有当前目录的读取/执行权限,移动至 /"
- 
- #: dnf/cli/main.py:135
- msgid "try to add '{}' to command line to replace conflicting packages"
--msgstr ""
-+msgstr "尝试在命令行中添加 '{}' 来替换冲突的软件包"
- 
- #: dnf/cli/main.py:139
- msgid "try to add '{}' to skip uninstallable packages"
--msgstr ""
-+msgstr "尝试添加 '{}' 来跳过无法安装的软件包"
- 
- #: dnf/cli/main.py:142
- msgid " or '{}' to skip uninstallable packages"
--msgstr ""
-+msgstr " 或 '{}' 来跳过无法安装的软件包"
- 
- #: dnf/cli/main.py:147
- msgid "try to add '{}' to use not only best candidate packages"
--msgstr ""
-+msgstr "尝试添加 '{}' 来不只使用最佳选择的软件包"
- 
- #: dnf/cli/main.py:150
- msgid " or '{}' to use not only best candidate packages"
--msgstr ""
-+msgstr " 或 '{}' 来不只使用最佳选择的软件包"
- 
- #: dnf/cli/main.py:167
- msgid "Dependencies resolved."
-@@ -2366,7 +2388,7 @@ msgstr "Setopt 参数没有值:%s"
- #: dnf/cli/option_parser.py:174
- #, python-brace-format
- msgid "General {prog} options"
--msgstr ""
-+msgstr "一般{prog}选项"
- 
- #: dnf/cli/option_parser.py:178
- msgid "config file location"
-@@ -2383,7 +2405,7 @@ msgstr "详尽执行"
- #: dnf/cli/option_parser.py:185
- #, python-brace-format
- msgid "show {prog} version and exit"
--msgstr ""
-+msgstr "显示 {prog} 版本并推出"
- 
- #: dnf/cli/option_parser.py:187
- msgid "set install root"
-@@ -2431,7 +2453,7 @@ msgstr "在事务中尝试最佳软件包版本。"
- 
- #: dnf/cli/option_parser.py:223
- msgid "do not limit the transaction to the best candidate"
--msgstr ""
-+msgstr "不用把事务限制在最佳选择"
- 
- #: dnf/cli/option_parser.py:226
- msgid "run entirely from system cache, don't update cache"
-@@ -2462,7 +2484,7 @@ msgstr "错误输出级别"
- msgid ""
- "enables {prog}'s obsoletes processing logic for upgrade or display "
- "capabilities that the package obsoletes for info, list and repoquery"
--msgstr ""
-+msgstr "对升级启用 {prog} 的过期处理逻辑,或对 info、list 和 repoquery 显示软件包过期的功能"
- 
- #: dnf/cli/option_parser.py:251
- msgid "debugging output level for rpm"
-@@ -2480,13 +2502,13 @@ msgstr "全部问题自动应答为否"
- msgid ""
- "Enable additional repositories. List option. Supports globs, can be "
- "specified multiple times."
--msgstr ""
-+msgstr "启用其他存储库。列出选项。支持 glob,可以多次指定。"
- 
- #: dnf/cli/option_parser.py:266
- msgid ""
- "Disable repositories. List option. Supports globs, can be specified multiple"
- " times."
--msgstr ""
-+msgstr "禁用存储库。列出选项。支持 glob,可以多次指定。"
- 
- #: dnf/cli/option_parser.py:270
- msgid ""
-@@ -2496,11 +2518,11 @@ msgstr "启用指定 id 或 glob 的仓库,可以指定多次"
- 
- #: dnf/cli/option_parser.py:275
- msgid "enable repos with config-manager command (automatically saves)"
--msgstr ""
-+msgstr "使用 config-manager 命令启用 repos (自动保存)"
- 
- #: dnf/cli/option_parser.py:279
- msgid "disable repos with config-manager command (automatically saves)"
--msgstr ""
-+msgstr "使用 config-manager 命令禁用 repos (自动保存)"
- 
- #: dnf/cli/option_parser.py:283
- msgid "exclude packages by name or glob"
-@@ -2514,7 +2536,7 @@ msgstr "禁用 excludepkgs"
- msgid ""
- "label and path to an additional repository to use (same path as in a "
- "baseurl), can be specified multiple times."
--msgstr ""
-+msgstr "要使用的附加存储库的标签和路径(与 baseurl 中相同的路径),可以多次指定。"
- 
- #: dnf/cli/option_parser.py:297
- msgid "disable removal of dependencies that are no longer used"
-@@ -2522,7 +2544,7 @@ msgstr "禁用删除不再被使用的依赖软件包"
- 
- #: dnf/cli/option_parser.py:300
- msgid "disable gpg signature checking (if RPM policy allows)"
--msgstr ""
-+msgstr "禁用 gpg 签名检查 (如果 RPM 策略允许)"
- 
- #: dnf/cli/option_parser.py:302
- msgid "control whether color is used"
-@@ -2597,10 +2619,10 @@ msgid "List of Plugin Commands:"
- msgstr "插件命令列表:"
- 
- #: dnf/cli/option_parser.py:413
--#, fuzzy, python-format
-+#, python-format
- #| msgid "No match for argument: %s"
- msgid "Cannot encode argument '%s': %s"
--msgstr "未找到匹配的参数: %s"
-+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
-@@ -2608,7 +2630,7 @@ msgstr "未找到匹配的参数: %s"
- #: dnf/cli/output.py:505
- msgctxt "short"
- msgid "Name"
--msgstr ""
-+msgstr "名称"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:511
-@@ -2619,16 +2641,16 @@ 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:1327
-+#: dnf/cli/output.py:512 dnf/cli/output.py:1335
- msgctxt "short"
- msgid "Version"
--msgstr ""
-+msgstr "版本"
- 
- #. Translators: This is the full (unabbreviated) term 'Version'.
--#: dnf/cli/output.py:513 dnf/cli/output.py:1329
-+#: dnf/cli/output.py:513 dnf/cli/output.py:1337
- msgctxt "long"
- msgid "Version"
--msgstr ""
-+msgstr "版本"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:516
-@@ -2637,32 +2659,32 @@ 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:1318
-+#: dnf/cli/output.py:517 dnf/cli/output.py:1326
- msgctxt "short"
- msgid "Arch"
--msgstr ""
-+msgstr "架构"
- 
- #. Translators: This is the full word 'Architecture', used when
- #. we have enough space.
--#: dnf/cli/output.py:518 dnf/cli/output.py:1321
-+#: dnf/cli/output.py:518 dnf/cli/output.py:1329
- msgctxt "long"
- msgid "Architecture"
--msgstr ""
-+msgstr "架构"
- 
- #. Translators: This is the full (unabbreviated) term 'Size'.
--#: dnf/cli/output.py:520 dnf/cli/output.py:1344
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1352
- msgctxt "long"
- msgid "Size"
--msgstr ""
-+msgstr "大小"
- 
- #. Translators: This is the short version of 'Size'. It should
- #. 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:1342
-+#: dnf/cli/output.py:520 dnf/cli/output.py:1350
- msgctxt "short"
- msgid "Size"
--msgstr ""
-+msgstr "大小"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:524
-@@ -2671,17 +2693,17 @@ 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:1333
-+#: dnf/cli/output.py:525 dnf/cli/output.py:1341
- msgctxt "short"
- msgid "Repo"
--msgstr ""
-+msgstr "仓库"
- 
- #. Translators: This is the full word 'Repository', used when
- #. we have enough space.
--#: dnf/cli/output.py:526 dnf/cli/output.py:1336
-+#: dnf/cli/output.py:526 dnf/cli/output.py:1344
- msgctxt "long"
- msgid "Repository"
--msgstr ""
-+msgstr "仓库"
- 
- #. Translators: This message should be no longer than 12 chars.
- #: dnf/cli/output.py:533
-@@ -2717,7 +2739,7 @@ msgstr "安装者"
- #: dnf/cli/output.py:558
- msgctxt "short"
- msgid "Summary"
--msgstr ""
-+msgstr "概况"
- 
- #. Translators: This message should be no longer than 12 characters.
- #: dnf/cli/output.py:564
-@@ -2730,11 +2752,11 @@ msgstr "协议"
- #: dnf/cli/output.py:568
- msgctxt "short"
- msgid "Description"
--msgstr ""
-+msgstr "描述"
- 
- #: dnf/cli/output.py:695
- msgid "No packages to list"
--msgstr ""
-+msgstr "没有可以列出的软件包"
- 
- #: dnf/cli/output.py:706
- msgid "y"
-@@ -2951,53 +2973,53 @@ msgstr "降级"
- 
- #: dnf/cli/output.py:1176
- msgid "Installing module profiles"
--msgstr ""
-+msgstr "安装模块配置档案"
- 
- #: dnf/cli/output.py:1185
- msgid "Disabling module profiles"
--msgstr ""
-+msgstr "禁用模块配置档案"
- 
- #: dnf/cli/output.py:1194
- msgid "Enabling module streams"
--msgstr ""
-+msgstr "启用模块流"
- 
- #: dnf/cli/output.py:1202
- msgid "Switching module streams"
--msgstr ""
-+msgstr "切换模块流"
- 
- #: dnf/cli/output.py:1210
- msgid "Disabling modules"
--msgstr ""
-+msgstr "禁用模块"
- 
- #: dnf/cli/output.py:1218
- msgid "Resetting modules"
--msgstr ""
-+msgstr "重置模块"
- 
--#: dnf/cli/output.py:1226
-+#: dnf/cli/output.py:1230
- msgid "Installing Environment Groups"
--msgstr ""
-+msgstr "安装环境组"
- 
--#: dnf/cli/output.py:1233
-+#: dnf/cli/output.py:1237
- msgid "Upgrading Environment Groups"
--msgstr ""
-+msgstr "升级环境组"
- 
--#: dnf/cli/output.py:1240
-+#: dnf/cli/output.py:1244
- msgid "Removing Environment Groups"
--msgstr ""
-+msgstr "删除环境组"
- 
--#: dnf/cli/output.py:1247
-+#: dnf/cli/output.py:1251
- msgid "Installing Groups"
--msgstr ""
-+msgstr "安装组"
- 
--#: dnf/cli/output.py:1254
-+#: dnf/cli/output.py:1258
- msgid "Upgrading Groups"
--msgstr ""
-+msgstr "升级组"
- 
--#: dnf/cli/output.py:1261
-+#: dnf/cli/output.py:1265
- msgid "Removing Groups"
--msgstr ""
-+msgstr "删除组"
- 
--#: dnf/cli/output.py:1277
-+#: dnf/cli/output.py:1281
- #, python-format
- msgid ""
- "Skipping packages with conflicts:\n"
-@@ -3006,12 +3028,12 @@ msgstr ""
- "跳过有冲突的软件包:\n"
- "(添加 '%s' 至命令行来强制升级)"
- 
--#: dnf/cli/output.py:1285
-+#: dnf/cli/output.py:1291
- #, python-format
- msgid "Skipping packages with broken dependencies%s"
- msgstr "跳过存在损坏依赖关系的软件包 %s"
- 
--#: dnf/cli/output.py:1289
-+#: dnf/cli/output.py:1295
- msgid " or part of a group"
- msgstr " 或一个组的一部分"
- 
-@@ -3019,23 +3041,23 @@ 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:1312
-+#: dnf/cli/output.py:1320
- msgctxt "short"
- msgid "Package"
--msgstr ""
-+msgstr "软件包"
- 
- #. Translators: This is the full (unabbreviated) term 'Package'.
- #. This is also a hack to resolve RhBug 1302935 correctly.
--#: dnf/cli/output.py:1314 dnf/cli/output.py:2007
-+#: dnf/cli/output.py:1322 dnf/cli/output.py:2023
- msgctxt "long"
- msgid "Package"
--msgstr ""
-+msgstr "软件包"
- 
--#: dnf/cli/output.py:1363
-+#: dnf/cli/output.py:1371
- msgid "replacing"
- msgstr "替换"
- 
--#: dnf/cli/output.py:1370
-+#: dnf/cli/output.py:1378
- #, python-format
- msgid ""
- "\n"
-@@ -3047,292 +3069,292 @@ msgstr ""
- "%s\n"
- 
- #. TODO: remove
--#: dnf/cli/output.py:1375 dnf/cli/output.py:1914 dnf/cli/output.py:1915
-+#: dnf/cli/output.py:1383 dnf/cli/output.py:1930 dnf/cli/output.py:1931
- msgid "Install"
- msgstr "安装"
- 
--#: dnf/cli/output.py:1379 dnf/cli/output.py:1923
-+#: dnf/cli/output.py:1387 dnf/cli/output.py:1939
- msgid "Upgrade"
- msgstr "升级"
- 
--#: dnf/cli/output.py:1380
-+#: dnf/cli/output.py:1388
- msgid "Remove"
- msgstr "移除"
- 
--#: dnf/cli/output.py:1382 dnf/cli/output.py:1921
-+#: dnf/cli/output.py:1390 dnf/cli/output.py:1937
- msgid "Downgrade"
- msgstr "降级"
- 
--#: dnf/cli/output.py:1383
-+#: dnf/cli/output.py:1391
- msgid "Skip"
- msgstr "跳过"
- 
--#: dnf/cli/output.py:1392 dnf/cli/output.py:1408
-+#: dnf/cli/output.py:1400 dnf/cli/output.py:1416
- msgid "Package"
- msgid_plural "Packages"
- msgstr[0] "软件包"
- 
--#: dnf/cli/output.py:1410
-+#: dnf/cli/output.py:1418
- msgid "Dependent package"
- msgid_plural "Dependent packages"
- msgstr[0] "依赖软件包"
- 
--#: dnf/cli/output.py:1489 dnf/cli/output.py:1756 dnf/cli/output.py:1924
-+#: dnf/cli/output.py:1497 dnf/cli/output.py:1771 dnf/cli/output.py:1940
- msgid "Upgraded"
- msgstr "已升级"
- 
--#: dnf/cli/output.py:1490 dnf/cli/output.py:1756 dnf/cli/output.py:1922
-+#: dnf/cli/output.py:1498 dnf/cli/output.py:1771 dnf/cli/output.py:1938
- msgid "Downgraded"
- msgstr "已降级"
- 
--#: dnf/cli/output.py:1495
-+#: dnf/cli/output.py:1503
- msgid "Reinstalled"
- msgstr "已重装"
- 
--#: dnf/cli/output.py:1496
-+#: dnf/cli/output.py:1504
- msgid "Skipped"
--msgstr ""
-+msgstr "跳过的"
- 
--#: dnf/cli/output.py:1497
-+#: dnf/cli/output.py:1505
- msgid "Removed"
- msgstr "已移除"
- 
--#: dnf/cli/output.py:1500
-+#: dnf/cli/output.py:1508
- msgid "Failed"
- msgstr "失败"
- 
--#: dnf/cli/output.py:1551
-+#: dnf/cli/output.py:1559
- msgid "Total"
- msgstr "总计"
- 
--#: dnf/cli/output.py:1579
-+#: dnf/cli/output.py:1587
- msgid "<unset>"
- msgstr "<空>"
- 
--#: dnf/cli/output.py:1580
-+#: dnf/cli/output.py:1588
- msgid "System"
- msgstr "系统"
- 
--#: dnf/cli/output.py:1630
-+#: dnf/cli/output.py:1638
- msgid "Command line"
- msgstr "命令行"
- 
- #. TRANSLATORS: user names who executed transaction in history command output
--#: dnf/cli/output.py:1634
-+#: dnf/cli/output.py:1649
- msgid "User name"
- msgstr "用户名"
- 
- #. REALLY Needs to use columns!
--#: dnf/cli/output.py:1636 dnf/cli/output.py:2004
-+#: dnf/cli/output.py:1651 dnf/cli/output.py:2020
- msgid "ID"
- msgstr "ID"
- 
--#: dnf/cli/output.py:1638
-+#: dnf/cli/output.py:1653
- msgid "Date and time"
- msgstr "日期和时间"
- 
--#: dnf/cli/output.py:1639 dnf/cli/output.py:2005
-+#: dnf/cli/output.py:1654 dnf/cli/output.py:2021
- msgid "Action(s)"
- msgstr "操作"
- 
--#: dnf/cli/output.py:1640
-+#: dnf/cli/output.py:1655
- msgid "Altered"
- msgstr "更改"
- 
--#: dnf/cli/output.py:1681
-+#: dnf/cli/output.py:1696
- msgid "No transactions"
- msgstr "没有事务"
- 
--#: dnf/cli/output.py:1682 dnf/cli/output.py:1698
-+#: dnf/cli/output.py:1697 dnf/cli/output.py:1713
- msgid "Failed history info"
--msgstr ""
-+msgstr "失败的历史信息"
- 
--#: dnf/cli/output.py:1697
-+#: dnf/cli/output.py:1712
- msgid "No transaction ID, or package, given"
- msgstr "未指定事务 ID、或者软件包"
- 
--#: dnf/cli/output.py:1755
-+#: dnf/cli/output.py:1770
- msgid "Erased"
- msgstr "已删除"
- 
--#: dnf/cli/output.py:1757
-+#: dnf/cli/output.py:1772
- msgid "Not installed"
- msgstr "未安装"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Newer"
- msgstr "较早的"
- 
--#: dnf/cli/output.py:1758
-+#: dnf/cli/output.py:1773
- msgid "Older"
- msgstr "较老的"
- 
--#: dnf/cli/output.py:1806 dnf/cli/output.py:1808
-+#: dnf/cli/output.py:1821 dnf/cli/output.py:1823
- msgid "Transaction ID :"
- msgstr "事务 ID:"
- 
--#: dnf/cli/output.py:1811
-+#: dnf/cli/output.py:1826
- msgid "Begin time     :"
- msgstr "起始时间    :"
- 
--#: dnf/cli/output.py:1814 dnf/cli/output.py:1816
-+#: dnf/cli/output.py:1829 dnf/cli/output.py:1831
- msgid "Begin rpmdb    :"
- msgstr "起始 RPM 数据库     :"
- 
--#: dnf/cli/output.py:1822
-+#: dnf/cli/output.py:1837
- #, python-format
- msgid "(%u seconds)"
- msgstr "(%u 秒)"
- 
--#: dnf/cli/output.py:1824
-+#: dnf/cli/output.py:1839
- #, python-format
- msgid "(%u minutes)"
- msgstr "(%u 分钟)"
- 
--#: dnf/cli/output.py:1826
-+#: dnf/cli/output.py:1841
- #, python-format
- msgid "(%u hours)"
- msgstr "(%u 小时)"
- 
--#: dnf/cli/output.py:1828
-+#: dnf/cli/output.py:1843
- #, python-format
- msgid "(%u days)"
- msgstr "(%u 天)"
- 
--#: dnf/cli/output.py:1829
-+#: dnf/cli/output.py:1844
- msgid "End time       :"
- msgstr "结束时间       :"
- 
--#: dnf/cli/output.py:1832 dnf/cli/output.py:1834
-+#: dnf/cli/output.py:1847 dnf/cli/output.py:1849
- msgid "End rpmdb      :"
- msgstr "结束 RPM 数据库      :"
- 
--#: dnf/cli/output.py:1841 dnf/cli/output.py:1843
-+#: dnf/cli/output.py:1856 dnf/cli/output.py:1858
- msgid "User           :"
- msgstr "用户           :"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1854
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1869
- msgid "Aborted"
- msgstr "已终止"
- 
--#: dnf/cli/output.py:1847 dnf/cli/output.py:1850 dnf/cli/output.py:1852
--#: dnf/cli/output.py:1854 dnf/cli/output.py:1856 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1862 dnf/cli/output.py:1865 dnf/cli/output.py:1867
-+#: dnf/cli/output.py:1869 dnf/cli/output.py:1871 dnf/cli/output.py:1873
- msgid "Return-Code    :"
- msgstr "返回码    :"
- 
--#: dnf/cli/output.py:1850 dnf/cli/output.py:1858
-+#: dnf/cli/output.py:1865 dnf/cli/output.py:1873
- msgid "Success"
- msgstr "成功"
- 
--#: dnf/cli/output.py:1852
-+#: dnf/cli/output.py:1867
- msgid "Failures:"
- msgstr "失败:"
- 
--#: dnf/cli/output.py:1856
-+#: dnf/cli/output.py:1871
- msgid "Failure:"
- msgstr "失败:"
- 
--#: dnf/cli/output.py:1866 dnf/cli/output.py:1868
-+#: dnf/cli/output.py:1881 dnf/cli/output.py:1883
- msgid "Releasever     :"
- msgstr "Releasever     :"
- 
--#: dnf/cli/output.py:1873 dnf/cli/output.py:1875
-+#: dnf/cli/output.py:1888 dnf/cli/output.py:1890
- msgid "Command Line   :"
- msgstr "命令行   :"
- 
--#: dnf/cli/output.py:1881
-+#: dnf/cli/output.py:1895 dnf/cli/output.py:1897
- msgid "Comment        :"
- msgstr "注释        :"
- 
--#: dnf/cli/output.py:1885
-+#: dnf/cli/output.py:1901
- msgid "Transaction performed with:"
- msgstr "事务完成由:"
- 
--#: dnf/cli/output.py:1894
-+#: dnf/cli/output.py:1910
- msgid "Packages Altered:"
- msgstr "已改变的包:"
- 
--#: dnf/cli/output.py:1900
-+#: dnf/cli/output.py:1916
- msgid "Scriptlet output:"
- msgstr "Scriptlet 输出:"
- 
--#: dnf/cli/output.py:1907
-+#: dnf/cli/output.py:1923
- msgid "Errors:"
- msgstr "错误:"
- 
--#: dnf/cli/output.py:1916
-+#: dnf/cli/output.py:1932
- msgid "Dep-Install"
- msgstr "依赖安装"
- 
--#: dnf/cli/output.py:1917
-+#: dnf/cli/output.py:1933
- msgid "Obsoleted"
- msgstr "已废弃"
- 
--#: dnf/cli/output.py:1918 dnf/transaction.py:84 dnf/transaction.py:85
-+#: dnf/cli/output.py:1934 dnf/transaction.py:84 dnf/transaction.py:85
- msgid "Obsoleting"
- msgstr "废弃"
- 
--#: dnf/cli/output.py:1919
-+#: dnf/cli/output.py:1935
- msgid "Erase"
- msgstr "删除"
- 
--#: dnf/cli/output.py:1920
-+#: dnf/cli/output.py:1936
- msgid "Reinstall"
- msgstr "重装"
- 
--#: dnf/cli/output.py:1995
-+#: dnf/cli/output.py:2011
- msgid "Bad transaction IDs, or package(s), given"
- msgstr "错误的事务 ID 或软件包"
- 
--#: dnf/cli/output.py:2094
-+#: dnf/cli/output.py:2110
- #, python-format
- msgid "---> Package %s.%s %s will be installed"
- msgstr "---> 软件包 %s.%s %s 将会被安装"
- 
--#: dnf/cli/output.py:2096
-+#: dnf/cli/output.py:2112
- #, python-format
- msgid "---> Package %s.%s %s will be an upgrade"
- msgstr "---> 软件包 %s.%s %s 将作为一个更新"
- 
--#: dnf/cli/output.py:2098
-+#: dnf/cli/output.py:2114
- #, python-format
- msgid "---> Package %s.%s %s will be erased"
- msgstr "---> 软件包 %s.%s %s 将会被清除"
- 
--#: dnf/cli/output.py:2100
-+#: dnf/cli/output.py:2116
- #, python-format
- msgid "---> Package %s.%s %s will be reinstalled"
- msgstr "---> 软件包 %s.%s %s 将会被重新安装"
- 
--#: dnf/cli/output.py:2102
-+#: dnf/cli/output.py:2118
- #, python-format
- msgid "---> Package %s.%s %s will be a downgrade"
- msgstr "---> 软件包 %s.%s %s 将会被降级"
- 
--#: dnf/cli/output.py:2104
-+#: dnf/cli/output.py:2120
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleting"
- msgstr "---> 软件包 %s.%s %s 将会废弃"
- 
--#: dnf/cli/output.py:2106
-+#: dnf/cli/output.py:2122
- #, python-format
- msgid "---> Package %s.%s %s will be upgraded"
- msgstr "---> 软件包 %s.%s %s 将会被升级"
- 
--#: dnf/cli/output.py:2108
-+#: dnf/cli/output.py:2124
- #, python-format
- msgid "---> Package %s.%s %s will be obsoleted"
- msgstr "---> 软件包 %s.%s %s 将会被废弃"
- 
--#: dnf/cli/output.py:2117
-+#: dnf/cli/output.py:2133
- msgid "--> Starting dependency resolution"
- msgstr "--> 开始解决依赖关系"
- 
--#: dnf/cli/output.py:2122
-+#: dnf/cli/output.py:2138
- msgid "--> Finished dependency resolution"
- msgstr "--> 依赖关系解决完成"
- 
--#: dnf/cli/output.py:2136 dnf/crypto.py:132
-+#: dnf/cli/output.py:2152 dnf/crypto.py:132
- #, python-format
- msgid ""
- "Importing GPG key 0x%s:\n"
-@@ -3394,36 +3416,36 @@ msgstr "    已启动: %s - %s之前"
- msgid "    State  : %s"
- msgstr "    状态  : %s"
- 
--#: dnf/comps.py:95
-+#: dnf/comps.py:104
- msgid "skipping."
- msgstr "正在跳过"
- 
--#: dnf/comps.py:187 dnf/comps.py:689
-+#: dnf/comps.py:196 dnf/comps.py:698
- #, python-format
- msgid "Module or Group '%s' is not installed."
--msgstr ""
-+msgstr "未安装模块或组 '%s'。"
- 
--#: dnf/comps.py:189 dnf/comps.py:691
-+#: dnf/comps.py:198 dnf/comps.py:700
- #, python-format
- msgid "Module or Group '%s' is not available."
--msgstr ""
-+msgstr "模块或组 '%s' 不可用。"
- 
--#: dnf/comps.py:191
-+#: dnf/comps.py:200
- #, python-format
- msgid "Module or Group '%s' does not exist."
--msgstr ""
-+msgstr "模块或组 '%s' 不存在。"
- 
--#: dnf/comps.py:610 dnf/comps.py:627
-+#: dnf/comps.py:619 dnf/comps.py:636
- #, python-format
- msgid "Environment '%s' is not installed."
- msgstr "环境组 '%s' 没有安装。"
- 
--#: dnf/comps.py:629
-+#: dnf/comps.py:638
- #, python-format
- msgid "Environment '%s' is not available."
--msgstr ""
-+msgstr "环境 '%s' 不可用。"
- 
--#: dnf/comps.py:657
-+#: dnf/comps.py:666
- #, python-format
- msgid "Group_id '%s' does not exist."
- msgstr "Group_id '%s' 不存在。"
-@@ -3442,6 +3464,8 @@ msgid ""
- "Configuration file URL \"{}\" could not be downloaded:\n"
- "  {}"
- msgstr ""
-+"配置文件 URL \"{}\" 不能被下载:\n"
-+"  {}"
- 
- #: dnf/conf/config.py:355 dnf/conf/config.py:391
- #, python-format
-@@ -3451,7 +3475,7 @@ msgstr "未知配置选项: %s = %s"
- #: dnf/conf/config.py:372
- #, python-format
- msgid "Error parsing --setopt with key '%s', value '%s': %s"
--msgstr ""
-+msgstr "错误解析 --setopt,键为 '%s',值是 '%s': %s"
- 
- #: dnf/conf/config.py:380
- #, python-format
-@@ -3465,7 +3489,7 @@ msgstr "不正确或未知的 \"{}\": {}"
- #: dnf/conf/config.py:501
- #, python-format
- msgid "Error parsing --setopt with key '%s.%s', value '%s': %s"
--msgstr ""
-+msgstr "错误解析 --setopt,键为 '%s.%s', 值是 '%s': %s"
- 
- #: dnf/conf/config.py:504
- #, python-format
-@@ -3479,31 +3503,31 @@ msgstr "警告:加载 '%s' 失败,跳过。"
- 
- #: dnf/conf/read.py:63
- msgid "Bad id for repo: {} ({}), byte = {} {}"
--msgstr ""
-+msgstr "无效 id repo: {} ({}), byte = {} {}"
- 
- #: dnf/conf/read.py:67
- msgid "Bad id for repo: {}, byte = {} {}"
--msgstr ""
-+msgstr "无效 id repo: {}, byte = {} {}"
- 
- #: dnf/conf/read.py:75
- msgid "Repository '{}' ({}): Error parsing config: {}"
--msgstr ""
-+msgstr "Repository '{}' ({}): 错误解析配置 : {}"
- 
- #: dnf/conf/read.py:78
- msgid "Repository '{}': Error parsing config: {}"
--msgstr ""
-+msgstr "Repository '{}': 错误解析配置 : {}"
- 
- #: dnf/conf/read.py:84
- msgid "Repository '{}' ({}) is missing name in configuration, using id."
--msgstr ""
-+msgstr "Repository '{}' ({}) 在配置中缺少名称,使用 id。"
- 
- #: dnf/conf/read.py:87
- msgid "Repository '{}' is missing name in configuration, using id."
--msgstr ""
-+msgstr "Repository '{}' 在配置中缺少名称,使用 id。"
- 
- #: dnf/conf/read.py:104
- msgid "Parsing file \"{}\" failed: {}"
--msgstr ""
-+msgstr "解析文件 \"{}\" 失败:{}"
- 
- #: dnf/crypto.py:108
- #, python-format
-@@ -3515,47 +3539,47 @@ msgstr "repo %s: 0x%s 已被导入"
- msgid "repo %s: imported key 0x%s."
- msgstr "repo %s: 导入的 key 0x%s。"
- 
--#: dnf/db/group.py:289
-+#: dnf/db/group.py:293
- msgid ""
- "No available modular metadata for modular package '{}', it cannot be "
- "installed on the system"
--msgstr ""
-+msgstr "模块软件包 '{}' 没有可用的元数据,它不能在系统上安装"
- 
--#: dnf/db/group.py:339
-+#: dnf/db/group.py:343
- msgid "No available modular metadata for modular package"
--msgstr ""
-+msgstr "模块软件包没有可用的模块元数据"
- 
--#: dnf/db/group.py:373
-+#: dnf/db/group.py:377
- #, python-format
- msgid "Will not install a source rpm package (%s)."
- msgstr "将不安装一个源码 RPM 软件包 (%s)。"
- 
--#: dnf/dnssec.py:169
-+#: dnf/dnssec.py:168
- msgid ""
- "Configuration option 'gpgkey_dns_verification' requires libunbound ({})"
--msgstr ""
-+msgstr "配置选项 'gpgkey_dns_verification' 需要 libunbound({})"
- 
--#: dnf/dnssec.py:240
-+#: dnf/dnssec.py:239
- msgid "DNSSEC extension: Key for user "
--msgstr ""
-+msgstr "DNSSEC 扩展 : 用户的密钥 "
- 
--#: dnf/dnssec.py:242
-+#: dnf/dnssec.py:241
- msgid "is valid."
- msgstr "无效"
- 
--#: dnf/dnssec.py:244
-+#: dnf/dnssec.py:243
- msgid "has unknown status."
--msgstr ""
-+msgstr "有未知状态"
- 
--#: dnf/dnssec.py:252
-+#: dnf/dnssec.py:251
- msgid "DNSSEC extension: "
--msgstr ""
-+msgstr "DNSSEC 扩展 : "
- 
--#: dnf/dnssec.py:284
-+#: dnf/dnssec.py:283
- msgid "Testing already imported keys for their validity."
--msgstr ""
-+msgstr "测试已导入的密钥来检查有效性。"
- 
--#: dnf/drpm.py:62 dnf/repo.py:267
-+#: dnf/drpm.py:62 dnf/repo.py:268
- #, python-format
- msgid "unsupported checksum type: %s"
- msgstr "不支持的校验类型: %s"
-@@ -3572,32 +3596,32 @@ msgstr "从增量包重构的 RPM 校验失败"
- msgid "done"
- msgstr "完成"
- 
--#: dnf/exceptions.py:109
-+#: dnf/exceptions.py:113
- msgid "Problems in request:"
--msgstr ""
-+msgstr "请求中的问题 :"
- 
--#: dnf/exceptions.py:111
-+#: dnf/exceptions.py:115
- msgid "missing packages: "
- msgstr "缺少的软件包 "
- 
--#: dnf/exceptions.py:113
-+#: dnf/exceptions.py:117
- msgid "broken packages: "
--msgstr ""
-+msgstr "错误的软件包 : "
- 
--#: dnf/exceptions.py:115
-+#: dnf/exceptions.py:119
- msgid "missing groups or modules: "
--msgstr ""
-+msgstr "缺少的组或模块 : "
- 
--#: dnf/exceptions.py:117
-+#: dnf/exceptions.py:121
- msgid "broken groups or modules: "
--msgstr ""
-+msgstr "错误的组或模块: "
- 
--#: dnf/exceptions.py:122
-+#: dnf/exceptions.py:126
- msgid "Modular dependency problem with Defaults:"
- msgid_plural "Modular dependency problems with Defaults:"
--msgstr[0] ""
-+msgstr[0] "默认设置的模块依赖性问题 :"
- 
--#: dnf/exceptions.py:127 dnf/module/module_base.py:686
-+#: dnf/exceptions.py:131 dnf/module/module_base.py:686
- msgid "Modular dependency problem:"
- msgid_plural "Modular dependency problems:"
- msgstr[0] "模块依赖问题"
-@@ -3608,6 +3632,8 @@ msgid ""
- "Malformed lock file found: %s.\n"
- "Ensure no other dnf/yum process is running and remove the lock file manually or run systemd-tmpfiles --remove dnf.conf."
- msgstr ""
-+"发现损坏的锁定文件: %s。\n"
-+"确认没有运行其他 dnf/yum 进程,手工删除锁定文件,或运行 systemd-tmpfiles --remove dnf.conf."
- 
- #: dnf/module/__init__.py:26
- msgid "Enabling different stream for '{}'."
-@@ -3645,6 +3671,9 @@ msgid ""
- "\n"
- "Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive"
- msgstr ""
-+"\n"
-+"\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
-@@ -3654,44 +3683,44 @@ msgstr "正在忽略无用的配置文件'{}/{}'"
- #: dnf/module/module_base.py:84
- #, python-brace-format
- msgid "All matches for argument '{0}' in module '{1}:{2}' are not active"
--msgstr ""
-+msgstr "'{1}:{2}' 中所有匹配的参数 '{0}' 都不活跃。"
- 
- #: dnf/module/module_base.py:92
- #, python-brace-format
- msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed"
--msgstr ""
-+msgstr "不允许通过 Fail-Safe 仓库 {1} 安装模块 '{0}'"
- 
- #: dnf/module/module_base.py:102
- msgid ""
- "Unable to match profile for argument {}. Available profiles for '{}:{}': {}"
--msgstr ""
-+msgstr "无法为参数 {} 匹配配置集。'{}:{}' 的有效配置集 : {}"
- 
- #: dnf/module/module_base.py:106
- msgid "Unable to match profile for argument {}"
--msgstr ""
-+msgstr "无法为参数 {} 配置配置集"
- 
- #: dnf/module/module_base.py:118
- msgid "No default profiles for module {}:{}. Available profiles: {}"
--msgstr ""
-+msgstr "模块 {}:{} 没有默认的配置集。可用配置集:{}"
- 
- #: dnf/module/module_base.py:122
- msgid "No profiles for module {}:{}"
--msgstr ""
-+msgstr "模块 {}:{} 没有配置集"
- 
- #: dnf/module/module_base.py:129
- msgid "Default profile {} not available in module {}:{}"
--msgstr ""
-+msgstr "默认配置集{}在模块 {}:{} 中不可用"
- 
- #: dnf/module/module_base.py:142
- msgid "Installing module from Fail-Safe repository is not allowed"
--msgstr ""
-+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
- msgid "Unable to resolve argument {}"
--msgstr ""
-+msgstr "无法解析参数 {}"
- 
- #: dnf/module/module_base.py:160
- msgid "No match for package {}"
-@@ -3700,15 +3729,15 @@ msgstr "没有和{}匹配的软件包"
- #: dnf/module/module_base.py:204
- #, python-brace-format
- msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed"
--msgstr ""
-+msgstr "不允许通过 Fail-Safe 仓库 {1} 升级模块 '{0}'"
- 
- #: dnf/module/module_base.py:223 dnf/module/module_base.py:251
- msgid "Unable to match profile in argument {}"
--msgstr ""
-+msgstr "无法配置参数 {} 中的配置档案"
- 
- #: dnf/module/module_base.py:231
- msgid "Upgrading module from Fail-Safe repository is not allowed"
--msgstr ""
-+msgstr "不允许通过 Fail-Safe 仓库升级模块"
- 
- #: dnf/module/module_base.py:367
- msgid ""
-@@ -3716,7 +3745,7 @@ msgid ""
- "'{}'"
- msgstr "只需要模块名。正在忽略'{}'中的无用信息"
- 
--#: dnf/package.py:295
-+#: dnf/package.py:298
- #, python-format
- msgid "%s: %s check failed: %s vs %s"
- msgstr "%s: %s 检查失败:%s vs %s"
-@@ -3748,27 +3777,27 @@ msgstr "加载插件:%s"
- #: dnf/plugin.py:199
- #, python-format
- msgid "Failed loading plugin \"%s\": %s"
--msgstr ""
-+msgstr "加载插件 \"%s\" 失败 : %s"
- 
- #: dnf/plugin.py:231
- msgid "No matches found for the following enable plugin patterns: {}"
--msgstr ""
-+msgstr "没有发现与以下启用插件特征匹配的项: {}"
- 
- #: dnf/plugin.py:235
- msgid "No matches found for the following disable plugin patterns: {}"
--msgstr ""
-+msgstr "没有发现与以下禁用插件特征匹配的项: {}"
- 
--#: dnf/repo.py:83
-+#: dnf/repo.py:84
- #, python-format
- msgid "no matching payload factory for %s"
- msgstr "没有 %s 匹配的 payload factory"
- 
--#: dnf/repo.py:110
-+#: dnf/repo.py:111
- msgid "Already downloaded"
- msgstr "已下载"
- 
- #. pinging mirrors, this might take a while
--#: dnf/repo.py:346
-+#: dnf/repo.py:347
- #, python-format
- msgid "determining the fastest mirror (%s hosts).. "
- msgstr "正在查找最快的镜像(%s 的主机) "
-@@ -3785,7 +3814,7 @@ msgstr "已添加 %s 仓库来自 %s"
- 
- #: dnf/rpm/transaction.py:119
- msgid "Errors occurred during test transaction."
--msgstr ""
-+msgstr "测试事务过程中出错。"
- 
- #. TRANSLATORS: This is for a single package currently being downgraded.
- #: dnf/transaction.py:80
-@@ -3839,16 +3868,12 @@ msgstr "问题"
- 
- #: dnf/util.py:444
- msgid "TransactionItem not found for key: {}"
--msgstr ""
-+msgstr "找不到密钥{}的TransactionItem"
- 
- #: dnf/util.py:454
- msgid "TransactionSWDBItem not found for key: {}"
--msgstr ""
-+msgstr "找不到密钥{}的TransactionSWDBItem"
- 
- #: dnf/util.py:457
- msgid "Errors occurred during transaction."
- msgstr "事务过程中出现错误。"
--
--#~ msgid ""
--#~ "Display capabilities that the package depends on for running a %%pre script."
--#~ msgstr "显示软件包运行一个 %%pre 脚本所依赖的功能"
--- 
-2.25.4
-
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
new file mode 100644
index 0000000..233a2fc
--- /dev/null
+++ b/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch
@@ -0,0 +1,1411 @@
+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
new file mode 100644
index 0000000..1ef5a4e
--- /dev/null
+++ b/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch
@@ -0,0 +1,150 @@
+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
new file mode 100644
index 0000000..2daa3b2
--- /dev/null
+++ b/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch
@@ -0,0 +1,30 @@
+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
new file mode 100644
index 0000000..f464e15
--- /dev/null
+++ b/SOURCES/0008-Module-switch-command.patch
@@ -0,0 +1,507 @@
+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
new file mode 100644
index 0000000..240495d
--- /dev/null
+++ b/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch
@@ -0,0 +1,107 @@
+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
new file mode 100644
index 0000000..3bfdafb
--- /dev/null
+++ b/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch
@@ -0,0 +1,22 @@
+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
new file mode 100644
index 0000000..49c2a1a
--- /dev/null
+++ b/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch
@@ -0,0 +1,117 @@
+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
new file mode 100644
index 0000000..b81646b
--- /dev/null
+++ b/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch
@@ -0,0 +1,80 @@
+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
new file mode 100644
index 0000000..a5f8478
--- /dev/null
+++ b/SOURCES/0013-Package-add-a-get-header--method.patch
@@ -0,0 +1,94 @@
+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
new file mode 100644
index 0000000..d912d69
--- /dev/null
+++ b/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch
@@ -0,0 +1,115 @@
+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
new file mode 100644
index 0000000..30dbab6
--- /dev/null
+++ b/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch
@@ -0,0 +1,366 @@
+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
new file mode 100644
index 0000000..2c8f13b
--- /dev/null
+++ b/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch
@@ -0,0 +1,43 @@
+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
new file mode 100644
index 0000000..b6dee78
--- /dev/null
+++ b/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch
@@ -0,0 +1,61 @@
+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
new file mode 100644
index 0000000..0fd4828
--- /dev/null
+++ b/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch
@@ -0,0 +1,56 @@
+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
new file mode 100644
index 0000000..f6d9c68
--- /dev/null
+++ b/SOURCES/0019-Update-translations.patch
@@ -0,0 +1,12740 @@
+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 fb58810..24d28b1 100644
--- a/SPECS/dnf.spec
+++ b/SPECS/dnf.spec
@@ -1,5 +1,5 @@
 # default dependencies
-%global hawkey_version 0.48.0-3
+%global hawkey_version 0.55.0-5
 %global libcomps_version 0.1.8
 %global libmodulemd_version 1.4.0
 %global rpm_version 4.14.2-35
@@ -81,17 +81,53 @@
 It supports RPMs, modules and comps groups & environments.
 
 Name:           dnf
-Version:        4.2.23
-Release:        4%{?dist}
+Version:        4.4.2
+Release:        11%{?dist}
 Summary:        %{pkg_summary}
 # For a breakdown of the licensing, see PACKAGE-LICENSING
 License:        GPLv2+ and GPLv2 and GPL
 URL:            https://github.com/rpm-software-management/dnf
 Source0:        %{url}/archive/%{version}/%{name}-%{version}.tar.gz
-Patch1:         0001-Handle-empty-comps-group-name-RhBug1826198.patch
-Patch2:         0002-Add-logfilelevel-configuration-RhBug-1802074.patch
-Patch3:         0003-Enhance-repo-variables-documentation-RhBug-1848161-1848615.patch
-Patch4:         0004-Update-translations-RhBug-1820544.patch
+# 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
 
 BuildArch:      noarch
 BuildRequires:  cmake
@@ -410,6 +446,7 @@ ln -sr  %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars
 %{_mandir}/man8/%{name}.8*
 %{_mandir}/man8/yum2dnf.8*
 %{_mandir}/man7/dnf.modularity.7*
+%{_mandir}/man5/dnf-transaction-json.5*
 %{_unitdir}/%{name}-makecache.service
 %{_unitdir}/%{name}-makecache.timer
 %{_var}/cache/%{name}/
@@ -511,6 +548,54 @@ ln -sr  %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars
 %endif
 
 %changelog
+* Mon Mar 8 2021 Marek Blaha <mblaha@redhat.com> - 4.4.2-11
+- Update translations
+
+* Thu Feb 11 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-10
+- Allow stream switching if option enabled
+
+* Tue Feb 09 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-9
+- Set persistdir for fill_sack_from_repos_in_cache tests (RhBug:1865803)
+
+* Mon Feb 08 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-8
+- Add api function: fill_sack_from_repos_in_cache (RhBug:1865803)
+- Add tests and docs for fill_sack_from_repos_in_cache (RhBug:1865803)
+- Run tests for fill_sack_from_repos_in_cache in installroot
+
+* Fri Feb 05 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-7
+- Make log rotated permissions match initial log permissions (RhBug:1894344)
+- Add new attribute for Package - from_repo
+- Change behaviour of Package().from_repo
+- Package: add a get_header() method
+
+* Fri Jan 29 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-6
+- yum.misc.decompress() to handle uncompressed files (RhBug:1895059)
+- Module switch command
+
+* Fri Jan 15 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-5
+- Fix patch for dnf history operations
+
+* Thu Jan 14 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-4
+- `dnf history` operations that work with comps correctly
+- Remove sourcepackages from install/upgrade set
+- Fix documentation of globs not supporting curly brackets
+
+* Thu Jan 07 2021 Nicola Sella <nsella@redhat.com> - 4.4.2-3
+- Backport patches
+- Log scriptlets output also for API users (RhBug:1847340)
+- Post transaction summary is logged for API users (RhBug:1855158) 
+
+* Wed Nov 11 2020 Nicola Sella <nsella@redhat.com> - 4.4.2-2
+- Backport patch Revert "Fix --setopt=cachedir writing outside of installroot"
+
+* Tue Nov 10 2020 Nicola Sella <nsella@redhat.com> - 4.4.2-1
+- Update to 4.4.2
+- spec: Fix building with new cmake macros (backport from downstream)
+- Warn about key retrieval over http:
+- Fix --setopt=cachedir writing outside of installroot
+- Add vendor to dnf API (RhBug:1876561)
+- Add allow_vendor_change option (RhBug:1788371) (RhBug:1788371)
+
 * Tue Jul 28 2020 Marek Blaha <mblaha@redhat.com> - 4.2.23-4
 - Update translations