From 4f4af9bebad224797178cf918ba2de60389d2f35 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: May 18 2021 06:40:27 +0000 Subject: import dnf-4.4.2-11.el8 --- 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?= -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 -"" 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 _("")) - 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 _("")) - 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 _(""), "", "", "", "", "", "") -+ - 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 @@ - brokendeps - - -+ -+ missing-name-group -+ -+ -+ meaning-of-life -+ -+ - - base-system - 99 -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 +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?= -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 ` -+ -+ 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?= -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?= -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?= +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 -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 +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 +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 +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 +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 +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 -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 \n" - "Language-Team: French \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 "" -+msgstr "" -+ - #: 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 "" - msgstr "" - --#: 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 , 2019. #zanata - # Ooyama Yosiyuki , 2019. #zanata - # Julien Humbert , 2020. -+# Casey Jones , 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 \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 \n" - "Language-Team: Japanese \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 ' command. After you reset the module, you can install the other stream." - msgstr "" -+"モジュールの有効なストリームを切り替えることはできません。\n" -+"モジュールからインストールされた全てのコンテンツを削除し、 '{prog} module reset ' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。" - - #: 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 '', 'last', 'last-'." - msgstr "" -+"'{}' をトランザクション IDに変換できません。\n" -+"'', 'last', 'last-' を使用してください。" - - #: 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 "" -+msgid "" -+msgstr "" -+ - #: 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 " - "--resolve'" - msgstr "" -+"オプションの '--recursive' は、'--whatrequires ' (オプションでは '--exactdeps' ではなく、'" -+"--alldeps' と共に使用) または '--requires --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 "" - 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 \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 ' command. After you reset the module, you can install the other stream." - msgstr "" -+"활성화된 모듈 스트림을 전환 할 수 없습니다.\n" -+"설치된 모든 내용을 모듈에서 제거하고 ‘{prog} module reset ' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후 다른 스트림을 설치할 수 있습니다." - - #: 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 '..'." - msgstr "" -+"잘못된 트랜잭션 ID 범위 정의 '{}'. \n" -+"'..' 사용." - - #: dnf/cli/commands/__init__.py:970 - msgid "" - "Can't convert '{}' to transaction ID.\n" - "Use '', 'last', 'last-'." - msgstr "" -+"'{}'을 (를) 트랜잭션 ID로 변환할 수 없습니다. \n" -+"'', 'last', 'last-' 사용." - - #: 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 "" -+msgid "" -+msgstr "" -+ - #: 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 " - "--resolve'" - msgstr "" -+"옵션 '--reative'를 '--whatrequires'와 함께 사용해야합니다. ' (다른 옵션으로 '--alldeps'와 " -+"함께 사용하지만 '--exactdeps'와는 사용하지 않음), 또는 '--requires --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 "" - 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! - # 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 \n" - "Language-Team: Chinese (Simplified) \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 ' command. After you reset the module, you can install the other stream." - msgstr "" -+"无法切换一个模块已启用的流。\n" -+"建议从模块中删除所有安装的内容,使用 '{prog} module reset ' 命令重置模块。在重置模块后,您可以安装其他流。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 '', 'last', 'last-'." - msgstr "" -+"无法将 '{}' 转换为事务 ID。\n" -+"使用 ''、'last'、'last-'。" - - #: 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 "" -+msgid "" -+msgstr "" -+ - #: 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 " - "--resolve'" - msgstr "" -+"选项 '--recursive' 需要和 '--whatrequires ' 一起使用(以及可选的 '--alldeps',但不能是 '--" -+"exactdeps'),或和 '--requires --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 "" - 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?= +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?= +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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?= +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?= +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?= +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 +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 +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 +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?= +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 +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 +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) ++ ++ # ++ 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 +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): + # + 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 +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:`\\ `... 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 ` 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 ` command for that. + + ``dnf [options] module update ...`` + 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 ...`` ++ 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 ` 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 ` 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 ...`` + Remove installed module profiles, including packages that were installed with the + :ref:`dnf module install ` command. Will not remove packages +@@ -1010,10 +1026,8 @@ Module subcommands take :ref:`\\ `... arg + of modular dependency issue the operation will be rejected. To perform the action anyway please use + \-\ :ref:`-skip-broken ` 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 ` 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 ` command for that. + + .. _module_disable_command-label: + +-- +2.26.2 + + +From 6b0b2b99e40c20706145e774626658825f5bc55d Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +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 +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?= +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 +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 +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 +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 +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 +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?= +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?= +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?= +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?= +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?= +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?= +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?= +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?= +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?= +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 ' 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 ' 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 +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 \n" + "Language-Team: LANGUAGE \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 "" + 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 '..'." + msgstr "" + +-#: dnf/cli/commands/history.py:226 ++#: dnf/cli/commands/history.py:283 + msgid "" + "Can't convert '{}' to transaction ID.\n" + "Use '', 'last', 'last-'." + 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 "" + 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 , 2018. #zanata + # Jean-Baptiste Holcroft , 2019. #zanata, 2020. + # Julien Humbert , 2020. ++# Sundeep Anand , 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 \n" +-"Language-Team: French \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 \n" ++"Language-Team: French \n" + "Language: fr\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=2; plural=n > 1;\n" +-"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 ». 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 "" + msgstr "" + +-#: 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 '..'." +@@ -1420,7 +1414,7 @@ msgstr "" + "La définition de la plage d’identifiants de transaction est invalide « {} ».\n" + "Utilisez « .. »." + +-#: dnf/cli/commands/history.py:226 ++#: dnf/cli/commands/history.py:283 + msgid "" + "Can't convert '{}' to transaction ID.\n" + "Use '', 'last', 'last-'." +@@ -1428,37 +1422,31 @@ msgstr "" + "Impossible de convertir « {} » à ID transaction.\n" + "Utiliser « », « last », « last- »." + +-#: 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 "" + msgstr "" + +-#: 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 , 2020. + # Casey Jones , 2020. + # Hajime Taira , 2020. ++# Sundeep Anand , 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 \n" +-"Language-Team: Japanese \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 \n" ++"Language-Team: Japanese \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 ' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。" + +-#: 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 "" + 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 "利用可能なサブコマンド: {} (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 '..'." +@@ -1346,7 +1335,7 @@ msgstr "" + "無効なトランザクション ID の範囲の定義 '{}'。\n" + "'..' を使用してください。" + +-#: dnf/cli/commands/history.py:226 ++#: dnf/cli/commands/history.py:283 + msgid "" + "Can't convert '{}' to transaction ID.\n" + "Use '', 'last', 'last-'." +@@ -1354,40 +1343,29 @@ msgstr "" + "'{}' をトランザクション IDに変換できません。\n" + "'', 'last', 'last-' を使用してください。" + +-#: 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 ' (オプションでは '--exactdeps' ではなく、'" +-"--alldeps' と共に使用) または '--requires --resolve' と共に使用する必要があります。" ++"--alldeps' と共に使用) または '--requires --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 "" + 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 \n" + "Language-Team: Korean \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 ' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후 다른 스트림을 설치할 수 있습니다." + +-#: 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 "" + 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 "필수 그룹 패키지를 찾을 수 없습니다." + +@@ -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 '..'." +@@ -1326,7 +1321,7 @@ msgstr "" + "잘못된 트랜잭션 ID 범위 정의 '{}'. \n" + "'..' 사용." + +-#: dnf/cli/commands/history.py:226 ++#: dnf/cli/commands/history.py:283 + msgid "" + "Can't convert '{}' to transaction ID.\n" + "Use '', 'last', 'last-'." +@@ -1334,38 +1329,32 @@ msgstr "" + "'{}'을 (를) 트랜잭션 ID로 변환할 수 없습니다. \n" + "'', 'last', 'last-' 사용." + +-#: 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 "" + 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 "사용자 이름" + + # 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 , 2020. + # Hongqiao Chen , 2020. + # Harry Chen , 2020. ++# Sundeep Anand , 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 \n" +-"Language-Team: Chinese (Simplified) \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 \n" ++"Language-Team: Chinese (Simplified) \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 ' 命令重置模块。在您重置模块之后,就可以安装其他的流。" + +-#: 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 "" + 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 '..'." +@@ -1347,7 +1336,7 @@ msgstr "" + "无效的事务 ID 范围定义 '{}'。\n" + "使用 '..'。" + +-#: dnf/cli/commands/history.py:226 ++#: dnf/cli/commands/history.py:283 + msgid "" + "Can't convert '{}' to transaction ID.\n" + "Use '', 'last', 'last-'." +@@ -1355,40 +1344,29 @@ msgstr "" + "无法将 '{}' 转换为事务 ID。\n" + "请使用 ''、'last'、'last-'。" + +-#: 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 "" + 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 - 4.4.2-11 +- Update translations + +* Thu Feb 11 2021 Nicola Sella - 4.4.2-10 +- Allow stream switching if option enabled + +* Tue Feb 09 2021 Nicola Sella - 4.4.2-9 +- Set persistdir for fill_sack_from_repos_in_cache tests (RhBug:1865803) + +* Mon Feb 08 2021 Nicola Sella - 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 - 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 - 4.4.2-6 +- yum.misc.decompress() to handle uncompressed files (RhBug:1895059) +- Module switch command + +* Fri Jan 15 2021 Nicola Sella - 4.4.2-5 +- Fix patch for dnf history operations + +* Thu Jan 14 2021 Nicola Sella - 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 - 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 - 4.4.2-2 +- Backport patch Revert "Fix --setopt=cachedir writing outside of installroot" + +* Tue Nov 10 2020 Nicola Sella - 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 - 4.2.23-4 - Update translations