diff --git a/.dnf.metadata b/.dnf.metadata index 9125cc8..8fa9d1a 100644 --- a/.dnf.metadata +++ b/.dnf.metadata @@ -1 +1 @@ -5941a49cfd466aeed4ec882a33647912c2a89245 SOURCES/dnf-4.4.2.tar.gz +f9c31cf46094c4bbf021e1872a9eb72d8a3f2136 SOURCES/dnf-4.7.0.tar.gz diff --git a/.gitignore b/.gitignore index 378380e..912e1fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/dnf-4.4.2.tar.gz +SOURCES/dnf-4.7.0.tar.gz diff --git a/SOURCES/0001-Set-top-level-directory-for-unittest.patch b/SOURCES/0001-Set-top-level-directory-for-unittest.patch new file mode 100644 index 0000000..7bb4f80 --- /dev/null +++ b/SOURCES/0001-Set-top-level-directory-for-unittest.patch @@ -0,0 +1,26 @@ +From 6eff0fe7850624791f049a17a41d779915f30f94 Mon Sep 17 00:00:00 2001 +From: Pavla Kratochvilova +Date: Wed, 19 May 2021 12:58:30 +0200 +Subject: [PATCH] Set top-level directory for unittest + +In some build environments, the top-level directory is not added to +the sys.path and the tests fail. This fixes the issue. +--- + tests/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt +index 77a4894..b7f4031 100644 +--- a/tests/CMakeLists.txt ++++ b/tests/CMakeLists.txt +@@ -1,6 +1,6 @@ + ADD_TEST( + NAME test +- COMMAND ${PYTHON_EXECUTABLE} -m unittest discover -s tests ++ COMMAND ${PYTHON_EXECUTABLE} -m unittest discover -s tests -t ${PROJECT_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) + + # For libdnf built with sanitizers, has no effect otherwise. +-- +libgit2 1.0.1 + diff --git a/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch b/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch deleted file mode 100644 index 39780f4..0000000 --- a/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 66e08009b8254462cb2c454ff2320355633c20d6 Mon Sep 17 00:00:00 2001 -From: Nicola Sella -Date: Tue, 10 Nov 2020 12:11:17 +0100 -Subject: [PATCH 1/1] [tests] SQL write a readonly folder - -fixes on rhel8.4 for test_dnf_base and test_dnf_db_group -libdnf._error.Error: SQLite error on "/var/lib/dnf/history.sqlite": -Executing an SQL statement failed: attempt to write a readonly -database - -=changelog= -msg: fixes SQL write a readonly folder -type: bugfix ---- - tests/api/test_dnf_base.py | 1 + - tests/api/test_dnf_db_group.py | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py -index b1cf49fb..ca71b75c 100644 ---- a/tests/api/test_dnf_base.py -+++ b/tests/api/test_dnf_base.py -@@ -14,6 +14,7 @@ from .common import TOUR_4_4 - class DnfBaseApiTest(TestCase): - def setUp(self): - self.base = dnf.Base(dnf.conf.Conf()) -+ self.base.conf.persistdir = "/tmp/tests" - - def tearDown(self): - self.base.close() -diff --git a/tests/api/test_dnf_db_group.py b/tests/api/test_dnf_db_group.py -index 447fd121..e1828cb4 100644 ---- a/tests/api/test_dnf_db_group.py -+++ b/tests/api/test_dnf_db_group.py -@@ -12,6 +12,7 @@ from .common import TestCase - class DnfRPMTransactionApiTest(TestCase): - def setUp(self): - self.base = dnf.Base(dnf.conf.Conf()) -+ self.base.conf.persistdir = "/tmp/tests" - self.base.fill_sack(False, False) - self.base.resolve() - self.rpmTrans = self.base.transaction --- -2.26.2 - diff --git a/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch b/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch deleted file mode 100644 index a844311..0000000 --- a/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch +++ /dev/null @@ -1,26 +0,0 @@ -From c2e4901cec947e5be2e5ff5afa22691841d00bdc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -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/0002-dnfrpmmiscutilspy-fix-usage-of-_.patch b/SOURCES/0002-dnfrpmmiscutilspy-fix-usage-of-_.patch new file mode 100644 index 0000000..0089bc6 --- /dev/null +++ b/SOURCES/0002-dnfrpmmiscutilspy-fix-usage-of-_.patch @@ -0,0 +1,36 @@ +From 8823feb5f42f8c579fdab80d9e22112b88d0ad2b Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin +Date: Tue, 4 May 2021 22:03:30 +0200 +Subject: [PATCH] dnf/rpm/miscutils.py: fix usage of _() + +Specifically: +- an import of _ was missing +- _ was reused for a different purpose +--- + dnf/rpm/miscutils.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/dnf/rpm/miscutils.py b/dnf/rpm/miscutils.py +index 235aaf2..7e33d4c 100644 +--- a/dnf/rpm/miscutils.py ++++ b/dnf/rpm/miscutils.py +@@ -22,6 +22,7 @@ import subprocess + import logging + + from dnf.i18n import ucd ++from dnf.i18n import _ + from shutil import which + + +@@ -46,7 +47,7 @@ def _verifyPkgUsingRpmkeys(package, installroot): + env={'LC_ALL': 'C'}, + stdout=subprocess.PIPE, + cwd='/') as p: +- data, _ = p.communicate() ++ data, err = p.communicate() + if p.returncode != 0 or data != (package.encode('ascii', 'strict') + b': digests signatures OK\n'): + return 0 + else: +-- +libgit2 1.0.1 + diff --git a/SOURCES/0003-Pass-the-package-to-rpmkeys-stdin.patch b/SOURCES/0003-Pass-the-package-to-rpmkeys-stdin.patch new file mode 100644 index 0000000..f8de68f --- /dev/null +++ b/SOURCES/0003-Pass-the-package-to-rpmkeys-stdin.patch @@ -0,0 +1,56 @@ +From 134b095b0833956cadfc02a9a1e7ca1344cd5aaa Mon Sep 17 00:00:00 2001 +From: Demi Marie Obenour +Date: Tue, 27 Apr 2021 21:07:19 -0400 +Subject: [PATCH] Pass the package to rpmkeys stdin + +This avoids having to compute the expected stdout value, which will +always be the constant "-: digests signatures OK\n". +--- + dnf/rpm/miscutils.py | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/dnf/rpm/miscutils.py b/dnf/rpm/miscutils.py +index 7e33d4c..5f2621c 100644 +--- a/dnf/rpm/miscutils.py ++++ b/dnf/rpm/miscutils.py +@@ -29,7 +29,8 @@ from shutil import which + logger = logging.getLogger('dnf') + + +-def _verifyPkgUsingRpmkeys(package, installroot): ++def _verifyPkgUsingRpmkeys(package, installroot, fdno): ++ os.lseek(fdno, 0, os.SEEK_SET) + rpmkeys_binary = '/usr/bin/rpmkeys' + if not os.path.isfile(rpmkeys_binary): + rpmkeys_binary = which("rpmkeys") +@@ -40,15 +41,16 @@ def _verifyPkgUsingRpmkeys(package, installroot): + logger.critical(_('Cannot find rpmkeys executable to verify signatures.')) + return 0 + +- args = ('rpmkeys', '--checksig', '--root', installroot, '--define', '_pkgverify_level all', '--', package) ++ args = ('rpmkeys', '--checksig', '--root', installroot, '--define', '_pkgverify_level all', '-') + with subprocess.Popen( + args=args, + executable=rpmkeys_binary, + env={'LC_ALL': 'C'}, ++ stdin=fdno, + stdout=subprocess.PIPE, + cwd='/') as p: + data, err = p.communicate() +- if p.returncode != 0 or data != (package.encode('ascii', 'strict') + b': digests signatures OK\n'): ++ if p.returncode != 0 or data != b'-: digests signatures OK\n': + return 0 + else: + return 1 +@@ -85,7 +87,7 @@ def checkSig(ts, package): + + if siginfo == '(none)': + value = 4 +- elif "Key ID" in siginfo and _verifyPkgUsingRpmkeys(package, ts.ts.rootDir): ++ elif "Key ID" in siginfo and _verifyPkgUsingRpmkeys(package, ts.ts.rootDir, fdno): + value = 0 + else: + raise ValueError('Unexpected return value %r from hdr.sprintf when checking signature.' % siginfo) +-- +libgit2 1.0.1 + diff --git a/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch b/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch deleted file mode 100644 index d34928f..0000000 --- a/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch +++ /dev/null @@ -1,567 +0,0 @@ -From 9ed390d08a9f2b66f4e352532fa526fc64e329d4 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -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 deleted file mode 100644 index 8447353..0000000 --- a/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch +++ /dev/null @@ -1,130 +0,0 @@ -From df64fd36d7fefe39a96fea3f41e35785bebd37ec Mon Sep 17 00:00:00 2001 -From: Marek Blaha -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-Use-rpmkeys-alone-to-verify-signature.patch b/SOURCES/0004-Use-rpmkeys-alone-to-verify-signature.patch new file mode 100644 index 0000000..73daa7e --- /dev/null +++ b/SOURCES/0004-Use-rpmkeys-alone-to-verify-signature.patch @@ -0,0 +1,176 @@ +From a21880fbac479968546304beeeae3ed3bb899373 Mon Sep 17 00:00:00 2001 +From: Demi Marie Obenour +Date: Fri, 9 Apr 2021 13:03:03 -0400 +Subject: [PATCH] Use rpmkeys alone to verify signature + +This avoids having to actually parse the package to check its signature, +which reduces attack surface. If the output of rpmkeys cannot be +parsed, we assume the package is corrupt (the most likely cause). +--- + dnf/rpm/miscutils.py | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------ + 1 file changed, 66 insertions(+), 60 deletions(-) + +diff --git a/dnf/rpm/miscutils.py b/dnf/rpm/miscutils.py +index 5f2621c..9d5b286 100644 +--- a/dnf/rpm/miscutils.py ++++ b/dnf/rpm/miscutils.py +@@ -13,90 +13,96 @@ + # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + # Copyright 2003 Duke University + +-from __future__ import print_function, absolute_import +-from __future__ import unicode_literals ++from __future__ import print_function, absolute_import, unicode_literals + +-import rpm + import os + import subprocess + import logging +- +-from dnf.i18n import ucd +-from dnf.i18n import _ + from shutil import which + ++from dnf.i18n import _ + +-logger = logging.getLogger('dnf') ++_logger = logging.getLogger('dnf') ++_rpmkeys_binary = None + ++def _find_rpmkeys_binary(): ++ global _rpmkeys_binary ++ if _rpmkeys_binary is None: ++ _rpmkeys_binary = which("rpmkeys") ++ _logger.debug(_('Using rpmkeys executable at %s to verify signatures'), ++ _rpmkeys_binary) ++ return _rpmkeys_binary + +-def _verifyPkgUsingRpmkeys(package, installroot, fdno): +- os.lseek(fdno, 0, os.SEEK_SET) +- rpmkeys_binary = '/usr/bin/rpmkeys' +- if not os.path.isfile(rpmkeys_binary): +- rpmkeys_binary = which("rpmkeys") +- logger.info(_('Using rpmkeys executable from {path} to verify signature for package: {package}.').format( +- path=rpmkeys_binary, package=package)) ++def _process_rpm_output(data): ++ # No signatures or digests = corrupt package. ++ # There is at least one line for -: and another (empty) entry after the ++ # last newline. ++ if len(data) < 3 or data[0] != b'-:' or data[-1]: ++ return 2 ++ seen_sig, missing_key, not_trusted, not_signed = False, False, False, False ++ for i in data[1:-1]: ++ if b': BAD' in i: ++ return 2 ++ elif i.endswith(b': NOKEY'): ++ missing_key = True ++ elif i.endswith(b': NOTTRUSTED'): ++ not_trusted = True ++ elif i.endswith(b': NOTFOUND'): ++ not_signed = True ++ elif not i.endswith(b': OK'): ++ return 2 ++ if not_trusted: ++ return 3 ++ elif missing_key: ++ return 1 ++ elif not_signed: ++ return 4 ++ # we still check return code, so this is safe ++ return 0 + +- if not os.path.isfile(rpmkeys_binary): +- logger.critical(_('Cannot find rpmkeys executable to verify signatures.')) +- return 0 ++def _verifyPackageUsingRpmkeys(package, installroot): ++ rpmkeys_binary = _find_rpmkeys_binary() ++ if rpmkeys_binary is None or not os.path.isfile(rpmkeys_binary): ++ _logger.critical(_('Cannot find rpmkeys executable to verify signatures.')) ++ return 2 + +- args = ('rpmkeys', '--checksig', '--root', installroot, '--define', '_pkgverify_level all', '-') ++ # "--define=_pkgverify_level all" enforces signature checking; ++ # "--define=_pkgverify_flags 0x0" ensures that all signatures and digests ++ # are checked. ++ args = ('rpmkeys', '--checksig', '--root', installroot, '--verbose', ++ '--define=_pkgverify_level all', '--define=_pkgverify_flags 0x0', ++ '-') + with subprocess.Popen( + args=args, + executable=rpmkeys_binary, + env={'LC_ALL': 'C'}, +- stdin=fdno, + stdout=subprocess.PIPE, +- cwd='/') as p: +- data, err = p.communicate() +- if p.returncode != 0 or data != b'-: digests signatures OK\n': +- return 0 +- else: +- return 1 ++ cwd='/', ++ stdin=package) as p: ++ data = p.communicate()[0] ++ returncode = p.returncode ++ if type(returncode) is not int: ++ raise AssertionError('Popen set return code to non-int') ++ # rpmkeys can return something other than 0 or 1 in the case of a ++ # fatal error (OOM, abort() called, SIGSEGV, etc) ++ if returncode >= 2 or returncode < 0: ++ return 2 ++ ret = _process_rpm_output(data.split(b'\n')) ++ if ret: ++ return ret ++ return 2 if returncode else 0 + + def checkSig(ts, package): + """Takes a transaction set and a package, check it's sigs, + return 0 if they are all fine + return 1 if the gpg key can't be found + return 2 if the header is in someway damaged + return 3 if the key is not trusted + return 4 if the pkg is not gpg or pgp signed""" + +- value = 4 +- currentflags = ts.setVSFlags(0) +- fdno = os.open(package, os.O_RDONLY) ++ fdno = os.open(package, os.O_RDONLY|os.O_NOCTTY|os.O_CLOEXEC) + try: +- hdr = ts.hdrFromFdno(fdno) +- except rpm.error as e: +- if str(e) == "public key not available": +- value = 1 +- elif str(e) == "public key not trusted": +- value = 3 +- elif str(e) == "error reading package header": +- value = 2 +- else: +- raise ValueError('Unexpected error value %r from ts.hdrFromFdno when checking signature.' % str(e)) +- else: +- # checks signature from an hdr +- string = '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:' \ +- '{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|' +- try: +- siginfo = hdr.sprintf(string) +- siginfo = ucd(siginfo) +- +- if siginfo == '(none)': +- value = 4 +- elif "Key ID" in siginfo and _verifyPkgUsingRpmkeys(package, ts.ts.rootDir, fdno): +- value = 0 +- else: +- raise ValueError('Unexpected return value %r from hdr.sprintf when checking signature.' % siginfo) +- except UnicodeDecodeError: +- pass +- +- del hdr +- +- os.close(fdno) +- +- ts.setVSFlags(currentflags) # put things back like they were before ++ value = _verifyPackageUsingRpmkeys(fdno, ts.ts.rootDir) ++ finally: ++ os.close(fdno) + return value +-- +libgit2 1.0.1 + diff --git a/SOURCES/0005-Lower-_pkgverify_level-to-signature-for-signature-checking-with-rpmkeys.patch b/SOURCES/0005-Lower-_pkgverify_level-to-signature-for-signature-checking-with-rpmkeys.patch new file mode 100644 index 0000000..f30ae63 --- /dev/null +++ b/SOURCES/0005-Lower-_pkgverify_level-to-signature-for-signature-checking-with-rpmkeys.patch @@ -0,0 +1,36 @@ +From b05f4589e4afb69240ae2001246a5ffb5d6b1b90 Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Thu, 3 Jun 2021 11:23:31 +0200 +Subject: [PATCH] Lower _pkgverify_level to signature for signature checking with rpmkeys + +We don't want to be veryfing digests as well when checking signatures. +It would break legacy package installation in FIPS mode due to MD5 +digest being unverifiable (see https://access.redhat.com/solutions/5221661) + +Follow up for https://github.com/rpm-software-management/dnf/pull/1753 +--- + dnf/rpm/miscutils.py | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/dnf/rpm/miscutils.py b/dnf/rpm/miscutils.py +index 9d5b286..46ef475 100644 +--- a/dnf/rpm/miscutils.py ++++ b/dnf/rpm/miscutils.py +@@ -66,11 +66,10 @@ def _verifyPackageUsingRpmkeys(package, installroot): + _logger.critical(_('Cannot find rpmkeys executable to verify signatures.')) + return 2 + +- # "--define=_pkgverify_level all" enforces signature checking; +- # "--define=_pkgverify_flags 0x0" ensures that all signatures and digests +- # are checked. ++ # "--define=_pkgverify_level signature" enforces signature checking; ++ # "--define=_pkgverify_flags 0x0" ensures that all signatures are checked. + args = ('rpmkeys', '--checksig', '--root', installroot, '--verbose', +- '--define=_pkgverify_level all', '--define=_pkgverify_flags 0x0', ++ '--define=_pkgverify_level signature', '--define=_pkgverify_flags 0x0', + '-') + with subprocess.Popen( + args=args, +-- +libgit2 1.0.1 + diff --git a/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch b/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch deleted file mode 100644 index 233a2fc..0000000 --- a/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch +++ /dev/null @@ -1,1411 +0,0 @@ -From b9a8226185f3ab58e3551b315af2b11a8b2f2ebe Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -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 deleted file mode 100644 index 1ef5a4e..0000000 --- a/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 8f3ce4868ac009976da7323ea39ebcd9a062e32d Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -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/0019-Update-translations.patch b/SOURCES/0006-Update-translations.patch similarity index 59% rename from SOURCES/0019-Update-translations.patch rename to SOURCES/0006-Update-translations.patch index f6d9c68..2295616 100644 --- a/SOURCES/0019-Update-translations.patch +++ b/SOURCES/0006-Update-translations.patch @@ -1,2452 +1,30 @@ -From c01dc4f6a6cdc7297b9ffacc6fe96142f02e4d54 Mon Sep 17 00:00:00 2001 +From 9895b138f231c380a90ebace39dc3a9c44e00d46 Mon Sep 17 00:00:00 2001 From: Marek Blaha -Date: Mon, 8 Mar 2021 16:22:58 +0100 +Date: Mon, 13 Sep 2021 09:45:20 +0200 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(-) + po/fr.po | 1283 +++++++++++++++++-------------- + po/ja.po | 1345 ++++++++++++++++++--------------- + po/ko.po | 2101 +++++++++++++++++++++++++++------------------------ + po/zh_CN.po | 1311 +++++++++++++++++--------------- + 4 files changed, 3225 insertions(+), 2815 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 +index 4e883335..44843ed7 100644 --- a/po/fr.po +++ b/po/fr.po -@@ -18,20 +18,21 @@ - # Ludek Janda , 2018. #zanata +@@ -15,23 +15,25 @@ + # José Fournier , 2017. #zanata + # Jérôme Fenal , 2017. #zanata + # Jean-Baptiste Holcroft , 2018. #zanata, 2020. +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021. # Jean-Baptiste Holcroft , 2019. #zanata, 2020. - # Julien Humbert , 2020. +-# Julien Humbert , 2020. ++# Julien Humbert , 2020, 2021. +# Sundeep Anand , 2021. ++# Guillaume Jacob , 2021. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" @@ -2455,8 +33,8 @@ index 4e883335..bf1ccb6a 100644 -"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" ++"POT-Creation-Date: 2021-08-11 16:00+0200\n" ++"PO-Revision-Date: 2021-09-06 17:24+0000\n" +"Last-Translator: Sundeep Anand \n" +"Language-Team: French \n" "Language: fr\n" @@ -2465,20 +43,35 @@ index 4e883335..bf1ccb6a 100644 "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" ++"X-Generator: Weblate 4.8\n" #: dnf/automatic/emitter.py:32 #, python-format -@@ -88,7 +89,7 @@ msgstr "Valeur de configuration inconnue : %s=%s dans %s ; %s" +@@ -78,7 +80,7 @@ msgstr "Échec de l’envoi d’un courriel par « %s » : %s" + msgid "Failed to execute command '%s': returned %d" + msgstr "Échec dans l’exécution de la commande « %s » : code retour %d" + +-#: dnf/automatic/main.py:164 dnf/conf/config.py:151 ++#: dnf/automatic/main.py:164 + #, python-format + msgid "Unknown configuration value: %s=%s in %s; %s" + msgstr "Valeur de configuration inconnue : %s=%s dans %s ; %s" +@@ -88,22 +90,23 @@ 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 ++#: dnf/automatic/main.py:237 dnf/cli/cli.py:305 msgid "GPG check FAILED" msgstr "La vérification GPG a ÉCHOUÉ" -@@ -101,9 +102,10 @@ msgid "Started dnf-automatic." + #: dnf/automatic/main.py:274 + msgid "Waiting for internet connection..." +-msgstr "En attente d'une connexion Internet…" ++msgstr "En attente d'une connexion Internet..." + + #: dnf/automatic/main.py:304 + msgid "Started dnf-automatic." msgstr "dnf-automatic démarré." #: dnf/automatic/main.py:308 @@ -2492,63 +85,64 @@ index 4e883335..bf1ccb6a 100644 #: dnf/automatic/main.py:315 msgid "System is off-line." -@@ -115,7 +117,7 @@ msgstr "Le système est hors-ligne." +@@ -115,84 +118,84 @@ 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 ++#: dnf/base.py:148 dnf/base.py:477 dnf/base.py:479 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 « {} » : {}" +-#: dnf/base.py:148 ++#: dnf/base.py:150 msgid "Loading repository '{}' has failed" msgstr "Échec du chargement du dépôt « {} »" -#: dnf/base.py:320 -+#: dnf/base.py:322 ++#: dnf/base.py:327 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 ++#: dnf/base.py:332 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 ++#: dnf/base.py:337 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 ++#: dnf/base.py:342 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 ++#: dnf/base.py:348 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 ++#: dnf/base.py:355 #, 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 ++#: dnf/base.py:357 #, 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 ++#: dnf/base.py:361 #, python-format msgid "%s: metadata will expire after %d seconds and will be refreshed now" msgstr "" @@ -2556,31 +150,31 @@ index 4e883335..bf1ccb6a 100644 "maintenant" -#: dnf/base.py:358 -+#: dnf/base.py:360 ++#: dnf/base.py:365 #, 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 ++#: dnf/base.py:371 msgid "Metadata cache created." msgstr "Cache des métadonnées créé." -#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 ++#: dnf/base.py:404 dnf/base.py:471 #, 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 ++#: dnf/base.py:416 dnf/base.py:484 #, python-format msgid "Ignoring repositories: %s" msgstr "Dépôts ignorés : %s" -#: dnf/base.py:412 -+#: dnf/base.py:414 ++#: dnf/base.py:419 #, python-format msgid "Last metadata expiration check: %s ago on %s." msgstr "" @@ -2588,121 +182,121 @@ index 4e883335..bf1ccb6a 100644 " %s." -#: dnf/base.py:443 -+#: dnf/base.py:507 ++#: dnf/base.py:512 msgid "" "The downloaded packages were saved in cache until the next successful " "transaction." -@@ -200,59 +202,59 @@ msgstr "" +@@ -200,59 +203,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 ++#: dnf/base.py:514 #, 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 ++#: dnf/base.py:606 #, 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 ++#: dnf/base.py:662 #, 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 ++#: dnf/base.py:904 msgid "Running transaction check" msgstr "Test de la transaction" -#: dnf/base.py:831 -+#: dnf/base.py:895 ++#: dnf/base.py:912 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 ++#: dnf/base.py:918 msgid "Transaction check succeeded." msgstr "La vérification de la transaction a réussi." -#: dnf/base.py:840 -+#: dnf/base.py:904 ++#: dnf/base.py:921 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 ++#: dnf/base.py:931 dnf/base.py:1082 msgid "RPM: {}" msgstr "RPM : {}" -#: dnf/base.py:851 -+#: dnf/base.py:915 ++#: dnf/base.py:932 msgid "Transaction test error:" msgstr "Erreur de la transaction de test :" -#: dnf/base.py:862 -+#: dnf/base.py:926 ++#: dnf/base.py:943 msgid "Transaction test succeeded." msgstr "Transaction de test réussie." -#: dnf/base.py:883 -+#: dnf/base.py:947 ++#: dnf/base.py:964 msgid "Running transaction" msgstr "Exécution de la transaction" -#: dnf/base.py:911 -+#: dnf/base.py:984 ++#: dnf/base.py:1001 msgid "Disk Requirements:" msgstr "Besoins en espace disque :" -#: dnf/base.py:914 -+#: dnf/base.py:987 ++#: dnf/base.py:1004 #, 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] "" +@@ -263,151 +266,151 @@ 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 ++#: dnf/base.py:1011 msgid "Error Summary" msgstr "Résumé des erreurs" -#: dnf/base.py:947 -+#: dnf/base.py:1020 ++#: dnf/base.py:1037 #, 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 ++#: dnf/base.py:1083 dnf/base.py:1091 msgid "Could not run transaction." msgstr "Impossible d’exécuter la transaction." -#: dnf/base.py:996 -+#: dnf/base.py:1069 ++#: dnf/base.py:1086 msgid "Transaction couldn't start:" msgstr "La transaction n’a pas pu démarrer :" -#: dnf/base.py:1010 -+#: dnf/base.py:1083 ++#: dnf/base.py:1100 #, 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 ++#: dnf/base.py:1182 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 ++#: dnf/base.py:1212 #, python-format msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)" msgstr "" @@ -2710,110 +304,120 @@ index 4e883335..bf1ccb6a 100644 "(%d.1%% économisés)" -#: dnf/base.py:1125 -+#: dnf/base.py:1198 ++#: dnf/base.py:1215 #, 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)" + msgstr "" +-"L’échec des Delta RPMs ont fait augmenter les %.1f MO de mises à jour de " +-"%.1f MB (%d.1%% gaspillés)" ++"Les Delta RPMs en échec ont fait augmenter la taille des mises à jour de " ++"%.1f Mio à %.1f Mio (%d.1%% gaspillés)" -#: dnf/base.py:1167 -+#: dnf/base.py:1240 ++#: dnf/base.py:1257 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 ++#: dnf/base.py:1271 msgid "Could not open: {}" msgstr "Impossible d’ouvrir : {}" -#: dnf/base.py:1219 -+#: dnf/base.py:1292 ++#: dnf/base.py:1309 #, 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 ++#: dnf/base.py:1313 #, python-format msgid "Problem opening package %s" msgstr "Problème à l’ouverture du paquet %s" -#: dnf/base.py:1231 -+#: dnf/base.py:1304 ++#: dnf/base.py:1321 #, 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 ++#: dnf/base.py:1325 #, python-format msgid "Package %s is not signed" msgstr "Le paquet %s n’est pas signé" -#: dnf/base.py:1265 -+#: dnf/base.py:1338 ++#: dnf/base.py:1355 #, python-format msgid "Cannot remove %s" msgstr "Impossible de supprimer %s" -#: dnf/base.py:1269 -+#: dnf/base.py:1342 ++#: dnf/base.py:1359 #, python-format msgid "%s removed" msgstr "%s supprimé" -#: dnf/base.py:1549 -+#: dnf/base.py:1622 ++#: dnf/base.py:1639 msgid "No match for group package \"{}\"" msgstr "Aucune correspondance pour le paquet du groupe « {} »" -#: dnf/base.py:1635 -+#: dnf/base.py:1708 ++#: dnf/base.py:1725 #, 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/__init__.py:499 dnf/cli/commands/__init__.py:592 +-#: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 ++#: dnf/base.py:1748 dnf/cli/cli.py:221 dnf/cli/commands/__init__.py:437 ++#: dnf/cli/commands/__init__.py:494 dnf/cli/commands/__init__.py:587 ++#: dnf/cli/commands/__init__.py:636 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 ++#: dnf/base.py:1766 msgid "No groups marked for removal." msgstr "Aucun groupe marqué pour suppression." -#: dnf/base.py:1710 -+#: dnf/base.py:1783 ++#: dnf/base.py:1800 msgid "No group marked for upgrade." msgstr "Aucun groupe marqué pour mise à jour." -#: dnf/base.py:1925 -+#: dnf/base.py:1997 ++#: dnf/base.py:2014 #, 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." +-#: 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 ++#: dnf/base.py:2016 dnf/base.py:2035 dnf/base.py:2048 dnf/base.py:2075 ++#: dnf/base.py:2128 dnf/base.py:2136 dnf/base.py:2270 dnf/cli/cli.py:417 ++#: dnf/cli/commands/__init__.py:420 dnf/cli/commands/__init__.py:477 ++#: dnf/cli/commands/__init__.py:581 dnf/cli/commands/__init__.py:628 ++#: dnf/cli/commands/__init__.py:706 dnf/cli/commands/install.py:147 + #: dnf/cli/commands/reinstall.py:70 dnf/cli/commands/reinstall.py:84 +-#: dnf/cli/commands/upgrade.py:110 dnf/cli/commands/upgrade.py:121 ++#: dnf/cli/commands/upgrade.py:105 dnf/cli/commands/upgrade.py:116 + #, python-format msgid "No match for argument: %s" msgstr "Aucune correspondance pour l’argument : %s" -#: dnf/base.py:1934 -+#: dnf/base.py:2006 ++#: dnf/base.py:2023 #, python-format msgid "Package %s of lower version already installed, cannot downgrade it." msgstr "" @@ -2821,54 +425,54 @@ index 4e883335..bf1ccb6a 100644 " rétrograder." -#: dnf/base.py:1957 -+#: dnf/base.py:2029 ++#: dnf/base.py:2046 #, 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 ++#: dnf/base.py:2061 #, 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 ++#: dnf/base.py:2072 #, 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 ++#: dnf/base.py:2082 #, python-format msgid "" "The same or higher version of %s is already installed, cannot update it." -@@ -415,127 +417,113 @@ msgstr "" +@@ -415,127 +418,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 ++#: dnf/base.py:2125 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 ++#: dnf/base.py:2131 #, 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 ++#: dnf/base.py:2156 #, 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/base.py:2174 dnf/cli/commands/install.py:136 #: dnf/cli/commands/remove.py:133 #, python-format msgid "Not a valid form: %s" @@ -2876,19 +480,19 @@ index 4e883335..bf1ccb6a 100644 -#: 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/base.py:2189 dnf/cli/commands/__init__.py:676 +#: 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 ++#: dnf/base.py:2277 dnf/cli/cli.py:428 #, 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 ++#: dnf/base.py:2282 #, python-format msgid "Package %s of lowest version already installed, cannot downgrade it." msgstr "" @@ -2910,28 +514,28 @@ index 4e883335..bf1ccb6a 100644 -msgstr "aucun paquet correspondant" - -#: dnf/base.py:2290 -+#: dnf/base.py:2302 ++#: dnf/base.py:2382 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 ++#: dnf/base.py:2384 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 ++#: dnf/base.py:2388 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 ++#: dnf/base.py:2390 msgid "No security updates needed for \"{}\", but {} updates available" msgstr "" "Aucune mise à jour de sécurité n’est nécessaire pour « {} », mais les mises " @@ -2939,143 +543,143 @@ index 4e883335..bf1ccb6a 100644 #. raise an exception, because po.repoid is not in self.repos -#: dnf/base.py:2319 -+#: dnf/base.py:2331 ++#: dnf/base.py:2411 #, 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 ++#: dnf/base.py:2419 #, python-format msgid ". Failing package is: %s" msgstr ". Le paquet en erreur est : %s" -#: dnf/base.py:2328 -+#: dnf/base.py:2340 ++#: dnf/base.py:2420 #, 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 ++#: dnf/base.py:2432 #, 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 ++#: dnf/base.py:2468 msgid "The key has been approved." msgstr "La clef a été approuvée." -#: dnf/base.py:2376 -+#: dnf/base.py:2388 ++#: dnf/base.py:2471 msgid "The key has been rejected." msgstr "La clef a été rejetée." -#: dnf/base.py:2409 -+#: dnf/base.py:2421 ++#: dnf/base.py:2504 #, 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 ++#: dnf/base.py:2506 msgid "Key imported successfully" msgstr "La clé a bien été importée" -#: dnf/base.py:2415 -+#: dnf/base.py:2427 ++#: dnf/base.py:2510 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 ++#: dnf/base.py:2513 #, 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 "" +@@ -544,28 +533,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 ++#: dnf/base.py:2524 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 ++#: dnf/base.py:2577 msgid " * Maybe you meant: {}" msgstr " * Peut-être vouliez-vous dire : {}" -#: dnf/base.py:2514 -+#: dnf/base.py:2526 ++#: dnf/base.py:2609 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 ++#: dnf/base.py:2612 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 ++#: dnf/base.py:2615 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 ++#: dnf/base.py:2618 msgid "" "Some packages have invalid cache, but cannot be downloaded due to \"--" "cacheonly\" option" -@@ -573,29 +561,29 @@ msgstr "" +@@ -573,29 +562,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 ++#: dnf/base.py:2636 dnf/base.py:2656 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 ++#: dnf/base.py:2644 dnf/base.py:2664 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 ++#: dnf/base.py:2646 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 ++#: dnf/base.py:2662 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 ++#: dnf/base.py:2709 #, 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" +@@ -616,8 +605,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 ++#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:804 ++#: dnf/cli/cli.py:808 dnf/cli/commands/alias.py:108 #, python-format msgid "Config error: %s" msgstr "Erreur de configuration : %s" -@@ -650,7 +638,7 @@ msgstr "" +@@ -650,21 +639,21 @@ msgstr "" "Le résulta de l’opération sera le basculement du flux« {1} » du module « {0}" " » vers le flux« {2} »" @@ -3083,117 +687,122 @@ index 4e883335..bf1ccb6a 100644 +#: 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." +-"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." ++"It is not possible to switch enabled streams of a module unless explicitly enabled via configuration option module_stream_switch.\n" ++"It is recommended to rather 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 "" +-"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." ++"Il n’est pas possible de basculer les flux actifs d’un module sauf si cela est explicitement activé par l’option de configuration module_stream_switch.\n" ++"Il est plutôt 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 ++#: dnf/cli/cli.py:212 #, 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 ++#: dnf/cli/cli.py:215 #, python-brace-format msgid "" "{prog} will only download packages, install gpg keys, and check the " -@@ -673,23 +661,23 @@ msgstr "" +@@ -673,23 +662,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 ++#: dnf/cli/cli.py:219 msgid "Operation aborted." msgstr "Opération avortée." -#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 ++#: dnf/cli/cli.py:226 msgid "Downloading Packages:" msgstr "Téléchargement des paquets :" -#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 ++#: dnf/cli/cli.py:232 msgid "Error downloading packages:" msgstr "Erreur de téléchargement des paquets :" -#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 ++#: dnf/cli/cli.py:264 msgid "Transaction failed" msgstr "La transaction a échoué" -#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 ++#: dnf/cli/cli.py:287 msgid "" "Refusing to automatically import keys when running unattended.\n" "Use \"-y\" to override." -@@ -697,91 +685,70 @@ msgstr "" +@@ -697,91 +686,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 ++#: dnf/cli/cli.py:337 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 ++#: dnf/cli/cli.py:370 dnf/cli/cli.py:511 dnf/cli/cli.py:517 msgid "Obsoleting Packages" msgstr "Passage de paquets en obsolètes" -#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 ++#: dnf/cli/cli.py:399 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 ++#: dnf/cli/cli.py:425 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 ++#: dnf/cli/cli.py:434 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 ++#: dnf/cli/cli.py:485 msgid "Installed Packages" msgstr "Paquets installés" -#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 ++#: dnf/cli/cli.py:493 msgid "Available Packages" msgstr "Paquets disponibles" -#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 ++#: dnf/cli/cli.py:497 msgid "Autoremove Packages" msgstr "Supprime des paquets automatiquement" -#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 ++#: dnf/cli/cli.py:499 msgid "Extra Packages" msgstr "Paquets supplémentaires" -#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 ++#: dnf/cli/cli.py:503 msgid "Available Upgrades" msgstr "Mises à jour disponibles" -#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 ++#: dnf/cli/cli.py:519 msgid "Recently Added Packages" msgstr "Paquets récemment ajoutés" -#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 ++#: dnf/cli/cli.py:523 msgid "No matching Packages to list" msgstr "Aucun paquet correspondant à lister" -#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 ++#: dnf/cli/cli.py:604 msgid "No Matches found" msgstr "Aucune correspondance trouvée" @@ -3224,132 +833,274 @@ index 4e883335..bf1ccb6a 100644 -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 ++#: dnf/cli/cli.py:671 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 ++#: dnf/cli/cli.py:685 #, 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 ++#: dnf/cli/cli.py:719 msgid "" "This command has to be run with superuser privileges (under the root user on" " most systems)." -@@ -789,12 +756,12 @@ msgstr "" +@@ -789,12 +757,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 ++#: dnf/cli/cli.py:749 #, 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 ++#: dnf/cli/cli.py:752 #, python-format, python-brace-format msgid "" "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" -@@ -803,7 +770,7 @@ msgstr "" +@@ -803,7 +771,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 ++#: dnf/cli/cli.py:756 #, python-brace-format msgid "" "It could be a {prog} plugin command, but loading of plugins is currently " -@@ -812,7 +779,7 @@ msgstr "" +@@ -812,7 +780,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 ++#: dnf/cli/cli.py:814 msgid "" "--destdir or --downloaddir must be used with --downloadonly or download or " "system-upgrade command." -@@ -820,7 +787,7 @@ msgstr "" +@@ -820,7 +788,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 ++#: dnf/cli/cli.py:820 msgid "" "--enable, --set-enabled and --disable, --set-disabled must be used with " "config-manager command." -@@ -828,7 +795,7 @@ msgstr "" +@@ -828,7 +796,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 ++#: dnf/cli/cli.py:902 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 "" +@@ -837,11 +805,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 ++#: dnf/cli/cli.py:922 msgid "Config file \"{}\" does not exist" msgstr "Le fichier de configuration \"{}\" n’existe pas" -#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 ++#: dnf/cli/cli.py:942 msgid "" "Unable to detect release version (use '--releasever' to specify release " "version)" -@@ -849,28 +816,28 @@ msgstr "" +@@ -849,28 +817,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 ++#: dnf/cli/cli.py:1016 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 ++#: dnf/cli/cli.py:1023 #, python-format msgid "Command \"%s\" already defined" msgstr "Commande « %s » déjà définie" -#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 ++#: dnf/cli/cli.py:1043 msgid "Excludes in dnf.conf: " msgstr "Exclut dans dnf.conf : " -#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 ++#: dnf/cli/cli.py:1046 msgid "Includes in dnf.conf: " msgstr "Inclut dans dnf.conf : " -#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 ++#: dnf/cli/cli.py:1049 msgid "Excludes in repo " msgstr "Exclut dans dépôt " -#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 ++#: dnf/cli/cli.py:1052 msgid "Includes in repo " msgstr "Inclut dans dépôt " -@@ -929,7 +896,7 @@ msgid "show all packages (default)" +@@ -924,38 +892,38 @@ msgstr "Problème avec le dépôt : %s" + msgid "display details about a package or group of packages" + msgstr "affiche les détails d’un paquet ou d’un groupe de paquets" + +-#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:740 ++#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:735 + 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/__init__.py:171 dnf/cli/commands/__init__.py:743 -#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 ++#: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:738 ++#: dnf/cli/commands/module.py:376 msgid "show only available packages" msgstr "affiche uniquement les paquets disponibles" -@@ -1260,78 +1227,78 @@ msgstr "affiche ou utilise les informations des groupes" +-#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:746 ++#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:741 + msgid "show only installed packages" + msgstr "affiche uniquement les paquets installés" + +-#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:749 ++#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:744 + msgid "show only extras packages" + msgstr "affiche uniquement les paquets supplémentaires" + + #: dnf/cli/commands/__init__.py:180 dnf/cli/commands/__init__.py:183 +-#: dnf/cli/commands/__init__.py:752 dnf/cli/commands/__init__.py:755 ++#: dnf/cli/commands/__init__.py:747 dnf/cli/commands/__init__.py:750 + msgid "show only upgrades packages" + msgstr "affiche uniquement les paquets à mettre à jour" + +-#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:758 ++#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:753 + msgid "show only autoremove packages" + msgstr "affiche uniquement les paquets à suppression automatique" + +-#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:761 ++#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:756 + msgid "show only recently changed packages" + msgstr "affiche uniquement les paquet modifiés récemment" + + #: dnf/cli/commands/__init__.py:190 dnf/cli/commands/__init__.py:265 +-#: dnf/cli/commands/__init__.py:774 dnf/cli/commands/autoremove.py:48 ++#: dnf/cli/commands/__init__.py:769 dnf/cli/commands/autoremove.py:48 + #: 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" +@@ -993,70 +961,70 @@ msgstr "recherche les mises à jour de paquets disponibles" + msgid "show changelogs before update" + msgstr "affiche les changelogs avant la mise à jour" + +-#: dnf/cli/commands/__init__.py:361 dnf/cli/commands/__init__.py:414 +-#: dnf/cli/commands/__init__.py:470 ++#: dnf/cli/commands/__init__.py:356 dnf/cli/commands/__init__.py:409 ++#: dnf/cli/commands/__init__.py:465 + msgid "No package available." + msgstr "Pas de paquet disponible." + +-#: dnf/cli/commands/__init__.py:376 ++#: dnf/cli/commands/__init__.py:371 + msgid "No packages marked for install." + msgstr "Aucun paquet marqué en vue d’être installé." + +-#: dnf/cli/commands/__init__.py:412 ++#: dnf/cli/commands/__init__.py:407 + msgid "No package installed." + msgstr "Pas de paquet installé." + +-#: dnf/cli/commands/__init__.py:432 dnf/cli/commands/__init__.py:489 ++#: dnf/cli/commands/__init__.py:427 dnf/cli/commands/__init__.py:484 + #: dnf/cli/commands/reinstall.py:91 + #, python-format + msgid " (from %s)" + msgstr " (depuis %s)" + +-#: dnf/cli/commands/__init__.py:433 dnf/cli/commands/__init__.py:490 ++#: dnf/cli/commands/__init__.py:428 dnf/cli/commands/__init__.py:485 + #: 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." + +-#: dnf/cli/commands/__init__.py:467 dnf/cli/commands/__init__.py:576 +-#: dnf/cli/commands/__init__.py:619 dnf/cli/commands/__init__.py:666 ++#: dnf/cli/commands/__init__.py:462 dnf/cli/commands/__init__.py:571 ++#: dnf/cli/commands/__init__.py:614 dnf/cli/commands/__init__.py:661 + msgid "No package installed from the repository." + msgstr "Aucun paquet installé depuis le dépôt." + +-#: dnf/cli/commands/__init__.py:530 dnf/cli/commands/reinstall.py:101 ++#: dnf/cli/commands/__init__.py:525 dnf/cli/commands/reinstall.py:101 + msgid "No packages marked for reinstall." + msgstr "Aucun paquet marqué pour réinstallation." + +-#: dnf/cli/commands/__init__.py:716 dnf/cli/commands/upgrade.py:89 ++#: dnf/cli/commands/__init__.py:711 dnf/cli/commands/upgrade.py:84 + msgid "No packages marked for upgrade." + msgstr "Aucun paquet marqué pour mise à jour." + +-#: dnf/cli/commands/__init__.py:726 ++#: dnf/cli/commands/__init__.py:721 + msgid "run commands on top of all packages in given repository" + msgstr "exécute des commandes pour chaque paquet d’un dépôt donné" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "REPOID" + msgstr "REPOID" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "Repository ID" + msgstr "ID du dépôt" + +-#: dnf/cli/commands/__init__.py:777 dnf/cli/commands/mark.py:48 ++#: dnf/cli/commands/__init__.py:772 dnf/cli/commands/mark.py:48 + #: dnf/cli/commands/updateinfo.py:108 + msgid "Package specification" + msgstr "Caractéristiques de paquet" + +-#: dnf/cli/commands/__init__.py:801 ++#: dnf/cli/commands/__init__.py:796 + msgid "display a helpful usage message" + msgstr "affiche un message d’aide à l’utilisation" + +-#: dnf/cli/commands/__init__.py:805 ++#: dnf/cli/commands/__init__.py:800 + msgid "COMMAND" + msgstr "COMMANDE" + +-#: dnf/cli/commands/__init__.py:806 ++#: dnf/cli/commands/__init__.py:801 + #, python-brace-format + msgid "{prog} command to get help for" + msgstr "{prog} commande pour obtenir de l’aide" +@@ -1231,9 +1199,12 @@ msgstr "" + "En attente de la fin d’exécution du processus ayant l’identifiant (pid) %d." + + #: dnf/cli/commands/deplist.py:32 +-msgid "List package's dependencies and what packages provide them" ++msgid "" ++"[deprecated, use repoquery --deplist] List package's dependencies and what " ++"packages provide them" + msgstr "" +-"Liste les dépendances du paquet et indique quels paquets les fournissent" ++"[obsolète, utilsez repoquery --deplist] Liste les dépendances du paquet et " ++"indique quels paquets les fournissent" + + #: dnf/cli/commands/distrosync.py:32 + msgid "synchronize installed packages to the latest available versions" +@@ -1260,78 +1231,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." @@ -3447,7 +1198,7 @@ index 4e883335..bf1ccb6a 100644 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." +@@ -1385,16 +1356,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." @@ -3467,7 +1218,7 @@ index 4e883335..bf1ccb6a 100644 #, python-format msgid "" "Cannot undo transaction %s, doing so would result in an inconsistent package" -@@ -1403,7 +1370,7 @@ msgstr "" +@@ -1403,7 +1374,7 @@ msgstr "" "Impossible de défaire la transaction %s ; cela aboutirait à une base de " "données des paquets incohérente." @@ -3476,7 +1227,7 @@ index 4e883335..bf1ccb6a 100644 #, python-format msgid "" "Cannot rollback transaction %s, doing so would result in an inconsistent " -@@ -1412,7 +1379,34 @@ msgstr "" +@@ -1412,7 +1383,34 @@ msgstr "" "Impossible de défaire la transaction %s ; cela aboutirait à une base de " "données des paquets incohérente." @@ -3488,7 +1239,7 @@ index 4e883335..bf1ccb6a 100644 +#: dnf/cli/commands/history.py:179 +#, python-brace-format +msgid "Transaction ID \"{0}\" not found." -+msgstr "ID de transaction \"{0}\" introuvable." ++msgstr "ID de transaction « {0} » non trouvé." + +#: dnf/cli/commands/history.py:185 +msgid "Found more than one transaction ID!" @@ -3512,7 +1263,7 @@ index 4e883335..bf1ccb6a 100644 msgid "" "Invalid transaction ID range definition '{}'.\n" "Use '..'." -@@ -1420,7 +1414,7 @@ msgstr "" +@@ -1420,7 +1418,7 @@ msgstr "" "La définition de la plage d’identifiants de transaction est invalide « {} ».\n" "Utilisez « .. »." @@ -3521,7 +1272,7 @@ index 4e883335..bf1ccb6a 100644 msgid "" "Can't convert '{}' to transaction ID.\n" "Use '', 'last', 'last-'." -@@ -1428,37 +1422,31 @@ msgstr "" +@@ -1428,36 +1426,30 @@ msgstr "" "Impossible de convertir « {} » à ID transaction.\n" "Utiliser « », « last », « last- »." @@ -3562,13 +1313,11 @@ index 4e883335..bf1ccb6a 100644 +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 :" ++"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" +@@ -1477,7 +1469,7 @@ msgstr "Impossible de trouver une correspondance" msgid "Not a valid rpm file path: %s" msgstr "Chemin du fichier RPM invalide : %s" @@ -3577,7 +1326,7 @@ index 4e883335..bf1ccb6a 100644 #, 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." +@@ -1522,7 +1514,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 @@ -3586,63 +1335,124 @@ index 4e883335..bf1ccb6a 100644 msgid "Error:" msgstr "Erreur :" -@@ -1580,42 +1568,46 @@ msgid "Package {} belongs to multiple modules, skipping" +@@ -1531,7 +1523,7 @@ msgstr "Erreur :" + msgid "Package %s is not installed." + msgstr "Le paquet %s n’est pas installé." + +-#: dnf/cli/commands/module.py:51 ++#: dnf/cli/commands/module.py:54 + msgid "" + "Only module name, stream, architecture or profile is used. Ignoring unneeded" + " information in argument: '{}'" +@@ -1539,83 +1531,87 @@ msgstr "" + "Seul le nom, le flux, l’architecture ou le profil du module est utilisé. Les" + " paramètres inutiles ont été ignorés dans le paramètre : « {} »" + +-#: dnf/cli/commands/module.py:77 ++#: dnf/cli/commands/module.py:80 + msgid "list all module streams, profiles and states" + msgstr "dresser la liste de tous les flux, profils et états des modules" + +-#: dnf/cli/commands/module.py:105 dnf/cli/commands/module.py:128 ++#: dnf/cli/commands/module.py:108 dnf/cli/commands/module.py:131 + msgid "No matching Modules to list" + msgstr "Aucun module correspondant à lister" + +-#: dnf/cli/commands/module.py:111 ++#: dnf/cli/commands/module.py:114 + msgid "print detailed information about a module" + msgstr "afficher les informations détaillées à propos d’un module" + +-#: dnf/cli/commands/module.py:133 ++#: dnf/cli/commands/module.py:136 + msgid "enable a module stream" + msgstr "activer un flux de modules" + +-#: dnf/cli/commands/module.py:157 ++#: dnf/cli/commands/module.py:160 + msgid "disable a module with all its streams" + msgstr "désactiver un module avec tous ses flux" + +-#: dnf/cli/commands/module.py:181 ++#: dnf/cli/commands/module.py:184 + msgid "reset a module" + msgstr "réinitialiser un module" + +-#: dnf/cli/commands/module.py:202 ++#: dnf/cli/commands/module.py:205 + msgid "install a module profile including its packages" + msgstr "installer un profil de module, y compris ses paquets" + +-#: dnf/cli/commands/module.py:223 ++#: dnf/cli/commands/module.py:226 + msgid "update packages associated with an active stream" + msgstr "mettre à jour les paquets associés à un flux actif" + +-#: dnf/cli/commands/module.py:240 ++#: dnf/cli/commands/module.py:243 + msgid "remove installed module profiles and their packages" + msgstr "supprimer les profils de modules installés et leurs paquets" + +-#: dnf/cli/commands/module.py:264 ++#: dnf/cli/commands/module.py:267 + msgid "Package {} belongs to multiple modules, skipping" msgstr "Le paquet {} appartient à de multiples modules, ignorer" - #: dnf/cli/commands/module.py:277 +-#: dnf/cli/commands/module.py:277 ++#: dnf/cli/commands/module.py:280 +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 ++#: dnf/cli/commands/module.py:302 msgid "list modular packages" msgstr "dresser une liste des paquets modulaires" -#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 ++#: dnf/cli/commands/module.py:317 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 ++#: dnf/cli/commands/module.py:352 msgid "Interact with Modules." msgstr "Interagit avec les modules." -#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 ++#: dnf/cli/commands/module.py:365 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 ++#: dnf/cli/commands/module.py:368 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 ++#: dnf/cli/commands/module.py:371 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 ++#: dnf/cli/commands/module.py:374 msgid "show profile content" msgstr "affiche le contenu du profil" -#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 ++#: dnf/cli/commands/module.py:379 msgid "remove all modular packages" msgstr "Supprimer les paquets modulaires" -#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 ++#: dnf/cli/commands/module.py:389 msgid "Module specification" msgstr "Caractéristique de module" -#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 ++#: dnf/cli/commands/module.py:411 msgid "{} {} {}: too few arguments" msgstr "{} {} {} : trop peu de paramètres" -@@ -2133,22 +2125,22 @@ msgstr "MOTCLEF" +@@ -2133,22 +2129,22 @@ msgstr "MOTCLEF" msgid "Keyword to search for" msgstr "Mot-clef à chercher" @@ -3669,7 +1479,7 @@ index 4e883335..bf1ccb6a 100644 msgid "URL" msgstr "URL" -@@ -2291,16 +2283,16 @@ msgstr "" +@@ -2291,16 +2287,16 @@ msgstr "" "run résoud et exécute l’ensemble de transactions\n" "exit (ou quit) quitte l’interpréteur de commandes" @@ -3689,18 +1499,18 @@ index 4e883335..bf1ccb6a 100644 msgid "Leaving Shell" msgstr "Abandon de l’interpréteur de commandes" -@@ -2497,8 +2489,8 @@ msgstr "Criticité" +@@ -2497,8 +2493,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 ++#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 dnf/util.py:617 msgid "Installed" msgstr "Installé" -@@ -2862,13 +2854,13 @@ msgstr "Impossible d’encoder l’argument « %s » : %s" +@@ -2862,13 +2858,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. @@ -3716,7 +1526,7 @@ index 4e883335..bf1ccb6a 100644 msgid "Epoch" msgstr "Époque" -@@ -2876,38 +2868,38 @@ msgstr "Époque" +@@ -2876,38 +2872,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. @@ -3761,7 +1571,7 @@ index 4e883335..bf1ccb6a 100644 msgctxt "long" msgid "Size" msgstr "Taille" -@@ -2916,32 +2908,32 @@ msgstr "Taille" +@@ -2916,32 +2912,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. @@ -3799,7 +1609,7 @@ index 4e883335..bf1ccb6a 100644 msgid "From repo" msgstr "Depuis le dépôt" -@@ -2949,316 +2941,312 @@ msgstr "Depuis le dépôt" +@@ -2949,316 +2945,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. @@ -4183,7 +1993,7 @@ index 4e883335..bf1ccb6a 100644 #, python-format msgid "" "Skipping packages with conflicts:\n" -@@ -3267,12 +3255,12 @@ msgstr "" +@@ -3267,12 +3259,12 @@ msgstr "" "Ignorer les paquets en conflit :\n" "(ajouter « %s » à la ligne de commande pour forcer leur mise à niveau)" @@ -4198,7 +2008,7 @@ index 4e883335..bf1ccb6a 100644 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" +@@ -3280,22 +3272,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. @@ -4225,17 +2035,17 @@ index 4e883335..bf1ccb6a 100644 #, python-format msgid "" "\n" -@@ -3307,289 +3295,273 @@ msgstr "" +@@ -3307,289 +3299,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 ++#: dnf/cli/output.py:1296 dnf/cli/output.py:1814 dnf/cli/output.py:1815 msgid "Install" msgstr "Installer" -#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 ++#: dnf/cli/output.py:1300 dnf/cli/output.py:1823 msgid "Upgrade" msgstr "Mettre à niveau" @@ -4245,7 +2055,7 @@ index 4e883335..bf1ccb6a 100644 msgstr "Supprimer" -#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 ++#: dnf/cli/output.py:1303 dnf/cli/output.py:1821 msgid "Downgrade" msgstr "Retrograder" @@ -4314,278 +2124,278 @@ index 4e883335..bf1ccb6a 100644 #. TRANSLATORS: user names who executed transaction in history command output -#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 ++#: dnf/cli/output.py:1531 msgid "User name" msgstr "Nom d’utilisateur" -#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 ++#: dnf/cli/output.py:1533 msgid "ID" msgstr "ID" -#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 ++#: dnf/cli/output.py:1535 msgid "Date and time" msgstr "Date et heure" -#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 ++#: dnf/cli/output.py:1536 msgid "Action(s)" msgstr "Action(s)" -#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 ++#: dnf/cli/output.py:1537 msgid "Altered" msgstr "Modifié" -#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 ++#: dnf/cli/output.py:1580 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 ++#: dnf/cli/output.py:1581 dnf/cli/output.py:1597 msgid "Failed history info" msgstr "Infos sur l’historique des échecs" -#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 ++#: dnf/cli/output.py:1596 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 ++#: dnf/cli/output.py:1654 msgid "Erased" msgstr "Effacé" -#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1822 dnf/util.py:616 +msgid "Downgraded" +msgstr "Rétrogradé" + -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1824 dnf/util.py:615 +msgid "Upgraded" +msgstr "Mis à niveau" + -+#: dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 msgid "Not installed" msgstr "Non installé" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 msgid "Newer" msgstr "Plus récent" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 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 ++#: dnf/cli/output.py:1705 dnf/cli/output.py:1707 msgid "Transaction ID :" msgstr "Identifiant de transaction :" -#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 ++#: dnf/cli/output.py:1710 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 ++#: dnf/cli/output.py:1713 dnf/cli/output.py:1715 msgid "Begin rpmdb :" msgstr "Début de RPMDB :" -#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 ++#: dnf/cli/output.py:1721 #, python-format msgid "(%u seconds)" msgstr "(%u secondes)" -#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 ++#: dnf/cli/output.py:1723 #, python-format msgid "(%u minutes)" msgstr "(%u minutes)" -#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 ++#: dnf/cli/output.py:1725 #, python-format msgid "(%u hours)" msgstr "(%u heures)" -#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 ++#: dnf/cli/output.py:1727 #, python-format msgid "(%u days)" msgstr "(%u jours)" -#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 ++#: dnf/cli/output.py:1728 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 ++#: dnf/cli/output.py:1731 dnf/cli/output.py:1733 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 ++#: dnf/cli/output.py:1740 dnf/cli/output.py:1742 msgid "User :" msgstr "Utilisateur :" -#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1753 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 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1749 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1753 dnf/cli/output.py:1755 dnf/cli/output.py:1757 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 ++#: dnf/cli/output.py:1749 dnf/cli/output.py:1757 msgid "Success" msgstr "Réussi" -#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 ++#: dnf/cli/output.py:1751 msgid "Failures:" msgstr "Échecs :" -#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 ++#: dnf/cli/output.py:1755 msgid "Failure:" msgstr "Échec :" -#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 ++#: dnf/cli/output.py:1765 dnf/cli/output.py:1767 msgid "Releasever :" msgstr "Releasever :" -#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 ++#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 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 ++#: dnf/cli/output.py:1779 dnf/cli/output.py:1781 msgid "Comment :" msgstr "Commentaire :" -#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 ++#: dnf/cli/output.py:1785 msgid "Transaction performed with:" msgstr "Transaction effectuée avec :" -#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 ++#: dnf/cli/output.py:1794 msgid "Packages Altered:" msgstr "Paquets modifiés :" -#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 ++#: dnf/cli/output.py:1800 msgid "Scriptlet output:" msgstr "Sortie du mini script :" -#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 ++#: dnf/cli/output.py:1807 msgid "Errors:" msgstr "Erreurs :" -#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 ++#: dnf/cli/output.py:1816 msgid "Dep-Install" msgstr "Installation des dépendances" -#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 ++#: dnf/cli/output.py:1817 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 ++#: dnf/cli/output.py:1818 dnf/transaction.py:84 dnf/transaction.py:85 msgid "Obsoleting" msgstr "Rend obsolète" -#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 ++#: dnf/cli/output.py:1819 msgid "Erase" msgstr "Effacement" -#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 ++#: dnf/cli/output.py:1820 msgid "Reinstall" msgstr "Réinstallation" -#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 ++#: dnf/cli/output.py:1894 #, 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 ++#: dnf/cli/output.py:1896 #, 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 ++#: dnf/cli/output.py:1898 #, 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 ++#: dnf/cli/output.py:1900 #, 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 ++#: dnf/cli/output.py:1902 #, 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 ++#: dnf/cli/output.py:1904 #, 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 ++#: dnf/cli/output.py:1906 #, 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 ++#: dnf/cli/output.py:1908 #, 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 ++#: dnf/cli/output.py:1917 msgid "--> Starting dependency resolution" msgstr "--> Début de la résolution des dépendances" -#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 ++#: dnf/cli/output.py:1921 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 ++#: dnf/cli/output.py:1935 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." +@@ -3677,7 +3653,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." @@ -4594,44 +2404,204 @@ index 4e883335..bf1ccb6a 100644 #, 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é" +@@ -3702,6 +3678,11 @@ msgstr "L’id de groupe « %s » n’existe pas." + msgid "Error parsing '%s': %s" + msgstr "Erreur lors l’analyse de « %s » : %s" + ++#: dnf/conf/config.py:151 ++#, python-format ++msgid "Invalid configuration value: %s=%s in %s; %s" ++msgstr "Valeur de configuration non valide : %s=%s dans %s ; %s" ++ + #: dnf/conf/config.py:226 + msgid "Could not set cachedir: {}" + msgstr "N’a pas pu définir cachedir : {}" +@@ -3745,39 +3726,39 @@ msgstr "" + msgid "Repo %s did not have a %s attr. before setopt" + msgstr "Le dépôt « %s » n’avait pas d’attr. %s avant setopt" + +-#: dnf/conf/read.py:51 ++#: dnf/conf/read.py:60 + #, python-format + msgid "Warning: failed loading '%s', skipping." + msgstr "Attention : lecture de « %s » erronée ; ignorer." + +-#: dnf/conf/read.py:63 ++#: dnf/conf/read.py:72 + msgid "Bad id for repo: {} ({}), byte = {} {}" + msgstr "Id erroné pour le dépôt : {} ({}), byte = {} {}" + +-#: dnf/conf/read.py:67 ++#: dnf/conf/read.py:76 + msgid "Bad id for repo: {}, byte = {} {}" + msgstr "Id erroné pour le dépôt : {}, byte = {} {}" + +-#: dnf/conf/read.py:75 ++#: dnf/conf/read.py:84 + msgid "Repository '{}' ({}): Error parsing config: {}" + msgstr "Dépôt « {} » ({}) : erreur lors de l’analyse de la configuration : {}" + +-#: dnf/conf/read.py:78 ++#: dnf/conf/read.py:87 + msgid "Repository '{}': Error parsing config: {}" + msgstr "Dépôt « {} » : erreur lors de l’analyse de la configuration : {}" + +-#: dnf/conf/read.py:84 ++#: dnf/conf/read.py:93 + msgid "Repository '{}' ({}) is missing name in configuration, using id." + msgstr "" + "Il manque le nom du dépôt « {} » ({}) dans la configuration, utilisation de " + "l’id." + +-#: dnf/conf/read.py:87 ++#: dnf/conf/read.py:96 + msgid "Repository '{}' is missing name in configuration, using id." + msgstr "" + "Il manque le nom du dépôt « {} » dans la configuration, utilisation de l’id." + +-#: dnf/conf/read.py:104 ++#: dnf/conf/read.py:113 + msgid "Parsing file \"{}\" failed: {}" + msgstr "La lecture du fichier « {} » a échoué : {}" + +@@ -3791,7 +3772,20 @@ 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 +-#: dnf/db/group.py:293 ++#: dnf/crypto.py:145 ++msgid "Verified using DNS record with DNSSEC signature." ++msgstr "Vérifié en utilisant un enregistrement DNS avec une signature DNSSEC." ++ ++#: dnf/crypto.py:147 ++msgid "NOT verified using DNS record." ++msgstr "NON vérifié avec un enregistrement DNS." ++ ++#: dnf/crypto.py:184 +#, 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" ++msgstr "récupération de la clé de dépôt pour %s déchiffrée à partir de %s" + - #: dnf/db/group.py:293 ++#: dnf/db/group.py:301 msgid "" "No available modular metadata for modular package '{}', it cannot be " -@@ -3878,7 +3855,7 @@ msgid_plural "Modular dependency problems with Defaults:" + "installed on the system" +@@ -3799,21 +3793,21 @@ 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:343 ++#: dnf/db/group.py:351 + msgid "No available modular metadata for modular package" + msgstr "Aucune métadonnée de module disponible pour le paquet modulaire" + +-#: dnf/db/group.py:377 ++#: dnf/db/group.py:385 + #, python-format + msgid "Will not install a source rpm package (%s)." + msgstr "Un paquet source rpm ne sera pas installé (%s)." + + #: dnf/dnssec.py:168 + msgid "" +-"Configuration option 'gpgkey_dns_verification' requires libunbound ({})" ++"Configuration option 'gpgkey_dns_verification' requires python3-unbound ({})" + msgstr "" +-"L’option de configuration « gpgkey_dns_verification » nécessite libunbound " +-"({})" ++"L’option de configuration « gpgkey_dns_verification » nécessite " ++"python3-unbound({})" + + #: dnf/dnssec.py:239 + msgid "DNSSEC extension: Key for user " +@@ -3878,7 +3872,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 ++#: dnf/exceptions.py:131 dnf/module/module_base.py:854 msgid "Modular dependency problem:" msgid_plural "Modular dependency problems:" msgstr[0] "Problème de dépendance modulaire :" -@@ -3935,8 +3912,8 @@ msgstr "" +@@ -3915,7 +3909,47 @@ msgstr "Modules activés : {}." + msgid "No profile specified for '{}', please specify profile." + msgstr "Aucun profil spécifié pour « {} », veuillez spécifier un profil." + +-#: dnf/module/module_base.py:33 ++#: dnf/module/exceptions.py:27 ++msgid "No such module: {}" ++msgstr "Aucun module de ce type : {}" ++ ++#: dnf/module/exceptions.py:33 ++msgid "No such stream: {}" ++msgstr "Aucun flux de ce type : {}" ++ ++#: dnf/module/exceptions.py:39 ++msgid "No enabled stream for module: {}" ++msgstr "Aucun flux activé pour le module : {}" ++ ++#: dnf/module/exceptions.py:46 ++msgid "Cannot enable more streams from module '{}' at the same time" ++msgstr "Ne peut pas activer plus de flux du module « {} » en même temps" ++ ++#: dnf/module/exceptions.py:52 ++msgid "Different stream enabled for module: {}" ++msgstr "Différent flux activé pour le module : {}" ++ ++#: dnf/module/exceptions.py:58 ++msgid "No such profile: {}" ++msgstr "Aucun profil de ce type : {}" ++ ++#: dnf/module/exceptions.py:64 ++msgid "Specified profile not installed for {}" ++msgstr "Le profil spécifié n'est pas installé pour {}" ++ ++#: dnf/module/exceptions.py:70 ++msgid "No stream specified for '{}', please specify stream" ++msgstr "Aucun flux spécifié pour « {} », veuillez spécifier un flux" ++ ++#: dnf/module/exceptions.py:82 ++msgid "No such profile: {}. No profiles available" ++msgstr "Aucun dépôt de ce type : {}. Aucun profile n’est disponible" ++ ++#: dnf/module/exceptions.py:88 ++msgid "No profile to remove for '{}'" ++msgstr "Aucun profil à retirer pour « {} »" ++ ++#: dnf/module/module_base.py:35 + msgid "" + "\n" + "\n" +@@ -3925,7 +3959,7 @@ msgstr "" + "\n" + "Aide : [d]éfaut, [e]activé, [x]désactivé, [i]nstallé" + +-#: dnf/module/module_base.py:34 ++#: dnf/module/module_base.py:36 + msgid "" + "\n" + "\n" +@@ -3935,82 +3969,105 @@ 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 ++#: dnf/module/module_base.py:56 dnf/module/module_base.py:556 ++#: dnf/module/module_base.py:615 dnf/module/module_base.py:681 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 « " +-#: dnf/module/module_base.py:84 ++#: dnf/module/module_base.py:86 + #, python-brace-format + msgid "All matches for argument '{0}' in module '{1}:{2}' are not active" + msgstr "" +-"Toutes les correspondance pour le paramètre « {0} » dans le mode module « " ++"Toutes les correspondances 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 ++#: dnf/module/module_base.py:94 dnf/module/module_base.py:204 #, python-brace-format msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" msgstr "" @@ -4639,7 +2609,7 @@ index 4e883335..bf1ccb6a 100644 "permise" -#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 ++#: dnf/module/module_base.py:104 dnf/module/module_base.py:214 msgid "" "Unable to match profile for argument {}. Available profiles for '{}:{}': {}" msgstr "" @@ -4647,16 +2617,28 @@ index 4e883335..bf1ccb6a 100644 "disponibles pour « {}:{} » : {}" -#: dnf/module/module_base.py:106 -+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216 ++#: dnf/module/module_base.py:108 dnf/module/module_base.py:218 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 {} : {}" +-#: dnf/module/module_base.py:118 ++#: dnf/module/module_base.py:120 + msgid "No default profiles for module {}:{}. Available profiles: {}" + msgstr "" + "Aucun profil par défaut pour le module {}:{}. Profils disponibles : {}" + +-#: dnf/module/module_base.py:122 ++#: dnf/module/module_base.py:124 + msgid "No profiles for module {}:{}" + msgstr "Aucun profil pour le module {} : {}" + +-#: dnf/module/module_base.py:129 ++#: dnf/module/module_base.py:131 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 ++#: dnf/module/module_base.py:144 dnf/module/module_base.py:247 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" @@ -4665,28 +2647,28 @@ index 4e883335..bf1ccb6a 100644 -#: 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 ++#: dnf/module/module_base.py:196 +#, 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}'" ++"Aucune correspondance active pour le paramètre « {0} » dans le module « " ++"{1}:{2} »" + -+#: dnf/module/module_base.py:226 ++#: dnf/module/module_base.py:228 +#, 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}'" ++"Le profil installé « {0} » n’est pas disponible dans le module « {1} » flux " ++"« {2} »" + -+#: dnf/module/module_base.py:265 ++#: dnf/module/module_base.py:267 +msgid "No packages available to distrosync for package name '{}'" -+msgstr "" -+"Aucun paquet disponible pour la distribution pour le nom de paquet '{}'" ++msgstr "Aucun paquet distrosync disponible 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 ++#: dnf/module/module_base.py:310 dnf/module/module_base.py:461 ++#: dnf/module/module_base.py:486 dnf/module/module_base.py:505 ++#: dnf/module/module_base.py:552 dnf/module/module_base.py:611 ++#: dnf/module/module_base.py:677 dnf/module/module_base.py:840 msgid "Unable to resolve argument {}" msgstr "Impossible de résoudre le paramètre {}" @@ -4695,7 +2677,7 @@ index 4e883335..bf1ccb6a 100644 -msgstr "Aucune correspondance pour le paquet {}" - -#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 ++#: dnf/module/module_base.py:321 #, python-brace-format msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed" msgstr "" @@ -4703,50 +2685,99 @@ index 4e883335..bf1ccb6a 100644 " 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 ++#: dnf/module/module_base.py:340 dnf/module/module_base.py:368 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 ++#: dnf/module/module_base.py:348 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 ++#: dnf/module/module_base.py:422 ++#, python-brace-format ++msgid "" ++"Argument '{argument}' matches {stream_count} streams ('{streams}') of module" ++" '{module}', but none of the streams are enabled or default" ++msgstr "" ++"L'argument « {argument} » correspond à {stream_count} flux (« {streams} ») " ++"du module « {module} », mais aucun des flux n'est activé ou par défaut" ++ ++#: dnf/module/module_base.py:509 msgid "" "Only module name is required. Ignoring unneeded information in argument: " "'{}'" -@@ -4018,7 +4009,11 @@ msgstr "" +@@ -4018,10 +4075,9 @@ 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 +-#, python-format +-msgid "%s: %s check failed: %s vs %s" +-msgstr "%s : %s vérification a échoué : %s vs %s" ++#: dnf/module/module_base.py:841 +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" + + #. empty file is invalid json format + #: dnf/persistor.py:54 +@@ -4032,12 +4088,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" ++msgstr "Échec du chargement du cache des dépôts 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" ++msgstr "Échec du stockage du cache des dépôts 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" +@@ -4057,17 +4113,17 @@ msgstr "La lecture du fichier a échoué : %s" + msgid "Loaded plugins: %s" + msgstr "Plugins chargés : %s" + +-#: dnf/plugin.py:199 ++#: dnf/plugin.py:211 + #, python-format + msgid "Failed loading plugin \"%s\": %s" + msgstr "Échec lors du chargement du module « %s » : %s" + +-#: dnf/plugin.py:231 ++#: dnf/plugin.py:243 + msgid "No matches found for the following enable plugin patterns: {}" + msgstr "" + "Aucun élément correspondant aux modèles de plugin d’activation suivants : {}" + +-#: dnf/plugin.py:235 ++#: dnf/plugin.py:247 + msgid "No matches found for the following disable plugin patterns: {}" + msgstr "" + "Aucun élément correspondant aux modèles de plugin de désactivation suivants " +@@ -4098,10 +4154,32 @@ msgstr "activation du dépôt %s" + msgid "Added %s repo from %s" + msgstr "Ajout du dépôt %s depuis le %s" + ++#: dnf/rpm/miscutils.py:35 ++#, python-brace-format ++msgid "" ++"Using rpmkeys executable from {path} to verify signature for package: " ++"{package}." ++msgstr "" ++"Utilisation de l'exécutable rpmkeys de {path} pour vérifier la signature du " ++"package : {package}." ++ ++#: dnf/rpm/miscutils.py:39 ++msgid "Cannot find rpmkeys executable to verify signatures." ++msgstr "" ++"Impossible de trouver l’exécutable rpmkeys pour vérifier les signatures." ++ + #: dnf/rpm/transaction.py:119 msgid "Errors occurred during test transaction." msgstr "Des erreurs sont survenues lors de la transaction de test." @@ -4755,13 +2786,13 @@ index 4e883335..bf1ccb6a 100644 +"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" ++"allow_vendor_change est désactivé. Cette option n’est actuellement pas prise" ++" en charge pour les commandes downgrade et 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" +@@ -4148,27 +4226,31 @@ msgstr "Exécution du scriptlet" msgid "Preparing" msgstr "Préparation" @@ -4775,7 +2806,7 @@ index 4e883335..bf1ccb6a 100644 +"\"{filename}\":" +msgstr "" +"Les problèmes suivants sont survenus lors de la relecture de la transaction " -+"à partir du fichier \"{filename}\" :" ++"à partir du fichier « {filename} » :" -#: dnf/transaction_sr.py:70 -#, python-brace-format @@ -4784,7 +2815,7 @@ index 4e883335..bf1ccb6a 100644 +#: 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 :" ++"Les problèmes suivants sont survenus lors de l'exécution d'une transaction :" -#: dnf/transaction_sr.py:87 +#: dnf/transaction_sr.py:89 @@ -4803,7 +2834,7 @@ index 4e883335..bf1ccb6a 100644 #, python-brace-format msgid "" "Incompatible major version \"{major}\", supported major version is " -@@ -4177,137 +4184,186 @@ msgstr "" +@@ -4177,137 +4259,192 @@ msgstr "" "Version majeure incompatible « {major} », la version majeure prise en charge" " est « {major_supp} »." @@ -4837,22 +2868,22 @@ index 4e883335..bf1ccb6a 100644 #, 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}\"." ++"Valeur inattendue pour le paquet de raison « {reason} » pour le 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}\"." ++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}\"." ++msgstr "Impossible de trouver le rpm nevra « {nevra} »." -#: dnf/transaction_sr.py:301 -#, fuzzy, python-brace-format @@ -4861,7 +2892,7 @@ index 4e883335..bf1ccb6a 100644 +#, 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}\"." ++msgstr "Le paquet « {na} » est déjà installé pour l’action « {action} »." -#: dnf/transaction_sr.py:311 +#: dnf/transaction_sr.py:345 @@ -4870,22 +2901,23 @@ index 4e883335..bf1ccb6a 100644 "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}\"." ++"Le paquet nevra « {nevra} » n’est pas disponible dans les dépôts pour " ++"l’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}\"." + 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}\"." + msgstr "" ++"Valeur inattendue pour l’action de paquet « {action} » pour le rpm nevra " ++"« {nevra} »." -#: dnf/transaction_sr.py:343 -#, fuzzy, python-format @@ -4894,14 +2926,14 @@ index 4e883335..bf1ccb6a 100644 +#, 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." ++msgstr "ID de groupe « %s » non 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." ++msgstr "Clé d’objet « {key} » manquante dans groups.packages." -#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387 -#, fuzzy, python-format @@ -4910,7 +2942,7 @@ index 4e883335..bf1ccb6a 100644 +#, python-format msgid "Group id '%s' is not installed." -msgstr "Module ou Groupe « %s » non installé." -+msgstr "L'id de groupe '%s' non installé." ++msgstr "ID de groupe « %s » non installé." -#: dnf/transaction_sr.py:398 -#, fuzzy, python-format @@ -4919,7 +2951,7 @@ index 4e883335..bf1ccb6a 100644 +#, 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." ++msgstr "ID d’environnement « %s » non disponible." -#: dnf/transaction_sr.py:422 +#: dnf/transaction_sr.py:456 @@ -4928,45 +2960,45 @@ index 4e883335..bf1ccb6a 100644 "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é." ++"Valeur invalide « {group_type} » pour environments.groups.group_type, seuls " ++"« mandatory » ou « optional » sont pris en charge." -#: 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." ++msgstr "Clé d’objet « {key} » manquante 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}\"." ++"Valeur inattendue pour 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." ++msgstr "Clé d’objet « {key} » manquante 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}\"." ++"Valeur inattendue pour l’action d’environnement « {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." ++msgstr "Clé d’objet « {key} » manquante dans un environnement." -#: dnf/transaction_sr.py:581 +#: dnf/transaction_sr.py:615 @@ -4975,45 +3007,48 @@ index 4e883335..bf1ccb6a 100644 "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." ++"Le paquet nevra « {nevra} », qui n’est pas présent dans le fichier de " ++"transaction, a été retiré de la transaction." -#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 ++#: dnf/util.py:419 dnf/util.py:421 msgid "Problem" msgstr "Problème" -#: dnf/util.py:444 -+#: dnf/util.py:446 ++#: dnf/util.py:472 msgid "TransactionItem not found for key: {}" msgstr "TransactionItem n’a pas été trouvé pour la clef : {}" -#: dnf/util.py:454 -+#: dnf/util.py:456 ++#: dnf/util.py:482 msgid "TransactionSWDBItem not found for key: {}" msgstr "TransactionSWDBItem n’a pas été trouvé pour la clef : {}" -#: dnf/util.py:457 -+#: dnf/util.py:459 ++#: dnf/util.py:485 msgid "Errors occurred during transaction." msgstr "Des erreurs sont survenues lors de la transaction." -+#: dnf/util.py:595 ++#: dnf/util.py:621 +msgid "Reinstalled" +msgstr "Réinstallé" + -+#: dnf/util.py:596 ++#: dnf/util.py:622 +msgid "Skipped" +msgstr "Ignoré" + -+#: dnf/util.py:597 ++#: dnf/util.py:623 +msgid "Removed" +msgstr "Supprimé" + -+#: dnf/util.py:600 ++#: dnf/util.py:626 +msgid "Failed" +msgstr "Échec" + ++#~ msgid "%s: %s check failed: %s vs %s" ++#~ msgstr "%s : %s vérification a échoué : %s vs %s" ++ +#~ msgid "Action not handled: {}" +#~ msgstr "Action non gérée : {}" + @@ -5036,9 +3071,18 @@ index 4e883335..bf1ccb6a 100644 #~ msgstr "format d’affichage des paquets trouvés" diff --git a/po/ja.po b/po/ja.po -index 6435271c..00529771 100644 +index 6435271c..887cd57c 100644 --- a/po/ja.po +++ b/po/ja.po +@@ -14,7 +14,7 @@ + # Hajime Taira , 2017. #zanata + # Ooyama Yosiyuki , 2017. #zanata + # Casey Jones , 2018. #zanata +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021. + # Noriko Mizumoto , 2018. #zanata + # Ooyama Yosiyuki , 2018. #zanata + # Hajime Taira , 2019. #zanata @@ -22,20 +22,21 @@ # Julien Humbert , 2020. # Casey Jones , 2020. @@ -5052,8 +3096,8 @@ index 6435271c..00529771 100644 -"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" ++"POT-Creation-Date: 2021-08-11 16:00+0200\n" ++"PO-Revision-Date: 2021-09-06 17:24+0000\n" +"Last-Translator: Sundeep Anand \n" +"Language-Team: Japanese \n" "Language: ja\n" @@ -5062,7 +3106,7 @@ index 6435271c..00529771 100644 "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" ++"X-Generator: Weblate 4.8\n" #: dnf/automatic/emitter.py:32 #, python-format @@ -5075,12 +3119,21 @@ index 6435271c..00529771 100644 #: dnf/automatic/emitter.py:34 #, python-format +@@ -82,7 +83,7 @@ msgstr "'%s' を使用した電子メールの送信に失敗しました: %s" + msgid "Failed to execute command '%s': returned %d" + msgstr "コマンド '%s' の実行に失敗しました: %d を返しました" + +-#: dnf/automatic/main.py:164 dnf/conf/config.py:151 ++#: dnf/automatic/main.py:164 + #, python-format + msgid "Unknown configuration value: %s=%s in %s; %s" + msgstr "不明な設定値: %s=%s in %s; %s" @@ -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 ++#: dnf/automatic/main.py:237 dnf/cli/cli.py:305 msgid "GPG check FAILED" msgstr "GPG の確認に失敗しました" @@ -5097,361 +3150,370 @@ index 6435271c..00529771 100644 #: dnf/automatic/main.py:315 msgid "System is off-line." -@@ -119,7 +120,7 @@ msgstr "システムはオフラインです。" +@@ -119,388 +120,374 @@ msgstr "システムはオフラインです。" msgid "Error: %s" msgstr "エラー: %s" -#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 ++#: dnf/base.py:148 dnf/base.py:477 dnf/base.py:479 msgid "loading repo '{}' failure: {}" msgstr "repo '{}' のロードに失敗しました: {}" -@@ -127,236 +128,236 @@ msgstr "repo '{}' のロードに失敗しました: {}" +-#: dnf/base.py:148 ++#: dnf/base.py:150 msgid "Loading repository '{}' has failed" msgstr "repository '{}' のロードに失敗しました" -#: dnf/base.py:320 -+#: dnf/base.py:322 ++#: dnf/base.py:327 msgid "Metadata timer caching disabled when running on metered connection." msgstr "metered 接続で実行する際、メタデータタイマーキャッシュは無効化されました。" -#: dnf/base.py:325 -+#: dnf/base.py:327 ++#: dnf/base.py:332 msgid "Metadata timer caching disabled when running on a battery." msgstr "バッテリーで実行する際、メタデータタイマーキャッシュは無効化されました。" -#: dnf/base.py:330 -+#: dnf/base.py:332 ++#: dnf/base.py:337 msgid "Metadata timer caching disabled." msgstr "メタデータタイマーキャッシュは無効化されました。" -#: dnf/base.py:335 -+#: dnf/base.py:337 ++#: dnf/base.py:342 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 ++#: dnf/base.py:348 dnf/cli/commands/__init__.py:91 msgid "There are no enabled repositories in \"{}\"." msgstr "\"{}\" には有効化されたリポジトリーがありません。" -#: dnf/base.py:348 -+#: dnf/base.py:350 ++#: dnf/base.py:355 #, python-format msgid "%s: will never be expired and will not be refreshed." msgstr "%s: は期限切れになることはなく、リフレッシュされることもありません。" -#: dnf/base.py:350 -+#: dnf/base.py:352 ++#: dnf/base.py:357 #, 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 ++#: dnf/base.py:361 #, 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 ++#: dnf/base.py:365 #, python-format msgid "%s: will expire after %d seconds." msgstr "%s: は %d 秒後に期限切れとなります。" #. performs the md sync -#: dnf/base.py:364 -+#: dnf/base.py:366 ++#: dnf/base.py:371 msgid "Metadata cache created." msgstr "メタデータキャッシュを作成しました。" -#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 ++#: dnf/base.py:404 dnf/base.py:471 #, 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 ++#: dnf/base.py:416 dnf/base.py:484 #, python-format msgid "Ignoring repositories: %s" msgstr "リポジトリーを無視します: %s" -#: dnf/base.py:412 -+#: dnf/base.py:414 ++#: dnf/base.py:419 #, python-format msgid "Last metadata expiration check: %s ago on %s." msgstr "メタデータの期限切れの最終確認: %s 時間前の %s に実施しました。" -#: dnf/base.py:443 -+#: dnf/base.py:507 ++#: dnf/base.py:512 msgid "" "The downloaded packages were saved in cache until the next successful " "transaction." msgstr "ダウンロード済みのパッケージは、次の正常なトランザクションまでキャッシュに保存されました。" -#: dnf/base.py:445 -+#: dnf/base.py:509 ++#: dnf/base.py:514 #, python-format msgid "You can remove cached packages by executing '%s'." msgstr "'%s' を実行することでキャッシュパッケージを削除できます。" -#: dnf/base.py:535 -+#: dnf/base.py:599 ++#: dnf/base.py:606 #, python-format msgid "Invalid tsflag in config file: %s" msgstr "設定ファイルの tsflag が無効です: %s" -#: dnf/base.py:591 -+#: dnf/base.py:655 ++#: dnf/base.py:662 #, python-format msgid "Failed to add groups file for repository: %s - %s" msgstr "リポジトリーのグループファイルを追加できませんでした: %s - %s" -#: dnf/base.py:823 -+#: dnf/base.py:887 ++#: dnf/base.py:904 msgid "Running transaction check" msgstr "トランザクションの確認を実行中" -#: dnf/base.py:831 -+#: dnf/base.py:895 ++#: dnf/base.py:912 msgid "Error: transaction check vs depsolve:" msgstr "エラー: トランザクションの確認 vs depsolve:" -#: dnf/base.py:837 -+#: dnf/base.py:901 ++#: dnf/base.py:918 msgid "Transaction check succeeded." msgstr "トランザクションの確認に成功しました。" -#: dnf/base.py:840 -+#: dnf/base.py:904 ++#: dnf/base.py:921 msgid "Running transaction test" msgstr "トランザクションのテストを実行中" -#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 ++#: dnf/base.py:931 dnf/base.py:1082 msgid "RPM: {}" msgstr "RPM: {}" -#: dnf/base.py:851 -+#: dnf/base.py:915 ++#: dnf/base.py:932 msgid "Transaction test error:" msgstr "トランザクションテストエラー:" -#: dnf/base.py:862 -+#: dnf/base.py:926 ++#: dnf/base.py:943 msgid "Transaction test succeeded." msgstr "トランザクションのテストに成功しました。" -#: dnf/base.py:883 -+#: dnf/base.py:947 ++#: dnf/base.py:964 msgid "Running transaction" msgstr "トランザクションを実行中" -#: dnf/base.py:911 -+#: dnf/base.py:984 ++#: dnf/base.py:1001 msgid "Disk Requirements:" -msgstr "ディスク要件" +msgstr "ディスク要件:" -#: dnf/base.py:914 -+#: dnf/base.py:987 ++#: dnf/base.py:1004 #, 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 ++#: dnf/base.py:1011 msgid "Error Summary" msgstr "エラーの概要" -#: dnf/base.py:947 -+#: dnf/base.py:1020 ++#: dnf/base.py:1037 #, 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 ++#: dnf/base.py:1083 dnf/base.py:1091 msgid "Could not run transaction." msgstr "トランザクションを実行できませんでした。" -#: dnf/base.py:996 -+#: dnf/base.py:1069 ++#: dnf/base.py:1086 msgid "Transaction couldn't start:" msgstr "トランザクションを開始できませんでした:" -#: dnf/base.py:1010 -+#: dnf/base.py:1083 ++#: dnf/base.py:1100 #, python-format msgid "Failed to remove transaction file %s" msgstr "トランザクションファイル %s の削除に失敗しました" -#: dnf/base.py:1092 -+#: dnf/base.py:1165 ++#: dnf/base.py:1182 msgid "Some packages were not downloaded. Retrying." msgstr "一部のパッケージはダウンロードされませんでした。再試行中です。" -#: dnf/base.py:1122 -+#: dnf/base.py:1195 ++#: dnf/base.py:1212 #, 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 ++#: dnf/base.py:1215 #, 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 ++#: dnf/base.py:1257 msgid "Cannot add local packages, because transaction job already exists" msgstr "ローカルパッケージを追加できません、トランザクションジョブがすでに存在するためです" -#: dnf/base.py:1181 -+#: dnf/base.py:1254 ++#: dnf/base.py:1271 msgid "Could not open: {}" msgstr "開くことができませんでした: {}" -#: dnf/base.py:1219 -+#: dnf/base.py:1292 ++#: dnf/base.py:1309 #, python-format msgid "Public key for %s is not installed" msgstr "%s の公開鍵がインストールされていません" -#: dnf/base.py:1223 -+#: dnf/base.py:1296 ++#: dnf/base.py:1313 #, python-format msgid "Problem opening package %s" msgstr "パッケージ %s を開くことができません" -#: dnf/base.py:1231 -+#: dnf/base.py:1304 ++#: dnf/base.py:1321 #, python-format msgid "Public key for %s is not trusted" msgstr "%s の公開鍵は信頼されていません" -#: dnf/base.py:1235 -+#: dnf/base.py:1308 ++#: dnf/base.py:1325 #, python-format msgid "Package %s is not signed" msgstr "パッケージ %s は署名されていません" -#: dnf/base.py:1265 -+#: dnf/base.py:1338 ++#: dnf/base.py:1355 #, python-format msgid "Cannot remove %s" msgstr "%s を削除できません" -#: dnf/base.py:1269 -+#: dnf/base.py:1342 ++#: dnf/base.py:1359 #, python-format msgid "%s removed" msgstr "%s を削除しました" -#: dnf/base.py:1549 -+#: dnf/base.py:1622 ++#: dnf/base.py:1639 msgid "No match for group package \"{}\"" -msgstr "グループパッケージ \"{}\" に一致するものはありません" +msgstr "グループパッケージ \"{}\" に一致するものはありません" -#: dnf/base.py:1635 -+#: dnf/base.py:1708 ++#: dnf/base.py:1725 #, 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/__init__.py:499 dnf/cli/commands/__init__.py:592 +-#: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 ++#: dnf/base.py:1748 dnf/cli/cli.py:221 dnf/cli/commands/__init__.py:437 ++#: dnf/cli/commands/__init__.py:494 dnf/cli/commands/__init__.py:587 ++#: dnf/cli/commands/__init__.py:636 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 ++#: dnf/base.py:1766 msgid "No groups marked for removal." msgstr "削除対象のパッケージはありません。" -#: dnf/base.py:1710 -+#: dnf/base.py:1783 ++#: dnf/base.py:1800 msgid "No group marked for upgrade." msgstr "アップグレード対象のグループはありません。" -#: dnf/base.py:1925 -+#: dnf/base.py:1997 ++#: dnf/base.py:2014 #, 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 はインストールされていないので、ダ +-#: 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 ++#: dnf/base.py:2016 dnf/base.py:2035 dnf/base.py:2048 dnf/base.py:2075 ++#: dnf/base.py:2128 dnf/base.py:2136 dnf/base.py:2270 dnf/cli/cli.py:417 ++#: dnf/cli/commands/__init__.py:420 dnf/cli/commands/__init__.py:477 ++#: dnf/cli/commands/__init__.py:581 dnf/cli/commands/__init__.py:628 ++#: dnf/cli/commands/__init__.py:706 dnf/cli/commands/install.py:147 + #: dnf/cli/commands/reinstall.py:70 dnf/cli/commands/reinstall.py:84 +-#: dnf/cli/commands/upgrade.py:110 dnf/cli/commands/upgrade.py:121 ++#: dnf/cli/commands/upgrade.py:105 dnf/cli/commands/upgrade.py:116 + #, python-format msgid "No match for argument: %s" msgstr "一致した引数がありません: %s" -#: dnf/base.py:1934 -+#: dnf/base.py:2006 ++#: dnf/base.py:2023 #, python-format msgid "Package %s of lower version already installed, cannot downgrade it." msgstr "下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。" -#: dnf/base.py:1957 -+#: dnf/base.py:2029 ++#: dnf/base.py:2046 #, python-format msgid "Package %s not installed, cannot reinstall it." msgstr "パッケージ %s はインストールされていないのでの、再インストールできません。" -#: dnf/base.py:1972 -+#: dnf/base.py:2044 ++#: dnf/base.py:2061 #, python-format msgid "File %s is a source package and cannot be updated, ignoring." msgstr "ファイル %s はソースパッケージで更新できません。無視します。" -#: dnf/base.py:1978 -+#: dnf/base.py:2050 ++#: dnf/base.py:2072 #, python-format msgid "Package %s not installed, cannot update it." msgstr "パッケージ %s はインストールされていないので、更新できません。" -#: dnf/base.py:1987 -+#: dnf/base.py:2059 ++#: dnf/base.py:2082 #, 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 ++#: dnf/base.py:2125 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 ++#: dnf/base.py:2131 #, 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 ++#: dnf/base.py:2156 #, 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/base.py:2174 dnf/cli/commands/install.py:136 #: dnf/cli/commands/remove.py:133 #, python-format msgid "Not a valid form: %s" @@ -5459,20 +3521,20 @@ index 6435271c..00529771 100644 -#: 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/base.py:2189 dnf/cli/commands/__init__.py:676 +#: 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 ++#: dnf/base.py:2277 dnf/cli/cli.py:428 #, python-format msgid "Packages for argument %s available, but not installed." -msgstr "引数 %s のパッケージは利用可能ですが、インストールされていません。" +msgstr "引数 %s のパッケージは利用可能ですが、インストールされていません。" -#: dnf/base.py:2184 -+#: dnf/base.py:2255 ++#: dnf/base.py:2282 #, python-format msgid "Package %s of lowest version already installed, cannot downgrade it." msgstr "最下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。" @@ -5492,79 +3554,79 @@ index 6435271c..00529771 100644 -msgstr "一致したパッケージはありません。" - -#: dnf/base.py:2290 -+#: dnf/base.py:2302 ++#: dnf/base.py:2382 msgid "No security updates needed, but {} update available" msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です" -#: dnf/base.py:2292 -+#: dnf/base.py:2304 ++#: dnf/base.py:2384 msgid "No security updates needed, but {} updates available" msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です" -#: dnf/base.py:2296 -+#: dnf/base.py:2308 ++#: dnf/base.py:2388 msgid "No security updates needed for \"{}\", but {} update available" msgstr "\"{}\" のセキュリティー更新は必要ありませんが、{} 更新が利用可能です" -#: dnf/base.py:2298 -+#: dnf/base.py:2310 ++#: dnf/base.py:2390 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 ++#: dnf/base.py:2411 #, python-format msgid "Unable to retrieve a key for a commandline package: %s" -msgstr "" +msgstr "コマンドラインパッケージのキーを取得できません: %s" -#: dnf/base.py:2327 -+#: dnf/base.py:2339 ++#: dnf/base.py:2419 #, python-format msgid ". Failing package is: %s" msgstr ". 失敗したパッケージは: %s" -#: dnf/base.py:2328 -+#: dnf/base.py:2340 ++#: dnf/base.py:2420 #, python-format msgid "GPG Keys are configured as: %s" msgstr "GPG 鍵が設定されています: %s" -#: dnf/base.py:2340 -+#: dnf/base.py:2352 ++#: dnf/base.py:2432 #, 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 ++#: dnf/base.py:2468 msgid "The key has been approved." msgstr "鍵が承認されました。" -#: dnf/base.py:2376 -+#: dnf/base.py:2388 ++#: dnf/base.py:2471 msgid "The key has been rejected." msgstr "鍵が拒否されました。" -#: dnf/base.py:2409 -+#: dnf/base.py:2421 ++#: dnf/base.py:2504 #, python-format msgid "Key import failed (code %d)" msgstr "鍵のインポートに失敗しました (コード: %d)" -#: dnf/base.py:2411 -+#: dnf/base.py:2423 ++#: dnf/base.py:2506 msgid "Key imported successfully" msgstr "鍵のインポートに成功しました" -#: dnf/base.py:2415 -+#: dnf/base.py:2427 ++#: dnf/base.py:2510 msgid "Didn't install any keys" msgstr "鍵を 1 つもインストールしませんでした" -#: dnf/base.py:2418 -+#: dnf/base.py:2430 ++#: dnf/base.py:2513 #, python-format msgid "" "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" @@ -5573,61 +3635,61 @@ index 6435271c..00529771 100644 "正しい鍵 URL がこのリポジトリー用に設定されているか確認してください。" -#: dnf/base.py:2429 -+#: dnf/base.py:2441 ++#: dnf/base.py:2524 msgid "Import of key(s) didn't help, wrong key(s)?" msgstr "鍵をインポートしても役に立ちませんでした。鍵が間違っていませんか?" -#: dnf/base.py:2482 -+#: dnf/base.py:2494 ++#: dnf/base.py:2577 msgid " * Maybe you meant: {}" msgstr " * おそらく: {}" -#: dnf/base.py:2514 -+#: dnf/base.py:2526 ++#: dnf/base.py:2609 msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" msgstr "ローカルリポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません" -#: dnf/base.py:2517 -+#: dnf/base.py:2529 ++#: dnf/base.py:2612 msgid "Some packages from local repository have incorrect checksum" msgstr "ローカルリポジトリーのいくつかのパッケージのチェックサムは正しくありません" -#: dnf/base.py:2520 -+#: dnf/base.py:2532 ++#: dnf/base.py:2615 msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" msgstr "リポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません" -#: dnf/base.py:2523 -+#: dnf/base.py:2535 ++#: dnf/base.py:2618 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 ++#: dnf/base.py:2636 dnf/base.py:2656 msgid "No match for argument" msgstr "一致した引数がありません" -#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 ++#: dnf/base.py:2644 dnf/base.py:2664 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 ++#: dnf/base.py:2646 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 ++#: dnf/base.py:2662 msgid "All matches were installed from a different repository for argument" msgstr "すべての検索結果は引数に対し異なるレポジトリからインストールされたものです" -#: dnf/base.py:2583 -+#: dnf/base.py:2626 ++#: dnf/base.py:2709 #, python-format msgid "Package %s is already installed." msgstr "パッケージ %s は既にインストールされています。" @@ -5637,12 +3699,12 @@ index 6435271c..00529771 100644 -#: 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 ++#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:804 ++#: dnf/cli/cli.py:808 dnf/cli/commands/alias.py:108 #, python-format msgid "Config error: %s" msgstr "設定エラー: %s" -@@ -603,7 +590,7 @@ msgid "" +@@ -603,44 +590,44 @@ msgid "" "stream '{2}'" msgstr "オペレーションは、モジュール '{0}' ストリーム '{1}' を ストリーム '{2}' へと切り替える結果となります" @@ -5650,19 +3712,24 @@ index 6435271c..00529771 100644 +#: 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 ' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。" +-"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." ++"It is not possible to switch enabled streams of a module unless explicitly enabled via configuration option module_stream_switch.\n" ++"It is recommended to rather 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 ' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。" ++"設定オプション module_stream_switch から明示的に有効化されていない限り、モジュールの有効なストリームを切り替えることはできません。\n" ++"モジュールからインストールされた全てのコンテンツを削除し、'{prog} module reset ' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。" -#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 ++#: dnf/cli/cli.py:212 #, python-brace-format msgid "{prog} will only download packages for the transaction." msgstr "{prog} はトランザクションでパッケージのダウンロードのみ行います。" -#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 ++#: dnf/cli/cli.py:215 #, python-brace-format msgid "" "{prog} will only download packages, install gpg keys, and check the " @@ -5670,27 +3737,27 @@ index 6435271c..00529771 100644 msgstr "{prog} はパッケージのダウンロード、gpgキーのインストール、トランザクションのチェックのみ行います。" -#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 ++#: dnf/cli/cli.py:219 msgid "Operation aborted." msgstr "操作が中断されました。" -#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 ++#: dnf/cli/cli.py:226 msgid "Downloading Packages:" msgstr "パッケージのダウンロード:" -#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 ++#: dnf/cli/cli.py:232 msgid "Error downloading packages:" msgstr "パッケージのダウンロード中にエラーが発生しました:" -#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 ++#: dnf/cli/cli.py:264 msgid "Transaction failed" msgstr "トランザクションが失敗しました" -#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 ++#: dnf/cli/cli.py:287 msgid "" "Refusing to automatically import keys when running unattended.\n" "Use \"-y\" to override." @@ -5699,68 +3766,68 @@ index 6435271c..00529771 100644 "オーバーライドするには \"-y\" を使用してください。" -#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 ++#: dnf/cli/cli.py:337 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 ++#: dnf/cli/cli.py:370 dnf/cli/cli.py:511 dnf/cli/cli.py:517 msgid "Obsoleting Packages" msgstr "パッケージの廃止" -#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 ++#: dnf/cli/cli.py:399 msgid "No packages marked for distribution synchronization." -msgstr "ディストリビューション同期対象のパッケージがありません" +msgstr "ディストリビューション同期対象のパッケージがありません。" + -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 ++#: dnf/cli/cli.py:425 dnf/cli/commands/group.py:395 +#, python-format +msgid "No package %s available." -+msgstr "利用可能なパッケージ %s がありません。" ++msgstr "利用可能なパッケージ %s はありません。" -#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:433 ++#: dnf/cli/cli.py:434 msgid "No packages marked for downgrade." msgstr "ダウングレード対象のパッケージはありません。" -#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 ++#: dnf/cli/cli.py:485 msgid "Installed Packages" msgstr "インストール済みパッケージ" -#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 ++#: dnf/cli/cli.py:493 msgid "Available Packages" msgstr "利用可能なパッケージ" -#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 ++#: dnf/cli/cli.py:497 msgid "Autoremove Packages" msgstr "パッケージを自動削除します" -#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 ++#: dnf/cli/cli.py:499 msgid "Extra Packages" msgstr "エクストラパッケージ" -#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 ++#: dnf/cli/cli.py:503 msgid "Available Upgrades" msgstr "利用可能なアップグレード" -#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 ++#: dnf/cli/cli.py:519 msgid "Recently Added Packages" msgstr "最近追加したパッケージ" -#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 ++#: dnf/cli/cli.py:523 msgid "No matching Packages to list" msgstr "表示するための一致したパッケージはありません" -#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 ++#: dnf/cli/cli.py:604 msgid "No Matches found" msgstr "一致したものは見つかりませんでした" @@ -5791,33 +3858,33 @@ index 6435271c..00529771 100644 -msgstr "トランザクション {} を {} から取り消しています" - -#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 ++#: dnf/cli/cli.py:671 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 ++#: dnf/cli/cli.py:685 #, python-format msgid "No repository match: %s" msgstr "一致するリポジトリーがありません: %s" -#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 ++#: dnf/cli/cli.py:719 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 ++#: dnf/cli/cli.py:749 #, 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 ++#: dnf/cli/cli.py:752 #, python-format, python-brace-format msgid "" "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" @@ -5825,7 +3892,7 @@ index 6435271c..00529771 100644 msgstr "{PROG} プラグインコマンドを実行できません、試してください: \"{prog} install 'dnf-command(%s)'\"" -#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 ++#: dnf/cli/cli.py:756 #, python-brace-format msgid "" "It could be a {prog} plugin command, but loading of plugins is currently " @@ -5833,7 +3900,7 @@ index 6435271c..00529771 100644 msgstr "{prog} プラグインコマンドを実行できません、プラグインのロードが現在無効になっているようです。" -#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 ++#: dnf/cli/cli.py:814 msgid "" "--destdir or --downloaddir must be used with --downloadonly or download or " "system-upgrade command." @@ -5842,7 +3909,7 @@ index 6435271c..00529771 100644 "コマンドと共に使用する必要があります。" -#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 ++#: dnf/cli/cli.py:820 msgid "" "--enable, --set-enabled and --disable, --set-disabled must be used with " "config-manager command." @@ -5851,7 +3918,7 @@ index 6435271c..00529771 100644 "コマンドと共に使用しなければなりません。" -#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 ++#: dnf/cli/cli.py:902 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)" @@ -5860,58 +3927,198 @@ index 6435271c..00529771 100644 "(このメッセージをスケルチするには、dnf.conf(5) の 'gpgcheck' を参照してください)" -#: dnf/cli/cli.py:1020 -+#: dnf/cli/cli.py:921 ++#: dnf/cli/cli.py:922 msgid "Config file \"{}\" does not exist" msgstr "設定ファイル \"{}\" は存在しません" -#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 ++#: dnf/cli/cli.py:942 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 ++#: dnf/cli/cli.py:1016 dnf/cli/commands/repoquery.py:471 msgid "argument {}: not allowed with argument {}" msgstr "引数 {}: 引数 {} と許可されていません" -#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 ++#: dnf/cli/cli.py:1023 #, python-format msgid "Command \"%s\" already defined" msgstr "コマンド \"%s\" はすでに定義済みです" -#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 ++#: dnf/cli/cli.py:1043 msgid "Excludes in dnf.conf: " msgstr "dnf.conf で除外します: " -#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 ++#: dnf/cli/cli.py:1046 msgid "Includes in dnf.conf: " msgstr "dnf.conf で含めます: " -#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 ++#: dnf/cli/cli.py:1049 msgid "Excludes in repo " msgstr "repo で除外します " -#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 ++#: dnf/cli/cli.py:1052 msgid "Includes in repo " msgstr "repo に含めます " -@@ -869,7 +835,7 @@ msgid "show all packages (default)" +@@ -864,38 +830,38 @@ msgstr "問題のリポジトリ: %s" + msgid "display details about a package or group of packages" + msgstr "パッケージもしくはパッケージのグループについての詳細を表示します" + +-#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:740 ++#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:735 + msgid "show all packages (default)" msgstr "すべてのパッケージを表示します (デフォルト)" - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 +-#: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 -#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 ++#: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:738 ++#: dnf/cli/commands/module.py:376 msgid "show only available packages" msgstr "利用可能なパッケージのみを表示します" -@@ -1194,78 +1160,78 @@ msgstr "グループ情報を表示または使用します" +-#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:746 ++#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:741 + msgid "show only installed packages" + msgstr "インストール済みのパッケージのみを表示します" + +-#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:749 ++#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:744 + msgid "show only extras packages" + msgstr "エクストラパッケージのみを表示します" + + #: dnf/cli/commands/__init__.py:180 dnf/cli/commands/__init__.py:183 +-#: dnf/cli/commands/__init__.py:752 dnf/cli/commands/__init__.py:755 ++#: dnf/cli/commands/__init__.py:747 dnf/cli/commands/__init__.py:750 + msgid "show only upgrades packages" + msgstr "アップグレードパッケージのみを表示します" + +-#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:758 ++#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:753 + msgid "show only autoremove packages" + msgstr "自動削除パッケージのみを表示します" + +-#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:761 ++#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:756 + msgid "show only recently changed packages" + msgstr "最近変更されたパッケージのみを表示します" + + #: dnf/cli/commands/__init__.py:190 dnf/cli/commands/__init__.py:265 +-#: dnf/cli/commands/__init__.py:774 dnf/cli/commands/autoremove.py:48 ++#: dnf/cli/commands/__init__.py:769 dnf/cli/commands/autoremove.py:48 + #: 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" +@@ -933,70 +899,70 @@ msgstr "利用可能なパッケージのアップグレードを確認します + msgid "show changelogs before update" + msgstr "更新前に changelogs を表示します" + +-#: dnf/cli/commands/__init__.py:361 dnf/cli/commands/__init__.py:414 +-#: dnf/cli/commands/__init__.py:470 ++#: dnf/cli/commands/__init__.py:356 dnf/cli/commands/__init__.py:409 ++#: dnf/cli/commands/__init__.py:465 + msgid "No package available." + msgstr "利用可能なパッケージがありません。" + +-#: dnf/cli/commands/__init__.py:376 ++#: dnf/cli/commands/__init__.py:371 + msgid "No packages marked for install." + msgstr "インストール対象のパッケージはありません。" + +-#: dnf/cli/commands/__init__.py:412 ++#: dnf/cli/commands/__init__.py:407 + msgid "No package installed." + msgstr "インストールされたパッケージはありません。" + +-#: dnf/cli/commands/__init__.py:432 dnf/cli/commands/__init__.py:489 ++#: dnf/cli/commands/__init__.py:427 dnf/cli/commands/__init__.py:484 + #: dnf/cli/commands/reinstall.py:91 + #, python-format + msgid " (from %s)" + msgstr " (%s から)" + +-#: dnf/cli/commands/__init__.py:433 dnf/cli/commands/__init__.py:490 ++#: dnf/cli/commands/__init__.py:428 dnf/cli/commands/__init__.py:485 + #: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:105 + #, python-format + msgid "Installed package %s%s not available." + msgstr "インストール済みパッケージ %s%s は利用できません。" + +-#: dnf/cli/commands/__init__.py:467 dnf/cli/commands/__init__.py:576 +-#: dnf/cli/commands/__init__.py:619 dnf/cli/commands/__init__.py:666 ++#: dnf/cli/commands/__init__.py:462 dnf/cli/commands/__init__.py:571 ++#: dnf/cli/commands/__init__.py:614 dnf/cli/commands/__init__.py:661 + msgid "No package installed from the repository." + msgstr "リポジトリーからインストールされたパッケージはありません。" + +-#: dnf/cli/commands/__init__.py:530 dnf/cli/commands/reinstall.py:101 ++#: dnf/cli/commands/__init__.py:525 dnf/cli/commands/reinstall.py:101 + msgid "No packages marked for reinstall." + msgstr "再インストール対象のパッケージはありません。" + +-#: dnf/cli/commands/__init__.py:716 dnf/cli/commands/upgrade.py:89 ++#: dnf/cli/commands/__init__.py:711 dnf/cli/commands/upgrade.py:84 + msgid "No packages marked for upgrade." + msgstr "アップグレード対象のパッケージがありません。" + +-#: dnf/cli/commands/__init__.py:726 ++#: dnf/cli/commands/__init__.py:721 + msgid "run commands on top of all packages in given repository" + msgstr "特定のリポジトリーのすべてのパッケージに対して、コマンドを実行します" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "REPOID" + msgstr "REPOID" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "Repository ID" + msgstr "リポジトリーID" + +-#: dnf/cli/commands/__init__.py:777 dnf/cli/commands/mark.py:48 ++#: dnf/cli/commands/__init__.py:772 dnf/cli/commands/mark.py:48 + #: dnf/cli/commands/updateinfo.py:108 + msgid "Package specification" + msgstr "パッケージspec" + +-#: dnf/cli/commands/__init__.py:801 ++#: dnf/cli/commands/__init__.py:796 + msgid "display a helpful usage message" + msgstr "有用な使用方法のメッセージを表示します" + +-#: dnf/cli/commands/__init__.py:805 ++#: dnf/cli/commands/__init__.py:800 + msgid "COMMAND" + msgstr "コマンド" + +-#: dnf/cli/commands/__init__.py:806 ++#: dnf/cli/commands/__init__.py:801 + #, python-brace-format + msgid "{prog} command to get help for" + msgstr "{prog} コマンドでヘルプ表示" +@@ -1167,8 +1133,10 @@ msgid "Waiting for process with pid %d to finish." + msgstr "pid %d のプロセスが終了するのを待ちます。" + + #: dnf/cli/commands/deplist.py:32 +-msgid "List package's dependencies and what packages provide them" +-msgstr "パッケージの依存関係とこれを提供するパッケージがどれかを一覧表示します" ++msgid "" ++"[deprecated, use repoquery --deplist] List package's dependencies and what " ++"packages provide them" ++msgstr "[非推奨、epoquery --deplist を使用] パッケージの依存関係とこれを提供するパッケージがどれかを一覧表示します" + + #: dnf/cli/commands/distrosync.py:32 + msgid "synchronize installed packages to the latest available versions" +@@ -1194,78 +1162,78 @@ msgstr "グループ情報を表示または使用します" msgid "No group data available for configured repositories." msgstr "設定されたリポジトリーが利用可能なグループデータはありません。" @@ -6010,7 +4217,7 @@ index 6435271c..00529771 100644 msgid "Unable to find a mandatory group package." msgstr "必須のグループパッケージを見つけることができません。" -@@ -1275,25 +1241,25 @@ msgstr "トランザクション履歴を表示、または使用します" +@@ -1275,25 +1243,25 @@ msgstr "トランザクション履歴を表示、または使用します" #: dnf/cli/commands/history.py:66 msgid "For the store command, file path to store the transaction to" @@ -6040,7 +4247,7 @@ index 6435271c..00529771 100644 #: dnf/cli/commands/history.py:94 msgid "" -@@ -1304,41 +1270,64 @@ msgstr "" +@@ -1304,41 +1272,64 @@ msgstr "" "'{}' は 1 つのトランザクション ID またはパッケージ名が必要です。" #: dnf/cli/commands/history.py:101 @@ -6116,7 +4323,7 @@ index 6435271c..00529771 100644 msgid "" "Invalid transaction ID range definition '{}'.\n" "Use '..'." -@@ -1346,7 +1335,7 @@ msgstr "" +@@ -1346,7 +1337,7 @@ msgstr "" "無効なトランザクション ID の範囲の定義 '{}'。\n" "'..' を使用してください。" @@ -6125,7 +4332,7 @@ index 6435271c..00529771 100644 msgid "" "Can't convert '{}' to transaction ID.\n" "Use '', 'last', 'last-'." -@@ -1354,40 +1343,29 @@ msgstr "" +@@ -1354,40 +1345,29 @@ msgstr "" "'{}' をトランザクション IDに変換できません。\n" "'', 'last', 'last-' を使用してください。" @@ -6174,11 +4381,11 @@ index 6435271c..00529771 100644 -msgstr "" +#: dnf/cli/commands/history.py:386 +msgid "Warning, the following problems occurred while running a transaction:" -+msgstr "警告: トランザクションの実行中に以下の問題が発生しました。" ++msgstr "警告: トランザクションの実行中に以下の問題が発生しました:" #: dnf/cli/commands/install.py:47 msgid "install a package or packages on your system" -@@ -1406,7 +1384,7 @@ msgstr "一致するものが見つかりません" +@@ -1406,7 +1386,7 @@ msgstr "一致するものが見つかりません" msgid "Not a valid rpm file path: %s" msgstr "有効な rpm ファイルパスではありません: %s" @@ -6187,7 +4394,7 @@ index 6435271c..00529771 100644 #, python-brace-format msgid "There are following alternatives for \"{0}\": {1}" msgstr "\"{0}\"には次の選択肢があります: {1}" -@@ -1449,7 +1427,7 @@ msgid "%s marked as group installed." +@@ -1449,7 +1429,7 @@ msgid "%s marked as group installed." msgstr "グループインストールには %s のマークがついています。" #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129 @@ -6196,63 +4403,122 @@ index 6435271c..00529771 100644 msgid "Error:" msgstr "エラー:" -@@ -1505,42 +1483,46 @@ msgid "Package {} belongs to multiple modules, skipping" +@@ -1458,89 +1438,93 @@ msgstr "エラー:" + msgid "Package %s is not installed." + msgstr "パッケージ %s はインストールされていません。" + +-#: dnf/cli/commands/module.py:51 ++#: dnf/cli/commands/module.py:54 + msgid "" + "Only module name, stream, architecture or profile is used. Ignoring unneeded" + " information in argument: '{}'" + msgstr "モジュール名、ストリーム、アーキテクチャーまたはプロファイルのみが使用されています。引数: '{}' の不要な情報は無視します" + +-#: dnf/cli/commands/module.py:77 ++#: dnf/cli/commands/module.py:80 + msgid "list all module streams, profiles and states" + msgstr "全てのモジュールストリーム、プロファイル、状態をリスト" + +-#: dnf/cli/commands/module.py:105 dnf/cli/commands/module.py:128 ++#: dnf/cli/commands/module.py:108 dnf/cli/commands/module.py:131 + msgid "No matching Modules to list" + msgstr "表示する一致モジュールはありません" + +-#: dnf/cli/commands/module.py:111 ++#: dnf/cli/commands/module.py:114 + msgid "print detailed information about a module" + msgstr "モジュールに関する詳細情報を表示" + +-#: dnf/cli/commands/module.py:133 ++#: dnf/cli/commands/module.py:136 + msgid "enable a module stream" + msgstr "モジュールストリームを有効化" + +-#: dnf/cli/commands/module.py:157 ++#: dnf/cli/commands/module.py:160 + msgid "disable a module with all its streams" + msgstr "すべてのストリームのモジュールを無効化" + +-#: dnf/cli/commands/module.py:181 ++#: dnf/cli/commands/module.py:184 + msgid "reset a module" + msgstr "モジュールのリセット" + +-#: dnf/cli/commands/module.py:202 ++#: dnf/cli/commands/module.py:205 + msgid "install a module profile including its packages" + msgstr "パッケージを含むモジュールプロファイルのインストール" + +-#: dnf/cli/commands/module.py:223 ++#: dnf/cli/commands/module.py:226 + msgid "update packages associated with an active stream" + msgstr "アクティブストリームに紐づいたパッケージをアップデート" + +-#: dnf/cli/commands/module.py:240 ++#: dnf/cli/commands/module.py:243 + msgid "remove installed module profiles and their packages" + msgstr "インストールされたモジュールプロファイルとそのパッケージを削除" + +-#: dnf/cli/commands/module.py:264 ++#: dnf/cli/commands/module.py:267 + msgid "Package {} belongs to multiple modules, skipping" msgstr "パッケージ {} は複数のモジュールに属しています、スキップします" - #: dnf/cli/commands/module.py:277 +-#: dnf/cli/commands/module.py:277 ++#: dnf/cli/commands/module.py:280 +msgid "switch a module to a stream and distrosync rpm packages" +msgstr "モジュールをストリームに切り替え、rpm パッケージを distrosync します" + -+#: dnf/cli/commands/module.py:299 ++#: dnf/cli/commands/module.py:302 msgid "list modular packages" msgstr "モジュラーパッケージをリスト" -#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 ++#: dnf/cli/commands/module.py:317 msgid "list packages belonging to a module" msgstr "モジュールに属するパッケージをリスト" -#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 ++#: dnf/cli/commands/module.py:352 msgid "Interact with Modules." msgstr "モジュールと対話します。" -#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 ++#: dnf/cli/commands/module.py:365 msgid "show only enabled modules" msgstr "有効なモジュールのみを表示します" -#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 ++#: dnf/cli/commands/module.py:368 msgid "show only disabled modules" msgstr "無効なモジュールのみを表示します" -#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 ++#: dnf/cli/commands/module.py:371 msgid "show only installed modules or packages" msgstr "インストールされたモジュールまたはパッケージのみ表示" -#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 ++#: dnf/cli/commands/module.py:374 msgid "show profile content" msgstr "プロファイルコンテンツを表示します" -#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 ++#: dnf/cli/commands/module.py:379 msgid "remove all modular packages" msgstr "すべてのモジュラーパッケージを削除" -#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 ++#: dnf/cli/commands/module.py:389 msgid "Module specification" msgstr "モジュールspec" -#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 ++#: dnf/cli/commands/module.py:411 msgid "{} {} {}: too few arguments" msgstr "{} {} {}: 引数が足りません" -@@ -1843,6 +1825,8 @@ msgid "" +@@ -1843,6 +1827,8 @@ msgid "" "display format for listing packages: \"%%{name} %%{version} ...\", use " "--querytags to view full tag list" msgstr "" @@ -6261,7 +4527,16 @@ index 6435271c..00529771 100644 #: dnf/cli/commands/repoquery.py:198 msgid "show available tags to use with --queryformat" -@@ -1977,7 +1961,7 @@ msgid "" +@@ -1853,7 +1839,7 @@ msgid "" + "use name-epoch:version-release.architecture format for displaying found " + "packages (default)" + msgstr "" +-"見つかったパッケージを表示するには name-epoch:version-release.architecture 形式を使用します (デフォルト)" ++"見つかったパッケージを表示するには name-epoch:version-release.architecture 形式を使用します (デフォルト)" + + #: dnf/cli/commands/repoquery.py:205 + msgid "" +@@ -1977,7 +1963,7 @@ msgid "" msgstr "" "オプションの '--resolve' は、'--conflicts'、'--depends'、'--enhances'、'--provides'、'--" "recommends'、'--requires'、'--requires-pre'、'--suggests' または '--supplements' " @@ -6270,7 +4545,7 @@ index 6435271c..00529771 100644 #: dnf/cli/commands/repoquery.py:305 msgid "" -@@ -1986,7 +1970,7 @@ msgid "" +@@ -1986,7 +1972,7 @@ msgid "" "--resolve'" msgstr "" "オプションの '--recursive' は、'--whatrequires ' (オプションでは '--exactdeps' ではなく、'" @@ -6279,7 +4554,7 @@ index 6435271c..00529771 100644 #: dnf/cli/commands/repoquery.py:312 msgid "argument {} requires --whatrequires or --whatdepends option" -@@ -2027,22 +2011,22 @@ msgstr "KEYWORD" +@@ -2027,22 +2013,22 @@ msgstr "KEYWORD" msgid "Keyword to search for" msgstr "検索のキーワード" @@ -6306,7 +4581,7 @@ index 6435271c..00529771 100644 msgid "URL" msgstr "URL" -@@ -2185,16 +2169,16 @@ msgstr "" +@@ -2185,16 +2171,16 @@ msgstr "" "実行 トランザクションセットの解決および実行\n" "終了 (または 中止) シェルの終了" @@ -6326,18 +4601,27 @@ index 6435271c..00529771 100644 msgid "Leaving Shell" msgstr "シェルを終了します" -@@ -2385,8 +2369,8 @@ msgstr "重大度" +@@ -2385,8 +2371,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 ++#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 dnf/util.py:617 msgid "Installed" msgstr "インストール済み" -@@ -2709,13 +2693,13 @@ msgstr "引数をエンコードできません '%s': %s" +@@ -2699,7 +2685,7 @@ msgstr "主要コマンドの一覧:" + + #: dnf/cli/option_parser.py:376 + msgid "List of Plugin Commands:" +-msgstr "プラグインコマンドの一覧" ++msgstr "プラグインコマンドの一覧:" + + #: dnf/cli/option_parser.py:413 + #, python-format +@@ -2709,13 +2695,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. @@ -6353,7 +4637,7 @@ index 6435271c..00529771 100644 msgid "Epoch" msgstr "エポック" -@@ -2723,38 +2707,38 @@ msgstr "エポック" +@@ -2723,38 +2709,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. @@ -6398,7 +4682,7 @@ index 6435271c..00529771 100644 msgctxt "long" msgid "Size" msgstr "サイズ" -@@ -2763,32 +2747,32 @@ msgstr "サイズ" +@@ -2763,32 +2749,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. @@ -6436,7 +4720,7 @@ index 6435271c..00529771 100644 msgid "From repo" msgstr "repo から" -@@ -2796,312 +2780,308 @@ msgstr "repo から" +@@ -2796,312 +2782,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. @@ -6817,7 +5101,7 @@ index 6435271c..00529771 100644 #, python-format msgid "" "Skipping packages with conflicts:\n" -@@ -3110,12 +3090,12 @@ msgstr "" +@@ -3110,12 +3092,12 @@ msgstr "" "競合するパッケージをスキップします:\n" "(アップグレードを強制するにはコマンドラインに '%s' を追加します)" @@ -6832,7 +5116,7 @@ index 6435271c..00529771 100644 msgid " or part of a group" msgstr " またはグループの一部" -@@ -3123,22 +3103,22 @@ msgstr " またはグループの一部" +@@ -3123,22 +3105,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. @@ -6859,17 +5143,17 @@ index 6435271c..00529771 100644 #, python-format msgid "" "\n" -@@ -3150,287 +3130,271 @@ msgstr "" +@@ -3150,287 +3132,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 ++#: dnf/cli/output.py:1296 dnf/cli/output.py:1814 dnf/cli/output.py:1815 msgid "Install" msgstr "インストール" -#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 ++#: dnf/cli/output.py:1300 dnf/cli/output.py:1823 msgid "Upgrade" msgstr "アップグレード" @@ -6879,7 +5163,7 @@ index 6435271c..00529771 100644 msgstr "削除" -#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 ++#: dnf/cli/output.py:1303 dnf/cli/output.py:1821 msgid "Downgrade" msgstr "ダウングレード" @@ -6946,278 +5230,278 @@ index 6435271c..00529771 100644 #. TRANSLATORS: user names who executed transaction in history command output -#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 ++#: dnf/cli/output.py:1531 msgid "User name" msgstr "ユーザー名" -#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 ++#: dnf/cli/output.py:1533 msgid "ID" msgstr "ID" -#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 ++#: dnf/cli/output.py:1535 msgid "Date and time" msgstr "日時" -#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 ++#: dnf/cli/output.py:1536 msgid "Action(s)" msgstr "動作" -#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 ++#: dnf/cli/output.py:1537 msgid "Altered" msgstr "変更されました" -#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 ++#: dnf/cli/output.py:1580 msgid "No transactions" msgstr "トランザクションがありません" -#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 ++#: dnf/cli/output.py:1581 dnf/cli/output.py:1597 msgid "Failed history info" msgstr "失敗した履歴情報" -#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 ++#: dnf/cli/output.py:1596 msgid "No transaction ID, or package, given" msgstr "トランザクション ID、またはパッケージが指定されていません" -#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 ++#: dnf/cli/output.py:1654 msgid "Erased" msgstr "削除されました" -#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1822 dnf/util.py:616 +msgid "Downgraded" +msgstr "ダウングレード済み" + -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1824 dnf/util.py:615 +msgid "Upgraded" +msgstr "アップグレード済み" + -+#: dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 msgid "Not installed" msgstr "インストールされていません" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 msgid "Newer" msgstr "新しい" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 msgid "Older" msgstr "古い" -#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 ++#: dnf/cli/output.py:1705 dnf/cli/output.py:1707 msgid "Transaction ID :" msgstr "トランザクション ID :" -#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 ++#: dnf/cli/output.py:1710 msgid "Begin time :" msgstr "開始時間 :" -#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 ++#: dnf/cli/output.py:1713 dnf/cli/output.py:1715 msgid "Begin rpmdb :" msgstr "開始 rpmdb :" -#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 ++#: dnf/cli/output.py:1721 #, python-format msgid "(%u seconds)" msgstr "(%u 秒)" -#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 ++#: dnf/cli/output.py:1723 #, python-format msgid "(%u minutes)" msgstr "(%u 分)" -#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 ++#: dnf/cli/output.py:1725 #, python-format msgid "(%u hours)" msgstr "(%u 時間)" -#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 ++#: dnf/cli/output.py:1727 #, python-format msgid "(%u days)" msgstr "(%u 日)" -#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 ++#: dnf/cli/output.py:1728 msgid "End time :" msgstr "終了時間 :" -#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 ++#: dnf/cli/output.py:1731 dnf/cli/output.py:1733 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 ++#: dnf/cli/output.py:1740 dnf/cli/output.py:1742 msgid "User :" msgstr "ユーザー :" -#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1753 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 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1749 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1753 dnf/cli/output.py:1755 dnf/cli/output.py:1757 msgid "Return-Code :" msgstr "終了コード :" -#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 ++#: dnf/cli/output.py:1749 dnf/cli/output.py:1757 msgid "Success" msgstr "成功" -#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 ++#: dnf/cli/output.py:1751 msgid "Failures:" msgstr "失敗:" -#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 ++#: dnf/cli/output.py:1755 msgid "Failure:" msgstr "失敗しました:" -#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 ++#: dnf/cli/output.py:1765 dnf/cli/output.py:1767 msgid "Releasever :" msgstr "Releasever :" -#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 ++#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 msgid "Command Line :" msgstr "コマンドライン :" -#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 ++#: dnf/cli/output.py:1779 dnf/cli/output.py:1781 msgid "Comment :" msgstr "コメント :" -#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 ++#: dnf/cli/output.py:1785 msgid "Transaction performed with:" msgstr "実行されたトランザクション:" -#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 ++#: dnf/cli/output.py:1794 msgid "Packages Altered:" msgstr "変更されたパッケージ:" -#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 ++#: dnf/cli/output.py:1800 msgid "Scriptlet output:" msgstr "Scriptlet の出力:" -#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 ++#: dnf/cli/output.py:1807 msgid "Errors:" msgstr "エラー:" -#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 ++#: dnf/cli/output.py:1816 msgid "Dep-Install" msgstr "Dep-Install" -#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 ++#: dnf/cli/output.py:1817 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 ++#: dnf/cli/output.py:1818 dnf/transaction.py:84 dnf/transaction.py:85 msgid "Obsoleting" msgstr "廃止" -#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 ++#: dnf/cli/output.py:1819 msgid "Erase" msgstr "削除" -#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 ++#: dnf/cli/output.py:1820 msgid "Reinstall" msgstr "再インストール" -#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 ++#: dnf/cli/output.py:1894 #, python-format msgid "---> Package %s.%s %s will be installed" msgstr "---> パッケージ %s.%s %s はインストールされます" -#: dnf/cli/output.py:2018 -+#: dnf/cli/output.py:1894 ++#: dnf/cli/output.py:1896 #, 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 ++#: dnf/cli/output.py:1898 #, python-format msgid "---> Package %s.%s %s will be erased" msgstr "---> パッケージ %s.%s %s は消去されます" -#: dnf/cli/output.py:2022 -+#: dnf/cli/output.py:1898 ++#: dnf/cli/output.py:1900 #, python-format msgid "---> Package %s.%s %s will be reinstalled" msgstr "---> パッケージ %s.%s %s は再インストールされます" -#: dnf/cli/output.py:2024 -+#: dnf/cli/output.py:1900 ++#: dnf/cli/output.py:1902 #, 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 ++#: dnf/cli/output.py:1904 #, python-format msgid "---> Package %s.%s %s will be obsoleting" msgstr "---> パッケージ %s.%s %s は廃止となります" -#: dnf/cli/output.py:2028 -+#: dnf/cli/output.py:1904 ++#: dnf/cli/output.py:1906 #, python-format msgid "---> Package %s.%s %s will be upgraded" msgstr "---> パッケージ %s.%s %s はアップグレードされます" -#: dnf/cli/output.py:2030 -+#: dnf/cli/output.py:1906 ++#: dnf/cli/output.py:1908 #, python-format msgid "---> Package %s.%s %s will be obsoleted" msgstr "---> パッケージ %s.%s %s は廃止されます" -#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 ++#: dnf/cli/output.py:1917 msgid "--> Starting dependency resolution" msgstr "--> 依存関係の解決を開始しました" -#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 ++#: dnf/cli/output.py:1921 msgid "--> Finished dependency resolution" msgstr "--> 依存関係の解決が完了しました" -#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 ++#: dnf/cli/output.py:1935 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." +@@ -3512,16 +3478,14 @@ msgid "Module or Group '%s' does not exist." msgstr "モジュールまたはグループ '%s' は存在しません。" #: dnf/comps.py:599 @@ -7239,7 +5523,7 @@ index 6435271c..00529771 100644 #: dnf/comps.py:639 #, python-format -@@ -3534,10 +3496,9 @@ msgid "Environment '%s' is not available." +@@ -3534,16 +3498,20 @@ msgid "Environment '%s' is not available." msgstr "環境 '%s' は利用不可です。" #: dnf/comps.py:673 @@ -7252,74 +5536,228 @@ index 6435271c..00529771 100644 #: dnf/conf/config.py:136 #, python-format -@@ -3588,7 +3549,7 @@ msgstr "repo %s には setopt の前に %s attr. がありませんでした" - #: dnf/conf/read.py:51 + msgid "Error parsing '%s': %s" + msgstr "'%s' の解析中にエラーが発生しました: %s" + ++#: dnf/conf/config.py:151 ++#, python-format ++msgid "Invalid configuration value: %s=%s in %s; %s" ++msgstr "正しくない設定値: %s=%s in %s; %s" ++ + #: dnf/conf/config.py:226 + msgid "Could not set cachedir: {}" + msgstr "cachedir を設定できませんでした: {}" +@@ -3585,36 +3553,36 @@ msgstr "鍵 '%s.%s'、値 '%s' の --setopt を解析中にエラーが発生し + msgid "Repo %s did not have a %s attr. before setopt" + msgstr "repo %s には setopt の前に %s attr. がありませんでした" + +-#: dnf/conf/read.py:51 ++#: dnf/conf/read.py:60 #, python-format msgid "Warning: failed loading '%s', skipping." -msgstr "警告: '%s' のロードに失敗、スキップします。" +msgstr "警告: '%s' のロードに失敗、スキップします。" - #: dnf/conf/read.py:63 +-#: dnf/conf/read.py:63 ++#: dnf/conf/read.py:72 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。" + msgstr "repo: {} ({}) に正しくないid、 byte = {} {}" -+#: dnf/crypto.py:177 +-#: dnf/conf/read.py:67 ++#: dnf/conf/read.py:76 + msgid "Bad id for repo: {}, byte = {} {}" + msgstr "repo: {} に正しくないid、byte = {} {}" + +-#: dnf/conf/read.py:75 ++#: dnf/conf/read.py:84 + msgid "Repository '{}' ({}): Error parsing config: {}" + msgstr "レポジトリ '{}' ({}): 設定変更エラー: {}" + +-#: dnf/conf/read.py:78 ++#: dnf/conf/read.py:87 + msgid "Repository '{}': Error parsing config: {}" + msgstr "レポジトリ '{}': 設定変更エラー: {}" + +-#: dnf/conf/read.py:84 ++#: dnf/conf/read.py:93 + msgid "Repository '{}' ({}) is missing name in configuration, using id." + msgstr "レポジトリ '{}' ({}) はidを使用した設定内に見つかりません。" + +-#: dnf/conf/read.py:87 ++#: dnf/conf/read.py:96 + msgid "Repository '{}' is missing name in configuration, using id." + msgstr "レポジトリ '{}' idを使用した設定内に見つかりません。" + +-#: dnf/conf/read.py:104 ++#: dnf/conf/read.py:113 + msgid "Parsing file \"{}\" failed: {}" + msgstr "ファイル \"{}\" の解析に失敗しました: {}" + +@@ -3626,27 +3594,40 @@ msgstr "repo %s: 0x%s はインポート済みです" + #: dnf/crypto.py:115 + #, python-format + msgid "repo %s: imported key 0x%s." +-msgstr "repo %s: インポート済みの鍵 0x%s。" ++msgstr "repo %s: インポート済みのキー 0x%s。" ++ ++#: dnf/crypto.py:145 ++msgid "Verified using DNS record with DNSSEC signature." ++msgstr "DNSSEC 署名付きの DNS レコードを使用して検証しました。" ++ ++#: dnf/crypto.py:147 ++msgid "NOT verified using DNS record." ++msgstr "DNS レコードを使用して検証されませんでした。" + +-#: dnf/db/group.py:293 ++#: dnf/crypto.py:184 +#, python-format +msgid "retrieving repo key for %s unencrypted from %s" +msgstr "%s から暗号化されていない %s の repo キーを取得しています" + - #: dnf/db/group.py:293 ++#: dnf/db/group.py:301 msgid "" "No available modular metadata for modular package '{}', it cannot be " -@@ -3710,7 +3676,7 @@ msgid "Modular dependency problem with Defaults:" + "installed on the system" + msgstr "モジュラーパッケージ '{}' のモジュラーメタデータは利用不可です、システムにインストールはできません" + +-#: dnf/db/group.py:343 ++#: dnf/db/group.py:351 + msgid "No available modular metadata for modular package" + msgstr "モジュラーパッケージ のモジュラーメタデータは利用不可です" + +-#: dnf/db/group.py:377 ++#: dnf/db/group.py:385 + #, python-format + msgid "Will not install a source rpm package (%s)." + msgstr "ソース rpm パッケージ (%s) をインストールしません。" + + #: dnf/dnssec.py:168 + msgid "" +-"Configuration option 'gpgkey_dns_verification' requires libunbound ({})" +-msgstr "設定オプション 'gpgkey_dns_verification' は libunbound ({}) が必要です" ++"Configuration option 'gpgkey_dns_verification' requires python3-unbound ({})" ++msgstr "設定オプション 'gpgkey_dns_verification' は python3-unbound ({}) が必要です" + + #: dnf/dnssec.py:239 + msgid "DNSSEC extension: Key for user " +@@ -3710,7 +3691,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 ++#: dnf/exceptions.py:131 dnf/module/module_base.py:854 msgid "Modular dependency problem:" msgid_plural "Modular dependency problems:" msgstr[0] "モジュラーの依存に関する問題:" -@@ -3764,8 +3730,8 @@ msgstr "" +@@ -3744,7 +3725,47 @@ msgstr "有効なモジュール: {}." + msgid "No profile specified for '{}', please specify profile." + msgstr "'{}' に指定したプロファイルはありません。プロファイルを指定してください。" + +-#: dnf/module/module_base.py:33 ++#: dnf/module/exceptions.py:27 ++msgid "No such module: {}" ++msgstr "次のようなモジュールはありません: {}" ++ ++#: dnf/module/exceptions.py:33 ++msgid "No such stream: {}" ++msgstr "次のようなストリームはありません: {}" ++ ++#: dnf/module/exceptions.py:39 ++msgid "No enabled stream for module: {}" ++msgstr "次のモジュールに有効化されたストリームはありません: {}" ++ ++#: dnf/module/exceptions.py:46 ++msgid "Cannot enable more streams from module '{}' at the same time" ++msgstr "モジュール '{}' から、さらにストリームを同時に有効にできません" ++ ++#: dnf/module/exceptions.py:52 ++msgid "Different stream enabled for module: {}" ++msgstr "次のモジュールに有効化された異なるストリーム: {}" ++ ++#: dnf/module/exceptions.py:58 ++msgid "No such profile: {}" ++msgstr "次ようなプロファイルはありません: {}" ++ ++#: dnf/module/exceptions.py:64 ++msgid "Specified profile not installed for {}" ++msgstr "指定のプロファイルは次にインストールされていません: {}" ++ ++#: dnf/module/exceptions.py:70 ++msgid "No stream specified for '{}', please specify stream" ++msgstr "'{}' に指定したストリームはありません。ストリームを指定してください" ++ ++#: dnf/module/exceptions.py:82 ++msgid "No such profile: {}. No profiles available" ++msgstr "次のようなプロファイルはありません: {}。利用できるプロファイルはありません" ++ ++#: dnf/module/exceptions.py:88 ++msgid "No profile to remove for '{}'" ++msgstr "'{}' の削除するプロファイルがありません" ++ ++#: dnf/module/module_base.py:35 + msgid "" + "\n" + "\n" +@@ -3754,7 +3775,7 @@ msgstr "" + "\n" + "ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled" + +-#: dnf/module/module_base.py:34 ++#: dnf/module/module_base.py:36 + msgid "" + "\n" + "\n" +@@ -3764,80 +3785,98 @@ 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 ++#: dnf/module/module_base.py:56 dnf/module/module_base.py:556 ++#: dnf/module/module_base.py:615 dnf/module/module_base.py:681 msgid "Ignoring unnecessary profile: '{}/{}'" msgstr "不要なプロファイルを無視します: '{}/{}'" -@@ -3774,17 +3740,17 @@ msgstr "不要なプロファイルを無視します: '{}/{}'" +-#: dnf/module/module_base.py:84 ++#: dnf/module/module_base.py:86 + #, python-brace-format 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 ++#: dnf/module/module_base.py:94 dnf/module/module_base.py:204 #, 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 ++#: dnf/module/module_base.py:104 dnf/module/module_base.py:214 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 ++#: dnf/module/module_base.py:108 dnf/module/module_base.py:218 msgid "Unable to match profile for argument {}" msgstr "引数 {} でプロファイルが見つかりません" -@@ -3800,41 +3766,55 @@ msgstr "モジュール {}:{} にプロファイルがありません" +-#: dnf/module/module_base.py:118 ++#: dnf/module/module_base.py:120 + msgid "No default profiles for module {}:{}. Available profiles: {}" + msgstr "モジュール {}:{} にデフォルトのプロファイルがありません。利用可能プロファイル: {}" + +-#: dnf/module/module_base.py:122 ++#: dnf/module/module_base.py:124 + msgid "No profiles for module {}:{}" + msgstr "モジュール {}:{} にプロファイルがありません" + +-#: dnf/module/module_base.py:129 ++#: dnf/module/module_base.py:131 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 ++#: dnf/module/module_base.py:144 dnf/module/module_base.py:247 msgid "Installing module from Fail-Safe repository is not allowed" msgstr "フェイルセーフレポジトリーからのモジュールインストールは許可されていません" @@ -7327,24 +5765,24 @@ index 6435271c..00529771 100644 -#: 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 ++#: dnf/module/module_base.py:196 +#, python-brace-format +msgid "No active matches for argument '{0}' in module '{1}:{2}'" +msgstr "モジュール '{1}:{2}' の引数 '{0}' には、アクティブな一致がありません" + -+#: dnf/module/module_base.py:226 ++#: dnf/module/module_base.py:228 +#, 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 ++#: dnf/module/module_base.py:267 +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 ++#: dnf/module/module_base.py:310 dnf/module/module_base.py:461 ++#: dnf/module/module_base.py:486 dnf/module/module_base.py:505 ++#: dnf/module/module_base.py:552 dnf/module/module_base.py:611 ++#: dnf/module/module_base.py:677 dnf/module/module_base.py:840 msgid "Unable to resolve argument {}" msgstr "引数 {} を解決できません" @@ -7353,38 +5791,48 @@ index 6435271c..00529771 100644 -msgstr "パッケージ {} に一致するものはありません" - -#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 ++#: dnf/module/module_base.py:321 #, 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 ++#: dnf/module/module_base.py:340 dnf/module/module_base.py:368 msgid "Unable to match profile in argument {}" msgstr "引数 {} でプロファイルを一致できません" -#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 ++#: dnf/module/module_base.py:348 msgid "Upgrading module from Fail-Safe repository is not allowed" msgstr "フェイルセーフレポジトリーからのモジュールアップグレードは許可されていません" -#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 ++#: dnf/module/module_base.py:422 ++#, python-brace-format ++msgid "" ++"Argument '{argument}' matches {stream_count} streams ('{streams}') of module" ++" '{module}', but none of the streams are enabled or default" ++msgstr "" ++"引数 '{argument}' は、モジュール '{module}' の {stream_count} ストリーム ('{streams}' " ++"と一致しますが、有効化されている、あるいはデフォルトのストリームはありません" ++ ++#: dnf/module/module_base.py:509 msgid "" "Only module name is required. Ignoring unneeded information in argument: " "'{}'" msgstr "モジュール名のみが必要です。引数で不必要な情報を無視します: '{}'" -#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 +-#, python-format +-msgid "%s: %s check failed: %s vs %s" +-msgstr "%s: %s の確認に失敗しました: %s vs %s" ++#: dnf/module/module_base.py:841 +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 は空のファイルです" + + #. empty file is invalid json format + #: dnf/persistor.py:54 +@@ -3848,12 +3887,12 @@ msgstr "%s は空のファイルです" #: dnf/persistor.py:91 #, python-format msgid "Failed to load expired repos cache: %s" @@ -7399,7 +5847,42 @@ index 6435271c..00529771 100644 #: dnf/persistor.py:106 msgid "Failed storing last makecache time." -@@ -3915,6 +3895,14 @@ msgstr "%s から %s repo を追加しました" +@@ -3873,16 +3912,16 @@ msgstr "ファイルの解析に失敗しました: %s" + msgid "Loaded plugins: %s" + msgstr "ロードされたプラグイン: %s" + +-#: dnf/plugin.py:199 ++#: dnf/plugin.py:211 + #, python-format + msgid "Failed loading plugin \"%s\": %s" + msgstr "plugin \"%s\" のロードに失敗しました: %s" + +-#: dnf/plugin.py:231 ++#: dnf/plugin.py:243 + msgid "No matches found for the following enable plugin patterns: {}" + msgstr "以下有効プラグインパターンが見つかりません: {}" + +-#: dnf/plugin.py:235 ++#: dnf/plugin.py:247 + msgid "No matches found for the following disable plugin patterns: {}" + msgstr "以下無効プラグインパターンが見つかりません: {}" + +@@ -3911,10 +3950,29 @@ msgstr "%s リポジトリーの有効化" + msgid "Added %s repo from %s" + msgstr "%s から %s repo を追加しました" + ++#: dnf/rpm/miscutils.py:35 ++#, python-brace-format ++msgid "" ++"Using rpmkeys executable from {path} to verify signature for package: " ++"{package}." ++msgstr "{path} から実行可能ファイル rpmkeys を使用して、パッケージの署名を検証します: {package}。" ++ ++#: dnf/rpm/miscutils.py:39 ++msgid "Cannot find rpmkeys executable to verify signatures." ++msgstr "署名を検証する rpmkeys 実行ファイルが見つかりません。" ++ + #: dnf/rpm/transaction.py:119 msgid "Errors occurred during test transaction." msgstr "テストトランザクション中にエラーが発生しました。" @@ -7414,7 +5897,7 @@ index 6435271c..00529771 100644 #. TRANSLATORS: This is for a single package currently being downgraded. #: dnf/transaction.py:80 msgctxt "currently" -@@ -3961,168 +3949,200 @@ msgstr "scriptletの実行中" +@@ -3961,168 +4019,203 @@ msgstr "scriptletの実行中" msgid "Preparing" msgstr "準備" @@ -7426,7 +5909,7 @@ index 6435271c..00529771 100644 +msgid "" +"The following problems occurred while replaying the transaction from file " +"\"{filename}\":" -+msgstr "ファイル \"{filename}\" からのトランザクションの再生中に以下の問題が発生しました。" ++msgstr "ファイル \"{filename}\" からのトランザクションの再生中に以下の問題が発生しました:" -#: dnf/transaction_sr.py:70 -#, python-brace-format @@ -7434,7 +5917,7 @@ index 6435271c..00529771 100644 -msgstr "" +#: dnf/transaction_sr.py:68 +msgid "The following problems occurred while running a transaction:" -+msgstr "トランザクションの実行中に以下の問題が発生しました。" ++msgstr "トランザクションの実行中に以下の問題が発生しました:" -#: dnf/transaction_sr.py:87 +#: dnf/transaction_sr.py:89 @@ -7631,41 +6114,44 @@ index 6435271c..00529771 100644 # 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 ++#: dnf/util.py:419 dnf/util.py:421 msgid "Problem" msgstr "問題" -#: dnf/util.py:444 -+#: dnf/util.py:446 ++#: dnf/util.py:472 msgid "TransactionItem not found for key: {}" msgstr "TransactionItemが見つかりません鍵: {}" -#: dnf/util.py:454 -+#: dnf/util.py:456 ++#: dnf/util.py:482 msgid "TransactionSWDBItem not found for key: {}" msgstr "TransactionSWDBItemが見つかりません鍵: {}" -#: dnf/util.py:457 -+#: dnf/util.py:459 ++#: dnf/util.py:485 msgid "Errors occurred during transaction." msgstr "トランザクション中にエラーが発生しました。" -+#: dnf/util.py:595 ++#: dnf/util.py:621 +msgid "Reinstalled" +msgstr "再インストール済み" + -+#: dnf/util.py:596 ++#: dnf/util.py:622 +msgid "Skipped" +msgstr "スキップ済み" + -+#: dnf/util.py:597 ++#: dnf/util.py:623 +msgid "Removed" +msgstr "削除しました" + -+#: dnf/util.py:600 ++#: dnf/util.py:626 +msgid "Failed" +msgstr "失敗しました" + ++#~ msgid "%s: %s check failed: %s vs %s" ++#~ msgstr "%s: %s の確認に失敗しました: %s vs %s" ++ +#~ msgid "Action not handled: {}" +#~ msgstr "動作は対処されていません: {}" + @@ -7682,394 +6168,535 @@ index 6435271c..00529771 100644 #~ msgstr "見つかったパッケージを表示する形式" diff --git a/po/ko.po b/po/ko.po -index 449f6130..9f37ae13 100644 +index 449f6130..78e18309 100644 --- a/po/ko.po +++ b/po/ko.po -@@ -5,7 +5,7 @@ msgid "" +@@ -1,68 +1,68 @@ + # MinWoo Joh , 2015. #zanata + # Eun-Ju Kim , 2016. #zanata + # Ludek Janda , 2018. #zanata, 2020. ++# simmon , 2021. + 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" +-"PO-Revision-Date: 2020-09-12 11:29+0000\n" +-"Last-Translator: Ludek Janda \n" +-"Language-Team: Korean \n" ++"POT-Creation-Date: 2021-08-11 16:00+0200\n" ++"PO-Revision-Date: 2021-08-12 16:04+0000\n" ++"Last-Translator: simmon \n" ++"Language-Team: Korean \n" + "Language: ko\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.2.2\n" ++"X-Generator: Weblate 4.7.2\n" + + #: dnf/automatic/emitter.py:32 + #, python-format + msgid "The following updates have been applied on '%s':" +-msgstr "'%s'에 다음 업데이트가 적용되었습니다:" ++msgstr "다음 최신화가 '%s'에 적용되었습니다:" + + #: dnf/automatic/emitter.py:33 +-#, fuzzy, python-format +-#| msgid "Updates applied on '%s'." ++#, python-format + msgid "Updates completed at %s" +-msgstr "'%s'에 업데이트가 적용 되었습니다." ++msgstr "'%s'에 최신화가 적용 되었습니다" + + #: dnf/automatic/emitter.py:34 + #, python-format + msgid "The following updates are available on '%s':" +-msgstr "'%s'에서 다음 업데이트를 사용할 수 있습니다:" ++msgstr "다음 최신화가 '%s'에서 사용 할 수 있습니다:" + + #: dnf/automatic/emitter.py:35 + #, python-format + msgid "The following updates were downloaded on '%s':" +-msgstr "'%s'에 다음 업데이트가 다운로드되었습니다:" ++msgstr "'%s'에 다음 최신화가 내려받기 되었습니다:" + + #: dnf/automatic/emitter.py:83 + #, python-format + msgid "Updates applied on '%s'." +-msgstr "'%s'에 업데이트가 적용되었습니다." ++msgstr "'%s'에서 적용되어 최신화되었습니다." + + #: dnf/automatic/emitter.py:85 + #, python-format + msgid "Updates downloaded on '%s'." +-msgstr "'%s'에 업데이트가 다운로드되었습니다." ++msgstr "'%s'에 최신화가 내려받기 되었습니다." + + #: dnf/automatic/emitter.py:87 + #, python-format + msgid "Updates available on '%s'." +-msgstr "'%s'에서 업데이트가 가능합니다." ++msgstr "'%s'에서 가능한 최신화입니다." + + #: dnf/automatic/emitter.py:110 + #, python-format + msgid "Failed to send an email via '%s': %s" +-msgstr "'%s'를 통한 이메일 전송을 실패했습니다: %s" ++msgstr "'%s'를 통한 전자우편 전송을 실패했습니다: %s" + + #: dnf/automatic/emitter.py:140 + #, python-format + msgid "Failed to execute command '%s': returned %d" + msgstr "명령’%s'을 실행하지 못했습니다: %d를 반환했습니다" + +-#: dnf/automatic/main.py:164 dnf/conf/config.py:151 ++#: dnf/automatic/main.py:164 + #, python-format + msgid "Unknown configuration value: %s=%s in %s; %s" + msgstr "알 수없는 설정: %s=%s in %s; %s" +@@ -72,26 +72,26 @@ 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 ++#: dnf/automatic/main.py:237 dnf/cli/cli.py:305 msgid "GPG check FAILED" msgstr "GPG 확인 실패" -@@ -85,9 +85,11 @@ msgid "Started dnf-automatic." + #: dnf/automatic/main.py:274 + msgid "Waiting for internet connection..." +-msgstr "" ++msgstr "인터넷 연결을 위한 대기..." + + #: dnf/automatic/main.py:304 + 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 초 동안 절전합니다" ++msgstr[0] "{} 초 동안 절전합니다" #: dnf/automatic/main.py:315 msgid "System is off-line." -@@ -99,7 +101,7 @@ msgstr "" +-msgstr "" ++msgstr "네트웍 끊김." + + #: dnf/automatic/main.py:344 dnf/cli/main.py:59 dnf/cli/main.py:80 + #: dnf/cli/main.py:83 +@@ -99,442 +99,428 @@ msgstr "" msgid "Error: %s" msgstr "오류: %s" -#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 ++#: dnf/base.py:148 dnf/base.py:477 dnf/base.py:479 msgid "loading repo '{}' failure: {}" - msgstr "repo '{}'의 로드에 실패했습니다 : {}" +-msgstr "repo '{}'의 로드에 실패했습니다 : {}" ++msgstr "repo '{}'의 적재에 실패했습니다 : {}" -@@ -107,236 +109,236 @@ msgstr "repo '{}'의 로드에 실패했습니다 : {}" +-#: dnf/base.py:148 ++#: dnf/base.py:150 msgid "Loading repository '{}' has failed" - msgstr "리포지토리 '{}'의 로드에 실패했습니다" +-msgstr "리포지토리 '{}'의 로드에 실패했습니다" ++msgstr "저장소 '{}'의 적재하기가 실패했습니다" -#: dnf/base.py:320 -+#: dnf/base.py:322 ++#: dnf/base.py:327 msgid "Metadata timer caching disabled when running on metered connection." - msgstr "데이터 통신 연결을 사용할 때 메타 데이터 타이머 캐싱을 비활성화합니다." +-msgstr "데이터 통신 연결을 사용할 때 메타 데이터 타이머 캐싱을 비활성화합니다." ++msgstr "데이터 통신 연결을 사용 할 때에 메타 자료 타이머 캐싱을 비활성화합니다." -#: dnf/base.py:325 -+#: dnf/base.py:327 ++#: dnf/base.py:332 msgid "Metadata timer caching disabled when running on a battery." - msgstr "배터리를 사용할할 때 메타 데이터 타이머 캐싱을 비활성화합니다." +-msgstr "배터리를 사용할할 때 메타 데이터 타이머 캐싱을 비활성화합니다." ++msgstr "배터리에서 동작 할 때에 메타자료 타이머 캐싱을 비활성화합니다." -#: dnf/base.py:330 -+#: dnf/base.py:332 ++#: dnf/base.py:337 msgid "Metadata timer caching disabled." - msgstr "메타 데이터 타이머 캐싱이 비활성화되었습니다." +-msgstr "메타 데이터 타이머 캐싱이 비활성화되었습니다." ++msgstr "메타자료 타이머 캐싱이 비활성화되었습니다." -#: dnf/base.py:335 -+#: dnf/base.py:337 ++#: dnf/base.py:342 msgid "Metadata cache refreshed recently." - msgstr "최근에 메타 데이터 캐시가 새로 고쳐졌습니다." +-msgstr "최근에 메타 데이터 캐시가 새로 고쳐졌습니다." ++msgstr "최근에 메타 자료 캐쉬가 새로 고쳐졌습니다." -#: dnf/base.py:341 dnf/cli/commands/__init__.py:91 -+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91 ++#: dnf/base.py:348 dnf/cli/commands/__init__.py:91 msgid "There are no enabled repositories in \"{}\"." msgstr "\"{}\"에 사용 가능한 저장소가 없습니다." -#: dnf/base.py:348 -+#: dnf/base.py:350 ++#: dnf/base.py:355 #, python-format msgid "%s: will never be expired and will not be refreshed." msgstr "%s: 만료되지 않고 새로 고침되지 않습니다." -#: dnf/base.py:350 -+#: dnf/base.py:352 ++#: dnf/base.py:357 #, 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 ++#: dnf/base.py:361 #, python-format msgid "%s: metadata will expire after %d seconds and will be refreshed now" - msgstr "%s: 메타 데이터는 %d 초 이후에 만료되며 이제 새로 고침됩니다." +-msgstr "%s: 메타 데이터는 %d 초 이후에 만료되며 이제 새로 고침됩니다." ++msgstr "%s: 메타 데이터는 %d 초 이후에 만료되며 이제 새로 고침됩니다" -#: dnf/base.py:358 -+#: dnf/base.py:360 ++#: dnf/base.py:365 #, python-format msgid "%s: will expire after %d seconds." msgstr "%s: %d 초 후에 만료됩니다." #. performs the md sync -#: dnf/base.py:364 -+#: dnf/base.py:366 ++#: dnf/base.py:371 msgid "Metadata cache created." - msgstr "메타 데이터 캐시가 생성되었습니다." +-msgstr "메타 데이터 캐시가 생성되었습니다." ++msgstr "메타 자료 캐쉬가 생성되었습니다." -#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 ++#: dnf/base.py:404 dnf/base.py:471 #, python-format msgid "%s: using metadata from %s." - msgstr "%s: %s에서 메타 데이터 사용 중" +-msgstr "%s: %s에서 메타 데이터 사용 중" ++msgstr "%s: 메타 자료 사용 중 %s." -#: dnf/base.py:409 -+#: dnf/base.py:411 dnf/base.py:479 ++#: dnf/base.py:416 dnf/base.py:484 #, python-format msgid "Ignoring repositories: %s" - msgstr "리포지토리를 무시합니다: %s" +-msgstr "리포지토리를 무시합니다: %s" ++msgstr "저장소를 무시합니다: %s" -#: dnf/base.py:412 -+#: dnf/base.py:414 ++#: dnf/base.py:419 #, python-format msgid "Last metadata expiration check: %s ago on %s." - msgstr "마지막 메타 데이터 만료 확인 :%s. %s 이전에 확인" +-msgstr "마지막 메타 데이터 만료 확인 :%s. %s 이전에 확인" ++msgstr "마지막 메타자료 만료확인 %s 이전인: %s." -#: dnf/base.py:443 -+#: dnf/base.py:507 ++#: dnf/base.py:512 msgid "" "The downloaded packages were saved in cache until the next successful " "transaction." - msgstr "다운로드된 패키지는 다음 번 성공적인 트랜잭션까지 캐시에 저장됩니다." +-msgstr "다운로드된 패키지는 다음 번 성공적인 트랜잭션까지 캐시에 저장됩니다." ++msgstr "내려받기된 꾸러미는 다음 번 성공적인 연결까지 캐쉬에 저장됩니다." -#: dnf/base.py:445 -+#: dnf/base.py:509 ++#: dnf/base.py:514 #, python-format msgid "You can remove cached packages by executing '%s'." - msgstr "'%s'을/를 실행하여 캐시 패키지를 삭제할 수 있습니다." +-msgstr "'%s'을/를 실행하여 캐시 패키지를 삭제할 수 있습니다." ++msgstr "'%s' 를 실행하여 캐쉬 꾸러미를 삭제 할 수 있습니다." -#: dnf/base.py:535 -+#: dnf/base.py:599 ++#: dnf/base.py:606 #, python-format msgid "Invalid tsflag in config file: %s" msgstr "설정 파일에서 tsflag 사용이 잘못되었습니다: %s" -#: dnf/base.py:591 -+#: dnf/base.py:655 ++#: dnf/base.py:662 #, python-format msgid "Failed to add groups file for repository: %s - %s" msgstr "리포지토리의 그룹 파일을 추가하지 못했습니다. %s - %s" -#: dnf/base.py:823 -+#: dnf/base.py:887 ++#: dnf/base.py:904 msgid "Running transaction check" - msgstr "트랜잭션 확인 실행 중" +-msgstr "트랜잭션 확인 실행 중" ++msgstr "연결 확인 실행 중" -#: dnf/base.py:831 -+#: dnf/base.py:895 ++#: dnf/base.py:912 msgid "Error: transaction check vs depsolve:" - msgstr "오류 : 트랜잭션 확인 및 종속성 해결 오류" +-msgstr "오류 : 트랜잭션 확인 및 종속성 해결 오류" ++msgstr "오류: 연결 확인 및 종속성 해결 오류:" -#: dnf/base.py:837 -+#: dnf/base.py:901 ++#: dnf/base.py:918 msgid "Transaction check succeeded." - msgstr "트랜잭션 확인에 성공했습니다." +-msgstr "트랜잭션 확인에 성공했습니다." ++msgstr "연결 확인에 성공했습니다." -#: dnf/base.py:840 -+#: dnf/base.py:904 ++#: dnf/base.py:921 msgid "Running transaction test" - msgstr "트랜잭션 테스트 실행 중" +-msgstr "트랜잭션 테스트 실행 중" ++msgstr "연결 시험 실행 중" -#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 ++#: dnf/base.py:931 dnf/base.py:1082 msgid "RPM: {}" msgstr "RPM: {}" -#: dnf/base.py:851 -+#: dnf/base.py:915 ++#: dnf/base.py:932 msgid "Transaction test error:" - msgstr "트랜잭션 테스트 오류:" +-msgstr "트랜잭션 테스트 오류:" ++msgstr "연결 시험 오류:" -#: dnf/base.py:862 -+#: dnf/base.py:926 ++#: dnf/base.py:943 msgid "Transaction test succeeded." - msgstr "트랜잭션 테스트에 성공했습니다." +-msgstr "트랜잭션 테스트에 성공했습니다." ++msgstr "연결 시험에 성공했습니다." -#: dnf/base.py:883 -+#: dnf/base.py:947 ++#: dnf/base.py:964 msgid "Running transaction" - msgstr "트랜잭션 실행 중" +-msgstr "트랜잭션 실행 중" ++msgstr "연결 실행 중" -#: dnf/base.py:911 -+#: dnf/base.py:984 ++#: dnf/base.py:1001 msgid "Disk Requirements:" msgstr "디스크 요구 사항 :" -#: dnf/base.py:914 -+#: dnf/base.py:987 ++#: dnf/base.py:1004 #, 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 ++#: dnf/base.py:1011 msgid "Error Summary" msgstr "오류 요약" -#: dnf/base.py:947 -+#: dnf/base.py:1020 ++#: dnf/base.py:1037 #, 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 ++#: dnf/base.py:1083 dnf/base.py:1091 msgid "Could not run transaction." - msgstr "트랜잭션을 실행할 수 없습니다." +-msgstr "트랜잭션을 실행할 수 없습니다." ++msgstr "연결를 실행 할 수 없습니다." -#: dnf/base.py:996 -+#: dnf/base.py:1069 ++#: dnf/base.py:1086 msgid "Transaction couldn't start:" - msgstr "트랜잭션을 시작할 수 없습니다 :" +-msgstr "트랜잭션을 시작할 수 없습니다 :" ++msgstr "연결을 시작 할 수 없습니다 :" -#: dnf/base.py:1010 -+#: dnf/base.py:1083 ++#: dnf/base.py:1100 #, python-format msgid "Failed to remove transaction file %s" - msgstr "%s 트랜잭션 파일을 삭제하지 못했습니다" +-msgstr "%s 트랜잭션 파일을 삭제하지 못했습니다" ++msgstr "%s 연결 파일을 삭제하지 못했습니다" -#: dnf/base.py:1092 -+#: dnf/base.py:1165 ++#: dnf/base.py:1182 msgid "Some packages were not downloaded. Retrying." - msgstr "일부 패키지가 다운로드되지 않았습니다. 다시 시도 중입니다." +-msgstr "일부 패키지가 다운로드되지 않았습니다. 다시 시도 중입니다." ++msgstr "일부 꾸러미를 내려받지 못했습니다. 다시 시도합니다." -#: dnf/base.py:1122 -+#: dnf/base.py:1195 ++#: dnf/base.py:1212 #, 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 %% 절약됨)" +-msgstr "Delta RPM이 %.1f MB의 업데이트를 %.1f MB로 줄였습니다. (%d.1 %% 절약됨)" ++msgstr "델타 RPM이 %.1f MB의 최신화를 %.1f MB로 줄였습니다. (%d.1%% 절약됨)" -#: dnf/base.py:1125 -+#: dnf/base.py:1198 ++#: dnf/base.py:1215 #, 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 %% 손실됨)" +-msgstr "Delta RPM은 %.1f MB의 업데이트를 %.1f MB로 줄이는데 실패했습니다. (%d.1 %% 손실됨)" ++msgstr "Delta RPM은 %.1f MB의 최신화를 %.1f MB로 줄이는데 실패했습니다. (%d.1 %% 손실됨)" -#: dnf/base.py:1167 -+#: dnf/base.py:1240 ++#: dnf/base.py:1257 msgid "Cannot add local packages, because transaction job already exists" - msgstr "트랜잭션 작업이 이미 존재하므로 로컬 패키지를 추가할 수 없습니다" +-msgstr "트랜잭션 작업이 이미 존재하므로 로컬 패키지를 추가할 수 없습니다" ++msgstr "연결 작업이 이미 존재하므로 로컬 꾸러미를 추가할 수 없습니다" -#: dnf/base.py:1181 -+#: dnf/base.py:1254 ++#: dnf/base.py:1271 msgid "Could not open: {}" msgstr "열 수 없음 : {}" -#: dnf/base.py:1219 -+#: dnf/base.py:1292 ++#: dnf/base.py:1309 #, python-format msgid "Public key for %s is not installed" - msgstr "%s의 공개 키는 설치되어 있지 않습니다." +-msgstr "%s의 공개 키는 설치되어 있지 않습니다." ++msgstr "%s의 공개 키는 설치되어 있지 않습니다" -#: dnf/base.py:1223 -+#: dnf/base.py:1296 ++#: dnf/base.py:1313 #, python-format msgid "Problem opening package %s" - msgstr "%s 패키지를 여는 중에 문제가 발생했습니다" +-msgstr "%s 패키지를 여는 중에 문제가 발생했습니다" ++msgstr "%s 꾸러미를 여는 중에 문제가 발생했습니다" -#: dnf/base.py:1231 -+#: dnf/base.py:1304 ++#: dnf/base.py:1321 #, python-format msgid "Public key for %s is not trusted" - msgstr "%s의 공개 키는 신뢰할 수 없습니다" +-msgstr "%s의 공개 키는 신뢰할 수 없습니다" ++msgstr "%s의 공개 키는 신뢰 할 수 없습니다" -#: dnf/base.py:1235 -+#: dnf/base.py:1308 ++#: dnf/base.py:1325 #, python-format msgid "Package %s is not signed" - msgstr "%s 패키지가 서명되지 않았습니다" +-msgstr "%s 패키지가 서명되지 않았습니다" ++msgstr "%s 꾸러미가 서명되지 않았습니다" -#: dnf/base.py:1265 -+#: dnf/base.py:1338 ++#: dnf/base.py:1355 #, python-format msgid "Cannot remove %s" - msgstr "%s을/를 삭제할 수 없습니다." +-msgstr "%s을/를 삭제할 수 없습니다." ++msgstr "%s를 삭제 할 수 없습니다" -#: dnf/base.py:1269 -+#: dnf/base.py:1342 ++#: dnf/base.py:1359 #, python-format msgid "%s removed" msgstr "%s가 삭제되었습니다" -#: dnf/base.py:1549 -+#: dnf/base.py:1622 ++#: dnf/base.py:1639 msgid "No match for group package \"{}\"" - msgstr "그룹 패키지 \"{}\"에 일치하는 항목이 없습니다" +-msgstr "그룹 패키지 \"{}\"에 일치하는 항목이 없습니다" ++msgstr "그룹 꾸러미 \"{}\"에 일치하는 항목이 없습니다" -#: dnf/base.py:1635 -+#: dnf/base.py:1708 ++#: dnf/base.py:1725 #, python-format msgid "Adding packages from group '%s': %s" - msgstr "'%s' 그룹에서 패키지 추가: %s" +-msgstr "'%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/__init__.py:499 dnf/cli/commands/__init__.py:592 +-#: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 ++#: dnf/base.py:1748 dnf/cli/cli.py:221 dnf/cli/commands/__init__.py:437 ++#: dnf/cli/commands/__init__.py:494 dnf/cli/commands/__init__.py:587 ++#: dnf/cli/commands/__init__.py:636 dnf/cli/commands/install.py:80 #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110 msgid "Nothing to do." - msgstr "처리가 필요하지 않습니다" +-msgstr "처리가 필요하지 않습니다" ++msgstr "처리가 필요하지 않습니다." -#: dnf/base.py:1676 -+#: dnf/base.py:1749 ++#: dnf/base.py:1766 msgid "No groups marked for removal." - msgstr "제거할 패키지 그룹이 없습니다" +-msgstr "제거할 패키지 그룹이 없습니다" ++msgstr "제거할 꾸러미 그룹이 없습니다." -#: dnf/base.py:1710 -+#: dnf/base.py:1783 ++#: dnf/base.py:1800 msgid "No group marked for upgrade." - msgstr "업그레이드용으로 표시된 그룹이 없습니다." +-msgstr "업그레이드용으로 표시된 그룹이 없습니다." ++msgstr "향상을 위해 표시된 그룹이 없습니다." -#: dnf/base.py:1925 -+#: dnf/base.py:1997 ++#: dnf/base.py:2014 #, python-format msgid "Package %s not installed, cannot downgrade it." - msgstr "%s 패키지가 설치되어 있지 않기 때문에 다운 그레이드할 수 없습니다." +-msgstr "%s 패키지가 설치되어 있지 않기 때문에 다운 그레이드할 수 없습니다." ++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 패키지가 설치되어 있지 않기 때문에 다운 그레이드 +-#: 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 ++#: dnf/base.py:2016 dnf/base.py:2035 dnf/base.py:2048 dnf/base.py:2075 ++#: dnf/base.py:2128 dnf/base.py:2136 dnf/base.py:2270 dnf/cli/cli.py:417 ++#: dnf/cli/commands/__init__.py:420 dnf/cli/commands/__init__.py:477 ++#: dnf/cli/commands/__init__.py:581 dnf/cli/commands/__init__.py:628 ++#: dnf/cli/commands/__init__.py:706 dnf/cli/commands/install.py:147 + #: dnf/cli/commands/reinstall.py:70 dnf/cli/commands/reinstall.py:84 +-#: dnf/cli/commands/upgrade.py:110 dnf/cli/commands/upgrade.py:121 ++#: dnf/cli/commands/upgrade.py:105 dnf/cli/commands/upgrade.py:116 + #, python-format msgid "No match for argument: %s" - msgstr "일치하는 인수가 없습니다 : %s" +-msgstr "일치하는 인수가 없습니다 : %s" ++msgstr "인수가 일치하지 않습니다: %s" -#: dnf/base.py:1934 -+#: dnf/base.py:2006 ++#: dnf/base.py:2023 #, python-format msgid "Package %s of lower version already installed, cannot downgrade it." - msgstr "%s 패키지의 하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다." +-msgstr "%s 패키지의 하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다." ++msgstr "%s 꾸러미의 하위 버전이 이미 설치되어 있으므로 다운그레이드 할 수 없습니다." -#: dnf/base.py:1957 -+#: dnf/base.py:2029 ++#: dnf/base.py:2046 #, python-format msgid "Package %s not installed, cannot reinstall it." - msgstr "%s 패키지가 설치되어 있지 않기 때문에 다시 설치할 수 없습니다." +-msgstr "%s 패키지가 설치되어 있지 않기 때문에 다시 설치할 수 없습니다." ++msgstr "꾸러미 %s가 설치되지 않아서, 다시 설치 할 수 없습니다." -#: dnf/base.py:1972 -+#: dnf/base.py:2044 ++#: dnf/base.py:2061 #, python-format msgid "File %s is a source package and cannot be updated, ignoring." - msgstr "%s 파일은 소스 패키지이며 업데이트할 수 없습니다. 무시합니다." +-msgstr "%s 파일은 소스 패키지이며 업데이트할 수 없습니다. 무시합니다." ++msgstr "%s 파일은 소스 꾸러미이며 최신화 할 수 없습니다. 무시합니다." -#: dnf/base.py:1978 -+#: dnf/base.py:2050 ++#: dnf/base.py:2072 #, python-format msgid "Package %s not installed, cannot update it." - msgstr "%s 패키지가 설치되어 있지 않기 때문에 업데이트할 수 없습니다." +-msgstr "%s 패키지가 설치되어 있지 않기 때문에 업데이트할 수 없습니다." ++msgstr "%s 꾸러미가 설치되어 있지 않기 때문에 최신화 할 수 없습니다." -#: dnf/base.py:1987 -+#: dnf/base.py:2059 ++#: dnf/base.py:2082 #, python-format msgid "" "The same or higher version of %s is already installed, cannot update it." - msgstr "%s 이상의 버전이 이미 설치되어 있으므로 업데이트할 수 없습니다." +-msgstr "%s 이상의 버전이 이미 설치되어 있으므로 업데이트할 수 없습니다." ++msgstr "%s 이상의 버전이 이미 설치되어 있으므로 최신화 할 수 없습니다." -#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81 -+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81 ++#: dnf/base.py:2125 dnf/cli/commands/reinstall.py:81 #, python-format msgid "Package %s available, but not installed." - msgstr "%s 패키지는 사용할 수는 있지만 설치되어 있지 않습니다." +-msgstr "%s 패키지는 사용할 수는 있지만 설치되어 있지 않습니다." ++msgstr "%s 꾸러미는 사용할 수는 있지만 설치되어 있지 않습니다." -#: dnf/base.py:2032 -+#: dnf/base.py:2104 ++#: dnf/base.py:2131 #, python-format msgid "Package %s available, but installed for different architecture." - msgstr "%s 패키지는 사용 가능하지만 다른 아키텍처 용으로 설치되어 있습니다." +-msgstr "%s 패키지는 사용 가능하지만 다른 아키텍처 용으로 설치되어 있습니다." ++msgstr "%s 꾸러미는 사용 가능하지만 다른 구조용으로 설치되어 있습니다." -#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699 -+#: dnf/base.py:2129 ++#: dnf/base.py:2156 #, python-format msgid "No package %s installed." - msgstr "%s 패키지는 설치되어 있지 않습니다" +-msgstr "%s 패키지는 설치되어 있지 않습니다" ++msgstr "%s 꾸러미는 설치되어 있지 않습니다." -#: dnf/base.py:2075 dnf/cli/commands/install.py:136 -+#: dnf/base.py:2147 dnf/cli/commands/install.py:136 ++#: dnf/base.py:2174 dnf/cli/commands/install.py:136 #: dnf/cli/commands/remove.py:133 #, python-format msgid "Not a valid form: %s" @@ -8077,27 +6704,30 @@ index 449f6130..9f37ae13 100644 -#: 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/base.py:2189 dnf/cli/commands/__init__.py:676 +#: dnf/cli/commands/remove.py:162 msgid "No packages marked for removal." - msgstr "제거 대상 패키지가 없습니다." +-msgstr "제거 대상 패키지가 없습니다." ++msgstr "제거 대상 꾸러미가 없습니다." -#: dnf/base.py:2179 dnf/cli/cli.py:422 -+#: dnf/base.py:2250 dnf/cli/cli.py:427 ++#: dnf/base.py:2277 dnf/cli/cli.py:428 #, python-format msgid "Packages for argument %s available, but not installed." - msgstr "%s 인수에 대한 패키지를 사용할 수 있지만 설치되어 있지 않습니다." +-msgstr "%s 인수에 대한 패키지를 사용할 수 있지만 설치되어 있지 않습니다." ++msgstr "%s 인수에 대한 꾸러미를 사용할 수 있지만 설치되어 있지 않습니다." -#: dnf/base.py:2184 -+#: dnf/base.py:2255 ++#: dnf/base.py:2282 #, python-format msgid "Package %s of lowest version already installed, cannot downgrade it." - msgstr "%s 패키지의 최하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다." - +-msgstr "%s 패키지의 최하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다." +- -#: dnf/base.py:2242 -msgid "Action not handled: {}" -msgstr "작업이 처리되지 않았습니다: {}" -- ++msgstr "%s 꾸러미의 최하위 버전이 이미 설치되어 있으므로 다운그레이드 할 수 없습니다." + -#: 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 @@ -8109,154 +6739,192 @@ index 449f6130..9f37ae13 100644 -msgstr "일치하는 패키지가 없습니다." - -#: dnf/base.py:2290 -+#: dnf/base.py:2302 ++#: dnf/base.py:2382 msgid "No security updates needed, but {} update available" - msgstr "보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" +-msgstr "보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" ++msgstr "보안 최신화가 필요하지 않지만, {} 최신화가 가능합니다" -#: dnf/base.py:2292 -+#: dnf/base.py:2304 ++#: dnf/base.py:2384 msgid "No security updates needed, but {} updates available" - msgstr "보안 업데이트는 필요하지 않지만 {} 업데이트가 가능합니다" +-msgstr "보안 업데이트는 필요하지 않지만 {} 업데이트가 가능합니다" ++msgstr "보안 최신화는 필요하지 않지만 {} 최신화는 가능합니다" -#: dnf/base.py:2296 -+#: dnf/base.py:2308 ++#: dnf/base.py:2388 msgid "No security updates needed for \"{}\", but {} update available" - msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" +-msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" ++msgstr "\"{}\"에는 보안 최신화가 필요하지 않지만 {} 최신화가 가능합니다" -#: dnf/base.py:2298 -+#: dnf/base.py:2310 ++#: dnf/base.py:2390 msgid "No security updates needed for \"{}\", but {} updates available" - msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" +-msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" ++msgstr "\"{}\"에는 보안 최신화가 필요하지 않지만 {} 최신화가 가능합니다" #. raise an exception, because po.repoid is not in self.repos -#: dnf/base.py:2319 -+#: dnf/base.py:2331 ++#: dnf/base.py:2411 #, python-format msgid "Unable to retrieve a key for a commandline package: %s" - msgstr "" +-msgstr "" ++msgstr "명령줄 꾸러미: %s 대한 키를 검색 할 수 없습니다" -#: dnf/base.py:2327 -+#: dnf/base.py:2339 ++#: dnf/base.py:2419 #, python-format msgid ". Failing package is: %s" - msgstr "실패한 패키지는 다음과 같습니다. %s" +-msgstr "실패한 패키지는 다음과 같습니다. %s" ++msgstr "실패한 꾸러미는 다음과 같습니다. %s" -#: dnf/base.py:2328 -+#: dnf/base.py:2340 ++#: dnf/base.py:2420 #, python-format msgid "GPG Keys are configured as: %s" msgstr "GPG 키는 다음과 같이 설정되어 있습니다. %s" -#: dnf/base.py:2340 -+#: dnf/base.py:2352 ++#: dnf/base.py:2432 #, 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 ++#: dnf/base.py:2468 msgid "The key has been approved." msgstr "키가 승인되었습니다." -#: dnf/base.py:2376 -+#: dnf/base.py:2388 ++#: dnf/base.py:2471 msgid "The key has been rejected." msgstr "키가 거부되었습니다." -#: dnf/base.py:2409 -+#: dnf/base.py:2421 ++#: dnf/base.py:2504 #, python-format msgid "Key import failed (code %d)" msgstr "키 가져 오기에 실패했습니다 (코드 %d)" -#: dnf/base.py:2411 -+#: dnf/base.py:2423 ++#: dnf/base.py:2506 msgid "Key imported successfully" msgstr "키 가져오기에 성공했습니다" -#: dnf/base.py:2415 -+#: dnf/base.py:2427 ++#: dnf/base.py:2510 msgid "Didn't install any keys" msgstr "키를 하나도 설치하지 못했습니다" -#: dnf/base.py:2418 -+#: dnf/base.py:2430 ++#: dnf/base.py:2513 #, 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" + "Check that the correct key URLs are configured for this repository." + msgstr "" +-"해당 GPG 키는 \"%s\"저장소가 이미 설치되어 있지만이 패키지에 맞지 않습니다.\n" ++"해당 GPG 키는 \"%s\"저장소가 이미 설치되어 있지만이 꾸러미에 맞지 않습니다.\n" "이 저장소에 대해 올바른 키 URL이 구성되었는지 확인하십시오." -#: dnf/base.py:2429 -+#: dnf/base.py:2441 ++#: dnf/base.py:2524 msgid "Import of key(s) didn't help, wrong key(s)?" msgstr "가져온 키에 문제가 있습니다. 잘못된 키입니까?" -#: dnf/base.py:2482 -+#: dnf/base.py:2494 ++#: dnf/base.py:2577 msgid " * Maybe you meant: {}" - msgstr " * 다음을 의미할 수도 있습니다: {}" +-msgstr " * 다음을 의미할 수도 있습니다: {}" ++msgstr " * 다음을 의미 할 수도 있습니다: {}" -#: dnf/base.py:2514 -+#: dnf/base.py:2526 ++#: dnf/base.py:2609 msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" - msgstr "로컬 저장소 \"{}\"의 \"{}\"패키지에 잘못된 체크섬이 있습니다" +-msgstr "로컬 저장소 \"{}\"의 \"{}\"패키지에 잘못된 체크섬이 있습니다" ++msgstr "로컬 저장소 \"{}\"의 \"{}\"꾸러미에 잘못된 체크섬이 있습니다" -#: dnf/base.py:2517 -+#: dnf/base.py:2529 ++#: dnf/base.py:2612 msgid "Some packages from local repository have incorrect checksum" - msgstr "로컬 저장소의 일부 패키지에 잘못된 체크섬이 있습니다" +-msgstr "로컬 저장소의 일부 패키지에 잘못된 체크섬이 있습니다" ++msgstr "로컬 저장소의 일부 꾸러미에 잘못된 체크섬이 있습니다" -#: dnf/base.py:2520 -+#: dnf/base.py:2532 ++#: dnf/base.py:2615 msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" - msgstr "저장소 \"{}\"의 패키지 \"{}\"에 잘못된 체크섬이 있습니다" +-msgstr "저장소 \"{}\"의 패키지 \"{}\"에 잘못된 체크섬이 있습니다" ++msgstr "저장소 \"{}\"의 꾸러미 \"{}\"에 잘못된 체크섬이 있습니다" -#: dnf/base.py:2523 -+#: dnf/base.py:2535 ++#: dnf/base.py:2618 msgid "" "Some packages have invalid cache, but cannot be downloaded due to \"--" "cacheonly\" option" - msgstr "일부 패키지에는 유효하지 않은 캐시가 있지만 \"--cacheonly\"옵션으로 인해 다운로드할 수 없습니다" +-msgstr "일부 패키지에는 유효하지 않은 캐시가 있지만 \"--cacheonly\"옵션으로 인해 다운로드할 수 없습니다" ++msgstr "일부 꾸러미에는 유효하지 않은 캐쉬가 있지만 \"--cacheonly\"옵션으로 인해 내려받기 할 수 없습니다" -#: dnf/base.py:2541 dnf/base.py:2561 -+#: dnf/base.py:2553 dnf/base.py:2573 ++#: dnf/base.py:2636 dnf/base.py:2656 msgid "No match for argument" msgstr "일치하는 인수가 없습니다" -#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 ++#: dnf/base.py:2644 dnf/base.py:2664 msgid "All matches were filtered out by exclude filtering for argument" msgstr "모든 일치 항목이 인수의 제외 필터로 필터링되었습니다" -#: dnf/base.py:2551 -+#: dnf/base.py:2563 ++#: dnf/base.py:2646 msgid "All matches were filtered out by modular filtering for argument" msgstr "모든 일치 항목이 인수의 모듈식 필터로 필터링되었습니다" -#: dnf/base.py:2567 -+#: dnf/base.py:2579 ++#: dnf/base.py:2662 msgid "All matches were installed from a different repository for argument" msgstr "모든 일치 항목이 인수의 다른 리포지토리에서 설치되었습니다" -#: dnf/base.py:2583 -+#: dnf/base.py:2626 ++#: dnf/base.py:2709 #, python-format msgid "Package %s is already installed." - msgstr "패키지 %s이/가 이미 설치되어 있습니다." -@@ -551,8 +539,8 @@ msgstr "\"%s\" 파일의 구문 분석에 실패했습니다 : %s" +-msgstr "패키지 %s이/가 이미 설치되어 있습니다." ++msgstr "꾸러미 %s가 이미 설치되어 있습니다." + + #: dnf/cli/aliases.py:96 + #, python-format +@@ -551,8 +537,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 ++#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:804 ++#: dnf/cli/cli.py:808 dnf/cli/commands/alias.py:108 #, python-format msgid "Config error: %s" msgstr "설정 오류: %s" -@@ -583,7 +571,7 @@ msgid "" +@@ -564,17 +550,17 @@ msgstr "별칭에는 무한 재귀가 포함되어 있습니다" + #: dnf/cli/aliases.py:209 + #, python-format + msgid "%s, using original arguments." +-msgstr "%s, 원래 인수를 사용하고 있습니다" ++msgstr "%s, 원래 인수를 사용." + + #: dnf/cli/cli.py:137 + #, python-format + msgid " Installed: %s-%s at %s" +-msgstr " 설치됨: %s-%s (일시: %s)" ++msgstr " 설치되었습니다: %s-%s (일시: %s)" + + #: dnf/cli/cli.py:139 + #, python-format + msgid " Built : %s at %s" +-msgstr " 빌드됨 :%s (일시: %s)" ++msgstr " 구성 :%s (일시: %s)" + + #: dnf/cli/cli.py:147 + #, python-brace-format +@@ -583,44 +569,44 @@ msgid "" "stream '{2}'" msgstr "이 작업은 '{0}' 모듈을 '{1}' 스트림에서 ‘{2}' 스트림으로 전환합니다" @@ -8264,117 +6932,137 @@ index 449f6130..9f37ae13 100644 +#: 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" +-"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." ++"It is not possible to switch enabled streams of a module unless explicitly enabled via configuration option module_stream_switch.\n" ++"It is recommended to rather 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" ++"구성 선택(옵션) module_stream_switch를 통해 명시적으로 활성화하지 않는 한 활성화된 모듈 스트림을 전환 할 수 없습니다.\n" "설치된 모든 내용을 모듈에서 제거하고 ‘{prog} module reset ' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후 다른 스트림을 설치할 수 있습니다." -#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 ++#: dnf/cli/cli.py:212 #, python-brace-format msgid "{prog} will only download packages for the transaction." - msgstr "{prog}은/는 트랜잭션용 패키지 만 다운로드합니다." +-msgstr "{prog}은/는 트랜잭션용 패키지 만 다운로드합니다." ++msgstr "{prog}은/는 연결용 꾸러미만 내려받기합니다." -#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 ++#: dnf/cli/cli.py:215 #, python-brace-format msgid "" "{prog} will only download packages, install gpg keys, and check the " "transaction." - msgstr "{prog}은/는 패키지 만 다운로드하고 gpg 키를 설치하며 트랜잭션을 확인합니다." +-msgstr "{prog}은/는 패키지 만 다운로드하고 gpg 키를 설치하며 트랜잭션을 확인합니다." ++msgstr "{prog}은/는 꾸러미만 내려받기하고 gpg 키를 설치하며 연결을 확인합니다." -#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 ++#: dnf/cli/cli.py:219 msgid "Operation aborted." - msgstr "작업이 중지됨." +-msgstr "작업이 중지됨." ++msgstr "작업이 중지됩니다." -#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 ++#: dnf/cli/cli.py:226 msgid "Downloading Packages:" - msgstr "패키지 다운로드중:" +-msgstr "패키지 다운로드중:" ++msgstr "꾸러미 내려받기중:" -#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 ++#: dnf/cli/cli.py:232 msgid "Error downloading packages:" - msgstr "패키지 다운로드중 오류 발생:" +-msgstr "패키지 다운로드중 오류 발생:" ++msgstr "꾸러미 내려받기 중 오류 발생:" -#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 ++#: dnf/cli/cli.py:264 msgid "Transaction failed" - msgstr "트랜잭션 실패" +-msgstr "트랜잭션 실패" ++msgstr "연결 실패" -#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 ++#: dnf/cli/cli.py:287 msgid "" "Refusing to automatically import keys when running unattended.\n" "Use \"-y\" to override." -@@ -628,117 +616,96 @@ msgstr "" +@@ -628,117 +614,96 @@ msgstr "" "키를 자동으로 가져 오는 것을 거부합니다.\n" "동작을 무시하려면 \"-y\"를 사용하십시오." -#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 ++#: dnf/cli/cli.py:337 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 ++#: dnf/cli/cli.py:370 dnf/cli/cli.py:511 dnf/cli/cli.py:517 msgid "Obsoleting Packages" - msgstr "더 이상 사용되지 않는 패키지" +-msgstr "더 이상 사용되지 않는 패키지" ++msgstr "더 이상 사용되지 않는 꾸러미" -#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 ++#: dnf/cli/cli.py:399 msgid "No packages marked for distribution synchronization." - msgstr "배포 동기화가 필요한 패키지가 없습니다." - --#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 +-msgstr "배포 동기화가 필요한 패키지가 없습니다." ++msgstr "배포 동기화가 필요한 꾸러미가 없습니다." ++ ++#: dnf/cli/cli.py:425 dnf/cli/commands/group.py:395 +#, python-format +msgid "No package %s available." -+msgstr "사용 가능한 패키지 %s가 없습니다." -+ -+#: dnf/cli/cli.py:433 ++msgstr "가용한 꾸러미(package) %s가 없습니다." + +-#: dnf/cli/cli.py:428 ++#: dnf/cli/cli.py:434 msgid "No packages marked for downgrade." - msgstr "다운 그레이드 대상으로 표시된 패키지가 없습니다." +-msgstr "다운 그레이드 대상으로 표시된 패키지가 없습니다." ++msgstr "하향설치 대상으로 표시된 꾸러미가 없습니다." -#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 ++#: dnf/cli/cli.py:485 msgid "Installed Packages" - msgstr "설치된 패키지" +-msgstr "설치된 패키지" ++msgstr "설치된 꾸러미" -#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 ++#: dnf/cli/cli.py:493 msgid "Available Packages" - msgstr "사용 가능한 패키지" +-msgstr "사용 가능한 패키지" ++msgstr "사용 가능한 꾸러미" -#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 ++#: dnf/cli/cli.py:497 msgid "Autoremove Packages" - msgstr "패키지 자동 삭제" +-msgstr "패키지 자동 삭제" ++msgstr "꾸러미 자동 삭제" # ctx::sourcefile::Systems Navigation Menu -#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 ++#: dnf/cli/cli.py:499 msgid "Extra Packages" - msgstr "추가 패키지" +-msgstr "추가 패키지" ++msgstr "추가 꾸러미" -#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 ++#: dnf/cli/cli.py:503 msgid "Available Upgrades" - msgstr "사용 가능한 업그레이드" +-msgstr "사용 가능한 업그레이드" ++msgstr "사용 가능한 최신화" -#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 ++#: dnf/cli/cli.py:519 msgid "Recently Added Packages" - msgstr "최근에 추가 된 패키지" +-msgstr "최근에 추가 된 패키지" ++msgstr "최근에 추가 된 꾸러미" -#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 ++#: dnf/cli/cli.py:523 msgid "No matching Packages to list" - msgstr "목록과 일치하는 패키지가 없습니다" +-msgstr "목록과 일치하는 패키지가 없습니다" ++msgstr "목록과 일치하는 꾸러미가 없습니다" -#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 ++#: dnf/cli/cli.py:604 msgid "No Matches found" msgstr "검색 결과가 없습니다" @@ -8405,32 +7093,33 @@ index 449f6130..9f37ae13 100644 -msgstr "{}에서 {} 트랜잭션 실행을 취소하고 있습니다" - -#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 ++#: dnf/cli/cli.py:671 dnf/cli/commands/shell.py:237 #, python-format msgid "Unknown repo: '%s'" msgstr "알 수 없는 저장소: '%s'" -#: dnf/cli/cli.py:783 -+#: dnf/cli/cli.py:684 ++#: dnf/cli/cli.py:685 #, python-format msgid "No repository match: %s" msgstr "일치하는 저장소가 없습니다 : %s" -#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 ++#: dnf/cli/cli.py:719 msgid "" "This command has to be run with superuser privileges (under the root user on" " most systems)." - msgstr "이 명령은 수퍼 유저 권한으로 실행해야합니다 (대부분의 시스템에서 root 사용자로 실행)." +-msgstr "이 명령은 수퍼 유저 권한으로 실행해야합니다 (대부분의 시스템에서 root 사용자로 실행)." ++msgstr "이 명령은 슈퍼유저 권한으로 실행해야합니다 (대부분의 시스템에서 root 사용자로 실행)." -#: dnf/cli/cli.py:847 -+#: dnf/cli/cli.py:748 ++#: dnf/cli/cli.py:749 #, 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 ++#: dnf/cli/cli.py:752 #, python-format, python-brace-format msgid "" "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" @@ -8438,7 +7127,7 @@ index 449f6130..9f37ae13 100644 msgstr "{PROG} 플러그인 명령일 수 있습니다: \"{prog} 'dnf-command(%s)'\"" -#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 ++#: dnf/cli/cli.py:756 #, python-brace-format msgid "" "It could be a {prog} plugin command, but loading of plugins is currently " @@ -8446,85 +7135,367 @@ index 449f6130..9f37ae13 100644 msgstr "{prog} 플러그인 명령일 수 있지만 플러그인 로딩은 현재 비활성화되어 있습니다." -#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 ++#: dnf/cli/cli.py:814 msgid "" "--destdir or --downloaddir must be used with --downloadonly or download or " "system-upgrade command." -@@ -746,7 +713,7 @@ msgstr "" +@@ -746,7 +711,7 @@ msgstr "" "--destdir 또는 --downloaddir은 --downloadonly 또는 download 또는 system-upgrade 명령과" " 함께 사용해야합니다." -#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 ++#: dnf/cli/cli.py:820 msgid "" "--enable, --set-enabled and --disable, --set-disabled must be used with " "config-manager command." -@@ -754,7 +721,7 @@ msgstr "" +@@ -754,7 +719,7 @@ msgstr "" "--enable, --set-enabled 및 --disable, --set-disabled는 config-manager 명령과 함께 " "사용해야합니다." -#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 ++#: dnf/cli/cli.py:902 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 "" +@@ -762,38 +727,38 @@ msgstr "" "경고: 활성화된 RPM 보안 정책에 따라 GPG 서명 검사를 전체적으로 시행합니다 (이 메시지를 제거하는 방법은 dnf.conf (5)의" " 'gpgcheck' 참조)" -#: dnf/cli/cli.py:1020 -+#: dnf/cli/cli.py:921 ++#: dnf/cli/cli.py:922 msgid "Config file \"{}\" does not exist" - msgstr "\"{}\" 설정 파일이 존재하지 않습니다" +-msgstr "\"{}\" 설정 파일이 존재하지 않습니다" ++msgstr "설정 파일 \"{}\" 이 존재하지 않습니다" -#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 ++#: dnf/cli/cli.py:942 msgid "" "Unable to detect release version (use '--releasever' to specify release " "version)" - msgstr "릴리스 버전을 찾을 수 없습니다 ('--releasever'를 사용하여 릴리스 버전을 지정하십시오)" +-msgstr "릴리스 버전을 찾을 수 없습니다 ('--releasever'를 사용하여 릴리스 버전을 지정하십시오)" ++msgstr "출시 버전을 찾을 수 없습니다 ('--releasever'를 사용하여 출시 버전을 지정하십시오)" -#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471 -+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471 ++#: dnf/cli/cli.py:1016 dnf/cli/commands/repoquery.py:471 msgid "argument {}: not allowed with argument {}" msgstr "인수 {}: 인수 {}과 함께 사용할 수 없습니다" -#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 ++#: dnf/cli/cli.py:1023 #, python-format msgid "Command \"%s\" already defined" msgstr "\"%s\" 명령이 이미 정의되어 있습니다" -#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 ++#: dnf/cli/cli.py:1043 msgid "Excludes in dnf.conf: " msgstr "dnf.conf에서 제외: " -#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 ++#: dnf/cli/cli.py:1046 msgid "Includes in dnf.conf: " msgstr "dnf.conf에 포함:. " -#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 ++#: dnf/cli/cli.py:1049 msgid "Excludes in repo " msgstr "리포지토리에서 제외 " -#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 ++#: dnf/cli/cli.py:1052 msgid "Includes in repo " msgstr "리포지토리에 포함 " -@@ -849,7 +816,7 @@ msgid "show all packages (default)" - msgstr "모든 패키지 표시 (기본값)" +@@ -823,17 +788,18 @@ msgid "" + "\n" + "For more information contact your distribution or package provider." + msgstr "" +-"GPG 키를 통해 패키지 검사를 활성화했습니다. 이는 적절한 작업 실행입니다. \n" +-"그러나 GPG 공개 키가 설치되어 있지 않습니다. 설치하려는 패키지의 키를 다운로드하여 설치해야합니다.\n" ++"GPG 키를 통해 꾸러미 검사를 활성화했습니다. 이는 적절한 작업 실행입니다.\n" ++"그러나 GPG 공개 키가 설치되어 있지 않습니다.\n" ++"설치하려는 꾸러미의 키를 내려받기하여 설치해야 합니다.\n" + "다음 명령으로 이 작업을 수행할 수 있습니다:\n" +-" rpm --import public.gpg.key\n" ++"rpm --import public.gpg.key\n" + "\n" + "\n" +-"또는 리포지토리 섹션의 'gpgkey' 옵션을 사용하여 \n" +-"리포지토리에 사용할 키의 URL을 지정할 수 있으며 {prog}이/가 \n" +-"이를 설치합니다 \n" ++"또는 저장소 섹션의 'gpgkey' 옵션을 사용하여\n" ++"저장소에 사용할 키의 URL을 지정할 수 있으며 {prog}가\n" ++"이를 설치합니다\n" + "\n" +-"자세한 내용은 배포 또는 패키지 공급 업체에 문의하십시오." ++"자세한 내용은 배포 또는 꾸러미 공급 업체에 문의하십시오." - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 + #: dnf/cli/commands/__init__.py:71 + #, python-format +@@ -842,56 +808,56 @@ msgstr "문제 저장소 : %s" + + #: dnf/cli/commands/__init__.py:158 + msgid "display details about a package or group of packages" +-msgstr "패키지 또는 패키지 그룹에 대한 세부 정보 표시" ++msgstr "꾸러미 또는 꾸러미 그룹에 대한 세부 정보 표시" + +-#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:740 ++#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:735 + msgid "show all packages (default)" +-msgstr "모든 패키지 표시 (기본값)" ++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 ++#: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:738 ++#: dnf/cli/commands/module.py:376 msgid "show only available packages" - msgstr "사용 가능한 패키지 만 표시" +-msgstr "사용 가능한 패키지 만 표시" ++msgstr "사용 가능한 꾸러미만 표시" -@@ -1174,78 +1141,78 @@ msgstr "그룹 정보를 표시하거나 사용합니다" +-#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:746 ++#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:741 + msgid "show only installed packages" +-msgstr "설치된 패키지 만 표시" ++msgstr "설치된 꾸러미만 보여주기" + +-#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:749 ++#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:744 + msgid "show only extras packages" +-msgstr "엑스트라 패키지 만 표시" ++msgstr "엑스트라 꾸러미만 표시" + + #: dnf/cli/commands/__init__.py:180 dnf/cli/commands/__init__.py:183 +-#: dnf/cli/commands/__init__.py:752 dnf/cli/commands/__init__.py:755 ++#: dnf/cli/commands/__init__.py:747 dnf/cli/commands/__init__.py:750 + msgid "show only upgrades packages" +-msgstr "업그레이드 패키지 만 표시" ++msgstr "향상 꾸러미만 표시" + +-#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:758 ++#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:753 + msgid "show only autoremove packages" +-msgstr "자동 삭제 패키지 만 표시" ++msgstr "자동 삭제 꾸러미만 표시" + +-#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:761 ++#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:756 + msgid "show only recently changed packages" +-msgstr "최근에 변경된 패키지 만 표시" ++msgstr "최근에 변경된 꾸러미만 표시" + + #: dnf/cli/commands/__init__.py:190 dnf/cli/commands/__init__.py:265 +-#: dnf/cli/commands/__init__.py:774 dnf/cli/commands/autoremove.py:48 ++#: dnf/cli/commands/__init__.py:769 dnf/cli/commands/autoremove.py:48 + #: 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 "꾸러미(package)" + + #: dnf/cli/commands/__init__.py:193 + msgid "Package name specification" +-msgstr "패키지 이름 사양" ++msgstr "꾸러미 이름 사양" + + #: dnf/cli/commands/__init__.py:221 + msgid "list a package or groups of packages" +-msgstr "패키지 또는 패키지 그룹 나열" ++msgstr "꾸러미 또는 꾸러미 그룹 나열" + + #: dnf/cli/commands/__init__.py:235 + msgid "find what package provides the given value" +-msgstr "지정된 컨텐츠를 제공하는 패키지 찾기" ++msgstr "지정된 내용을 제공하는 꾸러미 찾기" + + #: dnf/cli/commands/__init__.py:239 + msgid "PROVIDE" +@@ -903,80 +869,80 @@ msgstr "검색할 사양 제공" + + #: dnf/cli/commands/__init__.py:249 dnf/cli/commands/search.py:159 + msgid "Searching Packages: " +-msgstr "패키지 검색 : " ++msgstr "꾸러미 검색 : " + + #: dnf/cli/commands/__init__.py:258 + msgid "check for available package upgrades" +-msgstr "사용 가능한 패키지 업그레이드 확인" ++msgstr "사용 가능한 꾸러미 향상 확인" + + #: dnf/cli/commands/__init__.py:264 + msgid "show changelogs before update" +-msgstr "업데이트 전에 changelog 표시" ++msgstr "최신화 전에 변경기록 표시" + +-#: dnf/cli/commands/__init__.py:361 dnf/cli/commands/__init__.py:414 +-#: dnf/cli/commands/__init__.py:470 ++#: dnf/cli/commands/__init__.py:356 dnf/cli/commands/__init__.py:409 ++#: dnf/cli/commands/__init__.py:465 + msgid "No package available." +-msgstr "사용할 수 있는 패키지가 없습니다." ++msgstr "사용할 수 있는 꾸러미가 없습니다." + +-#: dnf/cli/commands/__init__.py:376 ++#: dnf/cli/commands/__init__.py:371 + msgid "No packages marked for install." +-msgstr "설치용으로 표시된 패키지가 없습니다." ++msgstr "설치용으로 표시된 꾸러미 없습니다." + +-#: dnf/cli/commands/__init__.py:412 ++#: dnf/cli/commands/__init__.py:407 + msgid "No package installed." +-msgstr "설치된 패키지가 없습니다." ++msgstr "설치된 꾸러미가 없습니다." + +-#: dnf/cli/commands/__init__.py:432 dnf/cli/commands/__init__.py:489 ++#: dnf/cli/commands/__init__.py:427 dnf/cli/commands/__init__.py:484 + #: dnf/cli/commands/reinstall.py:91 + #, python-format + msgid " (from %s)" + msgstr " (%s에서)" + +-#: dnf/cli/commands/__init__.py:433 dnf/cli/commands/__init__.py:490 ++#: dnf/cli/commands/__init__.py:428 dnf/cli/commands/__init__.py:485 + #: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:105 + #, python-format + msgid "Installed package %s%s not available." +-msgstr "설치된 패키지 %s%s 사용 불가." ++msgstr "설치된 꾸러미 %s%s 사용 불가." + +-#: dnf/cli/commands/__init__.py:467 dnf/cli/commands/__init__.py:576 +-#: dnf/cli/commands/__init__.py:619 dnf/cli/commands/__init__.py:666 ++#: dnf/cli/commands/__init__.py:462 dnf/cli/commands/__init__.py:571 ++#: dnf/cli/commands/__init__.py:614 dnf/cli/commands/__init__.py:661 + msgid "No package installed from the repository." +-msgstr "저장소에서 설치된 패키지가 없습니다." ++msgstr "저장소에서 설치된 꾸러미가 없습니다." + +-#: dnf/cli/commands/__init__.py:530 dnf/cli/commands/reinstall.py:101 ++#: dnf/cli/commands/__init__.py:525 dnf/cli/commands/reinstall.py:101 + msgid "No packages marked for reinstall." +-msgstr "다시 설치하도록 표시된 패키지가 없습니다." ++msgstr "다시 설치하도록 표시된 꾸러미가 없습니다." + +-#: dnf/cli/commands/__init__.py:716 dnf/cli/commands/upgrade.py:89 ++#: dnf/cli/commands/__init__.py:711 dnf/cli/commands/upgrade.py:84 + msgid "No packages marked for upgrade." +-msgstr "업그레이드할 패키지 없음." ++msgstr "최신화 할 꾸러미 없음." + +-#: dnf/cli/commands/__init__.py:726 ++#: dnf/cli/commands/__init__.py:721 + msgid "run commands on top of all packages in given repository" +-msgstr "지정된 저장소의 모든 패키지에 대해 명령을 실행합니다" ++msgstr "지정된 저장소의 모든 꾸러미에 대해 명령을 실행합니다" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "REPOID" + msgstr "REPOID" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "Repository ID" +-msgstr "리포지터리 ID" ++msgstr "저장소 ID" + +-#: dnf/cli/commands/__init__.py:777 dnf/cli/commands/mark.py:48 ++#: dnf/cli/commands/__init__.py:772 dnf/cli/commands/mark.py:48 + #: dnf/cli/commands/updateinfo.py:108 + msgid "Package specification" +-msgstr "패키지 사양" ++msgstr "꾸러미 사양" + +-#: dnf/cli/commands/__init__.py:801 ++#: dnf/cli/commands/__init__.py:796 + msgid "display a helpful usage message" + msgstr "유용한 사용법 메시지 표시" + +-#: dnf/cli/commands/__init__.py:805 ++#: dnf/cli/commands/__init__.py:800 + msgid "COMMAND" + msgstr "명령" + +-#: dnf/cli/commands/__init__.py:806 ++#: dnf/cli/commands/__init__.py:801 + #, python-brace-format + msgid "{prog} command to get help for" + msgstr "{prog} 명령 도움말 표시" +@@ -1068,11 +1034,11 @@ msgstr "일치하는 별칭이 없습니다 : %s" + #: dnf/cli/commands/autoremove.py:41 + msgid "" + "remove all unneeded packages that were originally installed as dependencies" +-msgstr "종속성으로 설치된 불필요한 패키지를 모두 제거합니다" ++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" +@@ -1092,7 +1058,7 @@ msgstr "중복된 문제를 표시" + + #: dnf/cli/commands/check.py:49 + msgid "show obsoleted packages" +-msgstr "더 이상 사용되지 않는 패키지 표시" ++msgstr "더 이상 사용되지 않는꾸러미 표시" + + #: dnf/cli/commands/check.py:52 + msgid "show problems with provides" +@@ -1121,7 +1087,7 @@ 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" +@@ -1133,7 +1099,7 @@ msgstr "데이터 정리 중: " + + #: dnf/cli/commands/clean.py:111 + msgid "Cache was expired" +-msgstr "캐시가 만료되었습니다" ++msgstr "캐쉬가 만료되었습니다" + + #: dnf/cli/commands/clean.py:115 + #, python-format +@@ -1147,24 +1113,26 @@ msgid "Waiting for process with pid %d to finish." + msgstr "PID %d 프로세스가 종료되기를 기다리고 있습니다." + + #: dnf/cli/commands/deplist.py:32 +-msgid "List package's dependencies and what packages provide them" +-msgstr "패키지의 종속성 및 패키지를 제공하는 소스 목록 나열" ++msgid "" ++"[deprecated, use repoquery --deplist] List package's dependencies and what " ++"packages provide them" ++msgstr "[더 이상 사용되지 않음, repoquery --deplist 사용] 꾸러미의 종속성과 이를 제공하는 꾸러미 목록 나열" + + #: 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" +-msgstr "동기화할 패키지" ++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:46 + msgid "display, or use, the groups information" +@@ -1174,207 +1142,220 @@ msgstr "그룹 정보를 표시하거나 사용합니다" msgid "No group data available for configured repositories." msgstr "설정된 리포지토리에 사용할 수있는 그룹 데이터가 없습니다." @@ -8537,7 +7508,8 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/commands/group.py:170 +#: dnf/cli/commands/group.py:167 msgid "Warning: No groups match:" - msgstr "경고: 일치하는 그룹이 없습니다" +-msgstr "경고: 일치하는 그룹이 없습니다" ++msgstr "경고: 일치하는 그룹이 없습니다:" -#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193 -#: dnf/cli/output.py:1226 @@ -8579,7 +7551,8 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/commands/group.py:322 +#: dnf/cli/commands/group.py:319 msgid "include optional packages from group" - msgstr "그룹의 선택 패키지를 포함합니다" +-msgstr "그룹의 선택 패키지를 포함합니다" ++msgstr "그룹의 선택 꾸러미를 포함합니다" -#: dnf/cli/commands/group.py:325 +#: dnf/cli/commands/group.py:322 @@ -8615,21 +7588,75 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/commands/group.py:343 #, python-format msgid "Invalid groups sub-command, use: %s." - msgstr "그룹 하위 명령이 잘못되었습니다. %s을/를 사용합니다." +-msgstr "그룹 하위 명령이 잘못되었습니다. %s을/를 사용합니다." ++msgstr "그룹 하위 명령이 잘못되었습니다. %s를 사용합니다." -#: dnf/cli/commands/group.py:403 +#: dnf/cli/commands/group.py:398 msgid "Unable to find a mandatory group package." - msgstr "필수 그룹 패키지를 찾을 수 없습니다." +-msgstr "필수 그룹 패키지를 찾을 수 없습니다." ++msgstr "필수 그룹 꾸러미를 찾을 수 없습니다." -@@ -1295,30 +1262,58 @@ msgstr "주어진 거래 ID가 없습니다." + #: dnf/cli/commands/history.py:48 + msgid "display, or use, the transaction history" +-msgstr "트랜잭션 내역 표시 또는 사용" ++msgstr "연결 내역 표시 또는 사용" + + #: dnf/cli/commands/history.py:66 + msgid "For the store command, file path to store the transaction to" +-msgstr "" ++msgstr "저장 명령을 위해, 트랜젝션을 저장할 파일 경로" + + #: dnf/cli/commands/history.py:68 + msgid "" + "For the replay command, don't check for installed packages matching those in" + " transaction" +-msgstr "" ++msgstr "재생명령을 위하여, 연결에 그것들과 일치하는 설치된 꾸러미를 확인하지 마세요" + + #: dnf/cli/commands/history.py:71 + msgid "" + "For the replay command, don't check for extra packages pulled into the " + "transaction" +-msgstr "" ++msgstr "응답 명령을 위하여, 연결에 추가 된 꾸러미를 확인하지 마세요" + + #: dnf/cli/commands/history.py:74 + msgid "" + "For the replay command, skip packages that are not available or have missing" + " dependencies" +-msgstr "" ++msgstr "지연 명령을 위하여, 사용 할 수 없는 또는 찾을 수 없는 의존성을 갖는 목록 건너띄기" + + #: dnf/cli/commands/history.py:94 + msgid "" + "Found more than one transaction ID.\n" + "'{}' requires one transaction ID or package name." + msgstr "" +-"둘 이상의 트랜잭션 ID를 찾았습니다.\n" +-"'{}'에는 하나의 트랜잭션 ID 또는 패키지 이름이 필요합니다." ++"둘 이상의 연결 ID를 찾았습니다.\n" ++"'{}'에는 하나의 연결 ID 또는 꾸러미 이름이 필요합니다." + + #: dnf/cli/commands/history.py:101 +-#, fuzzy +-#| msgid "No transaction ID 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 "트랜잭션 파일을 제거하지 못했습니다. %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 또는 패키지 이름이 없습니다." +-msgstr "트랜잭션 ID 또는 패키지 이름이 없습니다." ++msgstr "연결 ID 또는 꾸러미 이름이 없습니다." -#: dnf/cli/commands/history.py:138 +#: dnf/cli/commands/history.py:142 @@ -8643,7 +7670,8 @@ index 449f6130..9f37ae13 100644 msgid "" "Cannot undo transaction %s, doing so would result in an inconsistent package" " database." - msgstr "%s 트랜잭션을 취소할 수 없습니다. 취소하면 패키지 데이터베이스가 일치하지 않게 됩니다." +-msgstr "%s 트랜잭션을 취소할 수 없습니다. 취소하면 패키지 데이터베이스가 일치하지 않게 됩니다." ++msgstr "%s 연결을 취소 할 수 없습니다. 취소하면 꾸러미 자료 저장소가 일치하지 않게 됩니다." -#: dnf/cli/commands/history.py:152 +#: dnf/cli/commands/history.py:156 @@ -8651,43 +7679,44 @@ index 449f6130..9f37ae13 100644 msgid "" "Cannot rollback transaction %s, doing so would result in an inconsistent " "package database." - msgstr "%s 트랜잭션을 롤백할 수 없습니다. 이렇게하면 패키지 데이터베이스가 일치하지 않게 됩니다." - --#: dnf/cli/commands/history.py:222 +-msgstr "%s 트랜잭션을 롤백할 수 없습니다. 이렇게하면 패키지 데이터베이스가 일치하지 않게 됩니다." ++msgstr "%s 연결을 되돌릴 수 없습니다. 이렇게 하면 꾸러미 데이타베이스가 일치하지 않게 됩니다." ++ +#: dnf/cli/commands/history.py:175 +msgid "No transaction ID given" -+msgstr "지정된 트랜잭션 ID가 없습니다" ++msgstr "지정된 연결 ID가 없습니다" + +#: dnf/cli/commands/history.py:179 -+#, fuzzy, python-brace-format -+#| msgid "TransactionItem not found for key: {}" ++#, python-brace-format +msgid "Transaction ID \"{0}\" not found." -+msgstr "{} 키에 대한 TransactionItem을 찾을 수 없습니다" -+ ++msgstr "Transaction ID \"{0}\" 를 찾을 수 없음." + +-#: dnf/cli/commands/history.py:222 +#: dnf/cli/commands/history.py:185 +msgid "Found more than one transaction ID!" -+msgstr "두 개 이상의 트랜잭션 ID를 찾았습니다!" ++msgstr "두 개 이상의 연결 ID를 찾았습니다!" + +#: dnf/cli/commands/history.py:203 +#, python-format +msgid "Transaction history is incomplete, before %u." -+msgstr "%u이전 트랜잭션 내역이 불완전합니다." ++msgstr "%u이전 연결 내역이 불완전합니다." + +#: dnf/cli/commands/history.py:205 +#, python-format +msgid "Transaction history is incomplete, after %u." -+msgstr "%u이후 트랜잭션 내역이 불완전합니다." ++msgstr "%u 이후 연결 내역이 불완전합니다." + +#: dnf/cli/commands/history.py:256 +msgid "No packages to list" -+msgstr "목록에 패키지가 없습니다" ++msgstr "목록에 꾸러미가 없습니다" + +#: dnf/cli/commands/history.py:279 msgid "" "Invalid transaction ID range definition '{}'.\n" "Use '..'." -@@ -1326,7 +1321,7 @@ msgstr "" - "잘못된 트랜잭션 ID 범위 정의 '{}'. \n" + msgstr "" +-"잘못된 트랜잭션 ID 범위 정의 '{}'. \n" ++"잘못된 연결 ID 범위 정의 '{}'.\n" "'..' 사용." -#: dnf/cli/commands/history.py:226 @@ -8695,14 +7724,16 @@ index 449f6130..9f37ae13 100644 msgid "" "Can't convert '{}' to transaction ID.\n" "Use '', 'last', 'last-'." -@@ -1334,38 +1329,32 @@ msgstr "" - "'{}'을 (를) 트랜잭션 ID로 변환할 수 없습니다. \n" + msgstr "" +-"'{}'을 (를) 트랜잭션 ID로 변환할 수 없습니다. \n" ++"'{}'을 (를) 연결 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 "패키지 '{}'을 (를) 사용하는 트랜잭션이 없습니다." +-msgstr "패키지 '{}'을 (를) 사용하는 트랜잭션이 없습니다." ++msgstr "꾸러미 '{}'를 사용하는 연결이 없습니다." -#: dnf/cli/commands/history.py:305 -#, python-brace-format @@ -8712,36 +7743,52 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/commands/history.py:313 +#: dnf/cli/commands/history.py:357 msgid "{} exists, overwrite?" - msgstr "" +-msgstr "" ++msgstr "{} 존재합니다, 덮어 쓸까요?" -#: dnf/cli/commands/history.py:316 +#: dnf/cli/commands/history.py:360 msgid "Not overwriting {}, exiting." - msgstr "" +-msgstr "" ++msgstr "존재하기 때문에, {} 덮어 쓸 수 없습니다." -#: dnf/cli/commands/history.py:323 +-#, fuzzy +-#| msgid "Transaction test succeeded." +#: dnf/cli/commands/history.py:367 - #, fuzzy - #| msgid "Transaction test succeeded." msgid "Transaction saved to {}." - msgstr "트랜잭션 테스트가 완료되었습니다." +-msgstr "트랜잭션 테스트가 완료되었습니다." ++msgstr "연결이 {}에 저장되었습니다." -#: dnf/cli/commands/history.py:326 +-#, fuzzy +-#| msgid "Errors occurred during transaction." +#: dnf/cli/commands/history.py:370 - #, fuzzy - #| msgid "Errors occurred during transaction." msgid "Error storing transaction: {}" - msgstr "거래 중에 오류가 발생했습니다." +-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 "" ++msgstr "경고, 연결 동작 중에 다음 문제가 발생하였습니다:" #: dnf/cli/commands/install.py:47 -@@ -1385,7 +1374,7 @@ msgstr "일치하는 항목을 찾을 수 없습니다" + msgid "install a package or packages on your system" +-msgstr "시스템에 패키지를 설치합니다" ++msgstr "시스템에 꾸러미를 설치합니다" + + #: dnf/cli/commands/install.py:53 + msgid "Package to install" +-msgstr "설치할 패키지" ++msgstr "설치할 꾸러미" + + #: dnf/cli/commands/install.py:118 + msgid "Unable to find a match" +@@ -1385,22 +1366,22 @@ msgstr "일치하는 항목을 찾을 수 없습니다" msgid "Not a valid rpm file path: %s" msgstr "올바른 rpm 파일 경로가 아닙니다. %s" @@ -8750,8 +7797,39 @@ index 449f6130..9f37ae13 100644 #, 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/makecache.py:37 + msgid "generate the metadata cache" +-msgstr "메타 데이터 캐시를 생성합니다" ++msgstr "메타 자료 캐쉬를 생성합니다" + + #: dnf/cli/commands/makecache.py:48 + msgid "Making cache files for all metadata files." +-msgstr "모든 메타 데이터 파일의 캐시 파일을 만듭니다." ++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 "" +@@ -1415,7 +1396,7 @@ msgstr "" + #: dnf/cli/commands/mark.py:52 + #, python-format + msgid "%s marked as user installed." +-msgstr "%s은/는 사용자가 설치한 것으로 표시되었습니다" ++msgstr "%s은사용자가 설치한 것으로 표시." + + #: dnf/cli/commands/mark.py:56 + #, python-format +@@ -1425,131 +1406,135 @@ msgstr "%s은/는 사용자가 설치한 것으로 표시되지 않았습니다. + #: dnf/cli/commands/mark.py:60 + #, python-format + msgid "%s marked as group installed." +-msgstr "%s은/는 그룹이 설치한 것으로 표시되었습니다" ++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 @@ -8759,63 +7837,583 @@ index 449f6130..9f37ae13 100644 msgid "Error:" msgstr "오류:" -@@ -1484,42 +1473,46 @@ msgid "Package {} belongs to multiple modules, skipping" - msgstr "{} 패키지는 여러 모듈에 속합니다. 건너 뛰기" + #: dnf/cli/commands/mark.py:87 + #, python-format + msgid "Package %s is not installed." +-msgstr "%s 패키지가 설치되지 않았습니다." ++msgstr "꾸러미 %s가 설치되지 않았습니다." - #: dnf/cli/commands/module.py:277 -+msgid "switch a module to a stream and distrosync rpm packages" -+msgstr "" +-#: dnf/cli/commands/module.py:51 ++#: dnf/cli/commands/module.py:54 + msgid "" + "Only module name, stream, architecture or profile is used. Ignoring unneeded" + " information in argument: '{}'" +-msgstr "모듈 이름, 스트림, 아키텍처 또는 프로파일만 사용됩니다. '{}'인수에서 불필요한 정보는 무시하십시오" ++msgstr "모듈 이름, 스트림, 구조 또는 프로파일만 사용됩니다. '{}'인수에서 불필요한 정보는 무시하십시오" + +-#: dnf/cli/commands/module.py:77 ++#: dnf/cli/commands/module.py:80 + msgid "list all module streams, profiles and states" + msgstr "모든 모듈 스트림, 프로파일 및 상태 나열" + +-#: dnf/cli/commands/module.py:105 dnf/cli/commands/module.py:128 ++#: dnf/cli/commands/module.py:108 dnf/cli/commands/module.py:131 + msgid "No matching Modules to list" + msgstr "일치하는 모듈을 나열할 수 없습니다" + +-#: dnf/cli/commands/module.py:111 ++#: dnf/cli/commands/module.py:114 + msgid "print detailed information about a module" + msgstr "모듈 세부 사항을 인쇄" + +-#: dnf/cli/commands/module.py:133 ++#: dnf/cli/commands/module.py:136 + msgid "enable a module stream" + msgstr "모듈 스트림을 활성화합니다" + +-#: dnf/cli/commands/module.py:157 ++#: dnf/cli/commands/module.py:160 + msgid "disable a module with all its streams" + msgstr "모듈의 모든 스트림을 비활성화합니다" + +-#: dnf/cli/commands/module.py:181 ++#: dnf/cli/commands/module.py:184 + msgid "reset a module" + msgstr "모듈 재설정" + +-#: dnf/cli/commands/module.py:202 ++#: dnf/cli/commands/module.py:205 + msgid "install a module profile including its packages" +-msgstr "패키지를 포함한 모듈 프로파일 설치" ++msgstr "꾸러미를 포함한 모듈 프로파일 설치" + +-#: dnf/cli/commands/module.py:223 ++#: dnf/cli/commands/module.py:226 + msgid "update packages associated with an active stream" +-msgstr "활성 스트림과 관련된 패키지 업데이트" ++msgstr "활성 스트림과 관련된 꾸러미 최신화" + +-#: dnf/cli/commands/module.py:240 ++#: dnf/cli/commands/module.py:243 + msgid "remove installed module profiles and their packages" +-msgstr "설치된 모듈 프로파일과 패키지를 제거" ++msgstr "설치된 모듈 프로파일과 꾸러미를 제거" + +-#: dnf/cli/commands/module.py:264 ++#: dnf/cli/commands/module.py:267 + msgid "Package {} belongs to multiple modules, skipping" +-msgstr "{} 패키지는 여러 모듈에 속합니다. 건너 뛰기" ++msgstr "{} 꾸러미는 여러 모듈에 속합니다. 건너 뛰기" + -+#: dnf/cli/commands/module.py:299 ++#: dnf/cli/commands/module.py:280 ++msgid "switch a module to a stream and distrosync rpm packages" ++msgstr "모듈을 스트림과 distrosync rpm 꾸러미로 전환합니다" + +-#: dnf/cli/commands/module.py:277 ++#: dnf/cli/commands/module.py:302 msgid "list modular packages" - msgstr "모듈 패키지 목록" +-msgstr "모듈 패키지 목록" ++msgstr "모듈러 꾸러미지 목록" -#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 ++#: dnf/cli/commands/module.py:317 msgid "list packages belonging to a module" - msgstr "모듈에 속하는 패키지를 나열하십시오" +-msgstr "모듈에 속하는 패키지를 나열하십시오" ++msgstr "모듈에 속하는 꾸러미를 나열하십시오" -#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 ++#: dnf/cli/commands/module.py:352 msgid "Interact with Modules." msgstr "모듈과 상호 작용합니다." -#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 ++#: dnf/cli/commands/module.py:365 msgid "show only enabled modules" msgstr "활성화된 모듈 만 표시" -#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 ++#: dnf/cli/commands/module.py:368 msgid "show only disabled modules" msgstr "비활성화된 모듈 만 표시" -#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 ++#: dnf/cli/commands/module.py:371 msgid "show only installed modules or packages" - msgstr "설치된 모듈 또는 패키지 만 표시" +-msgstr "설치된 모듈 또는 패키지 만 표시" ++msgstr "설치된 모듈 또는 꾸러미만 표시" -#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 ++#: dnf/cli/commands/module.py:374 msgid "show profile content" msgstr "프로파일 내용 표시" -#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 ++#: dnf/cli/commands/module.py:379 msgid "remove all modular packages" - msgstr "모든 모듈 패키지 삭제" +-msgstr "모든 모듈 패키지 삭제" ++msgstr "모든 모듈 꾸러미 삭제" -#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 ++#: dnf/cli/commands/module.py:389 msgid "Module specification" msgstr "모듈 사양" -#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 ++#: dnf/cli/commands/module.py:411 msgid "{} {} {}: too few arguments" msgstr "{} {} {}: 인수가 부족합니다" -@@ -2004,22 +1997,22 @@ msgstr "KEYWORD" + #: dnf/cli/commands/reinstall.py:38 + msgid "reinstall a package" +-msgstr "패키지 다시 설치" ++msgstr "꾸러미 다시 설치" + + #: dnf/cli/commands/reinstall.py:42 + msgid "Package to reinstall" +-msgstr "다시 설치할 패키지" ++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:95 + msgid "No duplicated packages found for removal." +-msgstr "제거할 중복 패키지가 없습니다." ++msgstr "제거할 중복 꾸러미가 없습니다." + + #: 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:364 +@@ -1593,7 +1578,7 @@ 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" +@@ -1605,87 +1590,87 @@ msgstr "사용 안함" + + #: dnf/cli/commands/repolist.py:162 + msgid "Repo-id : " +-msgstr "Repo-id : " ++msgstr "Repo-id : " + + #: dnf/cli/commands/repolist.py:163 + msgid "Repo-name : " +-msgstr "Repo-name : " ++msgstr "Repo-name : " + + #: dnf/cli/commands/repolist.py:166 + msgid "Repo-status : " +-msgstr "Repo-status : " ++msgstr "Repo-status : " + + #: dnf/cli/commands/repolist.py:169 + msgid "Repo-revision : " +-msgstr "Repo-revision : " ++msgstr "Repo-revision : " + + #: dnf/cli/commands/repolist.py:173 + msgid "Repo-tags : " +-msgstr "Repo-tags : " ++msgstr "Repo-tags : " + + #: dnf/cli/commands/repolist.py:180 + msgid "Repo-distro-tags : " +-msgstr "Repo-distro-tags : " ++msgstr "Repo-distro-tags : " + + #: dnf/cli/commands/repolist.py:192 + msgid "Repo-updated : " +-msgstr "Repo-updated : " ++msgstr "Repo-updated : " + + #: dnf/cli/commands/repolist.py:194 + msgid "Repo-pkgs : " +-msgstr "Repo-pkgs : " ++msgstr "Repo-pkgs : " + + #: dnf/cli/commands/repolist.py:195 + msgid "Repo-available-pkgs: " +-msgstr "Repo-available-pkgs: " ++msgstr "저장소-이용 할 수 있는-꾸러미: " + + #: dnf/cli/commands/repolist.py:196 + msgid "Repo-size : " +-msgstr "Repo-size : " ++msgstr "Repo-size : " + + #: dnf/cli/commands/repolist.py:199 + msgid "Repo-metalink : " +-msgstr "Repo-metalink : " ++msgstr "Repo-metalink : " + + #: dnf/cli/commands/repolist.py:204 + msgid " Updated : " +-msgstr " Updated : " ++msgstr " Updated : " + + #: dnf/cli/commands/repolist.py:206 + msgid "Repo-mirrors : " +-msgstr "Repo-mirrors : " ++msgstr "Repo-mirrors : " + + #: dnf/cli/commands/repolist.py:210 dnf/cli/commands/repolist.py:216 + msgid "Repo-baseurl : " +-msgstr "Repo-baseurl : " ++msgstr "Repo-baseurl : " + + #: dnf/cli/commands/repolist.py:219 + msgid "Repo-expire : " +-msgstr "Repo-expire : " ++msgstr "Repo-expire : " + + #. TRANSLATORS: Packages that are excluded - their names like (dnf systemd) + #: dnf/cli/commands/repolist.py:223 + msgid "Repo-exclude : " +-msgstr "Repo-exclude : " ++msgstr "Repo-exclude : " + + #: dnf/cli/commands/repolist.py:227 + msgid "Repo-include : " +-msgstr "Repo-include : " ++msgstr "Repo-include : " + + #. TRANSLATORS: Number of packages that where excluded (5) + #: dnf/cli/commands/repolist.py:232 + msgid "Repo-excluded : " +-msgstr "Repo-excluded : " ++msgstr "Repo-excluded : " + + #: dnf/cli/commands/repolist.py:236 + msgid "Repo-filename : " +-msgstr "Repo-filename : " ++msgstr "Repo-filename : " + + #. Work out the first (id) and last (enabled/disabled/count), + #. then chop the middle (name)... + #: dnf/cli/commands/repolist.py:246 dnf/cli/commands/repolist.py:273 + msgid "repo id" +-msgstr "리포지터리 ID" ++msgstr "레포지터리 ID" + + #: dnf/cli/commands/repolist.py:259 dnf/cli/commands/repolist.py:260 + #: dnf/cli/commands/repolist.py:281 +@@ -1694,25 +1679,25 @@ msgstr "상태" + + #: dnf/cli/commands/repolist.py:275 dnf/cli/commands/repolist.py:277 + msgid "repo name" +-msgstr "리포지터리 이름" ++msgstr "레포지터리 이름" + + #: dnf/cli/commands/repolist.py:291 + msgid "Total packages: {}" +-msgstr "총 패키지: {}" ++msgstr "총 꾸러미: {}" + + #: dnf/cli/commands/repoquery.py:107 + msgid "search for packages matching keyword" +-msgstr "키워드와 일치하는 패키지 검색" ++msgstr "키워드와 일치하는 꾸러미 검색" + + #: dnf/cli/commands/repoquery.py:121 + msgid "" + "Query all packages (shorthand for repoquery '*' or repoquery without " + "argument)" +-msgstr "모든 패키지를 쿼리하십시오 (repoquery '*'의 축약형 또는 인수없는 repoquery)" ++msgstr "모든 꾸러미를 쿼리하십시오 (repoquery '*'의 축약형 또는 인수없는 repoquery)" + + #: dnf/cli/commands/repoquery.py:124 + msgid "Query all versions of packages (default)" +-msgstr "패키지의 모든 버전 쿼리 (기본값)" ++msgstr "꾸러미의 모든 버전 질문 (기본값)" + + #: dnf/cli/commands/repoquery.py:127 + msgid "show only results from this ARCH" +@@ -1730,7 +1715,7 @@ msgstr "REQ와 충돌하는 결과 만 표시" + msgid "" + "shows results that requires, suggests, supplements, enhances,or recommends " + "package provides and files REQ" +-msgstr "REQ를 제공하고 파일 패키지를 요구, 제안, 보완, 개선, 권장하는 결과를 표시합니다." ++msgstr "REQ를 제공하고 파일 꾸러미를 요구, 제안, 보완, 개선, 권장하는 결과를 표시합니다" + + #: dnf/cli/commands/repoquery.py:139 + msgid "show only results that obsolete REQ" +@@ -1742,7 +1727,7 @@ msgstr "REQ를 제공하는 결과 만 표시" + + #: dnf/cli/commands/repoquery.py:145 + msgid "shows results that requires package provides and files REQ" +-msgstr "REQ를 제공 및 파일 패키지가 필요한 결과를 표시" ++msgstr "REQ를 제공 및 파일 꾸러미가 필요한 결과를 표시" + + #: dnf/cli/commands/repoquery.py:148 + msgid "show only results that recommend REQ" +@@ -1772,19 +1757,19 @@ msgstr "지정된대로 종속성을 확인. --alldeps와 반대됩니다" + msgid "" + "used with --whatrequires, and --requires --resolve, query packages " + "recursively." +-msgstr "--whatrequires, --requires --resolve와 함계 사용하여 패키지를 재귀적으로 쿼리합니다." ++msgstr "--whatrequires, --requires --resolve와 함계 사용하여 꾸러미를 재귀적으로 쿼리합니다." + + #: dnf/cli/commands/repoquery.py:166 + msgid "show a list of all dependencies and what packages provide them" +-msgstr "모든 종속성 목록과 이를 제공하는 패키지를 표시합니다" ++msgstr "모든 종속성 목록과 이를 제공하는꾸러미지를 표시합니다" + + #: dnf/cli/commands/repoquery.py:168 + msgid "resolve capabilities to originating package(s)" +-msgstr "원래 패키지의 기능을 제공합니다" ++msgstr "원래 꾸러미의 기능을 제공합니다" + + #: dnf/cli/commands/repoquery.py:170 + msgid "show recursive tree for package(s)" +-msgstr "패키지의 재귀 트리를 표시합니다" ++msgstr "꾸러미의 재귀 트리를 표시합니다" + + #: dnf/cli/commands/repoquery.py:172 + msgid "operate on corresponding source RPM" +@@ -1794,27 +1779,27 @@ msgstr "해당 소스 RPM에서 작동합니다" + msgid "" + "show N latest packages for a given name.arch (or latest but N if N is " + "negative)" +-msgstr "지정된 name.arch (또는 N이 음수인 경우 가장 오래된 패키지)에 대한 N 개의 최신 패키지를 표시합니다" ++msgstr "지정된 name.arch (또는 N이 음수인 경우 가장 오래된 꾸러미)에 대한 N 개의 최신 꾸러미를 표시합니다" + + #: dnf/cli/commands/repoquery.py:177 + msgid "list also packages of inactive module streams" +-msgstr "비활성 모듈 스트림의 패키지 목록" ++msgstr "비활성 모듈 스트림의 꾸러미 목록" + + #: dnf/cli/commands/repoquery.py:182 + msgid "show detailed information about the package" +-msgstr "패키지에 대한 자세한 정보 표시" ++msgstr "꾸러미에 대한 자세한 정보 표시" + + #: dnf/cli/commands/repoquery.py:185 + msgid "show list of files in the package" +-msgstr "패키지에 있는 파일 목록 표시" ++msgstr "꾸러미에 있는 파일 목록 표시" + + #: dnf/cli/commands/repoquery.py:188 + msgid "show package source RPM name" +-msgstr "패키지 소스 RPM 이름 표시" ++msgstr "꾸러미 소스 RPM 이름 표시" + + #: dnf/cli/commands/repoquery.py:191 + msgid "show changelogs of the package" +-msgstr "패키지의 변경 로그 표시" ++msgstr "꾸러미의 변경 로그 표시" + + #: dnf/cli/commands/repoquery.py:194 + #, python-format, python-brace-format +@@ -1822,6 +1807,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" +@@ -1831,65 +1818,65 @@ msgstr "--queryformat과 함께 사용할 수 있는 태그를 표시합니다" + msgid "" + "use name-epoch:version-release.architecture format for displaying found " + "packages (default)" +-msgstr "name-epoch:version-release.architecture 형식을 사용하여 검색된 패키지를 표시합니다 (기본값)" ++msgstr "name-epoch:version-release.architecture 형식을 사용하여 검색된 꾸러미를 표시합니다 (기본값)" + + #: dnf/cli/commands/repoquery.py:205 + 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:211 + 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:214 + msgid "Display in which comps groups are presented selected packages" +-msgstr "선택한 패키지에 제시된 comps 그룹 표시" ++msgstr "선택한 꾸러미에 제시된 comps 그룹 표시" + + #: dnf/cli/commands/repoquery.py:218 + msgid "limit the query to installed duplicate packages" +-msgstr "설치된 중복 패키지로 쿼리 제한" ++msgstr "설치된 중복 꾸러미로 쿼리 제한" + + #: dnf/cli/commands/repoquery.py:225 + msgid "limit the query to installed installonly packages" +-msgstr "설치된 설치 전용 패키지로 쿼리 제한" ++msgstr "설치된 설치 전용 꾸러미로 쿼리 제한" + + #: dnf/cli/commands/repoquery.py:228 + msgid "limit the query to installed packages with unsatisfied dependencies" +-msgstr "설치된 충족되지 않은 종속성이있는 패키지로 쿼리 제한" ++msgstr "설치된 충족되지 않은 종속성이있는 꾸러미로 쿼리 제한" + + #: dnf/cli/commands/repoquery.py:230 + msgid "show a location from where packages can be downloaded" +-msgstr "패키지를 다운로드할 위치 표시" ++msgstr "꾸러미를 내려받기 할 위치 표시" + + #: dnf/cli/commands/repoquery.py:233 + msgid "Display capabilities that the package conflicts with." +-msgstr "패키지와 충돌하는 기능을 표시합니다." ++msgstr "꾸러미와 충돌하는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:234 + msgid "" + "Display capabilities that the package can depend on, enhance, recommend, " + "suggest, and supplement." +-msgstr "패키지가 종속 기능 강화, 개선, 권장, 제안 및 보완할 수 있는 기능을 표시합니다." ++msgstr "꾸러미가 종속 기능 강화, 개선, 권장, 제안 및 보완할 수 있는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:236 + msgid "Display capabilities that the package can enhance." +-msgstr "패키지를 확장할 수 있는 기능을 표시합니다." ++msgstr "꾸러미를 확장 할 수 있는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:237 + msgid "Display capabilities provided by the package." +-msgstr "패키지가 제공하는 기능을 표시합니다." ++msgstr "꾸러미가 제공하는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:238 + msgid "Display capabilities that the package recommends." +-msgstr "패키지에서 권장하는 기능을 표시합니다." ++msgstr "꾸러미에서 권장하는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:239 + msgid "Display capabilities that the package depends on." +-msgstr "패키지가 의존하는 기능을 표시합니다." ++msgstr "꾸러미가 의존하는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:240 + #, python-format +@@ -1898,49 +1885,49 @@ 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에 종속된 기능이 표시됩니다." ++"꾸러미가 설치되어 있지 않은 경우 %%pre 과 %%post 스크립트를 실행할 수 있는 기능이 표시됩니다. 꾸러미가 설치 되어 있는 경우" ++" %%pre, %%post , %%preun, %%postun에 종속된 기능이 표시됩니다." + + #: dnf/cli/commands/repoquery.py:243 + msgid "Display capabilities that the package suggests." +-msgstr "패키지에서 제안하는 기능을 표시합니다." ++msgstr "꾸러미에서 제안하는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:244 + msgid "Display capabilities that the package can supplement." +-msgstr "패키지가 보완할 수있는 기능을 표시합니다." ++msgstr "꾸러미가 보완할 수있는 기능을 표시합니다." + + #: dnf/cli/commands/repoquery.py:250 + msgid "Display only available packages." +-msgstr "사용 가능한 패키지 만 표시합니다." ++msgstr "사용 가능한 꾸러미만 표시합니다." + + #: dnf/cli/commands/repoquery.py:253 + msgid "Display only installed packages." +-msgstr "설치된 패키지 만 표시합니다." ++msgstr "설치된 꾸러미만 표시합니다." + + #: dnf/cli/commands/repoquery.py:254 + msgid "" + "Display only packages that are not present in any of available repositories." +-msgstr "사용 가능한 리포지토리에없는 패키지 만 표시합니다." ++msgstr "사용 가능한 저장소에 없는 꾸러미만 표시합니다." + + #: dnf/cli/commands/repoquery.py:255 + msgid "" + "Display only packages that provide an upgrade for some already installed " + "package." +-msgstr "이미 설치된 일부 패키지에 대한 업그레이드를 제공하는 패키지 만 표시합니다." ++msgstr "이미 설치된 일부 꾸러미에 대한 향상를 제공하는 꾸러미만 표시합니다." + + #: dnf/cli/commands/repoquery.py:256 + #, python-brace-format + msgid "" + "Display only packages that can be removed by \"{prog} autoremove\" command." +-msgstr "\"{prog} autoremove\" 명령으로 제거할 수 있는 패키지 만 표시합니다." ++msgstr "\"{prog} autoremove\" 명령으로 제거할 수 있는 꾸러미만 표시합니다." + + #: dnf/cli/commands/repoquery.py:258 + msgid "Display only packages that were installed by user." +-msgstr "사용자가 설치한 패키지 만 표시합니다." ++msgstr "사용자가 설치한 꾸러미만 표시합니다." + + #: dnf/cli/commands/repoquery.py:270 + msgid "Display only recently edited packages" +-msgstr "최근에 수정한 패키지 만 표시합니다" ++msgstr "최근에 수정한 꾸러미만 표시합니다" + + #: dnf/cli/commands/repoquery.py:273 + msgid "the key to search for" +@@ -1962,8 +1949,8 @@ msgid "" + "with '--alldeps', but not with '--exactdeps'), or with '--requires " + "--resolve'" + msgstr "" +-"옵션 '--reative'를 '--whatrequires ' (선택 옵션으로 '--exactdeps' 대신 '--" +-"alldeps'와 함께 사용), 또는 '--requires --resolve'와 함께 사용해야 합니다." ++"옵션 '--reative'를 '--whatrequires ' (선택 옵션으로 '--exactdeps' 대신 '--" ++"alldeps'와 함께 사용), 또는 '--requires --resolve'와 함께 사용해야 합니다" + + #: dnf/cli/commands/repoquery.py:312 + msgid "argument {} requires --whatrequires or --whatdepends option" +@@ -1971,7 +1958,7 @@ msgstr "인수 {}에는 --whatrequires 또는 --whatdepends 옵션이 필요합 + + #: dnf/cli/commands/repoquery.py:344 + msgid "Package {} contains no files" +-msgstr "패키지 {}에 파일이 없습니다" ++msgstr "꾸러미 {}에 파일이 없습니다" + + #: dnf/cli/commands/repoquery.py:561 + #, python-brace-format +@@ -1986,15 +1973,15 @@ msgstr "" + "사용법: {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 "패키지 설명 및 URL 검색" ++msgstr "꾸러미 설명 및 URL 검색" + + #: dnf/cli/commands/search.py:52 + msgid "KEYWORD" +@@ -2004,22 +1991,22 @@ msgstr "KEYWORD" msgid "Keyword to search for" msgstr "검색 키워드" @@ -8842,9 +8440,77 @@ index 449f6130..9f37ae13 100644 msgid "URL" msgstr "URL" -@@ -2162,16 +2155,16 @@ msgstr "" - "run 트랜잭션 세트 분석 및 실행\n" - "exit (or quit) 쉘 종료" +@@ -2034,18 +2021,18 @@ msgstr " & " + #: dnf/cli/commands/search.py:80 + #, python-format + msgid "%s Exactly Matched: %%s" +-msgstr "%s 정확히 일치하는 항목: %%s" ++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 "%s 일치하는 항목: %%s" ++msgstr "%s과 일치하는 항목: %%s" + + #: dnf/cli/commands/search.py:134 + msgid "No matches found." +-msgstr "일치하는 항목이 없습니다." ++msgstr "일치 항목이 없습니다." + + #: dnf/cli/commands/shell.py:47 + #, python-brace-format +@@ -2110,7 +2097,7 @@ msgid "" + " resolve the transaction set" + msgstr "" + "{}\n" +-" 트랜잭션 집합을 분석합니다" ++" 연결 집합을 분석합니다" + + #: dnf/cli/commands/shell.py:195 + msgid "" +@@ -2120,9 +2107,9 @@ msgid "" + " run: run the transaction" + msgstr "" + "{} arg\n" +-" list : 트랜잭션 내용을 나열합니다\n" +-" reset : 트랜잭션을 재설정합니다 (zero-out)\n" +-" run: 트랜잭션을 실행합니다" ++" list : 연결 내용을 나열합니다\n" ++" reset : 연결을 재설정합니다 (zero-out)\n" ++" run: 연결을 실행합니다" + + #: dnf/cli/commands/shell.py:201 + msgid "" +@@ -2130,7 +2117,7 @@ msgid "" + " run the transaction" + msgstr "" + "{}\n" +-" 트랜잭션을 실행합니다." ++"연결을 실행합니다" + + #: dnf/cli/commands/shell.py:205 + msgid "" +@@ -2154,24 +2141,24 @@ msgid "" + msgstr "" + "쉘 관련 인수:\n" + "\n" +-"config 설정 옵션 설정\n" +-"help 도움말 인쇄\n" +-"repository (or repo) 리포지토리 활성화,비활성화 또는 나열\n" +-"resolvedep 트랜잭션 세트 분석\n" +-"transaction (or ts) 트랜잭션 세트 목록,재설정 또는 실행\n" +-"run 트랜잭션 세트 분석 및 실행\n" +-"exit (or quit) 쉘 종료" ++"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 +#: dnf/cli/commands/shell.py:262 @@ -8862,18 +8528,323 @@ index 449f6130..9f37ae13 100644 msgid "Leaving Shell" msgstr "쉘 나가기" -@@ -2364,8 +2357,8 @@ msgstr "파일" +@@ -2202,45 +2189,45 @@ msgstr "보안" + + #: dnf/cli/commands/updateinfo.py:48 + msgid "newpackage" +-msgstr "새 패키지" ++msgstr "새 꾸러미" + + #: 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)" +@@ -2264,11 +2251,11 @@ 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" +@@ -2280,11 +2267,11 @@ 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)" +@@ -2324,11 +2311,11 @@ msgstr "기타 다른 공지" + + #: dnf/cli/commands/updateinfo.py:316 + msgid "Unknown/Sec." +-msgstr "알 수 없음 /보안 취약점" ++msgstr "알 수 없음/보안." + + #: dnf/cli/commands/updateinfo.py:357 + msgid "Bugs" +-msgstr "버그" ++msgstr "결점" + + #: dnf/cli/commands/updateinfo.py:357 + msgid "Type" +@@ -2336,11 +2323,11 @@ msgstr "유형" + + #: dnf/cli/commands/updateinfo.py:357 + msgid "Update ID" +-msgstr "ID 업데이트" ++msgstr "ID 최신화" + + #: dnf/cli/commands/updateinfo.py:357 + msgid "Updated" +-msgstr "업데이트됨" ++msgstr "최신화됨" + + #: dnf/cli/commands/updateinfo.py:358 + msgid "CVEs" +@@ -2364,10 +2351,10 @@ 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 ++#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 dnf/util.py:617 msgid "Installed" - msgstr "설치됨" +-msgstr "설치됨" ++msgstr "설치되었습니다" -@@ -2688,13 +2681,13 @@ msgstr "‘%s' 인수를 인코딩할 수 없습니다: %s" + #: dnf/cli/commands/updateinfo.py:385 + msgid "false" +@@ -2379,17 +2366,17 @@ msgstr "true" + + #: dnf/cli/commands/upgrade.py:40 + msgid "upgrade a package or packages on your system" +-msgstr "시스템에서 패키지를 업그레이드하십시오." ++msgstr "시스템에서 꾸러미를 최신화하세요" + + #: dnf/cli/commands/upgrade.py:44 + msgid "Package to upgrade" +-msgstr "업그레이드할 패키지" ++msgstr "최신화 할 꾸러미" + + #: dnf/cli/commands/upgrademinimal.py:31 + msgid "" + "upgrade, but only 'newest' package match which fixes a problem that affects " + "your system" +-msgstr "업그레이드하지만 ‘최신' 패키지에만 시스템에 영향을 줄 수 있는 수정된 문제가 있습니다" ++msgstr "최신화 하지만 ‘최신' 꾸러미에만 시스템에 영향을 줄 수 있는 수정된 문제가 있습니다" + + #: dnf/cli/main.py:88 + msgid "Terminated." +@@ -2401,23 +2388,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." +@@ -2497,7 +2484,7 @@ 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" +@@ -2505,19 +2492,19 @@ msgstr "명령 도움말 표시" + + #: dnf/cli/option_parser.py:217 + msgid "allow erasing of installed packages to resolve dependencies" +-msgstr "종속성을 해결하기 위해 설치된 패키지 지우기 허용" ++msgstr "종속성을 해결하기 위해 설치된 꾸러미 지우기 허용" + + #: dnf/cli/option_parser.py:221 + msgid "try the best available package versions in transactions." +-msgstr "트랜잭션에서 사용 가능한 최상의 패키지 버전을 사용해보십시오." ++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" +-msgstr "시스템 캐시에서 완전히 실행하고, 캐시를 업데이트하지 않습니다." ++msgstr "시스템 캐쉬에서 완전히 실행하고, 캐쉬를 최신화하지 않습니다" + + #: dnf/cli/option_parser.py:230 + msgid "maximum command wait time" +@@ -2529,11 +2516,11 @@ msgstr "디버깅 출력 레벨" + + #: dnf/cli/option_parser.py:236 + msgid "dumps detailed solving results into files" +-msgstr "자세한 해결 결과를 파일로 덤프합니다." ++msgstr "자세한 해결 결과를 파일로 덤프합니다" + + #: dnf/cli/option_parser.py:240 + msgid "show duplicates, in repos, in list/search commands" +-msgstr "repos에 있는 중복 목록을 목록/검색 명령에 표시합니다." ++msgstr "repos에 있는 중복 목록을 목록/검색 명령에 표시합니다" + + #: dnf/cli/option_parser.py:243 + msgid "error output level" +@@ -2545,8 +2532,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}의 더 이상 " +-"사용되지 않는 처리 로직을 활성화합니다." ++"꾸러미가 info, list, repoquery에 더 이상 사용하지 않는 최신화 또는 표시 기능을 위해 {prog}의 더 이상 사용되지 " ++"않는 처리 로직을 활성화합니다" + + #: dnf/cli/option_parser.py:251 + msgid "debugging output level for rpm" +@@ -2588,7 +2575,7 @@ 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" +@@ -2598,7 +2585,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 "사용할 추가 리포지터리에 대한 레이블 및 경로 (baseurl과 동일한 경로)를 여러 번 지정할 수 있습니다." ++msgstr "사용 할 추가 레포지터리에 대한 이름표와 경로 (baseurl과 동일한 경로)를 여러 번 지정와 할 수 있습니다." + + #: dnf/cli/option_parser.py:297 + msgid "disable removal of dependencies that are no longer used" +@@ -2626,51 +2613,51 @@ 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" +-msgstr "패키지 만 다운로드" ++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 "결점(bug) 수정 관련 꾸러미 최신화에 포함" + + #: dnf/cli/option_parser.py:325 + msgid "Include enhancement relevant packages, in updates" +-msgstr "개선된 기능과 관련된 패키지를 업데이트에 포함" ++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" +-msgstr "보안 관련 패키지 업데이트에 포함" ++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" +-msgstr "주어진 CVE를 수정하는 데 필요한 패키지를 업데이트에 포함" ++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" +-msgstr "아키텍처의 사용을 강제합니다" ++msgstr "구조의 사용을 강제합니다" + + #: dnf/cli/option_parser.py:375 + msgid "List of Main Commands:" +@@ -2688,13 +2675,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. @@ -8889,7 +8860,7 @@ index 449f6130..9f37ae13 100644 msgid "Epoch" msgstr "기간" -@@ -2702,38 +2695,38 @@ msgstr "기간" +@@ -2702,38 +2689,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. @@ -8918,7 +8889,8 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:471 dnf/cli/output.py:1239 msgctxt "short" msgid "Arch" - msgstr "아키텍처" +-msgstr "아키텍처" ++msgstr "구조" #. Translators: This is the full word 'Architecture', used when #. we have enough space. @@ -8926,7 +8898,8 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:472 dnf/cli/output.py:1242 msgctxt "long" msgid "Architecture" - msgstr "아키텍처" +-msgstr "아키텍처" ++msgstr "구조" #. Translators: This is the full (unabbreviated) term 'Size'. -#: dnf/cli/output.py:520 dnf/cli/output.py:1352 @@ -8934,7 +8907,7 @@ index 449f6130..9f37ae13 100644 msgctxt "long" msgid "Size" msgstr "크기" -@@ -2742,32 +2735,32 @@ msgstr "크기" +@@ -2742,361 +2729,357 @@ 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. @@ -8956,7 +8929,8 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:479 dnf/cli/output.py:1254 msgctxt "short" msgid "Repo" - msgstr "리포지터리" +-msgstr "리포지터리" ++msgstr "레포지터리" #. Translators: This is the full word 'Repository', used when #. we have enough space. @@ -8964,22 +8938,25 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:480 dnf/cli/output.py:1257 msgctxt "long" msgid "Repository" - msgstr "리포지터리" +-msgstr "리포지터리" ++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 "리포지터리에서" +-msgstr "리포지터리에서" ++msgstr "레포지터리에서" -@@ -2775,314 +2768,310 @@ msgstr "리포지터리에서" + #. :hawkey does not support changelog information #. 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 "패키지 프로그램" +-msgstr "패키지 프로그램" ++msgstr "꾸러미 생성자" #. Translators: This message should be no longer than 12 characters. -#: dnf/cli/output.py:541 @@ -9012,7 +8989,8 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:564 +#: dnf/cli/output.py:518 msgid "License" - msgstr "라이센스" +-msgstr "라이센스" ++msgstr "저작권" #. Translators: This is abbreviated 'Description'. Should be no longer #. than 12 characters. You can use the full version if it is short @@ -9045,17 +9023,20 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:707 +#: dnf/cli/output.py:651 msgid "no" - msgstr "아니요" +-msgstr "아니요" ++msgstr "아니" -#: dnf/cli/output.py:711 +#: dnf/cli/output.py:655 msgid "Is this ok [y/N]: " - msgstr "정말입니까 [y/N]: " +-msgstr "정말입니까 [y/N]: " ++msgstr "진행 할 까요? [y/N]: " -#: dnf/cli/output.py:715 +#: dnf/cli/output.py:659 msgid "Is this ok [Y/n]: " - msgstr "정말입니까 [Y/n]: " +-msgstr "정말입니까 [Y/n]: " ++msgstr "진행 할 까요? [Y/n]: " -#: dnf/cli/output.py:795 +#: dnf/cli/output.py:739 @@ -9084,22 +9065,26 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:806 +#: dnf/cli/output.py:750 msgid " Mandatory Packages:" - msgstr " 필수 패키지 :" +-msgstr " 필수 패키지 :" ++msgstr " 필수 꾸러미 :" -#: dnf/cli/output.py:807 +#: dnf/cli/output.py:751 msgid " Default Packages:" - msgstr " 기본 패키지 :" +-msgstr " 기본 패키지 :" ++msgstr " 기본 꾸러미 :" -#: dnf/cli/output.py:808 +#: dnf/cli/output.py:752 msgid " Optional Packages:" - msgstr " 선택적인 패키지 :" +-msgstr " 선택적인 패키지 :" ++msgstr " 선택적인 꾸러미 :" -#: dnf/cli/output.py:809 +#: dnf/cli/output.py:753 msgid " Conditional Packages:" - msgstr " 추가 가능 패키지 :" +-msgstr " 추가 가능 패키지 :" ++msgstr " 추가 가능 꾸러미 :" -#: dnf/cli/output.py:834 +#: dnf/cli/output.py:778 @@ -9155,7 +9140,8 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:865 #, python-format msgid "License : %s" - msgstr "라이센스 : %s" +-msgstr "라이센스 : %s" ++msgstr "저작권 : %s" -#: dnf/cli/output.py:927 +#: dnf/cli/output.py:871 @@ -9172,7 +9158,8 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:996 +#: dnf/cli/output.py:940 msgid "There was an error calculating total download size" - msgstr "총 다운로드 크기를 계산하는 중에 오류가 발생했습니다" +-msgstr "총 다운로드 크기를 계산하는 중에 오류가 발생했습니다" ++msgstr "총 내려받기 크기를 계산하는 중에 오류가 발생했습니다" -#: dnf/cli/output.py:1002 +#: dnf/cli/output.py:946 @@ -9184,7 +9171,8 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:949 #, python-format msgid "Total download size: %s" - msgstr "총 다운로드 크기 : %s" +-msgstr "총 다운로드 크기 : %s" ++msgstr "총계 내려받기 크기: %s" -#: dnf/cli/output.py:1008 +#: dnf/cli/output.py:952 @@ -9206,12 +9194,14 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:1039 +#: dnf/cli/output.py:983 msgid "Marking packages as installed by the group:" - msgstr "그룹에 설치된 패키지 표시:" +-msgstr "그룹에 설치된 패키지 표시:" ++msgstr "그룹에 설치된 꾸러미 표시:" -#: dnf/cli/output.py:1046 +#: dnf/cli/output.py:990 msgid "Marking packages as removed by the group:" - msgstr "그룹에 의해 제거된 패키지 표시:" +-msgstr "그룹에 의해 제거된 패키지 표시:" ++msgstr "그룹에 의해 제거된 꾸러미 표시:" -#: dnf/cli/output.py:1056 +#: dnf/cli/output.py:1000 @@ -9221,17 +9211,20 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:1056 +#: dnf/cli/output.py:1000 msgid "Packages" - msgstr "패키지" +-msgstr "패키지" ++msgstr "꾸러미" -#: dnf/cli/output.py:1133 +#: dnf/cli/output.py:1046 msgid "Installing group/module packages" - msgstr "그룹 / 모듈 패키지 설치" +-msgstr "그룹 / 모듈 패키지 설치" ++msgstr "그룹/모듈 꾸러미 설치" -#: dnf/cli/output.py:1134 +#: dnf/cli/output.py:1047 msgid "Installing group packages" - msgstr "그룹 패키지 설치" +-msgstr "그룹 패키지 설치" ++msgstr "그룹 꾸러미 설치" #. TRANSLATORS: This is for a list of packages to be installed. -#: dnf/cli/output.py:1138 @@ -9245,7 +9238,8 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:1053 msgctxt "summary" msgid "Upgrading" - msgstr "업그레이드 중" +-msgstr "업그레이드 중" ++msgstr "향상 중" #. TRANSLATORS: This is for a list of packages to be reinstalled. -#: dnf/cli/output.py:1142 @@ -9257,12 +9251,14 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:1144 +#: dnf/cli/output.py:1057 msgid "Installing dependencies" - msgstr "종속 패키지 설치 중" +-msgstr "종속 패키지 설치 중" ++msgstr "종속 꾸러미 설치 중" -#: dnf/cli/output.py:1145 +#: dnf/cli/output.py:1058 msgid "Installing weak dependencies" - msgstr "취약한 종속 패키지 설치 중" +-msgstr "취약한 종속 패키지 설치 중" ++msgstr "취약한 종속 꾸러미 설치 중" #. TRANSLATORS: This is for a list of packages to be removed. # translation auto-copied from project subscription-manager, version 1.11.X, @@ -9275,19 +9271,22 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:1148 +#: dnf/cli/output.py:1061 msgid "Removing dependent packages" - msgstr "종속 패키지 제거" +-msgstr "종속 패키지 제거" ++msgstr "종속 꾸러미지 제거" -#: dnf/cli/output.py:1149 +#: dnf/cli/output.py:1062 msgid "Removing unused dependencies" - msgstr "사용하지 않는 종속 패키지 제거" +-msgstr "사용하지 않는 종속 패키지 제거" ++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 "다운그레이드 중" +-msgstr "다운그레이드 중" ++msgstr "하향설치 중" -#: dnf/cli/output.py:1176 +#: dnf/cli/output.py:1089 @@ -9322,12 +9321,14 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:1230 +#: dnf/cli/output.py:1143 msgid "Installing Environment Groups" - msgstr "환경 그룹 설치" +-msgstr "환경 그룹 설치" ++msgstr "환경 그룹 설치 중" -#: dnf/cli/output.py:1237 +#: dnf/cli/output.py:1150 msgid "Upgrading Environment Groups" - msgstr "환경 그룹 업그레이드" +-msgstr "환경 그룹 업그레이드" ++msgstr "환경 그룹 향상" -#: dnf/cli/output.py:1244 +#: dnf/cli/output.py:1157 @@ -9342,7 +9343,8 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:1258 +#: dnf/cli/output.py:1171 msgid "Upgrading Groups" - msgstr "그룹 업그레이드" +-msgstr "그룹 업그레이드" ++msgstr "그룹 향상" -#: dnf/cli/output.py:1265 +#: dnf/cli/output.py:1178 @@ -9354,22 +9356,26 @@ index 449f6130..9f37ae13 100644 #, python-format msgid "" "Skipping packages with conflicts:\n" -@@ -3091,12 +3080,12 @@ msgstr "" - "충돌 패키지 건너 뛰기 :\n" - "(업그레이드를 강제하려면 명령행에 '%s' 추가)" + "(add '%s' to command line to force their upgrade)" + msgstr "" +-"충돌 패키지 건너 뛰기 :\n" +-"(업그레이드를 강제하려면 명령행에 '%s' 추가)" ++"충돌 꾸러미 건너 뛰기:\n" ++"(향상을 강제하려면 명령행에 '%s' 추가)" -#: dnf/cli/output.py:1291 +#: dnf/cli/output.py:1204 #, python-format msgid "Skipping packages with broken dependencies%s" - msgstr "손상된 종속성이 있는 %s 패키지 건너 뛰기" +-msgstr "손상된 종속성이 있는 %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 " 또는 그룹의 일부" +@@ -3104,22 +3087,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. @@ -9377,14 +9383,16 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:1233 msgctxt "short" msgid "Package" - msgstr "패키지" +-msgstr "패키지" ++msgstr "꾸러미" #. Translators: This is the full (unabbreviated) term 'Package'. -#: dnf/cli/output.py:1322 +#: dnf/cli/output.py:1235 msgctxt "long" msgid "Package" - msgstr "패키지" +-msgstr "패키지" ++msgstr "꾸러미" -#: dnf/cli/output.py:1371 +#: dnf/cli/output.py:1284 @@ -9396,20 +9404,26 @@ index 449f6130..9f37ae13 100644 #, python-format msgid "" "\n" -@@ -3131,292 +3120,276 @@ msgstr "" +@@ -3127,296 +3110,280 @@ msgid "" + "%s\n" + msgstr "" + "\n" +-"트랜잭션 요약\n" ++"연결 요약\n" "%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 ++#: dnf/cli/output.py:1296 dnf/cli/output.py:1814 dnf/cli/output.py:1815 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 ++#: dnf/cli/output.py:1300 dnf/cli/output.py:1823 msgid "Upgrade" - msgstr "업그레이드" +-msgstr "업그레이드" ++msgstr "향상" -#: dnf/cli/output.py:1388 +#: dnf/cli/output.py:1301 @@ -9417,9 +9431,10 @@ index 449f6130..9f37ae13 100644 msgstr "삭제" -#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 ++#: dnf/cli/output.py:1303 dnf/cli/output.py:1821 msgid "Downgrade" - msgstr "다운 그레이드" +-msgstr "다운 그레이드" ++msgstr "하향설치" -#: dnf/cli/output.py:1391 +#: dnf/cli/output.py:1304 @@ -9430,14 +9445,15 @@ index 449f6130..9f37ae13 100644 +#: dnf/cli/output.py:1313 dnf/cli/output.py:1329 msgid "Package" msgid_plural "Packages" - msgstr[0] "패키지" +-msgstr[0] "패키지" ++msgstr[0] "꾸러미" -#: dnf/cli/output.py:1418 +#: dnf/cli/output.py:1331 msgid "Dependent package" msgid_plural "Dependent packages" - msgstr[0] "종속 패키지" - +-msgstr[0] "종속 패키지" +- -#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942 -msgid "Upgraded" -msgstr "업그레이드 됨" @@ -9461,7 +9477,8 @@ index 449f6130..9f37ae13 100644 -#: dnf/cli/output.py:1508 -msgid "Failed" -msgstr "실패하였습니다" -- ++msgstr[0] "종속 꾸러미" + # auto translated by TM merge from project: RHOSP Director Installation and # Usage , version: 11-Korean, DocId: master -#: dnf/cli/output.py:1559 @@ -9486,375 +9503,677 @@ index 449f6130..9f37ae13 100644 #. TRANSLATORS: user names who executed transaction in history command output -#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 ++#: dnf/cli/output.py:1531 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 ++#: dnf/cli/output.py:1533 msgid "ID" msgstr "ID" -#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 ++#: dnf/cli/output.py:1535 msgid "Date and time" msgstr "날짜와 시간" -#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 ++#: dnf/cli/output.py:1536 msgid "Action(s)" msgstr "작업" -#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 ++#: dnf/cli/output.py:1537 msgid "Altered" msgstr "변경됨" -#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 ++#: dnf/cli/output.py:1580 msgid "No transactions" - msgstr "트랜잭션 없음" +-msgstr "트랜잭션 없음" ++msgstr "연결 없음" -#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 ++#: dnf/cli/output.py:1581 dnf/cli/output.py:1597 msgid "Failed history info" msgstr "실패 기록 정보" -#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 ++#: dnf/cli/output.py:1596 msgid "No transaction ID, or package, given" - msgstr "트랜잭션 ID 또는 패키지가 지정되지 않았습니다" +-msgstr "트랜잭션 ID 또는 패키지가 지정되지 않았습니다" ++msgstr "연결 ID 또는 꾸러미가 지정되지 않았습니다" -#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 ++#: dnf/cli/output.py:1654 msgid "Erased" - msgstr "삭제됨" +-msgstr "삭제됨" ++msgstr "제거되었습니다" ++ ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1822 dnf/util.py:616 ++msgid "Downgraded" ++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 ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1824 dnf/util.py:615 +msgid "Upgraded" -+msgstr "업그레이드 됨" ++msgstr "향상되었습니다" + -+#: dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 msgid "Not installed" msgstr "설치되지 않음" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 msgid "Newer" msgstr "최신" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 msgid "Older" msgstr "이전" -#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 ++#: dnf/cli/output.py:1705 dnf/cli/output.py:1707 msgid "Transaction ID :" - msgstr "트랜잭션 ID :" +-msgstr "트랜잭션 ID :" ++msgstr "연결 ID :" -#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 ++#: dnf/cli/output.py:1710 msgid "Begin time :" msgstr "시작 시간 :" -#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 ++#: dnf/cli/output.py:1713 dnf/cli/output.py:1715 msgid "Begin rpmdb :" msgstr "rpmdb 시작 :" -#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 ++#: dnf/cli/output.py:1721 #, python-format msgid "(%u seconds)" msgstr "(%u 초)" -#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 ++#: dnf/cli/output.py:1723 #, python-format msgid "(%u minutes)" msgstr "(%u 분)" -#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 ++#: dnf/cli/output.py:1725 #, python-format msgid "(%u hours)" msgstr "(%u 시간)" -#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 ++#: dnf/cli/output.py:1727 #, python-format msgid "(%u days)" msgstr "(%u 일)" -#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 ++#: dnf/cli/output.py:1728 msgid "End time :" msgstr "종료 시간 :" -#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 ++#: dnf/cli/output.py:1731 dnf/cli/output.py:1733 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 ++#: dnf/cli/output.py:1740 dnf/cli/output.py:1742 msgid "User :" msgstr "사용자 :" -#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1753 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 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1749 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1753 dnf/cli/output.py:1755 dnf/cli/output.py:1757 msgid "Return-Code :" msgstr "반환 코드 :" -#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 ++#: dnf/cli/output.py:1749 dnf/cli/output.py:1757 msgid "Success" msgstr "성공" -#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 ++#: dnf/cli/output.py:1751 msgid "Failures:" msgstr "실패 :" -#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 ++#: dnf/cli/output.py:1755 msgid "Failure:" msgstr "실패:" -#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 ++#: dnf/cli/output.py:1765 dnf/cli/output.py:1767 msgid "Releasever :" - msgstr "Releasever :" +-msgstr "Releasever :" ++msgstr "Releasever :" -#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 ++#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 msgid "Command Line :" msgstr "명령 줄 :" -#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 ++#: dnf/cli/output.py:1779 dnf/cli/output.py:1781 msgid "Comment :" msgstr "댓글 :" -#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 ++#: dnf/cli/output.py:1785 msgid "Transaction performed with:" - msgstr "실행된 트랜잭션:" +-msgstr "실행된 트랜잭션:" ++msgstr "실행된 연결:" -#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 ++#: dnf/cli/output.py:1794 msgid "Packages Altered:" - msgstr "변경된 패키지 :" +-msgstr "변경된 패키지 :" ++msgstr "변경된 꾸러미 :" -#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 ++#: dnf/cli/output.py:1800 msgid "Scriptlet output:" - msgstr "Scriptlet 출력 :" +-msgstr "Scriptlet 출력 :" ++msgstr "스크립트릿 출력 :" -#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 ++#: dnf/cli/output.py:1807 msgid "Errors:" msgstr "오류 :" -#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 ++#: dnf/cli/output.py:1816 msgid "Dep-Install" - msgstr "Dep-Install" +-msgstr "Dep-Install" ++msgstr "설치-시작" -#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 ++#: dnf/cli/output.py:1817 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 ++#: dnf/cli/output.py:1818 dnf/transaction.py:84 dnf/transaction.py:85 msgid "Obsoleting" msgstr "사용 중지" -#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 ++#: dnf/cli/output.py:1819 msgid "Erase" msgstr "삭제" -#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 ++#: dnf/cli/output.py:1820 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이/가 업그레이드됩니다" + msgid "---> Package %s.%s %s will be installed" +-msgstr "---> 패키지 %s.%s %s이/가 설치됩니다" ++msgstr "---> 꾸러미 %s.%s %s가 설치됩니다" --#: dnf/cli/output.py:2020 +-#: dnf/cli/output.py:2018 +#: dnf/cli/output.py:1896 #, python-format - msgid "---> Package %s.%s %s will be erased" - msgstr "---> 패키지 %s.%s %s이/가 제거됩니다" + msgid "---> Package %s.%s %s will be an upgrade" +-msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다" ++msgstr "---> 꾸러미 %s.%s %s가 최신화됩니다" --#: dnf/cli/output.py:2022 +-#: dnf/cli/output.py:2020 +#: dnf/cli/output.py:1898 #, python-format - msgid "---> Package %s.%s %s will be reinstalled" - msgstr "---> 패키지 %s.%s %s이/가 다시 설치됩니다" + msgid "---> Package %s.%s %s will be erased" +-msgstr "---> 패키지 %s.%s %s이/가 제거됩니다" ++msgstr "---> 꾸러미 %s.%s %s가 제거됩니다" --#: dnf/cli/output.py:2024 +-#: dnf/cli/output.py:2022 +#: dnf/cli/output.py:1900 #, python-format - msgid "---> Package %s.%s %s will be a downgrade" - msgstr "---> 패키지 %s.%s %s이/가 다운그레이드됩니다" + msgid "---> Package %s.%s %s will be reinstalled" +-msgstr "---> 패키지 %s.%s %s이/가 다시 설치됩니다" ++msgstr "---> 꾸러미 %s.%s %s가 다시 설치됩니다" --#: dnf/cli/output.py:2026 +-#: dnf/cli/output.py:2024 +#: dnf/cli/output.py:1902 #, python-format - msgid "---> Package %s.%s %s will be obsoleting" - msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다" + msgid "---> Package %s.%s %s will be a downgrade" +-msgstr "---> 패키지 %s.%s %s이/가 다운그레이드됩니다" ++msgstr "---> 꾸러미 %s.%s %s가 하향설치됩니다" --#: dnf/cli/output.py:2028 +-#: dnf/cli/output.py:2026 +#: dnf/cli/output.py:1904 #, python-format - msgid "---> Package %s.%s %s will be upgraded" - msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다" + msgid "---> Package %s.%s %s will be obsoleting" +-msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다" ++msgstr "---> 꾸러미 %s.%s %s가 더 이상 사용되지 않습니다" --#: dnf/cli/output.py:2030 +-#: dnf/cli/output.py:2028 +#: dnf/cli/output.py:1906 + #, python-format + msgid "---> Package %s.%s %s will be upgraded" +-msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다" ++msgstr "---> 꾸러미 %s.%s %s가 최신화됩니다" + +-#: dnf/cli/output.py:2030 ++#: dnf/cli/output.py:1908 #, python-format msgid "---> Package %s.%s %s will be obsoleted" - msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다" +-msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다" ++msgstr "---> 꾸러미 %s.%s %s가 더 이상 사용되지 않습니다" -#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 ++#: dnf/cli/output.py:1917 msgid "--> Starting dependency resolution" msgstr "-> 종석성 해결 시작" -#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 ++#: dnf/cli/output.py:1921 msgid "--> Finished dependency resolution" msgstr "-> 종속성 해결 완료" -#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 ++#: dnf/cli/output.py:1935 dnf/crypto.py:132 #, python-format msgid "" "Importing GPG key 0x%s:\n" -@@ -3503,7 +3476,7 @@ msgstr "모듈 또는 그룹 '%s'이/가 존재하지 않습니다." +@@ -3425,13 +3392,13 @@ msgid "" + " From : %s" + msgstr "" + "GPG키 0x%s 가져오는 중:\n" +-" 사용자 ID : \"%s\"\n" +-" 지문: %s\n" +-" 출처 : %s" ++"사용자 ID : \"%s\"\n" ++"지문: %s\n" ++"출처 : %s" + + #: dnf/cli/utils.py:98 + msgid "Running" +-msgstr "실행중" ++msgstr "실행 중" + + #: dnf/cli/utils.py:99 + msgid "Sleeping" +@@ -3485,29 +3452,27 @@ msgstr "건너 뛰기." + #: dnf/comps.py:196 dnf/comps.py:692 dnf/comps.py:706 + #, python-format + msgid "Module or Group '%s' is not installed." +-msgstr "모듈 또는 그룹 '%s'이/가 설치되지 않았습니다." ++msgstr "모듈 또는 그룹 '%s'가 설치되지 않았습니다." + + #: dnf/comps.py:198 dnf/comps.py:708 + #, python-format + msgid "Module or Group '%s' is not available." +-msgstr "모듈 또는 그룹 '%s'을/를 사용할 수 없습니다." ++msgstr "모듈 또는 그룹 '%s'을 사용 할 수 없습니다." + + #: dnf/comps.py:200 + #, python-format + msgid "Module or Group '%s' does not exist." +-msgstr "모듈 또는 그룹 '%s'이/가 존재하지 않습니다." ++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 "환경 '%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 - #, fuzzy, python-format - #| msgid "Environment '%s' is not installed." ++#, python-format msgid "Environment id '%s' is not installed." -@@ -3614,6 +3587,11 @@ msgstr "repo %s: 0x%s을/를 이미 가져왔습니다" +-msgstr "환경 '%s'이 설치되지 않았습니다." ++msgstr "환경id '%s'가 설치되지 않았습니다." + + #: dnf/comps.py:639 + #, python-format +@@ -3517,19 +3482,23 @@ msgstr "환경 '%s'이 설치되지 않았습니다." + #: dnf/comps.py:641 + #, python-format + msgid "Environment '%s' is not available." +-msgstr "환경 '%s'을/를 사용할 수 없습니다." ++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 "Group id '%s' 가 존재하지 않습니다." + + #: dnf/conf/config.py:136 + #, python-format + msgid "Error parsing '%s': %s" + msgstr "'%s' 구문 분석 중 오류 발생: %s" + ++#: dnf/conf/config.py:151 ++#, python-format ++msgid "Invalid configuration value: %s=%s in %s; %s" ++msgstr "잘못된 구성 값: %s=%s (%s; %s에서)" ++ + #: dnf/conf/config.py:226 + msgid "Could not set cachedir: {}" + msgstr "cachedir를 설정할 수 없습니다: {}" +@@ -3539,7 +3508,7 @@ msgid "" + "Configuration file URL \"{}\" could not be downloaded:\n" + " {}" + msgstr "" +-"구성 파일 URL \"{}\"을 (를) 다운로드 할 수 없습니다:\n" ++"구성 파일 URL \"{}\"를 내려받기 할 수 없습니다:\n" + " {}" + + #: dnf/conf/config.py:355 dnf/conf/config.py:391 +@@ -3550,7 +3519,7 @@ msgstr "알 수 없는 설정 옵션 : %s = %s" + #: dnf/conf/config.py:372 + #, python-format + msgid "Error parsing --setopt with key '%s', value '%s': %s" +-msgstr "키 ‘%s', 값 '%s'을/를 사용하여 --setopt 구문 분석 중 오류 발생: %s" ++msgstr "키 ‘%s', 값 '%s'를 사용하여 --setopt 구문 분석 중 오류 발생: %s" + + #: dnf/conf/config.py:380 + #, python-format +@@ -3564,75 +3533,88 @@ msgstr "잘못되었거나 알 수 없음 \"{}\": {}" + #: dnf/conf/config.py:501 + #, python-format + msgid "Error parsing --setopt with key '%s.%s', value '%s': %s" +-msgstr "키 %s.%s', 값 '%s'을/를 사용하여 --setopt 구문 분석 중 오류 발생: %s" ++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 "Repo %s에 setopt 이전에 %s attr이 없습니다" + +-#: dnf/conf/read.py:51 ++#: dnf/conf/read.py:60 + #, python-format + msgid "Warning: failed loading '%s', skipping." +-msgstr "경고: '%s'을/를 로드하지 못했습니다, 건너 뛰기." ++msgstr "경고: '%s'을 적재하지 못했습니다, 건너 뛰기." + +-#: dnf/conf/read.py:63 ++#: dnf/conf/read.py:72 + msgid "Bad id for repo: {} ({}), byte = {} {}" +-msgstr "리포지터리의 ID가 잘못되었습니다. {} ({}), byte = {} {}" ++msgstr "레포지터리의 ID가 잘못되었습니다. {} ({}), byte = {} {}" + +-#: dnf/conf/read.py:67 ++#: dnf/conf/read.py:76 + msgid "Bad id for repo: {}, byte = {} {}" +-msgstr "리포지터리의 ID가 잘못되었습니다. {}, byte = {} {}" ++msgstr "레포지터리의 ID가 잘못되었습니다. {}, byte = {} {}" + +-#: dnf/conf/read.py:75 ++#: dnf/conf/read.py:84 + msgid "Repository '{}' ({}): Error parsing config: {}" + msgstr "Repository '{}' ({}): 구문 분석 설정 오류: {}" + +-#: dnf/conf/read.py:78 ++#: dnf/conf/read.py:87 + msgid "Repository '{}': Error parsing config: {}" + msgstr "Repository '{}' : 구문 분석 설정 오류: {}" + +-#: dnf/conf/read.py:84 ++#: dnf/conf/read.py:93 + msgid "Repository '{}' ({}) is missing name in configuration, using id." + msgstr "Repository '{}' ({})의 설정에 이름이 누락되어 있습니다. id를 사용하십시오." + +-#: dnf/conf/read.py:87 ++#: dnf/conf/read.py:96 + msgid "Repository '{}' is missing name in configuration, using id." + msgstr "Repository '{}'의 설정에 이름이 누락되어 있습니다. id를 사용하십시오." + +-#: dnf/conf/read.py:104 ++#: dnf/conf/read.py:113 + msgid "Parsing file \"{}\" failed: {}" + msgstr "\"{}\" 파일을 구문 분석하지 못했습니다: {}" + + #: dnf/crypto.py:108 + #, python-format + msgid "repo %s: 0x%s already imported" +-msgstr "repo %s: 0x%s을/를 이미 가져왔습니다" ++msgstr "repo %s: 0x%s를 이미 가져왔습니다" + + #: dnf/crypto.py:115 + #, python-format msgid "repo %s: imported key 0x%s." msgstr "repo %s: 0x%s 키를 가져왔습니다." -+#: dnf/crypto.py:177 +-#: dnf/db/group.py:293 ++#: dnf/crypto.py:145 ++msgid "Verified using DNS record with DNSSEC signature." ++msgstr "DNSSEC 서명이 있는 DNS 레코드를 사용하여 확인됨." ++ ++#: dnf/crypto.py:147 ++msgid "NOT verified using DNS record." ++msgstr "DNS 레코드를 사용하여 확인되지 않음." ++ ++#: dnf/crypto.py:184 +#, python-format +msgid "retrieving repo key for %s unencrypted from %s" -+msgstr "" ++msgstr "%s에서 암호화 하지 않은 %s를 위한 저장소 키 검색" + - #: dnf/db/group.py:293 ++#: dnf/db/group.py:301 msgid "" "No available modular metadata for modular package '{}', it cannot be " -@@ -3698,7 +3676,7 @@ msgid "Modular dependency problem with Defaults:" + "installed on the system" +-msgstr "모듈 패키지 '{}'에 사용 가능한 메타 데이터가 없으며 시스템에 설치할 수 없습니다" ++msgstr "모듈 꾸러미 '{}'에 사용 가능한 메타 자료가 없으며 시스템에 설치 할 수 없습니다" + +-#: dnf/db/group.py:343 ++#: dnf/db/group.py:351 + msgid "No available modular metadata for modular package" +-msgstr "모듈 패키지에 사용 가능한 모듈 메타 데이터가 없습니다" ++msgstr "모듈 꾸러미에 사용 가능한 모듈 메타 자료가 없습니다" + +-#: dnf/db/group.py:377 ++#: dnf/db/group.py:385 + #, python-format + msgid "Will not install a source rpm package (%s)." +-msgstr "소스 RPM패키지를 설치하지 않습니다 (%s)." ++msgstr "소스 RPM 꾸러미를 설치하지 않습니다 (%s)." + + #: dnf/dnssec.py:168 + msgid "" +-"Configuration option 'gpgkey_dns_verification' requires libunbound ({})" +-msgstr "설정 옵션 'gpgkey_dns_verification'에는 libunbound ({})가 필요합니다" ++"Configuration option 'gpgkey_dns_verification' requires python3-unbound ({})" ++msgstr "구성 선택(옵션) 'gpgkey_dns_verification'에는 python3-unbound ({})가 필요합니다" + + #: dnf/dnssec.py:239 + msgid "DNSSEC extension: Key for user " +@@ -3679,11 +3661,11 @@ msgstr "요청 중인 문제 :" + + #: dnf/exceptions.py:115 + msgid "missing packages: " +-msgstr "누락된 패키지: " ++msgstr "누락된 꾸러미: " + + #: dnf/exceptions.py:117 + msgid "broken packages: " +-msgstr "잘못된 패키지: " ++msgstr "잘못된 꾸러미: " + + #: dnf/exceptions.py:119 + msgid "missing groups or modules: " +@@ -3698,7 +3680,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 ++#: dnf/exceptions.py:131 dnf/module/module_base.py:854 msgid "Modular dependency problem:" msgid_plural "Modular dependency problems:" msgstr[0] "모듈 종속성 문제 :" -@@ -3752,8 +3730,8 @@ msgstr "" +@@ -3722,7 +3704,7 @@ msgstr "표시할 것이 없습니다." + + #: dnf/module/__init__.py:28 + msgid "Installing newer version of '{}' than specified. Reason: {}" +-msgstr "지정된 버전보다 새 버전의 '{}'을/를 설치합니다. 이유 : {}" ++msgstr "지정된 버전 보다 새로운 버전의 '{}'를 설치합니다. 이유 : {}" + + #: dnf/module/__init__.py:29 + msgid "Enabled modules: {}." +@@ -3732,7 +3714,47 @@ msgstr "사용 설정된 모듈 : {}." + msgid "No profile specified for '{}', please specify profile." + msgstr "'{}'에 지정된 프로필이 없습니다. 프로필을 지정하십시오." + +-#: dnf/module/module_base.py:33 ++#: dnf/module/exceptions.py:27 ++msgid "No such module: {}" ++msgstr "그런 모듈이 없습니다: {}" ++ ++#: dnf/module/exceptions.py:33 ++msgid "No such stream: {}" ++msgstr "그런 스트림이 없습니다: {}" ++ ++#: dnf/module/exceptions.py:39 ++msgid "No enabled stream for module: {}" ++msgstr "모듈에 대한 활성화된 스트림이 없습니다: {}" ++ ++#: dnf/module/exceptions.py:46 ++msgid "Cannot enable more streams from module '{}' at the same time" ++msgstr "동시에 모듈 '{}'에서 더 많은 스트림을 활성화 할 수 없습니다" ++ ++#: dnf/module/exceptions.py:52 ++msgid "Different stream enabled for module: {}" ++msgstr "모듈에 대해 활성화된 다른 스트림: {}" ++ ++#: dnf/module/exceptions.py:58 ++msgid "No such profile: {}" ++msgstr "그런 프로파일이 없습니다: {}" ++ ++#: dnf/module/exceptions.py:64 ++msgid "Specified profile not installed for {}" ++msgstr "{}를 위한 지정된 프로필이 설치되지 않았습니다" ++ ++#: dnf/module/exceptions.py:70 ++msgid "No stream specified for '{}', please specify stream" ++msgstr "'{}'을 위한 지정된 스트림이 없으며, 스트림을 지정해주세요" ++ ++#: dnf/module/exceptions.py:82 ++msgid "No such profile: {}. No profiles available" ++msgstr "그런 프로파일이 없습니다: {}. 사용 가능한 프로파일이 없습니다" ++ ++#: dnf/module/exceptions.py:88 ++msgid "No profile to remove for '{}'" ++msgstr "제거되는 프로파일이 없습니다('{}'를 위해 )" ++ ++#: dnf/module/module_base.py:35 + msgid "" + "\n" + "\n" +@@ -3742,7 +3764,7 @@ msgstr "" + "\n" + "힌트 : [d] efault, [e] nabled, [x] disabled, [i] stalled" + +-#: dnf/module/module_base.py:34 ++#: dnf/module/module_base.py:36 + msgid "" + "\n" + "\n" +@@ -3752,80 +3774,98 @@ 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 ++#: dnf/module/module_base.py:56 dnf/module/module_base.py:556 ++#: dnf/module/module_base.py:615 dnf/module/module_base.py:681 msgid "Ignoring unnecessary profile: '{}/{}'" msgstr "불필요한 프로파일을 무시합니다: '{}/{}'" -@@ -3762,17 +3740,17 @@ msgstr "불필요한 프로파일을 무시합니다: '{}/{}'" +-#: dnf/module/module_base.py:84 ++#: dnf/module/module_base.py:86 + #, python-brace-format 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 ++#: dnf/module/module_base.py:94 dnf/module/module_base.py:204 #, python-brace-format msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 설치할 수 없습니다" +-msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 설치할 수 없습니다" ++msgstr "실패 방지 저장소 {1}에서 모듈 '{0}’를 설치 할 수 없습니다" -#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 ++#: dnf/module/module_base.py:104 dnf/module/module_base.py:214 msgid "" "Unable to match profile for argument {}. Available profiles for '{}:{}': {}" - msgstr "인수 {}의 프로파일을 찾을 수 없습니다. '{}:{}'에 사용 가능한 프로파일: {}" +-msgstr "인수 {}의 프로파일을 찾을 수 없습니다. '{}:{}'에 사용 가능한 프로파일: {}" ++msgstr "인수 {}의 프로파일을 찾을 수 없습니다. '{}:{}': {} 에 사용 가능한 프로파일" -#: dnf/module/module_base.py:106 -+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216 ++#: dnf/module/module_base.py:108 dnf/module/module_base.py:218 msgid "Unable to match profile for argument {}" msgstr "인수 {}의 프로파일을 찾을 수 없습니다" -@@ -3788,41 +3766,58 @@ msgstr "{} : {} 모듈에 대한 프로파일이 없습니다" +-#: dnf/module/module_base.py:118 ++#: dnf/module/module_base.py:120 + msgid "No default profiles for module {}:{}. Available profiles: {}" + msgstr "{} : {} 모듈에 대한 기본 프로파일이 없습니다. 사용 가능한 프로파일: {}" + +-#: dnf/module/module_base.py:122 ++#: dnf/module/module_base.py:124 + msgid "No profiles for module {}:{}" + msgstr "{} : {} 모듈에 대한 프로파일이 없습니다" + +-#: dnf/module/module_base.py:129 ++#: dnf/module/module_base.py:131 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 ++#: dnf/module/module_base.py:144 dnf/module/module_base.py:247 msgid "Installing module from Fail-Safe repository is not allowed" - msgstr "Fail-Safe 리포지토리에서 모듈을 설치할 수 없습니다" +-msgstr "Fail-Safe 리포지토리에서 모듈을 설치할 수 없습니다" ++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 -+#, fuzzy, python-brace-format -+#| msgid "" -+#| "All matches for argument '{0}' in module '{1}:{2}' are not active" ++#: dnf/module/module_base.py:196 ++#, python-brace-format +msgid "No active matches for argument '{0}' in module '{1}:{2}'" -+msgstr "모듈 '{1}:{2}'의 인수 '{0}'에 대한 모든 일치 항목이 활성화되지 않았습니다" ++msgstr "모듈 '{1}:{2}'의 인수 '{0}'에 대한 일치 항목 없음" + -+#: dnf/module/module_base.py:226 -+#, fuzzy, python-brace-format -+#| msgid "Default profile {} not available in module {}:{}" ++#: dnf/module/module_base.py:228 ++#, python-brace-format +msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'" -+msgstr "{} 모듈에서 기본 프로필 {}을 (를) 사용할 수 없음 : {}" ++msgstr "설치 프로파일'{0}'은 모듈 '{1} 스트림 '{2}'에서 사용 할 수 없습니다" + -+#: dnf/module/module_base.py:265 ++#: dnf/module/module_base.py:267 +msgid "No packages available to distrosync for package name '{}'" -+msgstr "" ++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 ++#: dnf/module/module_base.py:310 dnf/module/module_base.py:461 ++#: dnf/module/module_base.py:486 dnf/module/module_base.py:505 ++#: dnf/module/module_base.py:552 dnf/module/module_base.py:611 ++#: dnf/module/module_base.py:677 dnf/module/module_base.py:840 msgid "Unable to resolve argument {}" msgstr "인수 {}을 (를) 구문 분석할 수 없습니다" @@ -9863,51 +10182,150 @@ index 449f6130..9f37ae13 100644 -msgstr "{} 패키지와 일치하지 않습니다" - -#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 ++#: dnf/module/module_base.py:321 #, python-brace-format msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 업그레이드할 수 없습니다" +-msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 업그레이드할 수 없습니다" ++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 ++#: dnf/module/module_base.py:340 dnf/module/module_base.py:368 msgid "Unable to match profile in argument {}" msgstr "인수 {}에서 프로파일이 일치하지 않습니다" -#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 ++#: dnf/module/module_base.py:348 msgid "Upgrading module from Fail-Safe repository is not allowed" - msgstr "Fail-Safe 리포지토리에서 모듈을 업그레이드할 수 없습니다" +-msgstr "Fail-Safe 리포지토리에서 모듈을 업그레이드할 수 없습니다" ++msgstr "실패-방지 저장소에서 모듈을 향상 할 수 없습니다" -#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 ++#: dnf/module/module_base.py:422 ++#, python-brace-format ++msgid "" ++"Argument '{argument}' matches {stream_count} streams ('{streams}') of module" ++" '{module}', but none of the streams are enabled or default" ++msgstr "" ++"인수 '{argument}'는 {stream_count} 스트림 ('{streams}')과 일치합니다 (모듈의 '{module}'), " ++"하지만 활성화 되었거나 지정된 스트림이 없습니다" ++ ++#: dnf/module/module_base.py:509 msgid "" "Only module name is required. Ignoring unneeded information in argument: " "'{}'" msgstr "모듈 이름만 필요합니다. '{}'인수에서 불필요한 정보를 무시합니다" -#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 +-#, python-format +-msgid "%s: %s check failed: %s vs %s" +-msgstr "%s: %s 확인 실패 : %s 대 %s" ++#: dnf/module/module_base.py:841 +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 "트랜잭션 테스트 중에 오류가 발생했습니다." ++msgstr "{} 꾸러미와 일치하지 않습니다" + #. empty file is invalid json format + #: dnf/persistor.py:54 +@@ -3836,12 +3876,12 @@ msgstr "%s는 빈 파일입니다" + #: dnf/persistor.py:91 + #, python-format + msgid "Failed to load expired repos cache: %s" +-msgstr "" ++msgstr "만료된 저장소 cache:%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." +@@ -3861,27 +3901,27 @@ msgstr "구문 분석에 실패했습니다. %s" + msgid "Loaded plugins: %s" + msgstr "로드된 플러그인 : %s" + +-#: dnf/plugin.py:199 ++#: dnf/plugin.py:211 + #, python-format + msgid "Failed loading plugin \"%s\": %s" +-msgstr "플러그인 \"%s\"을/를 불러오지 못했습니다: %s" ++msgstr "플러그인 \"%s\"를 불러오지 못했습니다: %s" + +-#: dnf/plugin.py:231 ++#: dnf/plugin.py:243 + msgid "No matches found for the following enable plugin patterns: {}" + msgstr "다음의 활성 플러그인 패턴과 일치하는 항목이 없습니다: {}" + +-#: dnf/plugin.py:235 ++#: dnf/plugin.py:247 + msgid "No matches found for the following disable plugin patterns: {}" + msgstr "다음의 비활성화 플러그인 패턴과 일치하는 항목이 없습니다: {}" + + #: dnf/repo.py:84 + #, python-format + msgid "no matching payload factory for %s" +-msgstr "%s와 일치하는 payload factory가 없습니다." ++msgstr "%s와 일치하는 payload factory가 없습니다" + + #: dnf/repo.py:111 + msgid "Already downloaded" +-msgstr "이미 다운로드 됨" ++msgstr "이미 내려받음" + + #. pinging mirrors, this might take a while + #: dnf/repo.py:347 +@@ -3899,15 +3939,32 @@ msgstr "%s 리포지토리 활성화" + msgid "Added %s repo from %s" + msgstr "%s 에서 %s repo를 추가했습니다" + ++#: dnf/rpm/miscutils.py:35 ++#, python-brace-format ++msgid "" ++"Using rpmkeys executable from {path} to verify signature for package: " ++"{package}." ++msgstr "{path}에서 실행 할 수 있는 rpmkeys를 사용하여 꾸러미 서명 확인: {package}." ++ ++#: dnf/rpm/miscutils.py:39 ++msgid "Cannot find rpmkeys executable to verify signatures." ++msgstr "서명을 확인하기 위해 실행 할 수 있는 rpmkeys를 찾을 수 없습니다." ++ + #: dnf/rpm/transaction.py:119 + msgid "Errors occurred during test transaction." +-msgstr "트랜잭션 테스트 중에 오류가 발생했습니다." ++msgstr "연결 시험 중에 오류가 발생했습니다." ++ +#: dnf/sack.py:47 +msgid "" +"allow_vendor_change is disabled. This option is currently not supported for " +"downgrade and distro-sync commands" -+msgstr "" -+ ++msgstr "허용_공급업체_변화는 사용 할 수 없습니다. 이 선택은 현재 다운드레이드와 distro-sync 명령을 지원하지 않습니다" + #. TRANSLATORS: This is for a single package currently being downgraded. #: dnf/transaction.py:80 msgctxt "currently" -@@ -3949,163 +3950,199 @@ msgstr "scriptlet 실행 중" + msgid "Downgrading" +-msgstr "다운그레이드 중" ++msgstr "하향 설치 중" + + #: dnf/transaction.py:81 dnf/transaction.py:88 dnf/transaction.py:93 + #: dnf/transaction.py:95 +@@ -3935,7 +3992,7 @@ msgstr "삭제 중" + #: dnf/transaction.py:92 + msgctxt "currently" + msgid "Upgrading" +-msgstr "업그레이드 중" ++msgstr "향상 중" + + #: dnf/transaction.py:96 + msgid "Verifying" +@@ -3943,168 +4000,202 @@ msgstr "확인 중" + + #: dnf/transaction.py:97 + msgid "Running scriptlet" +-msgstr "scriptlet 실행 중" ++msgstr "스크립트릿 실행 중" + + #: dnf/transaction.py:99 msgid "Preparing" msgstr "준비 중" @@ -9915,32 +10333,33 @@ index 449f6130..9f37ae13 100644 +#: 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 "" ++msgstr "다음 문제는 파일에서 연결 응답 할 때에 발생합니다 \"{filename}\":" -#: 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 "트랜잭션 중에 오류가 발생했습니다." ++msgstr "연결 중에 오류가 발생했습니다:" -#: dnf/transaction_sr.py:87 +#: dnf/transaction_sr.py:89 #, python-brace-format msgid "Invalid major version \"{major}\", number expected." - msgstr "" +-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 "" ++msgstr "잘못된 하위 버전 \"{minor}\", 번호가 예상됩니다." -#: dnf/transaction_sr.py:101 +#: dnf/transaction_sr.py:103 @@ -9948,54 +10367,62 @@ index 449f6130..9f37ae13 100644 msgid "" "Incompatible major version \"{major}\", supported major version is " "\"{major_supp}\"." - msgstr "" +-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 "" ++msgstr "연결 지연 인수의 충돌은 명시됩니다: 파일이름, 자료" + +#: dnf/transaction_sr.py:265 #, python-brace-format msgid "Unexpected type of \"{id}\", {exp} expected." - msgstr "" +-msgstr "" ++msgstr "예상치 못한 유형 \"{id}\", {exp} 가 예상된다." -#: dnf/transaction_sr.py:250 +#: dnf/transaction_sr.py:271 #, python-brace-format msgid "Missing key \"{key}\"." - msgstr "" +-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 "" ++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 "" ++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 "" ++msgstr "꾸러미 \"{nevra}\"를 위해 NEVRA를 구문 분석 할 수 없습니다." -#: dnf/transaction_sr.py:286 +#: dnf/transaction_sr.py:321 #, python-brace-format msgid "Cannot find rpm nevra \"{nevra}\"." - msgstr "" +-msgstr "" ++msgstr "rpm nevra \"{nevra}\"를 찾을 수 없습니다." -#: dnf/transaction_sr.py:301 +#: dnf/transaction_sr.py:336 #, python-brace-format msgid "Package \"{na}\" is already installed for action \"{action}\"." - msgstr "" +-msgstr "" ++msgstr "꾸러미 \"{na}\"는 활동 \"{action}\"를 위해 이미 설치되어 있습니다." -#: dnf/transaction_sr.py:311 +#: dnf/transaction_sr.py:345 @@ -10003,46 +10430,56 @@ index 449f6130..9f37ae13 100644 msgid "" "Package nevra \"{nevra}\" not available in repositories for action " "\"{action}\"." - msgstr "" +-msgstr "" ++msgstr "꾸러미 nervra \"{nevra}\"는 실행 \"{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 "" ++msgstr "꾸러미 nevra\"{nevra}\"는 활동 \"{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 "" ++msgstr "rpm nevra \"{nevra}\"를 위해 기대하지 않는 꾸러미 활동 \"{action}\"의 값." -#: dnf/transaction_sr.py:343 +-#, fuzzy, python-format +-#| msgid "Group_id '%s' does not exist." +#: dnf/transaction_sr.py:377 - #, fuzzy, python-format - #| msgid "Group_id '%s' does not exist." ++#, python-format msgid "Group id '%s' is not available." - msgstr "Group_id '%s' 존재하지 않는다." +-msgstr "Group_id '%s' 존재하지 않는다." ++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 "" +-msgstr "" ++msgstr "group.packages에 있는 객체 키 \"{key}\" 누락." -#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387 +-#, fuzzy, python-format +-#| msgid "Environment '%s' is not installed." +#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421 - #, fuzzy, python-format - #| msgid "Environment '%s' is not installed." ++#, python-format msgid "Group id '%s' is not installed." - msgstr "환경 '%s'이 설치되지 않았습니다." +-msgstr "환경 '%s'이 설치되지 않았습니다." ++msgstr "그룹 '%s'는 설치되어 있지 않습니다." -#: dnf/transaction_sr.py:398 +-#, fuzzy, python-format +-#| msgid "Environment '%s' is not installed." +#: dnf/transaction_sr.py:432 - #, fuzzy, python-format - #| msgid "Environment '%s' is not installed." ++#, python-format msgid "Environment id '%s' is not available." - msgstr "환경 '%s'이 설치되지 않았습니다." +-msgstr "환경 '%s'이 설치되지 않았습니다." ++msgstr "환경 id '%s'는 사용 할 수 없습니다." -#: dnf/transaction_sr.py:422 +#: dnf/transaction_sr.py:456 @@ -10050,37 +10487,43 @@ index 449f6130..9f37ae13 100644 msgid "" "Invalid value \"{group_type}\" of environments.groups.group_type, only " "\"mandatory\" or \"optional\" is supported." - msgstr "" +-msgstr "" ++msgstr "잘못된 environments.groups.group_type의 값 \"{group_type}\", \"필 수\" 또는 \"선택\"만 지원합니다." -#: dnf/transaction_sr.py:430 +#: dnf/transaction_sr.py:464 #, python-brace-format msgid "Missing object key \"{key}\" in environments.groups." - msgstr "" +-msgstr "" ++msgstr "환경 그룹에서 누락된 객체 키 \"{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 "" ++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 "" ++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 "" ++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 "" ++msgstr "환경에 누락된 객체 키 \"{key}\"." -#: dnf/transaction_sr.py:581 +#: dnf/transaction_sr.py:615 @@ -10088,44 +10531,49 @@ index 449f6130..9f37ae13 100644 msgid "" "Package nevra \"{nevra}\", which is not present in the transaction file, was" " pulled into the transaction." - msgstr "" +-msgstr "" ++msgstr "꾸러미 nevra \"{nevra}\", 연겨 파일에 존재하지 않는 것은 연결로 가져왔습니다." -#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 ++#: dnf/util.py:419 dnf/util.py:421 msgid "Problem" msgstr "문제" -#: dnf/util.py:444 -+#: dnf/util.py:446 ++#: dnf/util.py:472 msgid "TransactionItem not found for key: {}" msgstr "{} 키에 대한 TransactionItem을 찾을 수 없습니다" -#: dnf/util.py:454 -+#: dnf/util.py:456 ++#: dnf/util.py:482 msgid "TransactionSWDBItem not found for key: {}" msgstr "{} 키에 대한 TransactionSWDBItem을 찾을 수 없습니다" -#: dnf/util.py:457 -+#: dnf/util.py:459 ++#: dnf/util.py:485 msgid "Errors occurred during transaction." - msgstr "트랜잭션 중에 오류가 발생했습니다." - -+#: dnf/util.py:595 -+msgid "Reinstalled" -+msgstr "다시 설치됨" +-msgstr "트랜잭션 중에 오류가 발생했습니다." ++msgstr "연결 중에 오류가 발생했습니다." + -+#: dnf/util.py:596 ++#: dnf/util.py:621 ++msgid "Reinstalled" ++msgstr "다시 설치되었습니다" ++ ++#: dnf/util.py:622 +msgid "Skipped" +msgstr "건너 뛰기됨" + -+#: dnf/util.py:597 ++#: dnf/util.py:623 +msgid "Removed" -+msgstr "제거됨" ++msgstr "제거되었습니다" + -+#: dnf/util.py:600 ++#: dnf/util.py:626 +msgid "Failed" +msgstr "실패하였습니다" + ++#~ msgid "%s: %s check failed: %s vs %s" ++#~ msgstr "%s: %s 확인 실패 : %s 대 %s" ++ +#~ msgid "Action not handled: {}" +#~ msgstr "작업이 처리되지 않았습니다: {}" + @@ -10137,15 +10585,29 @@ index 449f6130..9f37ae13 100644 + +#~ 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 +index 7ede4ed8..9f8da6a6 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po -@@ -26,20 +26,21 @@ +@@ -13,33 +13,34 @@ + # Qi Fan , 2016. #zanata + # Tommy He , 2016. #zanata + # mosquito , 2016. #zanata +-# Charles Lee , 2017. #zanata, 2020. ++# Charles Lee , 2017. #zanata, 2020, 2021. + # Pany , 2017. #zanata + # cheng ye <18969068329@163.com>, 2017. #zanata + # lexuge , 2017. #zanata + # n0vad3v , 2017. #zanata + # zhouxiaobo , 2017. #zanata +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021. + # Pany , 2018. #zanata + # Qiyu Yan , 2018. #zanata + # Qiyu Yan , 2019. #zanata # Anonymous , 2020. # Hongqiao Chen , 2020. # Harry Chen , 2020. @@ -10158,8 +10620,8 @@ index 7ede4ed8..d1c433a3 100644 -"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" ++"POT-Creation-Date: 2021-08-11 16:00+0200\n" ++"PO-Revision-Date: 2021-09-06 17:24+0000\n" +"Last-Translator: Sundeep Anand \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -10168,16 +10630,25 @@ index 7ede4ed8..d1c433a3 100644 "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" ++"X-Generator: Weblate 4.8\n" #: dnf/automatic/emitter.py:32 #, python-format +@@ -86,7 +87,7 @@ msgstr "使用 '%s' 发送邮件失败: %s" + msgid "Failed to execute command '%s': returned %d" + msgstr "无法执行命令 '%s' :返回 %d" + +-#: dnf/automatic/main.py:164 dnf/conf/config.py:151 ++#: dnf/automatic/main.py:164 + #, python-format + msgid "Unknown configuration value: %s=%s in %s; %s" + msgstr "未知配置值: %s=%s 在 %s 中; %s" @@ -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 ++#: dnf/automatic/main.py:237 dnf/cli/cli.py:305 msgid "GPG check FAILED" msgstr "GPG 检查失败" @@ -10194,358 +10665,367 @@ index 7ede4ed8..d1c433a3 100644 #: dnf/automatic/main.py:315 msgid "System is off-line." -@@ -123,7 +124,7 @@ msgstr "系统离线。" +@@ -123,388 +124,374 @@ msgstr "系统离线。" msgid "Error: %s" msgstr "错误:%s" -#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 ++#: dnf/base.py:148 dnf/base.py:477 dnf/base.py:479 msgid "loading repo '{}' failure: {}" msgstr "加载仓库 '{}' 失败:{}" -@@ -131,236 +132,236 @@ msgstr "加载仓库 '{}' 失败:{}" +-#: dnf/base.py:148 ++#: dnf/base.py:150 msgid "Loading repository '{}' has failed" msgstr "加载仓库 '{}' 失败" -#: dnf/base.py:320 -+#: dnf/base.py:322 ++#: dnf/base.py:327 msgid "Metadata timer caching disabled when running on metered connection." msgstr "在使用按流量计费的连接时禁用元数据计时缓存。" -#: dnf/base.py:325 -+#: dnf/base.py:327 ++#: dnf/base.py:332 msgid "Metadata timer caching disabled when running on a battery." msgstr "在使用电池时禁用元数据计时缓存。" -#: dnf/base.py:330 -+#: dnf/base.py:332 ++#: dnf/base.py:337 msgid "Metadata timer caching disabled." msgstr "元数据计时缓存已禁用。" -#: dnf/base.py:335 -+#: dnf/base.py:337 ++#: dnf/base.py:342 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 ++#: dnf/base.py:348 dnf/cli/commands/__init__.py:91 msgid "There are no enabled repositories in \"{}\"." msgstr "在\"{}\"中没有被启用的仓库。" -#: dnf/base.py:348 -+#: dnf/base.py:350 ++#: dnf/base.py:355 #, python-format msgid "%s: will never be expired and will not be refreshed." msgstr "%s: 永远不过期并不会被刷新。" -#: dnf/base.py:350 -+#: dnf/base.py:352 ++#: dnf/base.py:357 #, 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 ++#: dnf/base.py:361 #, 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 ++#: dnf/base.py:365 #, python-format msgid "%s: will expire after %d seconds." msgstr "%s: 将会在 %d 秒后过期。" #. performs the md sync -#: dnf/base.py:364 -+#: dnf/base.py:366 ++#: dnf/base.py:371 msgid "Metadata cache created." msgstr "元数据缓存已建立。" -#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 ++#: dnf/base.py:404 dnf/base.py:471 #, python-format msgid "%s: using metadata from %s." msgstr "%s:正在使用截止于 %s 的元数据。" -#: dnf/base.py:409 -+#: dnf/base.py:411 dnf/base.py:479 ++#: dnf/base.py:416 dnf/base.py:484 #, python-format msgid "Ignoring repositories: %s" msgstr "正在忽略仓库:%s" -#: dnf/base.py:412 -+#: dnf/base.py:414 ++#: dnf/base.py:419 #, python-format msgid "Last metadata expiration check: %s ago on %s." msgstr "上次元数据过期检查:%s 前,执行于 %s。" -#: dnf/base.py:443 -+#: dnf/base.py:507 ++#: dnf/base.py:512 msgid "" "The downloaded packages were saved in cache until the next successful " "transaction." msgstr "下载的软件包保存在缓存中,直到下次成功执行事务。" -#: dnf/base.py:445 -+#: dnf/base.py:509 ++#: dnf/base.py:514 #, python-format msgid "You can remove cached packages by executing '%s'." msgstr "您可以通过执行 '%s' 删除软件包缓存。" -#: dnf/base.py:535 -+#: dnf/base.py:599 ++#: dnf/base.py:606 #, python-format msgid "Invalid tsflag in config file: %s" msgstr "配置文件 %s 中使用 tsflag 是错误的" -#: dnf/base.py:591 -+#: dnf/base.py:655 ++#: dnf/base.py:662 #, python-format msgid "Failed to add groups file for repository: %s - %s" msgstr "为仓库 %s 添加组文件时失败:%s" -#: dnf/base.py:823 -+#: dnf/base.py:887 ++#: dnf/base.py:904 msgid "Running transaction check" msgstr "运行事务检查" -#: dnf/base.py:831 -+#: dnf/base.py:895 ++#: dnf/base.py:912 msgid "Error: transaction check vs depsolve:" msgstr "错误:事务检查与依赖解决错误:" -#: dnf/base.py:837 -+#: dnf/base.py:901 ++#: dnf/base.py:918 msgid "Transaction check succeeded." msgstr "事务检查成功。" -#: dnf/base.py:840 -+#: dnf/base.py:904 ++#: dnf/base.py:921 msgid "Running transaction test" msgstr "运行事务测试" -#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 ++#: dnf/base.py:931 dnf/base.py:1082 msgid "RPM: {}" msgstr "RPM软件包: {}" -#: dnf/base.py:851 -+#: dnf/base.py:915 ++#: dnf/base.py:932 msgid "Transaction test error:" msgstr "事物测试失败:" -#: dnf/base.py:862 -+#: dnf/base.py:926 ++#: dnf/base.py:943 msgid "Transaction test succeeded." msgstr "事务测试成功。" -#: dnf/base.py:883 -+#: dnf/base.py:947 ++#: dnf/base.py:964 msgid "Running transaction" msgstr "运行事务" -#: dnf/base.py:911 -+#: dnf/base.py:984 ++#: dnf/base.py:1001 msgid "Disk Requirements:" msgstr "磁盘需求:" -#: dnf/base.py:914 -+#: dnf/base.py:987 ++#: dnf/base.py:1004 #, 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 ++#: dnf/base.py:1011 msgid "Error Summary" msgstr "错误汇总" -#: dnf/base.py:947 -+#: dnf/base.py:1020 ++#: dnf/base.py:1037 #, 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 ++#: dnf/base.py:1083 dnf/base.py:1091 msgid "Could not run transaction." msgstr "不能执行事务。" -#: dnf/base.py:996 -+#: dnf/base.py:1069 ++#: dnf/base.py:1086 msgid "Transaction couldn't start:" msgstr "事务无法启动:" -#: dnf/base.py:1010 -+#: dnf/base.py:1083 ++#: dnf/base.py:1100 #, python-format msgid "Failed to remove transaction file %s" msgstr "移除事务文件 %s 失败" -#: dnf/base.py:1092 -+#: dnf/base.py:1165 ++#: dnf/base.py:1182 msgid "Some packages were not downloaded. Retrying." msgstr "某些软件包没有被下载。正在重试。" -#: dnf/base.py:1122 -+#: dnf/base.py:1195 ++#: dnf/base.py:1212 #, 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 ++#: dnf/base.py:1215 #, 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 ++#: dnf/base.py:1257 msgid "Cannot add local packages, because transaction job already exists" msgstr "由于事物已经存在,无法添加本地软件包" -#: dnf/base.py:1181 -+#: dnf/base.py:1254 ++#: dnf/base.py:1271 msgid "Could not open: {}" msgstr "无法打开: {}" -#: dnf/base.py:1219 -+#: dnf/base.py:1292 ++#: dnf/base.py:1309 #, python-format msgid "Public key for %s is not installed" msgstr "%s 的公钥没有安装" -#: dnf/base.py:1223 -+#: dnf/base.py:1296 ++#: dnf/base.py:1313 #, python-format msgid "Problem opening package %s" msgstr "打开软件包 %s 出现问题" -#: dnf/base.py:1231 -+#: dnf/base.py:1304 ++#: dnf/base.py:1321 #, python-format msgid "Public key for %s is not trusted" msgstr "%s 的公钥不可信任" -#: dnf/base.py:1235 -+#: dnf/base.py:1308 ++#: dnf/base.py:1325 #, python-format msgid "Package %s is not signed" msgstr "软件包 %s 没有签名" -#: dnf/base.py:1265 -+#: dnf/base.py:1338 ++#: dnf/base.py:1355 #, python-format msgid "Cannot remove %s" msgstr "无法删除 %s" -#: dnf/base.py:1269 -+#: dnf/base.py:1342 ++#: dnf/base.py:1359 #, python-format msgid "%s removed" msgstr "%s 已删除" -#: dnf/base.py:1549 -+#: dnf/base.py:1622 ++#: dnf/base.py:1639 msgid "No match for group package \"{}\"" msgstr "没有和组 \"{}\" 匹配的" -#: dnf/base.py:1635 -+#: dnf/base.py:1708 ++#: dnf/base.py:1725 #, 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/__init__.py:499 dnf/cli/commands/__init__.py:592 +-#: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 ++#: dnf/base.py:1748 dnf/cli/cli.py:221 dnf/cli/commands/__init__.py:437 ++#: dnf/cli/commands/__init__.py:494 dnf/cli/commands/__init__.py:587 ++#: dnf/cli/commands/__init__.py:636 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 ++#: dnf/base.py:1766 msgid "No groups marked for removal." msgstr "没有软件包组需要移除。" -#: dnf/base.py:1710 -+#: dnf/base.py:1783 ++#: dnf/base.py:1800 msgid "No group marked for upgrade." msgstr "没有标记为要升级的组。" -#: dnf/base.py:1925 -+#: dnf/base.py:1997 ++#: dnf/base.py:2014 #, 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 并没有能够安装,无法进行降级操作。" +-#: 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 ++#: dnf/base.py:2016 dnf/base.py:2035 dnf/base.py:2048 dnf/base.py:2075 ++#: dnf/base.py:2128 dnf/base.py:2136 dnf/base.py:2270 dnf/cli/cli.py:417 ++#: dnf/cli/commands/__init__.py:420 dnf/cli/commands/__init__.py:477 ++#: dnf/cli/commands/__init__.py:581 dnf/cli/commands/__init__.py:628 ++#: dnf/cli/commands/__init__.py:706 dnf/cli/commands/install.py:147 + #: dnf/cli/commands/reinstall.py:70 dnf/cli/commands/reinstall.py:84 +-#: dnf/cli/commands/upgrade.py:110 dnf/cli/commands/upgrade.py:121 ++#: dnf/cli/commands/upgrade.py:105 dnf/cli/commands/upgrade.py:116 + #, python-format msgid "No match for argument: %s" msgstr "未找到匹配的参数: %s" -#: dnf/base.py:1934 -+#: dnf/base.py:2006 ++#: dnf/base.py:2023 #, python-format msgid "Package %s of lower version already installed, cannot downgrade it." msgstr "软件包 %s 的低版本已经安装,无法进行降级。" -#: dnf/base.py:1957 -+#: dnf/base.py:2029 ++#: dnf/base.py:2046 #, python-format msgid "Package %s not installed, cannot reinstall it." msgstr "软件包 %s 未能够安装成功,无法进行重新安装。" -#: dnf/base.py:1972 -+#: dnf/base.py:2044 ++#: dnf/base.py:2061 #, python-format msgid "File %s is a source package and cannot be updated, ignoring." msgstr "%s 文件无法被升级,已忽略。" -#: dnf/base.py:1978 -+#: dnf/base.py:2050 ++#: dnf/base.py:2072 #, python-format msgid "Package %s not installed, cannot update it." msgstr "软件包 %s 未安装,无法更新。" -#: dnf/base.py:1987 -+#: dnf/base.py:2059 ++#: dnf/base.py:2082 #, 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 ++#: dnf/base.py:2125 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 ++#: dnf/base.py:2131 #, 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 ++#: dnf/base.py:2156 #, 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/base.py:2174 dnf/cli/commands/install.py:136 #: dnf/cli/commands/remove.py:133 #, python-format msgid "Not a valid form: %s" @@ -10553,19 +11033,19 @@ index 7ede4ed8..d1c433a3 100644 -#: 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/base.py:2189 dnf/cli/commands/__init__.py:676 +#: 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 ++#: dnf/base.py:2277 dnf/cli/cli.py:428 #, python-format msgid "Packages for argument %s available, but not installed." msgstr "针对于参数 %s 的软件包可用, 但是目前没有安装。" -#: dnf/base.py:2184 -+#: dnf/base.py:2255 ++#: dnf/base.py:2282 #, python-format msgid "Package %s of lowest version already installed, cannot downgrade it." msgstr "软件包 %s 的最低版本已经安装,无法再进行降级。" @@ -10585,79 +11065,79 @@ index 7ede4ed8..d1c433a3 100644 -msgstr "没有能够与之匹配的软件包" - -#: dnf/base.py:2290 -+#: dnf/base.py:2302 ++#: dnf/base.py:2382 msgid "No security updates needed, but {} update available" msgstr "没有必须的安全更新, 但是 {} 的更新可用" -#: dnf/base.py:2292 -+#: dnf/base.py:2304 ++#: dnf/base.py:2384 msgid "No security updates needed, but {} updates available" msgstr "没有必须的安全更新, 但是 {} 的更新可用" -#: dnf/base.py:2296 -+#: dnf/base.py:2308 ++#: dnf/base.py:2388 msgid "No security updates needed for \"{}\", but {} update available" msgstr "没有针对于\"{}\" 所必须的安全更新, 但是 {} 的更新可用" -#: dnf/base.py:2298 -+#: dnf/base.py:2310 ++#: dnf/base.py:2390 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 ++#: dnf/base.py:2411 #, python-format msgid "Unable to retrieve a key for a commandline package: %s" -msgstr "" -+msgstr "无法获取命令行软件包的密钥: %s" ++msgstr "无法获取来自命令行的软件包的密钥:%s" -#: dnf/base.py:2327 -+#: dnf/base.py:2339 ++#: dnf/base.py:2419 #, python-format msgid ". Failing package is: %s" msgstr ". 失败的软件包是:%s" -#: dnf/base.py:2328 -+#: dnf/base.py:2340 ++#: dnf/base.py:2420 #, python-format msgid "GPG Keys are configured as: %s" msgstr "GPG密钥配置为:%s" -#: dnf/base.py:2340 -+#: dnf/base.py:2352 ++#: dnf/base.py:2432 #, 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 ++#: dnf/base.py:2468 msgid "The key has been approved." msgstr "密钥已被确认。" -#: dnf/base.py:2376 -+#: dnf/base.py:2388 ++#: dnf/base.py:2471 msgid "The key has been rejected." msgstr "密钥已被拒绝。" -#: dnf/base.py:2409 -+#: dnf/base.py:2421 ++#: dnf/base.py:2504 #, python-format msgid "Key import failed (code %d)" msgstr "导入公钥失败(代码 %d)" -#: dnf/base.py:2411 -+#: dnf/base.py:2423 ++#: dnf/base.py:2506 msgid "Key imported successfully" msgstr "导入公钥成功" -#: dnf/base.py:2415 -+#: dnf/base.py:2427 ++#: dnf/base.py:2510 msgid "Didn't install any keys" msgstr "没有安装任何公钥" -#: dnf/base.py:2418 -+#: dnf/base.py:2430 ++#: dnf/base.py:2513 #, python-format msgid "" "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" @@ -10666,59 +11146,59 @@ index 7ede4ed8..d1c433a3 100644 "请检查此仓库的公钥 URL 是否配置正确。" -#: dnf/base.py:2429 -+#: dnf/base.py:2441 ++#: dnf/base.py:2524 msgid "Import of key(s) didn't help, wrong key(s)?" msgstr "导入的密钥没有公钥,错误的公钥?" -#: dnf/base.py:2482 -+#: dnf/base.py:2494 ++#: dnf/base.py:2577 msgid " * Maybe you meant: {}" msgstr " * 可能您的意思是:{}" -#: dnf/base.py:2514 -+#: dnf/base.py:2526 ++#: dnf/base.py:2609 msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" msgstr "软件包 \"{}\"(来自于本地仓库 \"{}\")的 checksum 不正确" -#: dnf/base.py:2517 -+#: dnf/base.py:2529 ++#: dnf/base.py:2612 msgid "Some packages from local repository have incorrect checksum" msgstr "本地仓库的一些软件包校验值(checksum)不正确,无法确定软件包完整" -#: dnf/base.py:2520 -+#: dnf/base.py:2532 ++#: dnf/base.py:2615 msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" msgstr "软件包 \"{}\"(来自仓库 \"{}\")的 checksum 不正确" -#: dnf/base.py:2523 -+#: dnf/base.py:2535 ++#: dnf/base.py:2618 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 ++#: dnf/base.py:2636 dnf/base.py:2656 msgid "No match for argument" msgstr "未找到匹配的参数" -#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 ++#: dnf/base.py:2644 dnf/base.py:2664 msgid "All matches were filtered out by exclude filtering for argument" msgstr "由于您的搜索参数,所有相关结果都已被滤掉" -#: dnf/base.py:2551 -+#: dnf/base.py:2563 ++#: dnf/base.py:2646 msgid "All matches were filtered out by modular filtering for argument" msgstr "所有的匹配结果均已经被参数的模块化过滤条件筛除" -#: dnf/base.py:2567 -+#: dnf/base.py:2579 ++#: dnf/base.py:2662 msgid "All matches were installed from a different repository for argument" msgstr "已从另一个仓库安装了参数的所有匹配" -#: dnf/base.py:2583 -+#: dnf/base.py:2626 ++#: dnf/base.py:2709 #, python-format msgid "Package %s is already installed." msgstr "软件包 %s 已安装。" @@ -10728,12 +11208,12 @@ index 7ede4ed8..d1c433a3 100644 -#: 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 ++#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:804 ++#: dnf/cli/cli.py:808 dnf/cli/commands/alias.py:108 #, python-format msgid "Config error: %s" msgstr "配置错误:%s" -@@ -607,7 +594,7 @@ msgid "" +@@ -607,44 +594,44 @@ msgid "" "stream '{2}'" msgstr "这个操作会把模块 '{0}' 从流 '{1}' 切换到流 '{2}'" @@ -10741,19 +11221,24 @@ index 7ede4ed8..d1c433a3 100644 +#: 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 ' 命令重置模块。在您重置模块之后,就可以安装其他的流。" +-"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." ++"It is not possible to switch enabled streams of a module unless explicitly enabled via configuration option module_stream_switch.\n" ++"It is recommended to rather 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 ' 命令重置模块。在您重置模块之后,就可以安装其他的流。" ++"无法切换已启用模块的流,除非显式的通过配置选项 module_stream_switch 启用。\n" ++"推荐直接移除来自模块的所有已安装内容,然后通过 '{prog} module reset ' 命令重置模块。在您重置模块之后,就可以安装其他的流。" -#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 ++#: dnf/cli/cli.py:212 #, python-brace-format msgid "{prog} will only download packages for the transaction." msgstr "{prog}将仅会从事务下载软件包。" -#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 ++#: dnf/cli/cli.py:215 #, python-brace-format msgid "" "{prog} will only download packages, install gpg keys, and check the " @@ -10761,27 +11246,27 @@ index 7ede4ed8..d1c433a3 100644 msgstr "{prog}将仅会下载软件包,导入gpg密钥并检查事务。" -#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 ++#: dnf/cli/cli.py:219 msgid "Operation aborted." msgstr "操作中止。" -#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 ++#: dnf/cli/cli.py:226 msgid "Downloading Packages:" msgstr "下载软件包:" -#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 ++#: dnf/cli/cli.py:232 msgid "Error downloading packages:" msgstr "下载软件包出错 :" -#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 ++#: dnf/cli/cli.py:264 msgid "Transaction failed" msgstr "事务失败" -#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 ++#: dnf/cli/cli.py:287 msgid "" "Refusing to automatically import keys when running unattended.\n" "Use \"-y\" to override." @@ -10790,67 +11275,67 @@ index 7ede4ed8..d1c433a3 100644 "指定 \"-y\" 改变这个行为。" -#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 ++#: dnf/cli/cli.py:337 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 ++#: dnf/cli/cli.py:370 dnf/cli/cli.py:511 dnf/cli/cli.py:517 msgid "Obsoleting Packages" msgstr "取代的软件包" -#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 ++#: dnf/cli/cli.py:399 msgid "No packages marked for distribution synchronization." msgstr "没有软件包需要发行版同步。" -#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 ++#: dnf/cli/cli.py:425 dnf/cli/commands/group.py:395 +#, python-format +msgid "No package %s available." +msgstr "没有可用的软件包 %s。" + -+#: dnf/cli/cli.py:433 ++#: dnf/cli/cli.py:434 msgid "No packages marked for downgrade." msgstr "没有标记要降级的软件包。" -#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 ++#: dnf/cli/cli.py:485 msgid "Installed Packages" msgstr "已安装的软件包" -#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 ++#: dnf/cli/cli.py:493 msgid "Available Packages" msgstr "可安装的软件包" -#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 ++#: dnf/cli/cli.py:497 msgid "Autoremove Packages" msgstr "自动移除软件包" -#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 ++#: dnf/cli/cli.py:499 msgid "Extra Packages" msgstr "更多软件包" -#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 ++#: dnf/cli/cli.py:503 msgid "Available Upgrades" msgstr "可用升级" -#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 ++#: dnf/cli/cli.py:519 msgid "Recently Added Packages" msgstr "最近添加的软件包" -#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 ++#: dnf/cli/cli.py:523 msgid "No matching Packages to list" msgstr "没有匹配的软件包可以列出" -#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 ++#: dnf/cli/cli.py:604 msgid "No Matches found" msgstr "没有找到匹配的软件包" @@ -10881,32 +11366,32 @@ index 7ede4ed8..d1c433a3 100644 -msgstr "撤销事务 {},从 {}" - -#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 ++#: dnf/cli/cli.py:671 dnf/cli/commands/shell.py:237 #, python-format msgid "Unknown repo: '%s'" msgstr "未知仓库:'%s'" -#: dnf/cli/cli.py:783 -+#: dnf/cli/cli.py:684 ++#: dnf/cli/cli.py:685 #, python-format msgid "No repository match: %s" msgstr "没有仓库匹配: %s" -#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 ++#: dnf/cli/cli.py:719 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 ++#: dnf/cli/cli.py:749 #, 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 ++#: dnf/cli/cli.py:752 #, python-format, python-brace-format msgid "" "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" @@ -10914,7 +11399,7 @@ index 7ede4ed8..d1c433a3 100644 msgstr "它可能是一个{PROG}插件命令,尝试:\"{prog} install 'dnf-command(%s)'\"" -#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 ++#: dnf/cli/cli.py:756 #, python-brace-format msgid "" "It could be a {prog} plugin command, but loading of plugins is currently " @@ -10922,7 +11407,7 @@ index 7ede4ed8..d1c433a3 100644 msgstr "这可能是一个 {prog} 插件的命令,但是插件的加载当前已经禁用。" -#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 ++#: dnf/cli/cli.py:814 msgid "" "--destdir or --downloaddir must be used with --downloadonly or download or " "system-upgrade command." @@ -10931,7 +11416,7 @@ index 7ede4ed8..d1c433a3 100644 "命令一起使用。" -#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 ++#: dnf/cli/cli.py:820 msgid "" "--enable, --set-enabled and --disable, --set-disabled must be used with " "config-manager command." @@ -10939,65 +11424,205 @@ index 7ede4ed8..d1c433a3 100644 "--enable、--set-enabled 和 --disable、--set-disabled 必须和 config-manager 命令一起使用。" -#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 ++#: dnf/cli/cli.py:902 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 ++#: dnf/cli/cli.py:922 msgid "Config file \"{}\" does not exist" msgstr "配置文件 \"{}\" 不存在" -#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 ++#: dnf/cli/cli.py:942 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 ++#: dnf/cli/cli.py:1016 dnf/cli/commands/repoquery.py:471 msgid "argument {}: not allowed with argument {}" msgstr "参数 {}:不允许与参数 {} 一起使用" -#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 ++#: dnf/cli/cli.py:1023 #, python-format msgid "Command \"%s\" already defined" msgstr "命令 \"%s\" 已有定义" -#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 ++#: dnf/cli/cli.py:1043 msgid "Excludes in dnf.conf: " msgstr "在 dnf.conf 中排除: " -#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 ++#: dnf/cli/cli.py:1046 msgid "Includes in dnf.conf: " msgstr "在 dnf.conf 中包括: " -#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 ++#: dnf/cli/cli.py:1049 msgid "Excludes in repo " msgstr "在 repo 中排除 " -#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 ++#: dnf/cli/cli.py:1052 msgid "Includes in repo " msgstr "在 repo 中包括 " -@@ -870,7 +836,7 @@ msgid "show all packages (default)" +@@ -865,38 +831,38 @@ msgstr "问题仓库:%s" + msgid "display details about a package or group of packages" + msgstr "显示关于软件包或软件包组的详细信息" + +-#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:740 ++#: dnf/cli/commands/__init__.py:168 dnf/cli/commands/__init__.py:735 + msgid "show all packages (default)" msgstr "显示所有的软件包(默认)" - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 +-#: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 -#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 ++#: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:738 ++#: dnf/cli/commands/module.py:376 msgid "show only available packages" msgstr "只显示可用的软件包" -@@ -1195,78 +1161,78 @@ msgstr "显示或使用组信息" +-#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:746 ++#: dnf/cli/commands/__init__.py:174 dnf/cli/commands/__init__.py:741 + msgid "show only installed packages" + msgstr "只显示已安装的软件包" + +-#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:749 ++#: dnf/cli/commands/__init__.py:177 dnf/cli/commands/__init__.py:744 + msgid "show only extras packages" + msgstr "只显示额外的软件包" + + #: dnf/cli/commands/__init__.py:180 dnf/cli/commands/__init__.py:183 +-#: dnf/cli/commands/__init__.py:752 dnf/cli/commands/__init__.py:755 ++#: dnf/cli/commands/__init__.py:747 dnf/cli/commands/__init__.py:750 + msgid "show only upgrades packages" + msgstr "只显示需要被升级的软件包" + +-#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:758 ++#: dnf/cli/commands/__init__.py:186 dnf/cli/commands/__init__.py:753 + msgid "show only autoremove packages" + msgstr "只显示需要被删除的软件包" + +-#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:761 ++#: dnf/cli/commands/__init__.py:189 dnf/cli/commands/__init__.py:756 + msgid "show only recently changed packages" + msgstr "限制最近被改变的软件包" + + #: dnf/cli/commands/__init__.py:190 dnf/cli/commands/__init__.py:265 +-#: dnf/cli/commands/__init__.py:774 dnf/cli/commands/autoremove.py:48 ++#: dnf/cli/commands/__init__.py:769 dnf/cli/commands/autoremove.py:48 + #: 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" +@@ -934,70 +900,70 @@ msgstr "检查是否有软件包升级" + msgid "show changelogs before update" + msgstr "在更新前显示Changelog" + +-#: dnf/cli/commands/__init__.py:361 dnf/cli/commands/__init__.py:414 +-#: dnf/cli/commands/__init__.py:470 ++#: dnf/cli/commands/__init__.py:356 dnf/cli/commands/__init__.py:409 ++#: dnf/cli/commands/__init__.py:465 + msgid "No package available." + msgstr "没有可用软件包。" + +-#: dnf/cli/commands/__init__.py:376 ++#: dnf/cli/commands/__init__.py:371 + msgid "No packages marked for install." + msgstr "没有标记要安装的软件包。" + +-#: dnf/cli/commands/__init__.py:412 ++#: dnf/cli/commands/__init__.py:407 + msgid "No package installed." + msgstr "没有软件包安装。" + +-#: dnf/cli/commands/__init__.py:432 dnf/cli/commands/__init__.py:489 ++#: dnf/cli/commands/__init__.py:427 dnf/cli/commands/__init__.py:484 + #: dnf/cli/commands/reinstall.py:91 + #, python-format + msgid " (from %s)" + msgstr " (来自 %s)" + +-#: dnf/cli/commands/__init__.py:433 dnf/cli/commands/__init__.py:490 ++#: dnf/cli/commands/__init__.py:428 dnf/cli/commands/__init__.py:485 + #: dnf/cli/commands/reinstall.py:92 dnf/cli/commands/remove.py:105 + #, python-format + msgid "Installed package %s%s not available." + msgstr "已安装的软件包%s%s已不可用。" + +-#: dnf/cli/commands/__init__.py:467 dnf/cli/commands/__init__.py:576 +-#: dnf/cli/commands/__init__.py:619 dnf/cli/commands/__init__.py:666 ++#: dnf/cli/commands/__init__.py:462 dnf/cli/commands/__init__.py:571 ++#: dnf/cli/commands/__init__.py:614 dnf/cli/commands/__init__.py:661 + msgid "No package installed from the repository." + msgstr "没有从仓库安装任何软件包。" + +-#: dnf/cli/commands/__init__.py:530 dnf/cli/commands/reinstall.py:101 ++#: dnf/cli/commands/__init__.py:525 dnf/cli/commands/reinstall.py:101 + msgid "No packages marked for reinstall." + msgstr "没有标记要重新安装的软件包。" + +-#: dnf/cli/commands/__init__.py:716 dnf/cli/commands/upgrade.py:89 ++#: dnf/cli/commands/__init__.py:711 dnf/cli/commands/upgrade.py:84 + msgid "No packages marked for upgrade." + msgstr "没有软件包需要升级。" + +-#: dnf/cli/commands/__init__.py:726 ++#: dnf/cli/commands/__init__.py:721 + msgid "run commands on top of all packages in given repository" + msgstr "对指定仓库中的所有软件包运行命令" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "REPOID" + msgstr "REPOID" + +-#: dnf/cli/commands/__init__.py:765 ++#: dnf/cli/commands/__init__.py:760 + msgid "Repository ID" + msgstr "仓库ID" + +-#: dnf/cli/commands/__init__.py:777 dnf/cli/commands/mark.py:48 ++#: dnf/cli/commands/__init__.py:772 dnf/cli/commands/mark.py:48 + #: dnf/cli/commands/updateinfo.py:108 + msgid "Package specification" + msgstr "软件包规格" + +-#: dnf/cli/commands/__init__.py:801 ++#: dnf/cli/commands/__init__.py:796 + msgid "display a helpful usage message" + msgstr "显示一个有帮助的用法信息" + +-#: dnf/cli/commands/__init__.py:805 ++#: dnf/cli/commands/__init__.py:800 + msgid "COMMAND" + msgstr "命令" + +-#: dnf/cli/commands/__init__.py:806 ++#: dnf/cli/commands/__init__.py:801 + #, python-brace-format + msgid "{prog} command to get help for" + msgstr "要获得帮助的 {prog} 命令" +@@ -1168,8 +1134,10 @@ msgid "Waiting for process with pid %d to finish." + msgstr "正在等待 pid 为%d的进程退出。" + + #: dnf/cli/commands/deplist.py:32 +-msgid "List package's dependencies and what packages provide them" +-msgstr "列出软件包的依赖关系和提供这些软件包的源" ++msgid "" ++"[deprecated, use repoquery --deplist] List package's dependencies and what " ++"packages provide them" ++msgstr "[已弃用,请使用 repoquery --deplist] 列出软件包的依赖关系和提供这些软件包的源" + + #: dnf/cli/commands/distrosync.py:32 + msgid "synchronize installed packages to the latest available versions" +@@ -1195,78 +1163,78 @@ msgstr "显示或使用组信息" msgid "No group data available for configured repositories." msgstr "配置的软件源不包含组数据。" @@ -11095,26 +11720,26 @@ index 7ede4ed8..d1c433a3 100644 msgid "Unable to find a mandatory group package." msgstr "无法找到一个必须的组软件包。" -@@ -1276,25 +1242,25 @@ msgstr "显示或使用事务历史" +@@ -1276,25 +1244,25 @@ msgstr "显示或使用事务历史" #: dnf/cli/commands/history.py:66 msgid "For the store command, file path to store the transaction to" -msgstr "" -+msgstr "对于 store 命令,将事务保存到的文件路径" ++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 命令,不检查与事务中匹配的安装的软件包" ++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 命令,不检查提取到事务中的额外的软件包" ++msgstr "对于 replay 命令,不要检查被拉入事务的额外的包" #: dnf/cli/commands/history.py:74 msgid "" @@ -11125,7 +11750,7 @@ index 7ede4ed8..d1c433a3 100644 #: dnf/cli/commands/history.py:94 msgid "" -@@ -1305,41 +1271,64 @@ msgstr "" +@@ -1305,41 +1273,64 @@ msgstr "" "'{}' 需要一个事务 ID 或软件包名。" #: dnf/cli/commands/history.py:101 @@ -11133,7 +11758,7 @@ index 7ede4ed8..d1c433a3 100644 -#| msgid "No transaction ID or package name given." msgid "No transaction file name given." -msgstr "没有提供事务 ID 或软件包名。" -+msgstr "没有给定事务文件名称。" ++msgstr "没有指定事务文件名。" #: dnf/cli/commands/history.py:103 -#, fuzzy @@ -11177,7 +11802,7 @@ index 7ede4ed8..d1c433a3 100644 +#: dnf/cli/commands/history.py:179 +#, python-brace-format +msgid "Transaction ID \"{0}\" not found." -+msgstr "没有找到事务 ID \"{0}\"。" ++msgstr "事务 ID \"{0}\" 未找到。" + +#: dnf/cli/commands/history.py:185 +msgid "Found more than one transaction ID!" @@ -11201,7 +11826,7 @@ index 7ede4ed8..d1c433a3 100644 msgid "" "Invalid transaction ID range definition '{}'.\n" "Use '..'." -@@ -1347,7 +1336,7 @@ msgstr "" +@@ -1347,7 +1338,7 @@ msgstr "" "无效的事务 ID 范围定义 '{}'。\n" "使用 '..'。" @@ -11210,7 +11835,7 @@ index 7ede4ed8..d1c433a3 100644 msgid "" "Can't convert '{}' to transaction ID.\n" "Use '', 'last', 'last-'." -@@ -1355,40 +1344,29 @@ msgstr "" +@@ -1355,40 +1346,29 @@ msgstr "" "无法将 '{}' 转换为事务 ID。\n" "请使用 ''、'last'、'last-'。" @@ -11243,7 +11868,7 @@ index 7ede4ed8..d1c433a3 100644 +#: dnf/cli/commands/history.py:367 msgid "Transaction saved to {}." -msgstr "事务失败" -+msgstr "事务保存到 {}。" ++msgstr "事务已保存至 {}。" -#: dnf/cli/commands/history.py:326 -#, fuzzy @@ -11251,7 +11876,7 @@ index 7ede4ed8..d1c433a3 100644 +#: dnf/cli/commands/history.py:370 msgid "Error storing transaction: {}" -msgstr "事务过程中出现错误。" -+msgstr "存储事务出错:{}" ++msgstr "存储事务时出现错误:{}" -#: dnf/cli/commands/history.py:350 -msgid "" @@ -11259,11 +11884,11 @@ index 7ede4ed8..d1c433a3 100644 -msgstr "" +#: dnf/cli/commands/history.py:386 +msgid "Warning, the following problems occurred while running a transaction:" -+msgstr "警告,在运行事务时发生以下问题:" ++msgstr "警告,在运行事务时出现了下列问题:" #: dnf/cli/commands/install.py:47 msgid "install a package or packages on your system" -@@ -1407,7 +1385,7 @@ msgstr "没有任何匹配" +@@ -1407,7 +1387,7 @@ msgstr "没有任何匹配" msgid "Not a valid rpm file path: %s" msgstr "RPM文件路径错误:%s" @@ -11272,7 +11897,7 @@ index 7ede4ed8..d1c433a3 100644 #, python-brace-format msgid "There are following alternatives for \"{0}\": {1}" msgstr "以下是 \"{0}\" 的替代 : {1}" -@@ -1450,7 +1428,7 @@ msgid "%s marked as group installed." +@@ -1450,7 +1430,7 @@ msgid "%s marked as group installed." msgstr "%s 已标记为已安装软件组。" #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129 @@ -11281,63 +11906,122 @@ index 7ede4ed8..d1c433a3 100644 msgid "Error:" msgstr "错误:" -@@ -1506,42 +1484,46 @@ msgid "Package {} belongs to multiple modules, skipping" +@@ -1459,89 +1439,93 @@ msgstr "错误:" + msgid "Package %s is not installed." + msgstr "软件包 %s 尚未安装。" + +-#: dnf/cli/commands/module.py:51 ++#: dnf/cli/commands/module.py:54 + msgid "" + "Only module name, stream, architecture or profile is used. Ignoring unneeded" + " information in argument: '{}'" + msgstr "仅使用模块名称、流、架构或者配置文件。忽略参数中不需要的信息:'{}'" + +-#: dnf/cli/commands/module.py:77 ++#: dnf/cli/commands/module.py:80 + msgid "list all module streams, profiles and states" + msgstr "列出所有模块流、配置文件以及状态" + +-#: dnf/cli/commands/module.py:105 dnf/cli/commands/module.py:128 ++#: dnf/cli/commands/module.py:108 dnf/cli/commands/module.py:131 + msgid "No matching Modules to list" + msgstr "没有匹配的模块可以列出" + +-#: dnf/cli/commands/module.py:111 ++#: dnf/cli/commands/module.py:114 + msgid "print detailed information about a module" + msgstr "打印关于一个模块的详细信息" + +-#: dnf/cli/commands/module.py:133 ++#: dnf/cli/commands/module.py:136 + msgid "enable a module stream" + msgstr "启用一个模块流" + +-#: dnf/cli/commands/module.py:157 ++#: dnf/cli/commands/module.py:160 + msgid "disable a module with all its streams" + msgstr "停用一个模块及其所有的流" + +-#: dnf/cli/commands/module.py:181 ++#: dnf/cli/commands/module.py:184 + msgid "reset a module" + msgstr "重置一个模块" + +-#: dnf/cli/commands/module.py:202 ++#: dnf/cli/commands/module.py:205 + msgid "install a module profile including its packages" + msgstr "安装一个包含其软件包的模块配置文件" + +-#: dnf/cli/commands/module.py:223 ++#: dnf/cli/commands/module.py:226 + msgid "update packages associated with an active stream" + msgstr "升级与一个已激活的流相关联的软件包" + +-#: dnf/cli/commands/module.py:240 ++#: dnf/cli/commands/module.py:243 + msgid "remove installed module profiles and their packages" + msgstr "移除已经安装的模块配置文件及其软件包" + +-#: dnf/cli/commands/module.py:264 ++#: dnf/cli/commands/module.py:267 + msgid "Package {} belongs to multiple modules, skipping" msgstr "软件包 {} 属于多个模块,正在跳过" - #: dnf/cli/commands/module.py:277 +-#: dnf/cli/commands/module.py:277 ++#: dnf/cli/commands/module.py:280 +msgid "switch a module to a stream and distrosync rpm packages" -+msgstr "将模块切换到流和 distrosync rpm 软件包" ++msgstr "切换一个模块到某个流并且对 rpm 软件包进行 distrosync" + -+#: dnf/cli/commands/module.py:299 ++#: dnf/cli/commands/module.py:302 msgid "list modular packages" msgstr "列出模块包" -#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 ++#: dnf/cli/commands/module.py:317 msgid "list packages belonging to a module" msgstr "列出属于一个模块的软件包" -#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 ++#: dnf/cli/commands/module.py:352 msgid "Interact with Modules." msgstr "与模块交互。" -#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 ++#: dnf/cli/commands/module.py:365 msgid "show only enabled modules" msgstr "只显示启用的模块" -#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 ++#: dnf/cli/commands/module.py:368 msgid "show only disabled modules" msgstr "只显示禁用的模块" -#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 ++#: dnf/cli/commands/module.py:371 msgid "show only installed modules or packages" msgstr "只显示已安装的模块或者软件包" -#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 ++#: dnf/cli/commands/module.py:374 msgid "show profile content" msgstr "显示档案内容" -#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 ++#: dnf/cli/commands/module.py:379 msgid "remove all modular packages" msgstr "移除所有模块包" -#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 ++#: dnf/cli/commands/module.py:389 msgid "Module specification" msgstr "模块规格" -#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 ++#: dnf/cli/commands/module.py:411 msgid "{} {} {}: too few arguments" msgstr "{} {} {}: 参数太少" -@@ -2026,22 +2008,22 @@ msgstr "KEYWORD" +@@ -2026,22 +2010,22 @@ msgstr "KEYWORD" msgid "Keyword to search for" msgstr "要搜索的关键字" @@ -11364,7 +12048,7 @@ index 7ede4ed8..d1c433a3 100644 msgid "URL" msgstr "URL" -@@ -2184,16 +2166,16 @@ msgstr "" +@@ -2184,16 +2168,16 @@ msgstr "" "run 解析以及运行事务集\n" "exit (或 quit) 退出 shell" @@ -11384,18 +12068,18 @@ index 7ede4ed8..d1c433a3 100644 msgid "Leaving Shell" msgstr "离开终端" -@@ -2384,8 +2366,8 @@ msgstr "严重性" +@@ -2384,8 +2368,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 ++#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 dnf/util.py:617 msgid "Installed" msgstr "已安装" -@@ -2706,13 +2688,13 @@ msgstr "无法编码参数 '%s': %s" +@@ -2706,13 +2690,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. @@ -11411,7 +12095,7 @@ index 7ede4ed8..d1c433a3 100644 msgid "Epoch" msgstr "时期" -@@ -2720,38 +2702,38 @@ msgstr "时期" +@@ -2720,38 +2704,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. @@ -11456,7 +12140,7 @@ index 7ede4ed8..d1c433a3 100644 msgctxt "long" msgid "Size" msgstr "大小" -@@ -2760,32 +2742,32 @@ msgstr "大小" +@@ -2760,32 +2744,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. @@ -11494,7 +12178,7 @@ index 7ede4ed8..d1c433a3 100644 msgid "From repo" msgstr "来自仓库" -@@ -2793,312 +2775,308 @@ msgstr "来自仓库" +@@ -2793,312 +2777,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. @@ -11874,7 +12558,7 @@ index 7ede4ed8..d1c433a3 100644 #, python-format msgid "" "Skipping packages with conflicts:\n" -@@ -3107,12 +3085,12 @@ msgstr "" +@@ -3107,12 +3087,12 @@ msgstr "" "跳过有冲突的软件包:\n" "(添加 '%s' 至命令行来强制升级)" @@ -11889,7 +12573,7 @@ index 7ede4ed8..d1c433a3 100644 msgid " or part of a group" msgstr " 或一个组的一部分" -@@ -3120,22 +3098,22 @@ msgstr " 或一个组的一部分" +@@ -3120,22 +3100,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. @@ -11916,17 +12600,17 @@ index 7ede4ed8..d1c433a3 100644 #, python-format msgid "" "\n" -@@ -3147,287 +3125,271 @@ msgstr "" +@@ -3147,287 +3127,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 ++#: dnf/cli/output.py:1296 dnf/cli/output.py:1814 dnf/cli/output.py:1815 msgid "Install" msgstr "安装" -#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 ++#: dnf/cli/output.py:1300 dnf/cli/output.py:1823 msgid "Upgrade" msgstr "升级" @@ -11936,7 +12620,7 @@ index 7ede4ed8..d1c433a3 100644 msgstr "移除" -#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 ++#: dnf/cli/output.py:1303 dnf/cli/output.py:1821 msgid "Downgrade" msgstr "降级" @@ -12003,278 +12687,278 @@ index 7ede4ed8..d1c433a3 100644 #. TRANSLATORS: user names who executed transaction in history command output -#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 ++#: dnf/cli/output.py:1531 msgid "User name" msgstr "用户名" -#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 ++#: dnf/cli/output.py:1533 msgid "ID" msgstr "ID" -#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 ++#: dnf/cli/output.py:1535 msgid "Date and time" msgstr "日期和时间" -#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 ++#: dnf/cli/output.py:1536 msgid "Action(s)" msgstr "操作" -#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 ++#: dnf/cli/output.py:1537 msgid "Altered" msgstr "更改" -#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 ++#: dnf/cli/output.py:1580 msgid "No transactions" msgstr "没有事务" -#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 ++#: dnf/cli/output.py:1581 dnf/cli/output.py:1597 msgid "Failed history info" msgstr "失败的历史信息" -#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 ++#: dnf/cli/output.py:1596 msgid "No transaction ID, or package, given" msgstr "未指定事务 ID、或者软件包" -#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 ++#: dnf/cli/output.py:1654 msgid "Erased" msgstr "已删除" -#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1822 dnf/util.py:616 +msgid "Downgraded" +msgstr "已降级" + -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 ++#: dnf/cli/output.py:1655 dnf/cli/output.py:1824 dnf/util.py:615 +msgid "Upgraded" +msgstr "已升级" + -+#: dnf/cli/output.py:1654 ++#: dnf/cli/output.py:1656 msgid "Not installed" msgstr "未安装" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 msgid "Newer" msgstr "较早的" -#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 ++#: dnf/cli/output.py:1657 msgid "Older" msgstr "较老的" -#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 ++#: dnf/cli/output.py:1705 dnf/cli/output.py:1707 msgid "Transaction ID :" msgstr "事务 ID:" -#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 ++#: dnf/cli/output.py:1710 msgid "Begin time :" msgstr "起始时间 :" -#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 ++#: dnf/cli/output.py:1713 dnf/cli/output.py:1715 msgid "Begin rpmdb :" msgstr "起始 RPM 数据库 :" -#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 ++#: dnf/cli/output.py:1721 #, python-format msgid "(%u seconds)" msgstr "(%u 秒)" -#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 ++#: dnf/cli/output.py:1723 #, python-format msgid "(%u minutes)" msgstr "(%u 分钟)" -#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 ++#: dnf/cli/output.py:1725 #, python-format msgid "(%u hours)" msgstr "(%u 小时)" -#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 ++#: dnf/cli/output.py:1727 #, python-format msgid "(%u days)" msgstr "(%u 天)" -#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 ++#: dnf/cli/output.py:1728 msgid "End time :" msgstr "结束时间 :" -#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 ++#: dnf/cli/output.py:1731 dnf/cli/output.py:1733 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 ++#: dnf/cli/output.py:1740 dnf/cli/output.py:1742 msgid "User :" msgstr "用户 :" -#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1753 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 ++#: dnf/cli/output.py:1746 dnf/cli/output.py:1749 dnf/cli/output.py:1751 ++#: dnf/cli/output.py:1753 dnf/cli/output.py:1755 dnf/cli/output.py:1757 msgid "Return-Code :" msgstr "返回码 :" -#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 ++#: dnf/cli/output.py:1749 dnf/cli/output.py:1757 msgid "Success" msgstr "成功" -#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 ++#: dnf/cli/output.py:1751 msgid "Failures:" msgstr "失败:" -#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 ++#: dnf/cli/output.py:1755 msgid "Failure:" msgstr "失败:" -#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 ++#: dnf/cli/output.py:1765 dnf/cli/output.py:1767 msgid "Releasever :" msgstr "Releasever :" -#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 ++#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 msgid "Command Line :" msgstr "命令行 :" -#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 ++#: dnf/cli/output.py:1779 dnf/cli/output.py:1781 msgid "Comment :" msgstr "注释 :" -#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 ++#: dnf/cli/output.py:1785 msgid "Transaction performed with:" msgstr "事务完成由:" -#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 ++#: dnf/cli/output.py:1794 msgid "Packages Altered:" msgstr "已改变的包:" -#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 ++#: dnf/cli/output.py:1800 msgid "Scriptlet output:" msgstr "Scriptlet 输出:" -#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 ++#: dnf/cli/output.py:1807 msgid "Errors:" msgstr "错误:" -#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 ++#: dnf/cli/output.py:1816 msgid "Dep-Install" msgstr "依赖安装" -#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 ++#: dnf/cli/output.py:1817 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 ++#: dnf/cli/output.py:1818 dnf/transaction.py:84 dnf/transaction.py:85 msgid "Obsoleting" msgstr "废弃" -#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 ++#: dnf/cli/output.py:1819 msgid "Erase" msgstr "删除" -#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 ++#: dnf/cli/output.py:1820 msgid "Reinstall" msgstr "重装" -#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 ++#: dnf/cli/output.py:1894 #, python-format msgid "---> Package %s.%s %s will be installed" msgstr "---> 软件包 %s.%s %s 将会被安装" -#: dnf/cli/output.py:2018 -+#: dnf/cli/output.py:1894 ++#: dnf/cli/output.py:1896 #, 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 ++#: dnf/cli/output.py:1898 #, python-format msgid "---> Package %s.%s %s will be erased" msgstr "---> 软件包 %s.%s %s 将会被清除" -#: dnf/cli/output.py:2022 -+#: dnf/cli/output.py:1898 ++#: dnf/cli/output.py:1900 #, python-format msgid "---> Package %s.%s %s will be reinstalled" msgstr "---> 软件包 %s.%s %s 将会被重新安装" -#: dnf/cli/output.py:2024 -+#: dnf/cli/output.py:1900 ++#: dnf/cli/output.py:1902 #, 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 ++#: dnf/cli/output.py:1904 #, python-format msgid "---> Package %s.%s %s will be obsoleting" msgstr "---> 软件包 %s.%s %s 将会废弃" -#: dnf/cli/output.py:2028 -+#: dnf/cli/output.py:1904 ++#: dnf/cli/output.py:1906 #, python-format msgid "---> Package %s.%s %s will be upgraded" msgstr "---> 软件包 %s.%s %s 将会被升级" -#: dnf/cli/output.py:2030 -+#: dnf/cli/output.py:1906 ++#: dnf/cli/output.py:1908 #, python-format msgid "---> Package %s.%s %s will be obsoleted" msgstr "---> 软件包 %s.%s %s 将会被废弃" -#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 ++#: dnf/cli/output.py:1917 msgid "--> Starting dependency resolution" msgstr "--> 开始解决依赖关系" -#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 ++#: dnf/cli/output.py:1921 msgid "--> Finished dependency resolution" msgstr "--> 依赖关系解决完成" -#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 ++#: dnf/cli/output.py:1935 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." +@@ -3509,16 +3473,14 @@ msgid "Module or Group '%s' does not exist." msgstr "模块或者组 '%s' 不存在。" #: dnf/comps.py:599 @@ -12296,7 +12980,7 @@ index 7ede4ed8..d1c433a3 100644 #: dnf/comps.py:639 #, python-format -@@ -3531,10 +3491,9 @@ msgid "Environment '%s' is not available." +@@ -3531,16 +3493,20 @@ msgid "Environment '%s' is not available." msgstr "环境 '%s' 不可用。" #: dnf/comps.py:673 @@ -12309,77 +12993,225 @@ index 7ede4ed8..d1c433a3 100644 #: dnf/conf/config.py:136 #, python-format -@@ -3593,7 +3552,7 @@ msgstr "repo 的 id 无效: {} ({}), byte = {} {}" + msgid "Error parsing '%s': %s" + msgstr "解析 “%s” 时错误: %s" - #: dnf/conf/read.py:67 ++#: dnf/conf/config.py:151 ++#, python-format ++msgid "Invalid configuration value: %s=%s in %s; %s" ++msgstr "无效配置值: %s=%s 在 %s 中; %s" ++ + #: dnf/conf/config.py:226 + msgid "Could not set cachedir: {}" + msgstr "不能设置 cachedir: {}" +@@ -3582,36 +3548,36 @@ msgstr "解析 --setopt 时出现错误,键为 '%s.%s', 值是 '%s': %s" + msgid "Repo %s did not have a %s attr. before setopt" + msgstr "Repo %s 在 setopt 前没有一个 %s 属性" + +-#: dnf/conf/read.py:51 ++#: dnf/conf/read.py:60 + #, python-format + msgid "Warning: failed loading '%s', skipping." + msgstr "警告:加载 '%s' 失败,跳过。" + +-#: dnf/conf/read.py:63 ++#: dnf/conf/read.py:72 + msgid "Bad id for repo: {} ({}), byte = {} {}" + msgstr "repo 的 id 无效: {} ({}), byte = {} {}" + +-#: dnf/conf/read.py:67 ++#: dnf/conf/read.py:76 msgid "Bad id for repo: {}, byte = {} {}" -msgstr "repo 的 id 无效: %s, byte = %s %d" +msgstr "repo 的 id 无效: {}, byte = {} {}" - #: dnf/conf/read.py:75 +-#: dnf/conf/read.py:75 ++#: dnf/conf/read.py:84 msgid "Repository '{}' ({}): Error parsing config: {}" -@@ -3625,6 +3584,11 @@ msgstr "repo %s: 0x%s 已被导入" + msgstr "仓库 '{}' ({}): 配置解析时出错: {}" + +-#: dnf/conf/read.py:78 ++#: dnf/conf/read.py:87 + msgid "Repository '{}': Error parsing config: {}" + msgstr "仓库 '{}': 配置解析时出错: {}" + +-#: dnf/conf/read.py:84 ++#: dnf/conf/read.py:93 + msgid "Repository '{}' ({}) is missing name in configuration, using id." + msgstr "仓库 '{}' ({}) 在配置中缺少名称,将使用 id。" + +-#: dnf/conf/read.py:87 ++#: dnf/conf/read.py:96 + msgid "Repository '{}' is missing name in configuration, using id." + msgstr "仓库 '{}' 在配置中缺少名称,将使用 id。" + +-#: dnf/conf/read.py:104 ++#: dnf/conf/read.py:113 + msgid "Parsing file \"{}\" failed: {}" + msgstr "解析文件 \"{}\" 失败:{}" + +@@ -3625,25 +3591,38 @@ msgstr "repo %s: 0x%s 已被导入" msgid "repo %s: imported key 0x%s." msgstr "repo %s: 已导入密钥 0x%s。" -+#: dnf/crypto.py:177 +-#: dnf/db/group.py:293 ++#: dnf/crypto.py:145 ++msgid "Verified using DNS record with DNSSEC signature." ++msgstr "已经通过被 DNSSEC 签名的 DNS 记录验证。" ++ ++#: dnf/crypto.py:147 ++msgid "NOT verified using DNS record." ++msgstr "并未被 DNS 记录验证。" ++ ++#: dnf/crypto.py:184 +#, python-format +msgid "retrieving repo key for %s unencrypted from %s" +msgstr "为 %s 从 %s 获取的 repo 密钥未加密" + - #: dnf/db/group.py:293 ++#: dnf/db/group.py:301 msgid "" "No available modular metadata for modular package '{}', it cannot be " -@@ -3707,7 +3671,7 @@ msgid "Modular dependency problem with Defaults:" + "installed on the system" + msgstr "对于模块软件包 '{}' 没有可用的模块元数据,它将不能被安装至此系统上" + +-#: dnf/db/group.py:343 ++#: dnf/db/group.py:351 + msgid "No available modular metadata for modular package" + msgstr "对于模块软件包没有可用的模块元数据" + +-#: dnf/db/group.py:377 ++#: dnf/db/group.py:385 + #, python-format + msgid "Will not install a source rpm package (%s)." + msgstr "将不安装一个源码 RPM 软件包 (%s)。" + + #: dnf/dnssec.py:168 + msgid "" +-"Configuration option 'gpgkey_dns_verification' requires libunbound ({})" +-msgstr "配置文件选项 'gpgkey_dns_verification' 要求 libunbound ({})" ++"Configuration option 'gpgkey_dns_verification' requires python3-unbound ({})" ++msgstr "配置文件选项 'gpgkey_dns_verification' 要求 python3-unbound ({})" + + #: dnf/dnssec.py:239 + msgid "DNSSEC extension: Key for user " +@@ -3707,7 +3686,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 ++#: dnf/exceptions.py:131 dnf/module/module_base.py:854 msgid "Modular dependency problem:" msgid_plural "Modular dependency problems:" msgstr[0] "模块依赖问题:" -@@ -3761,27 +3725,27 @@ msgstr "" +@@ -3741,7 +3720,47 @@ msgstr "启用的模板:{}。" + msgid "No profile specified for '{}', please specify profile." + msgstr "没有为 '{}' 指定档案。请指定档案。" + +-#: dnf/module/module_base.py:33 ++#: dnf/module/exceptions.py:27 ++msgid "No such module: {}" ++msgstr "不存在模块:{}" ++ ++#: dnf/module/exceptions.py:33 ++msgid "No such stream: {}" ++msgstr "没有对应的流:{}" ++ ++#: dnf/module/exceptions.py:39 ++msgid "No enabled stream for module: {}" ++msgstr "该模块没有已启用的流: {}" ++ ++#: dnf/module/exceptions.py:46 ++msgid "Cannot enable more streams from module '{}' at the same time" ++msgstr "不能同时启用模块:{} 中的多个流" ++ ++#: dnf/module/exceptions.py:52 ++msgid "Different stream enabled for module: {}" ++msgstr "模块中已启用的其他流:{}" ++ ++#: dnf/module/exceptions.py:58 ++msgid "No such profile: {}" ++msgstr "没有这个配置:{}" ++ ++#: dnf/module/exceptions.py:64 ++msgid "Specified profile not installed for {}" ++msgstr "指定的配置没有为 {} 安装" ++ ++#: dnf/module/exceptions.py:70 ++msgid "No stream specified for '{}', please specify stream" ++msgstr "没有为 '{}' 指定流。请指定流" ++ ++#: dnf/module/exceptions.py:82 ++msgid "No such profile: {}. No profiles available" ++msgstr "没有这个配置:{}。无配置可用" ++ ++#: dnf/module/exceptions.py:88 ++msgid "No profile to remove for '{}'" ++msgstr "'{}' 没有可以移除的配置" ++ ++#: dnf/module/module_base.py:35 + msgid "" + "\n" + "\n" +@@ -3751,7 +3770,7 @@ msgstr "" + "\n" + "提示:[d]默认,[e]已启用,[x]已禁用,[i]已安装" + +-#: dnf/module/module_base.py:34 ++#: dnf/module/module_base.py:36 + msgid "" + "\n" + "\n" +@@ -3761,80 +3780,98 @@ 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 ++#: dnf/module/module_base.py:56 dnf/module/module_base.py:556 ++#: dnf/module/module_base.py:615 dnf/module/module_base.py:681 msgid "Ignoring unnecessary profile: '{}/{}'" msgstr "正在忽略无用的配置文件'{}/{}'" - #: dnf/module/module_base.py:84 +-#: dnf/module/module_base.py:84 ++#: dnf/module/module_base.py:86 #, python-brace-format msgid "All matches for argument '{0}' in module '{1}:{2}' are not active" --msgstr "模块 '{1}:{2}' 中参数 '{0}' 的所有匹配项目都未激活" -+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 ++#: dnf/module/module_base.py:94 dnf/module/module_base.py:204 #, python-brace-format msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" --msgstr "不允许从失效保险仓库 {1} 安装模块 '{0}'" -+msgstr "不允许从 Fail-Safe repository {1} 安装模块 '{0}'" + msgstr "不允许从失效保险仓库 {1} 安装模块 '{0}'" -#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 ++#: dnf/module/module_base.py:104 dnf/module/module_base.py:214 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 ++#: dnf/module/module_base.py:108 dnf/module/module_base.py:218 msgid "Unable to match profile for argument {}" msgstr "无法配置参数 {} 中的配置档案" -@@ -3797,41 +3761,55 @@ msgstr "没有模块 {}:{} 的配置文件" +-#: dnf/module/module_base.py:118 ++#: dnf/module/module_base.py:120 + msgid "No default profiles for module {}:{}. Available profiles: {}" + msgstr "模块 {}:{} 没有默认的配置文件。可用的配置为 : {}" + +-#: dnf/module/module_base.py:122 ++#: dnf/module/module_base.py:124 + msgid "No profiles for module {}:{}" + msgstr "没有模块 {}:{} 的配置文件" + +-#: dnf/module/module_base.py:129 ++#: dnf/module/module_base.py:131 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 ++#: dnf/module/module_base.py:144 dnf/module/module_base.py:247 msgid "Installing module from Fail-Safe repository is not allowed" msgstr "不允许从失效保险仓库中安装模块" @@ -12387,24 +13219,24 @@ index 7ede4ed8..d1c433a3 100644 -#: 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 ++#: dnf/module/module_base.py:196 +#, python-brace-format +msgid "No active matches for argument '{0}' in module '{1}:{2}'" -+msgstr "模块 '{1}:{2}' 中的参数 '{0}' 没有活跃的匹配" ++msgstr "模块 '{1}:{2}' 中的参数 '{0}' 没有已激活的匹配项目" + -+#: dnf/module/module_base.py:226 ++#: dnf/module/module_base.py:228 +#, python-brace-format +msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'" -+msgstr "在模块 '{1}' 流 '{2}' 中没有安装的配置集 '{0}'" ++msgstr "在模块 '{1}' 流 '{2}' 中没有安装的配置文件 '{0}'" + -+#: dnf/module/module_base.py:265 ++#: dnf/module/module_base.py:267 +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 ++#: dnf/module/module_base.py:310 dnf/module/module_base.py:461 ++#: dnf/module/module_base.py:486 dnf/module/module_base.py:505 ++#: dnf/module/module_base.py:552 dnf/module/module_base.py:611 ++#: dnf/module/module_base.py:677 dnf/module/module_base.py:840 msgid "Unable to resolve argument {}" msgstr "无法解析参数 {}" @@ -12413,38 +13245,48 @@ index 7ede4ed8..d1c433a3 100644 -msgstr "没有和{}匹配的软件包" - -#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 ++#: dnf/module/module_base.py:321 #, 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 ++#: dnf/module/module_base.py:340 dnf/module/module_base.py:368 msgid "Unable to match profile in argument {}" msgstr "无法匹配参数 {} 中的配置档案" -#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 ++#: dnf/module/module_base.py:348 msgid "Upgrading module from Fail-Safe repository is not allowed" msgstr "不允许从失效保险仓库中升级模块" -#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 ++#: dnf/module/module_base.py:422 ++#, python-brace-format ++msgid "" ++"Argument '{argument}' matches {stream_count} streams ('{streams}') of module" ++" '{module}', but none of the streams are enabled or default" ++msgstr "" ++"参数 '{argument}' 可以匹配模块 '{module}' 的 {stream_count} " ++"个流('{streams}'),但是这些流都未被启用或非默认" ++ ++#: dnf/module/module_base.py:509 msgid "" "Only module name is required. Ignoring unneeded information in argument: " "'{}'" msgstr "只需要模块名。正在忽略'{}'中的无用信息" -#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 +-#, python-format +-msgid "%s: %s check failed: %s vs %s" +-msgstr "%s: %s 检查失败:%s vs %s" ++#: dnf/module/module_base.py:841 +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 为空文件" + + #. empty file is invalid json format + #: dnf/persistor.py:54 +@@ -3845,12 +3882,12 @@ msgstr "%s 为空文件" #: dnf/persistor.py:91 #, python-format msgid "Failed to load expired repos cache: %s" @@ -12459,7 +13301,42 @@ index 7ede4ed8..d1c433a3 100644 #: dnf/persistor.py:106 msgid "Failed storing last makecache time." -@@ -3912,6 +3890,12 @@ msgstr "已添加 %s 仓库来自 %s" +@@ -3870,16 +3907,16 @@ msgstr "解析文件失败:%s" + msgid "Loaded plugins: %s" + msgstr "加载插件:%s" + +-#: dnf/plugin.py:199 ++#: dnf/plugin.py:211 + #, python-format + msgid "Failed loading plugin \"%s\": %s" + msgstr "加载插件 \"%s\" 失败 : %s" + +-#: dnf/plugin.py:231 ++#: dnf/plugin.py:243 + msgid "No matches found for the following enable plugin patterns: {}" + msgstr "没有以下已启用插件模式的匹配项 : {}" + +-#: dnf/plugin.py:235 ++#: dnf/plugin.py:247 + msgid "No matches found for the following disable plugin patterns: {}" + msgstr "没有以下已停用插件模式的匹配项 : {}" + +@@ -3908,10 +3945,27 @@ msgstr "正在启用 %s 仓库" + msgid "Added %s repo from %s" + msgstr "已添加 %s 仓库来自 %s" + ++#: dnf/rpm/miscutils.py:35 ++#, python-brace-format ++msgid "" ++"Using rpmkeys executable from {path} to verify signature for package: " ++"{package}." ++msgstr "使用来自 {path} 的 rpmkeys 可执行代码验证软件包的签名:{package}。" ++ ++#: dnf/rpm/miscutils.py:39 ++msgid "Cannot find rpmkeys executable to verify signatures." ++msgstr "无法找到 rpmkeys 的可执行文件以验证签名。" ++ + #: dnf/rpm/transaction.py:119 msgid "Errors occurred during test transaction." msgstr "测试事务过程中出现错误。" @@ -12467,12 +13344,12 @@ index 7ede4ed8..d1c433a3 100644 +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 命令" ++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 "运行脚本" +@@ -3958,164 +4012,199 @@ msgstr "运行脚本" msgid "Preparing" msgstr "准备中" @@ -12484,7 +13361,7 @@ index 7ede4ed8..d1c433a3 100644 +msgid "" +"The following problems occurred while replaying the transaction from file " +"\"{filename}\":" -+msgstr "在从文件 \"{filename}\" replay 事务时发生以下问题:" ++msgstr "在重放来自文件 \"{filename}\" 的事务时出现了下列问题:" -#: dnf/transaction_sr.py:70 -#, python-brace-format @@ -12516,13 +13393,13 @@ index 7ede4ed8..d1c433a3 100644 "\"{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:244 +#: dnf/transaction_sr.py:265 #, python-brace-format msgid "Unexpected type of \"{id}\", {exp} expected." @@ -12548,7 +13425,7 @@ index 7ede4ed8..d1c433a3 100644 #, python-brace-format msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"." -msgstr "" -+msgstr "rpm nevra \"{reason}\" 的软件包原因 \"{nevra}\" 的值无效。" ++msgstr "rpm nevra \"{nevra}\" 的软件包原因 \"{reason}\" 的值无效。" -#: dnf/transaction_sr.py:275 +#: dnf/transaction_sr.py:297 @@ -12587,14 +13464,14 @@ index 7ede4ed8..d1c433a3 100644 #, python-brace-format msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"." -msgstr "" -+msgstr "没有为操作 \"{action}\" 安装软件包 nevra \"{nevra}\"。" ++msgstr "软件包 nevra \"{nevra}\" 没有为操作 \"{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 "rpm nevra \"{action}\" 的软件包操作 \"{nevra}\" 无效。" ++msgstr "rpm nevra \"{nevra}\" 的软件包操作 \"{action}\" 无效。" -#: dnf/transaction_sr.py:343 -#, fuzzy, python-format @@ -12619,7 +13496,7 @@ index 7ede4ed8..d1c433a3 100644 +#, python-format msgid "Group id '%s' is not installed." -msgstr "模块或者组 '%s' 未安装。" -+msgstr "组 id '%s' 没有安装。" ++msgstr "组 id '%s' 未安装。" -#: dnf/transaction_sr.py:398 -#, fuzzy, python-format @@ -12637,7 +13514,7 @@ index 7ede4ed8..d1c433a3 100644 "Invalid value \"{group_type}\" of environments.groups.group_type, only " "\"mandatory\" or \"optional\" is supported." msgstr "" -+"environments.groups.group_type 无效的值 \"{group_type}\",只支持 \"mandatory\" 或 " ++"environments.groups.group_type 的值 \"{group_type}\" 无效,仅支持 \"mandatory\" 或者 " +"\"optional\"。" -#: dnf/transaction_sr.py:430 @@ -12652,7 +13529,7 @@ index 7ede4ed8..d1c433a3 100644 #, python-brace-format msgid "Unexpected value of group action \"{action}\" for group \"{group}\"." -msgstr "" -+msgstr "组 \"{action}\" 的组操作 \"{group}\" 的值无效。" ++msgstr "组 \"{group}\" 的组操作 \"{action}\" 的值无效。" -#: dnf/transaction_sr.py:513 +#: dnf/transaction_sr.py:547 @@ -12685,41 +13562,44 @@ index 7ede4ed8..d1c433a3 100644 +msgstr "软件包 nevra \"{nevra}\" 没有包括在事务文件中,但它被拉取到事务中。" -#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 ++#: dnf/util.py:419 dnf/util.py:421 msgid "Problem" msgstr "问题" -#: dnf/util.py:444 -+#: dnf/util.py:446 ++#: dnf/util.py:472 msgid "TransactionItem not found for key: {}" msgstr "找不到键的 TransactionItem: {}" -#: dnf/util.py:454 -+#: dnf/util.py:456 ++#: dnf/util.py:482 msgid "TransactionSWDBItem not found for key: {}" msgstr "找不到键的 TransactionSWDBItem: {}" -#: dnf/util.py:457 -+#: dnf/util.py:459 ++#: dnf/util.py:485 msgid "Errors occurred during transaction." msgstr "事务过程中出现错误。" -+#: dnf/util.py:595 ++#: dnf/util.py:621 +msgid "Reinstalled" +msgstr "已重装" + -+#: dnf/util.py:596 ++#: dnf/util.py:622 +msgid "Skipped" +msgstr "已跳过" + -+#: dnf/util.py:597 ++#: dnf/util.py:623 +msgid "Removed" +msgstr "已移除" + -+#: dnf/util.py:600 ++#: dnf/util.py:626 +msgid "Failed" +msgstr "失败" + ++#~ msgid "%s: %s check failed: %s vs %s" ++#~ msgstr "%s: %s 检查失败:%s vs %s" ++ +#~ msgid "Action not handled: {}" +#~ msgstr "操作没被处理:{}" + @@ -12736,5 +13616,5 @@ index 7ede4ed8..d1c433a3 100644 #~ msgstr "用于显示已查找到软件包的格式" -- -2.29.2 +2.31.1 diff --git a/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch b/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch deleted file mode 100644 index 2daa3b2..0000000 --- a/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch +++ /dev/null @@ -1,30 +0,0 @@ -From f3c254581bcb0591a543aee0c7e031c3c9d0a9a1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Mon, 11 Jan 2021 16:43:25 +0100 -Subject: [PATCH] Fix documentation of globs not supporting curly brackets - -= changelog = -msg: Fix documentation of globs not supporting curly brackets -type: bugfix -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1913418 ---- - doc/command_ref.rst | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/doc/command_ref.rst b/doc/command_ref.rst -index bbce3ddcf4..d11e8dd502 100644 ---- a/doc/command_ref.rst -+++ b/doc/command_ref.rst -@@ -1763,8 +1763,10 @@ The following patterns are supported: - those two characters, inclusive, is matched. If the first character - following the ``[`` is a ``!`` or a ``^`` then any character not enclosed - is matched. --``{}`` -- Matches any of the comma separated list of enclosed strings. -+ -+Note: Curly brackets (``{}``) are not supported. You can still use them in -+shells that support them and let the shell do the expansion, but if quoted or -+escaped, dnf will not expand them. - - -------------- - NEVRA Matching diff --git a/SOURCES/0008-Module-switch-command.patch b/SOURCES/0008-Module-switch-command.patch deleted file mode 100644 index f464e15..0000000 --- a/SOURCES/0008-Module-switch-command.patch +++ /dev/null @@ -1,507 +0,0 @@ -From 6ed0458744090ab307da9d9118690372b2e66ca8 Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -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 deleted file mode 100644 index 240495d..0000000 --- a/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch +++ /dev/null @@ -1,107 +0,0 @@ -From de8bbccc4e035a9a9b5baa3aeb0dbf0cb12f1fe2 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Wed, 9 Dec 2020 13:45:46 +0100 -Subject: [PATCH 1/1] yum.misc.decompress() to handle uncompressed files - (RhBug:1895059) - -The underlying libdnf function is capable to handle even uncompressed -files - so now uncompressed files are just copied to the destination. -Also unused fn_only parameter of the function was removed. - -This fixes issue with "reposync -m" command when the group metadata file -in the repository is a plain xml file (not compressed). - -https://bugzilla.redhat.com/show_bug.cgi?id=1895059 ---- - dnf/yum/misc.py | 60 +++++++++++++++++++++++++++---------------------- - 1 file changed, 33 insertions(+), 27 deletions(-) - -diff --git a/dnf/yum/misc.py b/dnf/yum/misc.py -index 0f922350..3e3905fe 100644 ---- a/dnf/yum/misc.py -+++ b/dnf/yum/misc.py -@@ -386,34 +386,39 @@ def getloginuid(): - _cached_getloginuid = _getloginuid() - return _cached_getloginuid - --def decompress(filename, dest=None, fn_only=False, check_timestamps=False): -- """take a filename and decompress it into the same relative location. -- if the file is not compressed just return the file""" -- -- ztype = None -- out = filename # If the file is not compressed, it returns the same file - -- dot_pos = filename.rfind('.') -- if dot_pos > 0: -- ext = filename[dot_pos:] -- if ext in ('.zck', '.xz', '.bz2', '.gz'): -- ztype = ext -- out = dest if dest else filename[:dot_pos] -- -- if ztype and not fn_only: -- if check_timestamps: -- fi = stat_f(filename) -- fo = stat_f(out) -- if fi and fo and fo.st_mtime == fi.st_mtime: -- return out -+def decompress(filename, dest=None, check_timestamps=False): -+ """take a filename and decompress it into the same relative location. -+ When the compression type is not recognized (or file is not compressed), -+ the content of the file is copied to the destination""" -+ -+ if dest: -+ out = dest -+ else: -+ out = None -+ dot_pos = filename.rfind('.') -+ if dot_pos > 0: -+ ext = filename[dot_pos:] -+ if ext in ('.zck', '.xz', '.bz2', '.gz', '.lzma', '.zst'): -+ out = filename[:dot_pos] -+ if out is None: -+ raise dnf.exceptions.MiscError("Could not determine destination filename") -+ -+ if check_timestamps: -+ fi = stat_f(filename) -+ fo = stat_f(out) -+ if fi and fo and fo.st_mtime == fi.st_mtime: -+ return out - -- try: -- libdnf.utils.decompress(filename, out, 0o644, ztype) -- except RuntimeError as e: -- raise dnf.exceptions.MiscError(str(e)) -+ try: -+ # libdnf.utils.decompress either decompress file to the destination or -+ # copy the content if the compression type is not recognized -+ libdnf.utils.decompress(filename, out, 0o644) -+ except RuntimeError as e: -+ raise dnf.exceptions.MiscError(str(e)) - -- if check_timestamps and fi: -- os.utime(out, (fi.st_mtime, fi.st_mtime)) -+ if check_timestamps and fi: -+ os.utime(out, (fi.st_mtime, fi.st_mtime)) - - return out - -@@ -424,13 +429,14 @@ def calculate_repo_gen_dest(filename, generated_name): - os.makedirs(dest, mode=0o755) - return dest + '/' + generated_name - --def repo_gen_decompress(filename, generated_name, cached=False): -+ -+def repo_gen_decompress(filename, generated_name): - """ This is a wrapper around decompress, where we work out a cached - generated name, and use check_timestamps. filename _must_ be from - a repo. and generated_name is the type of the file. """ - - dest = calculate_repo_gen_dest(filename, generated_name) -- return decompress(filename, dest=dest, check_timestamps=True, fn_only=cached) -+ return decompress(filename, dest=dest, check_timestamps=True) - - def read_in_items_from_dot_dir(thisglob, line_as_list=True): - """ Takes a glob of a dir (like /etc/foo.d/\\*.foo) returns a list of all --- -2.26.2 - diff --git a/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch b/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch deleted file mode 100644 index 3bfdafb..0000000 --- a/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 04b1a90bb24b7e98d4e001c44f8b3f563ad5f0f6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Tue, 24 Nov 2020 14:31:21 +0100 -Subject: [PATCH] Make rotated log file (mode, owner, group) match previous log - settings (RhBug:1894344) - -https://bugzilla.redhat.com/show_bug.cgi?id=1894344 ---- - etc/logrotate.d/dnf | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/etc/logrotate.d/dnf b/etc/logrotate.d/dnf -index b96c6ff9b4..0ce2629f1b 100644 ---- a/etc/logrotate.d/dnf -+++ b/etc/logrotate.d/dnf -@@ -3,5 +3,5 @@ - notifempty - rotate 4 - weekly -- create 0600 root root -+ create - } diff --git a/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch b/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch deleted file mode 100644 index 49c2a1a..0000000 --- a/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch +++ /dev/null @@ -1,117 +0,0 @@ -From eb2aa8c14208da7a567a0d79a8baa9f5201640cd Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -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 deleted file mode 100644 index b81646b..0000000 --- a/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch +++ /dev/null @@ -1,80 +0,0 @@ -From ca06d200d738fd6b23cb05b9776c9fd29288665f Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -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 deleted file mode 100644 index a5f8478..0000000 --- a/SOURCES/0013-Package-add-a-get-header--method.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 38cc67385fb1b36aa0881bc5982bc58d75dac464 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Wed, 11 Nov 2020 18:45:11 +0100 -Subject: [PATCH] Package: add a get_header() method (RhBug:1876606) - -Adds get_header() method to the Package class, which returns the rpm -header of an installed package. - -= changelog = -msg: Add get_header() method to the Package class -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1876606 ---- - dnf/package.py | 24 ++++++++++++++++++++++++ - tests/test_package.py | 12 ++++++++++++ - 2 files changed, 36 insertions(+) - -diff --git a/dnf/package.py b/dnf/package.py -index baef04fa5b..836e0e4989 100644 ---- a/dnf/package.py -+++ b/dnf/package.py -@@ -26,11 +26,13 @@ - from dnf.i18n import _ - - import binascii -+import dnf.exceptions - import dnf.rpm - import dnf.yum.misc - import hawkey - import logging - import os -+import rpm - - logger = logging.getLogger("dnf") - -@@ -95,6 +97,11 @@ def from_repo(self): - - @property - def _header(self): -+ """ -+ Returns the header of a locally present rpm package file. As opposed to -+ self.get_header(), which retrieves the header of an installed package -+ from rpmdb. -+ """ - return dnf.rpm._header(self.localPkg()) - - @property -@@ -164,6 +171,23 @@ def debugsource_name(self): - src_name = self.source_name if self.source_name is not None else self.name - return src_name + self.DEBUGSOURCE_SUFFIX - -+ def get_header(self): -+ """ -+ Returns the rpm header of the package if it is installed. If not -+ installed, returns None. The header is not cached, it is retrieved from -+ rpmdb on every call. In case of a failure (e.g. when the rpmdb changes -+ between loading the data and calling this method), raises an instance -+ of PackageNotFoundError. -+ """ -+ if not self._from_system: -+ return None -+ -+ try: -+ # RPMDBI_PACKAGES stands for the header of the package -+ return next(self.base._ts.dbMatch(rpm.RPMDBI_PACKAGES, self.rpmdbid)) -+ except StopIteration: -+ raise dnf.exceptions.PackageNotFoundError("Package not found when attempting to retrieve header", str(self)) -+ - @property - def source_debug_name(self): - # :api -diff --git a/tests/test_package.py b/tests/test_package.py -index cd4872e631..514e5bf099 100644 ---- a/tests/test_package.py -+++ b/tests/test_package.py -@@ -68,6 +68,18 @@ def fn_getter(): - with self.assertRaises(IOError): - pkg._header - -+ # rpm.hdr() is not easy to construct with custom data, we just return a string -+ # instead, as we don't actually need an instance of rpm.hdr for the test -+ @mock.patch("rpm.TransactionSet.dbMatch", lambda self, a, b: iter(["package_header_test_data"])) -+ def test_get_header(self): -+ pkg = self.sack.query().installed().filter(name="pepper")[0] -+ header = pkg.get_header() -+ self.assertEqual(header, "package_header_test_data") -+ -+ pkg = self.sack.query().available().filter(name="pepper")[0] -+ header = pkg.get_header() -+ self.assertEqual(header, None) -+ - @mock.patch("dnf.package.Package.rpmdbid", long(3)) - def test_idx(self): - """ pkg.idx is an int. """ diff --git a/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch b/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch deleted file mode 100644 index d912d69..0000000 --- a/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch +++ /dev/null @@ -1,115 +0,0 @@ -From b3542a96c6f77e5cc0b5217e586fcc56fde074d8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -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 deleted file mode 100644 index 30dbab6..0000000 --- a/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch +++ /dev/null @@ -1,366 +0,0 @@ -From a777ff01c79d5e0e2cf3ae7b0652795577253bc3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -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 deleted file mode 100644 index 2c8f13b..0000000 --- a/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch +++ /dev/null @@ -1,43 +0,0 @@ -From 291071a937a1de398641f02002413678398e473c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Mon, 8 Feb 2021 08:25:46 +0100 -Subject: [PATCH] Run tests for fill_sack_from_repos_in_cache in installroot - (RhBug:1865803) - -This prevents loading data (like failsafe) from host. - -It also allows testing that there are no modules in the installroot not just -no base-runtime* in test_with_modular_repo_without_modules_yaml. - -https://bugzilla.redhat.com/show_bug.cgi?id=1865803 ---- - tests/test_fill_sack_from_repos_in_cache.py | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py -index 24b0d4598d..f27235bf84 100644 ---- a/tests/test_fill_sack_from_repos_in_cache.py -+++ b/tests/test_fill_sack_from_repos_in_cache.py -@@ -42,6 +42,7 @@ class FillSackFromReposInCacheTest(unittest.TestCase): - def _create_cache_for_repo(self, repopath, tmpdir): - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(tmpdir, "cache") -+ conf.installroot = os.path.join(tmpdir) - - base = dnf.Base(conf=conf) - -@@ -68,6 +69,7 @@ def _setUp_from_repo_path(self, original_repo_path): - # Prepare base for the actual test - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(self.tmpdir, "cache") -+ conf.installroot = os.path.join(self.tmpdir) - self.test_base = dnf.Base(conf=conf) - repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf) - repoconf.baseurl = self.repo_copy_path -@@ -258,5 +260,5 @@ def test_with_modular_repo_without_modules_yaml(self): - self.assertEqual(packages[0].evr, "10.0-7") - - self.module_base = dnf.module.module_base.ModuleBase(self.test_base) -- modules, _ = self.module_base._get_modules("base-runtime*") -+ modules, _ = self.module_base._get_modules("*") - self.assertEqual(len(modules), 0) diff --git a/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch b/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch deleted file mode 100644 index b6dee78..0000000 --- a/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 40e762da5cd2d876b6424f4c25b77e8dc2422a0f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Mon, 8 Feb 2021 08:25:46 +0100 -Subject: [PATCH] Set persistdir and substitutions for - fill_sack_from_repos_in_cache tests (RhBug:1865803) - -Setting just installroot is not enough because persistdir is not -automatically prepended with installroot if set via API. - -Also assert exact package names which is more useful output in case the -test fails. - -https://bugzilla.redhat.com/show_bug.cgi?id=1865803 ---- - tests/test_fill_sack_from_repos_in_cache.py | 19 +++++++++++++++---- - 1 file changed, 15 insertions(+), 4 deletions(-) - -diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py -index f27235bf84..23fd2a4337 100644 ---- a/tests/test_fill_sack_from_repos_in_cache.py -+++ b/tests/test_fill_sack_from_repos_in_cache.py -@@ -42,7 +42,10 @@ class FillSackFromReposInCacheTest(unittest.TestCase): - def _create_cache_for_repo(self, repopath, tmpdir): - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(tmpdir, "cache") -- conf.installroot = os.path.join(tmpdir) -+ conf.installroot = tmpdir -+ conf.persistdir = os.path.join(conf.installroot, conf.persistdir.lstrip("/")) -+ conf.substitutions["arch"] = "x86_64" -+ conf.substitutions["basearch"] = dnf.rpm.basearch(conf.substitutions["arch"]) - - base = dnf.Base(conf=conf) - -@@ -69,7 +72,10 @@ def _setUp_from_repo_path(self, original_repo_path): - # Prepare base for the actual test - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(self.tmpdir, "cache") -- conf.installroot = os.path.join(self.tmpdir) -+ conf.installroot = self.tmpdir -+ conf.persistdir = os.path.join(conf.installroot, conf.persistdir.lstrip("/")) -+ conf.substitutions["arch"] = "x86_64" -+ conf.substitutions["basearch"] = dnf.rpm.basearch(conf.substitutions["arch"]) - self.test_base = dnf.Base(conf=conf) - repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf) - repoconf.baseurl = self.repo_copy_path -@@ -231,8 +237,13 @@ def test_with_modules_yaml(self): - - q = self.test_base.sack.query() - packages = q.run() -- self.assertEqual(len(packages), 8) -- self.assertEqual(packages[0].evr, "2.02-0.40") -+ -+ pkg_names = [] -+ for pkg in packages: -+ pkg_names.append(pkg.name) -+ -+ self.assertEqual(pkg_names, ['grub2', 'httpd', 'httpd', 'httpd-doc', 'httpd-doc', 'httpd-provides-name-doc', -+ 'httpd-provides-name-version-release-doc', 'libnghttp2']) - - self.module_base = dnf.module.module_base.ModuleBase(self.test_base) - modules, _ = self.module_base._get_modules("base-runtime*") diff --git a/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch b/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch deleted file mode 100644 index 0fd4828..0000000 --- a/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 9ceb74f77479910f7844a9a87d4b7623687076be Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -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/SPECS/dnf.spec b/SPECS/dnf.spec index 24d28b1..f4a9d29 100644 --- a/SPECS/dnf.spec +++ b/SPECS/dnf.spec @@ -1,11 +1,14 @@ +# Always build out-of-source +%define __cmake_in_source_build 1 + # default dependencies -%global hawkey_version 0.55.0-5 +%global hawkey_version 0.61.1 %global libcomps_version 0.1.8 -%global libmodulemd_version 1.4.0 +%global libmodulemd_version 2.9.3 %global rpm_version 4.14.2-35 # conflicts -%global conflicts_dnf_plugins_core_version 4.0.16 +%global conflicts_dnf_plugins_core_version 4.0.20 %global conflicts_dnf_plugins_extras_version 4.0.4 %global conflicts_dnfdaemon_version 0.3.19 @@ -24,19 +27,6 @@ %endif -%if 0%{?rhel} && 0%{?rhel} <= 7 -%bcond_with python3 -%else -%bcond_without python3 -%endif - -%if 0%{?rhel} >= 8 || 0%{?fedora} > 29 -# Disable python2 build -%bcond_with python2 -%else -%bcond_without python2 -%endif - # YUM compat subpackage configuration # # level=full -> deploy all compat symlinks (conflicts with yum < 4) @@ -64,13 +54,7 @@ %global confdir %{_sysconfdir}/%{name} %global pluginconfpath %{confdir}/plugins -%if %{with python2} - %global py2pluginpath %{python2_sitelib}/%{name}-plugins -%endif - -%if %{with python3} - %global py3pluginpath %{python3_sitelib}/%{name}-plugins -%endif +%global py3pluginpath %{python3_sitelib}/%{name}-plugins # Use the same directory of the main package for subpackage licence and docs %global _docdir_fmt %{name} @@ -81,53 +65,19 @@ It supports RPMs, modules and comps groups & environments. Name: dnf -Version: 4.4.2 -Release: 11%{?dist} +Version: 4.7.0 +Release: 4%{?dist} Summary: %{pkg_summary} # For a breakdown of the licensing, see PACKAGE-LICENSING -License: GPLv2+ and GPLv2 and GPL +License: GPLv2+ URL: https://github.com/rpm-software-management/dnf Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz -# https://github.com/rpm-software-management/dnf/commit/f6d1e4308769efaa6175f70d52bfd784c62fbf98 -Patch1: 0001-tests-SQL-write-a-readonly-folder.patch -# https://github.com/rpm-software-management/dnf/commit/c2e4901cec947e5be2e5ff5afa22691841d00bdc -Patch2: 0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch -# https://github.com/rpm-software-management/dnf/pull/1675 -Patch3: 0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch -# https://github.com/rpm-software-management/dnf/pull/1698 -Patch4: 0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch -# https://github.com/rpm-software-management/dnf/pull/1659 -# https://github.com/rpm-software-management/dnf/pull/1689 -# https://github.com/rpm-software-management/dnf/pull/1709 -# https://github.com/rpm-software-management/dnf/pull/1690 -Patch5: 0005-dnf-history-operations-that-work-with-comps-correctly.patch -# https://github.com/rpm-software-management/dnf/pull/1691 -Patch6: 0006-Remove-sourcepackages-from-install-upgrade-set.patch -# https://github.com/rpm-software-management/dnf/pull/1710 -Patch7: 0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch -# https://github.com/rpm-software-management/dnf/pull/1685 -Patch8: 0008-Module-switch-command.patch -# https://github.com/rpm-software-management/dnf/pull/1702 -Patch9: 0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch -# https://github.com/rpm-software-management/dnf/pull/1693 -Patch10: 0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch -# https://github.com/rpm-software-management/dnf/pull/1692 -Patch11: 0011-Add-new-attribute-for-Package--from-repo.patch -# https://github.com/rpm-software-management/dnf/pull/1695 -Patch12: 0012-Change-behaviour-of-Package-.from-repo.patch -# https://github.com/rpm-software-management/dnf/pull/1686 -Patch13: 0013-Package-add-a-get-header--method.patch -# https://github.com/rpm-software-management/dnf/pull/1703 -Patch14: 0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch -# https://github.com/rpm-software-management/dnf/pull/1711 -Patch15: 0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch -# https://github.com/rpm-software-management/dnf/pull/1721 -Patch16: 0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch -#https://github.com/rpm-software-management/dnf/pull/1723 -Patch17: 0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch -# https://github.com/rpm-software-management/dnf/pull/1725 -Patch18: 0018-Allow-stream-switching-if-option-enabled.patch -Patch19: 0019-Update-translations.patch +Patch1: 0001-Set-top-level-directory-for-unittest.patch +Patch2: 0002-dnfrpmmiscutilspy-fix-usage-of-_.patch +Patch3: 0003-Pass-the-package-to-rpmkeys-stdin.patch +Patch4: 0004-Use-rpmkeys-alone-to-verify-signature.patch +Patch5: 0005-Lower-_pkgverify_level-to-signature-for-signature-checking-with-rpmkeys.patch +Patch6: 0006-Update-translations.patch BuildArch: noarch BuildRequires: cmake @@ -135,22 +85,13 @@ BuildRequires: gettext # Documentation BuildRequires: systemd BuildRequires: bash-completion -%if %{with python3} BuildRequires: %{_bindir}/sphinx-build-3 Requires: python3-%{name} = %{version}-%{release} -%else -BuildRequires: %{_bindir}/sphinx-build -Requires: python2-%{name} = %{version}-%{release} -%endif %if 0%{?rhel} && 0%{?rhel} <= 7 Requires: python-dbus Requires: %{_bindir}/sqlite3 %else -%if %{with python3} Recommends: (python3-dbus if NetworkManager) -%else -Recommends: (python2-dbus if NetworkManager) -%endif Recommends: (%{_bindir}/sqlite3 if bash-completion) %endif Provides: dnf-command(alias) @@ -176,9 +117,7 @@ Provides: dnf-command(search) Provides: dnf-command(updateinfo) Provides: dnf-command(upgrade) Provides: dnf-command(upgrade-to) -Conflicts: python2-dnf-plugins-core < %{conflicts_dnf_plugins_core_version} Conflicts: python3-dnf-plugins-core < %{conflicts_dnf_plugins_core_version} -Conflicts: python2-dnf-plugins-extras-common < %{conflicts_dnf_plugins_extras_version} Conflicts: python3-dnf-plugins-extras-common < %{conflicts_dnf_plugins_extras_version} %description @@ -208,55 +147,6 @@ Conflicts: yum < 3.4.3-505 %description -n %{yum_subpackage_name} %{pkg_description} -%if %{with python2} -%package -n python2-%{name} -Summary: Python 2 interface to DNF -%{?python_provide:%python_provide python2-%{name}} -BuildRequires: python2-devel -BuildRequires: python2-hawkey >= %{hawkey_version} -BuildRequires: python2-libdnf >= %{hawkey_version} -BuildRequires: python2-libcomps >= %{libcomps_version} -BuildRequires: python2-libdnf -BuildRequires: python2-nose -BuildRequires: libmodulemd >= %{libmodulemd_version} -Requires: libmodulemd >= %{libmodulemd_version} -%if (0%{?rhel} && 0%{?rhel} <= 7) -BuildRequires: pygpgme -Requires: pygpgme -BuildRequires: python-enum34 -Requires: python-enum34 -%else -BuildRequires: python2-gpg -Requires: python2-gpg -BuildRequires: python2-enum34 -Requires: python2-enum34 -%endif -Requires: %{name}-data = %{version}-%{release} -%if 0%{?fedora} -Recommends: deltarpm -# required for DNSSEC main.gpgkey_dns_verification https://dnf.readthedocs.io/en/latest/conf_ref.html -Recommends: python2-unbound -%endif -Requires: python2-hawkey >= %{hawkey_version} -Requires: python2-libdnf >= %{hawkey_version} -Requires: python2-libcomps >= %{libcomps_version} -Requires: python2-libdnf -%if 0%{?rhel} && 0%{?rhel} <= 7 -BuildRequires: rpm-python >= %{rpm_version} -Requires: rpm-python >= %{rpm_version} -%else -BuildRequires: python2-rpm >= %{rpm_version} -Requires: python2-rpm >= %{rpm_version} -Recommends: rpm-plugin-systemd-inhibit -%endif -Conflicts: dnfdaemon < %{conflicts_dnfdaemon_version} - -%description -n python2-%{name} -Python 2 interface to DNF. -%endif -# ^ %%{with python2} - -%if %{with python3} %package -n python3-%{name} Summary: Python 3 interface to DNF %{?python_provide:%python_provide python3-%{name}} @@ -267,7 +157,6 @@ BuildRequires: python3-libcomps >= %{libcomps_version} BuildRequires: python3-libdnf BuildRequires: libmodulemd >= %{libmodulemd_version} Requires: libmodulemd >= %{libmodulemd_version} -BuildRequires: python3-nose BuildRequires: python3-gpg Requires: python3-gpg Requires: %{name}-data = %{version}-%{release} @@ -290,7 +179,6 @@ Recommends: rpm-plugin-systemd-inhibit %description -n python3-%{name} Python 3 interface to DNF. -%endif %package automatic Summary: %{pkg_summary} - automated upgrades @@ -304,40 +192,22 @@ Systemd units that can periodically download package upgrades and apply them. %prep %autosetup -p1 -mkdir build-py2 + mkdir build-py3 - %build -%if %{with python2} - pushd build-py2 - %cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python2} -DDNF_VERSION=%{version} - %make_build - make doc-man - popd -%endif - -%if %{with python3} - pushd build-py3 - %cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python3} -DDNF_VERSION=%{version} - %make_build - make doc-man - popd -%endif +pushd build-py3 +%cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python3} -DDNF_VERSION=%{version} +%make_build +make doc-man +popd %install -%if %{with python2} - pushd build-py2 - %make_install - popd -%endif -%if %{with python3} - pushd build-py3 - %make_install - popd -%endif +pushd build-py3 +%make_install +popd %find_lang %{name} mkdir -p %{buildroot}%{confdir}/vars @@ -345,22 +215,12 @@ mkdir -p %{buildroot}%{confdir}/aliases.d mkdir -p %{buildroot}%{pluginconfpath}/ mkdir -p %{buildroot}%{_sysconfdir}/%{name}/modules.d mkdir -p %{buildroot}%{_sysconfdir}/%{name}/modules.defaults.d -%if %{with python2} -mkdir -p %{buildroot}%{py2pluginpath}/ -%endif -%if %{with python3} mkdir -p %{buildroot}%{py3pluginpath}/__pycache__/ -%endif mkdir -p %{buildroot}%{_localstatedir}/log/ mkdir -p %{buildroot}%{_var}/cache/dnf/ touch %{buildroot}%{_localstatedir}/log/%{name}.log -%if %{with python3} ln -sr %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/dnf mv %{buildroot}%{_bindir}/dnf-automatic-3 %{buildroot}%{_bindir}/dnf-automatic -%else -ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/dnf -mv %{buildroot}%{_bindir}/dnf-automatic-2 %{buildroot}%{_bindir}/dnf-automatic -%endif rm -vf %{buildroot}%{_bindir}/dnf-automatic-* # Strict conf distribution @@ -372,17 +232,7 @@ rm -vf %{buildroot}%{confdir}/%{name}-strict.conf # YUM compat layer ln -sr %{buildroot}%{confdir}/%{name}.conf %{buildroot}%{_sysconfdir}/yum.conf -%if %{with python3} ln -sr %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/yum -%else -%if "%{yum_compat_level}" == "preview" -ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum4 -ln -sr %{buildroot}%{_mandir}/man8/dnf.8.gz %{buildroot}%{_mandir}/man8/yum4.8.gz -rm -f %{buildroot}%{_mandir}/man8/yum.8.gz -%else -ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum -%endif -%endif %if "%{yum_compat_level}" == "full" mkdir -p %{buildroot}%{_sysconfdir}/yum ln -sr %{buildroot}%{pluginconfpath} %{buildroot}%{_sysconfdir}/yum/pluginconf.d @@ -392,17 +242,10 @@ ln -sr %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars %check -%if %{with python2} - pushd build-py2 - ctest -VV - popd -%endif -%if %{with python3} - pushd build-py3 - ctest -VV - popd -%endif +pushd build-py3 +ctest -VV +popd %post @@ -512,22 +355,12 @@ ln -sr %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars %exclude %{_mandir}/man8/yum.8* %endif -%if %{with python2} -%files -n python2-%{name} -%{_bindir}/%{name}-2 -%exclude %{python2_sitelib}/%{name}/automatic -%{python2_sitelib}/%{name}/ -%dir %{py2pluginpath} -%endif - -%if %{with python3} %files -n python3-%{name} %{_bindir}/%{name}-3 %exclude %{python3_sitelib}/%{name}/automatic %{python3_sitelib}/%{name}/ %dir %{py3pluginpath} %dir %{py3pluginpath}/__pycache__ -%endif %files automatic %{_bindir}/%{name}-automatic @@ -541,15 +374,48 @@ ln -sr %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars %{_unitdir}/%{name}-automatic-download.timer %{_unitdir}/%{name}-automatic-install.service %{_unitdir}/%{name}-automatic-install.timer -%if %{with python3} %{python3_sitelib}/%{name}/automatic/ -%else -%{python2_sitelib}/%{name}/automatic/ -%endif %changelog -* Mon Mar 8 2021 Marek Blaha - 4.4.2-11 -- Update translations +* Mon Sep 13 2021 Marek Blaha - 4.7.0-4 +- Update translations (RhBug:1961632) + +* Mon Aug 16 2021 Pavla Kratochvilova - 4.7.0-3 +- Improve signature checking using rpmkeys (RhBug:1967454) + +* Tue Jul 27 2021 Pavla Kratochvilova - 4.7.0-2 +- Fix covscan issue: dnf/rpm/miscutils.py: fix usage of _() + +* Wed May 19 2021 Pavla Kratochvilova - 4.7.0-1 +- Update to 4.7.0 +- New optional parameter for filter_modules enables following modular obsoletes based on a config option module_obsoletes +- Fix module remove --all when no match spec (RhBug:1904490) +- Make an error message more informative (RhBug:1814831) +- Expand history to full term size when output is redirected (RhBug:1852577) (RhBug:1852577,1906970) +- Print additional information when verifying GPG key using DNS +- Enhanced detection of plugins removed in transaction (RhBug:1929163) +- Improve repo config path ordering to fix a comps merging issue (RhBug:1928181) +- Keep reason when package is removed (RhBug:1921063) +- Improve mechanism for application of security filters (RhBug:1918475) +- [API] Add new method for reset of security filters +- Remove hardcoded logfile permissions (RhBug:1910084) +- Preserve file mode during log rotation (RhBug:1910084) +- Increase loglevel in case of invalid config options +- Prevent traceback (catch ValueError) if pkg is from cmdline +- Check for specific key string when verifing signatures (RhBug:1915990) +- Use rpmkeys binary to verify package signature (RhBug:1915990) +- [doc] Improve description of modular filtering +- [doc] deprecated alias for dnf repoquery --deplist +- [doc] Describe install with just a name and obsoletes (RhBug:1902279) +- [doc] Fix: "sslcacert" contains path to the file +- [doc] Added proxy ssl configuration options, increase libdnf require +- [doc] Update documentation for module_obsoletes and module_stream_switch +- [doc] Improve documentation for Hotfix repositories +- [doc] fix: "makecache" command downloads only enabled repositories +- [doc] Add info that maximum parallel downloads is 20 +- [doc] installonly_limit documentation follows behavior +- [doc] Add documentation for config option sslverifystatus (RhBug:1814383) +- The noroot plugin no longer exists, remove mention * Thu Feb 11 2021 Nicola Sella - 4.4.2-10 - Allow stream switching if option enabled