Imported Upstream version 17.31.23 upstream upstream/17.31.23
authorTizenOpenSource <tizenopensrc@samsung.com>
Fri, 15 Mar 2024 09:14:21 +0000 (18:14 +0900)
committerTizenOpenSource <tizenopensrc@samsung.com>
Fri, 15 Mar 2024 09:14:21 +0000 (18:14 +0900)
265 files changed:
CMakeLists.txt
VERSION.cmake
cmake/modules/FindProtobuf.cmake [new file with mode: 0644]
cmake/modules/FindReadline.cmake [new file with mode: 0644]
cmake/modules/FindZypp.cmake
cmake/modules/Findlibproxy.cmake
doc/autodoc/CMakeLists.txt
doc/autodoc/Doxyfile.cmake
doc/autoinclude/EnvironmentVariables.doc
doc/autoinclude/Services.doc
libzypp.spec.cmake
mkChangelog
package/libzypp.changes
po/CMakeLists.txt
po/af.po
po/ar.po
po/ast.po [new file with mode: 0644]
po/be.po
po/bg.po
po/bn.po
po/bs.po
po/ca.po
po/cs.po
po/cy.po
po/da.po
po/de.po
po/el.po
po/en_GB.po
po/es.po
po/et.po
po/fa.po
po/fi.po
po/fr.po
po/gl.po
po/gu.po
po/he.po
po/hi.po
po/hr.po
po/hu.po
po/id.po
po/it.po
po/ja.po
po/ka.po
po/km.po
po/ko.po
po/ku.po
po/lt.po
po/mk.po
po/mr.po
po/nb.po
po/nl.po
po/nn.po
po/pa.po
po/pl.po
po/pt.po
po/pt_BR.po
po/ro.po
po/ru.po
po/si.po
po/sk.po
po/sl.po
po/sr.po
po/sv.po
po/ta.po
po/th.po
po/tr.po
po/uk.po
po/vi.po
po/wa.po
po/xh.po
po/zh_CN.po
po/zh_TW.po
po/zu.po
po/zypp.pot
tests/media/metalink/metalink.dockerfile [new file with mode: 0644]
tests/zypp/Arch_test.cc
tests/zypp/CheckSum_test.cc
tests/zypp/ProgressData_test.cc
tests/zypp/base/ExternalProgram_test.cc
tests/zyppng/CMakeLists.txt
tests/zyppng/UnixSignalSource_test.cc [new file with mode: 0644]
tests/zyppng/media/EvDownloader_test.cc
tests/zyppng/media/NetworkRequestDispatcher_test.cc
tests/zyppng/media/Provider_test.cc
tools/CalculateReusableBlocks.cc [new file with mode: 0644]
tools/DownloadFiles.cc [new file with mode: 0644]
tools/ToolScanRepos.cc
tools/zypp-media-chksum/CMakeLists.txt
tools/zypp-media-copy/CMakeLists.txt
tools/zypp-media-dir/CMakeLists.txt
tools/zypp-media-disc/CMakeLists.txt
tools/zypp-media-disk/CMakeLists.txt
tools/zypp-media-disk/diskprovider.cc
tools/zypp-media-http/CMakeLists.txt
tools/zypp-media-http/networkprovider.cc
tools/zypp-media-iso/CMakeLists.txt
tools/zypp-media-nfs/CMakeLists.txt
tools/zypp-media-smb/CMakeLists.txt
tools/zypp-media-tvm/CMakeLists.txt
tools/zypp-media-tvm/testvmprovider.cc
tools/zypp-rpm/CMakeLists.txt
tools/zypp-rpm/errorcodes.h
tools/zypp-rpm/main.cc
zypp-core/AutoDispose.h
zypp-core/CMakeLists.txt
zypp-core/Digest.cc
zypp-core/Digest.h
zypp-core/ExternalProgram.cc
zypp-core/ExternalProgram.h
zypp-core/Pathname.cc
zypp-core/ShutdownLock.cc [new file with mode: 0644]
zypp-core/ShutdownLock_p.h [moved from zypp/ShutdownLock_p.h with 88% similarity]
zypp-core/TriBool.h
zypp-core/base/CleanerThread.cc
zypp-core/base/LogControl.cc
zypp-core/base/LogTools.h
zypp-core/base/Logger.h
zypp-core/base/StringV.cc
zypp-core/base/StringV.h
zypp-core/base/inputstream.h
zypp-core/proto/CMakeLists.txt [deleted file]
zypp-core/ui/progressdata.cc
zypp-core/ui/progressdata.h
zypp-core/zyppng/base/UnixSignalSource [new file with mode: 0644]
zypp-core/zyppng/base/eventdispatcher.h
zypp-core/zyppng/base/eventdispatcher_glib.cc
zypp-core/zyppng/base/eventloop.h
zypp-core/zyppng/base/linuxhelpers.cc
zypp-core/zyppng/base/private/eventdispatcher_glib_p.h
zypp-core/zyppng/base/private/linuxhelpers_p.h
zypp-core/zyppng/base/timer.h
zypp-core/zyppng/base/unixsignalsource.cpp [new file with mode: 0644]
zypp-core/zyppng/base/unixsignalsource.h [new file with mode: 0644]
zypp-core/zyppng/core/string.h
zypp-core/zyppng/io/forkspawnengine.cc
zypp-core/zyppng/io/private/abstractspawnengine_p.h
zypp-core/zyppng/io/private/forkspawnengine_p.h
zypp-core/zyppng/io/private/socket_p.h
zypp-core/zyppng/io/socket.cc
zypp-core/zyppng/rpc/messagestream.h
zypp-core/zyppng/rpc/rpc.h
zypp-curl/CMakeLists.txt
zypp-curl/curlhelper.cc
zypp-curl/ng/network/downloader.h
zypp-curl/ng/network/downloadspec.cc
zypp-curl/ng/network/downloadspec.h
zypp-curl/ng/network/mirrorcontrol.cc
zypp-curl/ng/network/networkrequestdispatcher.cc
zypp-curl/ng/network/networkrequestdispatcher.h
zypp-curl/ng/network/networkrequesterror.cc
zypp-curl/ng/network/networkrequesterror.h
zypp-curl/ng/network/private/downloader_p.h
zypp-curl/ng/network/private/downloaderstates/base_p.h
zypp-curl/ng/network/private/downloaderstates/basicdownloader_p.cc
zypp-curl/ng/network/private/downloaderstates/detectmeta_p.cc
zypp-curl/ng/network/private/downloaderstates/final_p.cc
zypp-curl/ng/network/private/downloaderstates/initial_p.cc
zypp-curl/ng/network/private/downloaderstates/metalink_p.cc
zypp-curl/ng/network/private/downloaderstates/metalinkinfo_p.cc
zypp-curl/ng/network/private/downloaderstates/metalinkinfo_p.h
zypp-curl/ng/network/private/downloaderstates/normal_p.cc
zypp-curl/ng/network/private/downloaderstates/preparemulti_p.cc
zypp-curl/ng/network/private/downloaderstates/preparemulti_p.h
zypp-curl/ng/network/private/downloaderstates/rangedownloader_p.cc
zypp-curl/ng/network/private/downloaderstates/rangedownloader_p.h
zypp-curl/ng/network/private/downloaderstates/zck_p.cc
zypp-curl/ng/network/private/networkrequestdispatcher_p.h
zypp-curl/ng/network/private/request_p.h
zypp-curl/ng/network/request.cc
zypp-curl/ng/network/request.h
zypp-curl/parser/ZsyncParser [new file with mode: 0644]
zypp-curl/parser/mediablocklist.cc
zypp-curl/parser/mediablocklist.h
zypp-curl/parser/metalinkparser.cc
zypp-curl/parser/zsyncparser.cc [moved from zypp/media/ZsyncParser.cc with 64% similarity]
zypp-curl/parser/zsyncparser.h [moved from zypp/media/ZsyncParser.h with 80% similarity]
zypp-curl/private/curlhelper_p.h
zypp-curl/transfersettings.cc
zypp-curl/transfersettings.h
zypp-media/mediaconfig.cc
zypp-media/mediaconfig.h
zypp-media/ng/private/provide_p.h
zypp-media/ng/private/providemessage_p.h
zypp-media/ng/private/providequeue_p.h
zypp-media/ng/worker/provideworker.h
zypp-proto/CMakeLists.txt
zypp-proto/target/commit.proto
zypp-tui/Application [new file with mode: 0644]
zypp-tui/CMakeLists.txt [new file with mode: 0644]
zypp-tui/Config [new file with mode: 0644]
zypp-tui/Table.cc [new file with mode: 0644]
zypp-tui/Table.h [new file with mode: 0644]
zypp-tui/application.cc [new file with mode: 0644]
zypp-tui/application.h [new file with mode: 0644]
zypp-tui/config.cc [new file with mode: 0644]
zypp-tui/config.h [new file with mode: 0644]
zypp-tui/output/AliveCursor.h [new file with mode: 0644]
zypp-tui/output/Out.cc [new file with mode: 0644]
zypp-tui/output/Out.h [new file with mode: 0644]
zypp-tui/output/OutNormal.cc [new file with mode: 0644]
zypp-tui/output/OutNormal.h [new file with mode: 0644]
zypp-tui/output/PromptOptions [new file with mode: 0644]
zypp-tui/output/Utf8.h [new file with mode: 0644]
zypp-tui/output/promptoptions.cc [new file with mode: 0644]
zypp-tui/output/promptoptions.h [new file with mode: 0644]
zypp-tui/utils/ansi.h [new file with mode: 0644]
zypp-tui/utils/colors.cc [new file with mode: 0644]
zypp-tui/utils/colors.h [new file with mode: 0644]
zypp-tui/utils/console.cc [new file with mode: 0644]
zypp-tui/utils/console.h [new file with mode: 0644]
zypp-tui/utils/richtext.cc [new file with mode: 0644]
zypp-tui/utils/richtext.h [new file with mode: 0644]
zypp-tui/utils/text.cc [new file with mode: 0644]
zypp-tui/utils/text.h [new file with mode: 0644]
zypp.conf
zypp/Arch.cc
zypp/Arch.h
zypp/CMakeLists.txt
zypp/Capability.cc
zypp/Capability.h
zypp/HistoryLog.cc
zypp/MediaSetAccess.cc
zypp/PurgeKernels.cc
zypp/RepoInfo.cc
zypp/RepoInfo.h
zypp/RepoManager.cc
zypp/RepoManager.h
zypp/ShutdownLock.cc [deleted file]
zypp/ZConfig.cc
zypp/ZConfig.h
zypp/ZYpp.h
zypp/ZYppCallbacks.h
zypp/ZYppFactory.cc
zypp/ZYppFactory.h
zypp/base/Algorithm.h
zypp/media/MediaCurl.cc
zypp/media/MediaCurl.h
zypp/media/MediaHandler.h
zypp/media/MediaHandlerFactory.cc
zypp/media/MediaMultiCurl.cc
zypp/media/MediaNetwork.cc [new file with mode: 0644]
zypp/media/MediaNetwork.h [new file with mode: 0644]
zypp/media/MediaNetworkCommonHandler.cc [new file with mode: 0644]
zypp/media/MediaNetworkCommonHandler.h
zypp/misc/CheckAccessDeleted.cc
zypp/misc/DefaultLoadSystem.cc
zypp/misc/DefaultLoadSystem.h
zypp/repo/Downloader.cc
zypp/repo/SUSEMediaVerifier.cc
zypp/repo/yum/Downloader.cc
zypp/sat/SolvAttr.h
zypp/sat/WhatProvides.h
zypp/solver/detail/Resolver.cc
zypp/solver/detail/Resolver.h
zypp/solver/detail/SATResolver.cc
zypp/solver/detail/SATResolver.h
zypp/target/RpmPostTransCollector.cc
zypp/target/RpmPostTransCollector.h
zypp/target/TargetImpl.cc
zypp/target/rpm/RpmDb.cc
zypp/target/rpm/RpmDb.h
zypp/target/rpm/RpmHeader.cc
zypp/target/rpm/RpmHeader.h
zypp/target/rpm/librpmDb.h
zypp/zypp_detail/ZYppImpl.cc

index 39334d0..69bece4 100644 (file)
@@ -2,7 +2,10 @@ cmake_minimum_required(VERSION 3.1)
 PROJECT(LIBZYPP)
 SET( PACKAGE "libzypp" )
 # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
-SET( CMAKE_MODULE_PATH ${LIBZYPP_SOURCE_DIR}/cmake/modules )
+SET( CMAKE_MODULE_PATH
+    ${LIBZYPP_SOURCE_DIR}/cmake/modules
+    ${CMAKE_MODULE_PATH}
+)
 INCLUDE(ZyppCommon)
 
 OPTION (ENABLE_BUILD_DOCS "Build documentation by default?" OFF)
@@ -207,7 +210,13 @@ ELSE ( NOT ZLIB_FOUND)
   INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
 ENDIF( NOT ZLIB_FOUND)
 
-FIND_PACKAGE(Protobuf REQUIRED)
+# CMake's own FindProtobuf is not compatible with protobuf >= 22,
+# so force using protobuf's own CMake module.
+FIND_PACKAGE(Protobuf CONFIG)
+if ( NOT Protobuf_FOUND)
+    # Protobuf's own CMake module not found, fall back to CMake's
+    FIND_PACKAGE(Protobuf REQUIRED)
+endif()
 SET( Protobuf_IMPORT_DIRS ${CMAKE_CURRENT_SOURCE_DIR} )
 if ( "${Protobuf_VERSION}" VERSION_LESS "3.8.0")
   message("Protobuf ${Protobuf_VERSION} has no ZeroCopyStreams, using internal version.")
@@ -219,6 +228,10 @@ IF ( NOT YAML-CPP_FOUND)
   MESSAGE( FATAL_ERROR " yaml-cpp not found" )
 ELSE ( NOT YAML-CPP_FOUND)
   INCLUDE_DIRECTORIES(${YAML_CPP_INCLUDE_DIR})
+  IF ( NOT YAML_CPP_LIBRARIES )
+    # Must have been found by config insted of module, use target instead.
+    SET( YAML_CPP_LIBRARIES "yaml-cpp" )
+  ENDIF ( NOT YAML_CPP_LIBRARIES )
 ENDIF( NOT YAML-CPP_FOUND)
 
 
@@ -249,12 +262,20 @@ ELSE()
   ENDIF()
 ENDIF( LIBSOLV_SRCDIR AND LIBSOLV_BUILDDIR )
 
-FIND_PACKAGE(Gpgme REQUIRED)
-IF ( NOT GPGME_PTHREAD_FOUND )
-  MESSAGE( FATAL_ERROR " gpgme not found" )
+pkg_search_module(GPGME gpgme>=1.8.0)
+IF ( GPGME_FOUND )
+  MESSAGE(STATUS "Found gpgme ${GPGME_VERSION}" )
+  INCLUDE_DIRECTORIES( ${GPGME_INCLUDE_DIRS} )
+  LINK_DIRECTORIES(${GPGME_LIBRARY_DIRS})
 ELSE()
-  INCLUDE_DIRECTORIES( ${GPGME_INCLUDES} )
-  LINK_DIRECTORIES(${GPGME_LIBRARY_DIR})
+  FIND_PACKAGE(Gpgme REQUIRED)
+  IF ( NOT GPGME_PTHREAD_FOUND )
+    MESSAGE( FATAL_ERROR " gpgme not found" )
+  ELSE()
+    INCLUDE_DIRECTORIES( ${GPGME_INCLUDES} )
+    LINK_DIRECTORIES(${GPGME_LIBRARY_DIR})
+    SET(GPGME_LIBRARIES ${GPGME_PTHREAD_LIBRARIES})
+  ENDIF()
 ENDIF()
 
 FIND_PACKAGE(OpenSSL REQUIRED)
@@ -359,6 +380,7 @@ ADD_SUBDIRECTORY( zypp-proto )
 ADD_SUBDIRECTORY( zypp-core )
 ADD_SUBDIRECTORY( zypp-media )
 ADD_SUBDIRECTORY( zypp-curl )
+ADD_SUBDIRECTORY( zypp-tui )
 ADD_SUBDIRECTORY( zypp )
 ADD_SUBDIRECTORY( tools )
 ADD_SUBDIRECTORY( doc )
index 816ceb1..69af1b3 100644 (file)
@@ -61,8 +61,8 @@
 SET(LIBZYPP_MAJOR "17")
 SET(LIBZYPP_COMPATMINOR "22")
 SET(LIBZYPP_MINOR "31")
-SET(LIBZYPP_PATCH "1")
+SET(LIBZYPP_PATCH "23")
 #
-# LAST RELEASED: 17.31.1 (22)
+# LAST RELEASED: 17.31.23 (22)
 # (The number in parenthesis is LIBZYPP_COMPATMINOR)
 #=======
diff --git a/cmake/modules/FindProtobuf.cmake b/cmake/modules/FindProtobuf.cmake
new file mode 100644 (file)
index 0000000..f485e47
--- /dev/null
@@ -0,0 +1,663 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+FindProtobuf
+------------
+
+Locate and configure the Google Protocol Buffers library.
+
+The following variables can be set and are optional:
+
+``Protobuf_SRC_ROOT_FOLDER``
+  When compiling with MSVC, if this cache variable is set
+  the protobuf-default VS project build locations
+  (vsprojects/Debug and vsprojects/Release
+  or vsprojects/x64/Debug and vsprojects/x64/Release)
+  will be searched for libraries and binaries.
+``Protobuf_IMPORT_DIRS``
+  List of additional directories to be searched for
+  imported .proto files.
+``Protobuf_DEBUG``
+  Show debug messages.
+``Protobuf_USE_STATIC_LIBS``
+  Set to ON to force the use of the static libraries.
+  Default is OFF.
+
+Defines the following variables:
+
+``Protobuf_FOUND``
+  Found the Google Protocol Buffers library
+  (libprotobuf & header files)
+``Protobuf_VERSION``
+  Version of package found.
+``Protobuf_INCLUDE_DIRS``
+  Include directories for Google Protocol Buffers
+``Protobuf_LIBRARIES``
+  The protobuf libraries
+``Protobuf_PROTOC_LIBRARIES``
+  The protoc libraries
+``Protobuf_LITE_LIBRARIES``
+  The protobuf-lite libraries
+
+The following :prop_tgt:`IMPORTED` targets are also defined:
+
+``protobuf::libprotobuf``
+  The protobuf library.
+``protobuf::libprotobuf-lite``
+  The protobuf lite library.
+``protobuf::libprotoc``
+  The protoc library.
+``protobuf::protoc``
+  The protoc compiler.
+
+The following cache variables are also available to set or use:
+
+``Protobuf_LIBRARY``
+  The protobuf library
+``Protobuf_PROTOC_LIBRARY``
+  The protoc library
+``Protobuf_INCLUDE_DIR``
+  The include directory for protocol buffers
+``Protobuf_PROTOC_EXECUTABLE``
+  The protoc compiler
+``Protobuf_LIBRARY_DEBUG``
+  The protobuf library (debug)
+``Protobuf_PROTOC_LIBRARY_DEBUG``
+  The protoc library (debug)
+``Protobuf_LITE_LIBRARY``
+  The protobuf lite library
+``Protobuf_LITE_LIBRARY_DEBUG``
+  The protobuf lite library (debug)
+
+Example:
+
+.. code-block:: cmake
+
+  find_package(Protobuf REQUIRED)
+  include_directories(${Protobuf_INCLUDE_DIRS})
+  include_directories(${CMAKE_CURRENT_BINARY_DIR})
+  protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)
+  protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto)
+  protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto)
+  protobuf_generate_python(PROTO_PY foo.proto)
+  add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
+  target_link_libraries(bar ${Protobuf_LIBRARIES})
+
+.. note::
+  The ``protobuf_generate_cpp`` and ``protobuf_generate_python``
+  functions and :command:`add_executable` or :command:`add_library`
+  calls only work properly within the same directory.
+
+.. command:: protobuf_generate_cpp
+
+  Add custom commands to process ``.proto`` files to C++::
+
+    protobuf_generate_cpp (<SRCS> <HDRS>
+        [DESCRIPTORS <DESC>] [EXPORT_MACRO <MACRO>] [<ARGN>...])
+
+  ``SRCS``
+    Variable to define with autogenerated source files
+  ``HDRS``
+    Variable to define with autogenerated header files
+  ``DESCRIPTORS``
+    Variable to define with autogenerated descriptor files, if requested.
+  ``EXPORT_MACRO``
+    is a macro which should expand to ``__declspec(dllexport)`` or
+    ``__declspec(dllimport)`` depending on what is being compiled.
+  ``ARGN``
+    ``.proto`` files
+
+.. command:: protobuf_generate_python
+
+  Add custom commands to process ``.proto`` files to Python::
+
+    protobuf_generate_python (<PY> [<ARGN>...])
+
+  ``PY``
+    Variable to define with autogenerated Python files
+  ``ARGN``
+    ``.proto`` files
+#]=======================================================================]
+
+function(protobuf_generate)
+  set(_options APPEND_PATH DESCRIPTORS)
+  set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR)
+  if(COMMAND target_sources)
+    list(APPEND _singleargs TARGET)
+  endif()
+  set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS)
+
+  cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}")
+
+  if(NOT protobuf_generate_PROTOS AND NOT protobuf_generate_TARGET)
+    message(SEND_ERROR "Error: protobuf_generate called without any targets or source files")
+    return()
+  endif()
+
+  if(NOT protobuf_generate_OUT_VAR AND NOT protobuf_generate_TARGET)
+    message(SEND_ERROR "Error: protobuf_generate called without a target or output variable")
+    return()
+  endif()
+
+  if(NOT protobuf_generate_LANGUAGE)
+    set(protobuf_generate_LANGUAGE cpp)
+  endif()
+  string(TOLOWER ${protobuf_generate_LANGUAGE} protobuf_generate_LANGUAGE)
+
+  if(NOT protobuf_generate_PROTOC_OUT_DIR)
+    set(protobuf_generate_PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
+  endif()
+
+  if(protobuf_generate_EXPORT_MACRO AND protobuf_generate_LANGUAGE STREQUAL cpp)
+    set(_dll_export_decl "dllexport_decl=${protobuf_generate_EXPORT_MACRO}:")
+  endif()
+
+  if(NOT protobuf_generate_GENERATE_EXTENSIONS)
+    if(protobuf_generate_LANGUAGE STREQUAL cpp)
+      set(protobuf_generate_GENERATE_EXTENSIONS .pb.h .pb.cc)
+    elseif(protobuf_generate_LANGUAGE STREQUAL python)
+      set(protobuf_generate_GENERATE_EXTENSIONS _pb2.py)
+    else()
+      message(SEND_ERROR "Error: protobuf_generate given unknown Language ${LANGUAGE}, please provide a value for GENERATE_EXTENSIONS")
+      return()
+    endif()
+  endif()
+
+  if(protobuf_generate_TARGET)
+    get_target_property(_source_list ${protobuf_generate_TARGET} SOURCES)
+    foreach(_file ${_source_list})
+      if(_file MATCHES "proto$")
+        list(APPEND protobuf_generate_PROTOS ${_file})
+      endif()
+    endforeach()
+  endif()
+
+  if(NOT protobuf_generate_PROTOS)
+    message(SEND_ERROR "Error: protobuf_generate could not find any .proto files")
+    return()
+  endif()
+
+  if(protobuf_generate_APPEND_PATH)
+    # Create an include path for each file specified
+    foreach(_file ${protobuf_generate_PROTOS})
+      get_filename_component(_abs_file ${_file} ABSOLUTE)
+      get_filename_component(_abs_path ${_abs_file} PATH)
+      list(FIND _protobuf_include_path ${_abs_path} _contains_already)
+      if(${_contains_already} EQUAL -1)
+          list(APPEND _protobuf_include_path -I ${_abs_path})
+      endif()
+    endforeach()
+  else()
+    set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
+  endif()
+
+  foreach(DIR ${protobuf_generate_IMPORT_DIRS})
+    get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
+    list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
+    if(${_contains_already} EQUAL -1)
+        list(APPEND _protobuf_include_path -I ${ABS_PATH})
+    endif()
+  endforeach()
+
+  set(_generated_srcs_all)
+  foreach(_proto ${protobuf_generate_PROTOS})
+    get_filename_component(_abs_file ${_proto} ABSOLUTE)
+    get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
+    get_filename_component(_basename ${_proto} NAME_WE)
+    file(RELATIVE_PATH _rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_abs_dir})
+
+    set(_possible_rel_dir)
+    if (NOT protobuf_generate_APPEND_PATH)
+        set(_possible_rel_dir ${_rel_dir}/)
+    endif()
+
+    set(_generated_srcs)
+    foreach(_ext ${protobuf_generate_GENERATE_EXTENSIONS})
+      list(APPEND _generated_srcs "${protobuf_generate_PROTOC_OUT_DIR}/${_possible_rel_dir}${_basename}${_ext}")
+    endforeach()
+
+    if(protobuf_generate_DESCRIPTORS AND protobuf_generate_LANGUAGE STREQUAL cpp)
+      set(_descriptor_file "${CMAKE_CURRENT_BINARY_DIR}/${_basename}.desc")
+      set(_dll_desc_out "--descriptor_set_out=${_descriptor_file}")
+      list(APPEND _generated_srcs ${_descriptor_file})
+    endif()
+    list(APPEND _generated_srcs_all ${_generated_srcs})
+
+    add_custom_command(
+      OUTPUT ${_generated_srcs}
+      COMMAND  protobuf::protoc
+      ARGS --${protobuf_generate_LANGUAGE}_out ${_dll_export_decl}${protobuf_generate_PROTOC_OUT_DIR} ${_dll_desc_out} ${_protobuf_include_path} ${_abs_file}
+      DEPENDS ${_abs_file} protobuf::protoc
+      COMMENT "Running ${protobuf_generate_LANGUAGE} protocol buffer compiler on ${_proto}"
+      VERBATIM )
+  endforeach()
+
+  set_source_files_properties(${_generated_srcs_all} PROPERTIES GENERATED TRUE)
+  if(protobuf_generate_OUT_VAR)
+    set(${protobuf_generate_OUT_VAR} ${_generated_srcs_all} PARENT_SCOPE)
+  endif()
+  if(protobuf_generate_TARGET)
+    target_sources(${protobuf_generate_TARGET} PRIVATE ${_generated_srcs_all})
+  endif()
+endfunction()
+
+function(PROTOBUF_GENERATE_CPP SRCS HDRS)
+  cmake_parse_arguments(protobuf_generate_cpp "" "EXPORT_MACRO;DESCRIPTORS" "" ${ARGN})
+
+  set(_proto_files "${protobuf_generate_cpp_UNPARSED_ARGUMENTS}")
+  if(NOT _proto_files)
+    message(SEND_ERROR "Error: PROTOBUF_GENERATE_CPP() called without any proto files")
+    return()
+  endif()
+
+  if(PROTOBUF_GENERATE_CPP_APPEND_PATH)
+    set(_append_arg APPEND_PATH)
+  endif()
+
+  if(protobuf_generate_cpp_DESCRIPTORS)
+    set(_descriptors DESCRIPTORS)
+  endif()
+
+  if(DEFINED PROTOBUF_IMPORT_DIRS AND NOT DEFINED Protobuf_IMPORT_DIRS)
+    set(Protobuf_IMPORT_DIRS "${PROTOBUF_IMPORT_DIRS}")
+  endif()
+
+  if(DEFINED Protobuf_IMPORT_DIRS)
+    set(_import_arg IMPORT_DIRS ${Protobuf_IMPORT_DIRS})
+  endif()
+
+  set(_outvar)
+  protobuf_generate(${_append_arg} ${_descriptors} LANGUAGE cpp EXPORT_MACRO ${protobuf_generate_cpp_EXPORT_MACRO} OUT_VAR _outvar ${_import_arg} PROTOS ${_proto_files})
+
+  set(${SRCS})
+  set(${HDRS})
+  if(protobuf_generate_cpp_DESCRIPTORS)
+    set(${protobuf_generate_cpp_DESCRIPTORS})
+  endif()
+
+  foreach(_file ${_outvar})
+    if(_file MATCHES "cc$")
+      list(APPEND ${SRCS} ${_file})
+    elseif(_file MATCHES "desc$")
+      list(APPEND ${protobuf_generate_cpp_DESCRIPTORS} ${_file})
+    else()
+      list(APPEND ${HDRS} ${_file})
+    endif()
+  endforeach()
+  set(${SRCS} ${${SRCS}} PARENT_SCOPE)
+  set(${HDRS} ${${HDRS}} PARENT_SCOPE)
+  if(protobuf_generate_cpp_DESCRIPTORS)
+    set(${protobuf_generate_cpp_DESCRIPTORS} "${${protobuf_generate_cpp_DESCRIPTORS}}" PARENT_SCOPE)
+  endif()
+endfunction()
+
+function(PROTOBUF_GENERATE_PYTHON SRCS)
+  if(NOT ARGN)
+    message(SEND_ERROR "Error: PROTOBUF_GENERATE_PYTHON() called without any proto files")
+    return()
+  endif()
+
+  if(PROTOBUF_GENERATE_CPP_APPEND_PATH)
+    set(_append_arg APPEND_PATH)
+  endif()
+
+  if(DEFINED PROTOBUF_IMPORT_DIRS AND NOT DEFINED Protobuf_IMPORT_DIRS)
+    set(Protobuf_IMPORT_DIRS "${PROTOBUF_IMPORT_DIRS}")
+  endif()
+
+  if(DEFINED Protobuf_IMPORT_DIRS)
+    set(_import_arg IMPORT_DIRS ${Protobuf_IMPORT_DIRS})
+  endif()
+
+  set(_outvar)
+  protobuf_generate(${_append_arg} LANGUAGE python OUT_VAR _outvar ${_import_arg} PROTOS ${ARGN})
+  set(${SRCS} ${_outvar} PARENT_SCOPE)
+endfunction()
+
+
+if(Protobuf_DEBUG)
+  # Output some of their choices
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "Protobuf_USE_STATIC_LIBS = ${Protobuf_USE_STATIC_LIBS}")
+endif()
+
+
+# Backwards compatibility
+# Define camel case versions of input variables
+foreach(UPPER
+    PROTOBUF_SRC_ROOT_FOLDER
+    PROTOBUF_IMPORT_DIRS
+    PROTOBUF_DEBUG
+    PROTOBUF_LIBRARY
+    PROTOBUF_PROTOC_LIBRARY
+    PROTOBUF_INCLUDE_DIR
+    PROTOBUF_PROTOC_EXECUTABLE
+    PROTOBUF_LIBRARY_DEBUG
+    PROTOBUF_PROTOC_LIBRARY_DEBUG
+    PROTOBUF_LITE_LIBRARY
+    PROTOBUF_LITE_LIBRARY_DEBUG
+    )
+    if (DEFINED ${UPPER})
+        string(REPLACE "PROTOBUF_" "Protobuf_" Camel ${UPPER})
+        if (NOT DEFINED ${Camel})
+            set(${Camel} ${${UPPER}})
+        endif()
+    endif()
+endforeach()
+
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+  set(_PROTOBUF_ARCH_DIR x64/)
+endif()
+
+
+# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
+if( Protobuf_USE_STATIC_LIBS )
+  set( _protobuf_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+  if(WIN32)
+    set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
+  else()
+    set(CMAKE_FIND_LIBRARY_SUFFIXES .a )
+  endif()
+endif()
+
+include(SelectLibraryConfigurations)
+
+# Internal function: search for normal library as well as a debug one
+#    if the debug one is specified also include debug/optimized keywords
+#    in *_LIBRARIES variable
+function(_protobuf_find_libraries name filename)
+  if(${name}_LIBRARIES)
+    # Use result recorded by a previous call.
+    return()
+  elseif(${name}_LIBRARY)
+    # Honor cache entry used by CMake 3.5 and lower.
+    set(${name}_LIBRARIES "${${name}_LIBRARY}" PARENT_SCOPE)
+  else()
+    find_library(${name}_LIBRARY_RELEASE
+      NAMES ${filename}
+      NAMES_PER_DIR
+      PATHS ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Release)
+    mark_as_advanced(${name}_LIBRARY_RELEASE)
+
+    find_library(${name}_LIBRARY_DEBUG
+      NAMES ${filename}d ${filename}
+      NAMES_PER_DIR
+      PATHS ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Debug)
+    mark_as_advanced(${name}_LIBRARY_DEBUG)
+
+    select_library_configurations(${name})
+
+    if(UNIX AND Threads_FOUND AND ${name}_LIBRARY)
+      list(APPEND ${name}_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
+    endif()
+
+    set(${name}_LIBRARY "${${name}_LIBRARY}" PARENT_SCOPE)
+    set(${name}_LIBRARIES "${${name}_LIBRARIES}" PARENT_SCOPE)
+  endif()
+endfunction()
+
+#
+# Main.
+#
+
+# By default have PROTOBUF_GENERATE_CPP macro pass -I to protoc
+# for each directory where a proto file is referenced.
+if(NOT DEFINED PROTOBUF_GENERATE_CPP_APPEND_PATH)
+  set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE)
+endif()
+
+
+# Google's provided vcproj files generate libraries with a "lib"
+# prefix on Windows
+if(MSVC)
+    set(Protobuf_ORIG_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
+    set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
+
+    find_path(Protobuf_SRC_ROOT_FOLDER protobuf.pc.in)
+endif()
+
+if(UNIX)
+  # Protobuf headers may depend on threading.
+  find_package(Threads QUIET)
+endif()
+
+# The Protobuf library
+_protobuf_find_libraries(Protobuf protobuf)
+#DOC "The Google Protocol Buffers RELEASE Library"
+
+_protobuf_find_libraries(Protobuf_LITE protobuf-lite)
+
+# The Protobuf Protoc Library
+_protobuf_find_libraries(Protobuf_PROTOC protoc)
+
+# Restore original find library prefixes
+if(MSVC)
+    set(CMAKE_FIND_LIBRARY_PREFIXES "${Protobuf_ORIG_FIND_LIBRARY_PREFIXES}")
+endif()
+
+# Find the include directory
+find_path(Protobuf_INCLUDE_DIR
+    google/protobuf/service.h
+    PATHS ${Protobuf_SRC_ROOT_FOLDER}/src
+)
+mark_as_advanced(Protobuf_INCLUDE_DIR)
+
+# Find the protoc Executable
+find_program(Protobuf_PROTOC_EXECUTABLE
+    NAMES protoc
+    DOC "The Google Protocol Buffers Compiler"
+    PATHS
+    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Release
+    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Debug
+)
+mark_as_advanced(Protobuf_PROTOC_EXECUTABLE)
+
+if(Protobuf_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+        "requested version of Google Protobuf is ${Protobuf_FIND_VERSION}")
+endif()
+
+if(Protobuf_INCLUDE_DIR)
+  set(_PROTOBUF_COMMON_HEADER ${Protobuf_INCLUDE_DIR}/google/protobuf/stubs/common.h)
+
+  if(Protobuf_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "location of common.h: ${_PROTOBUF_COMMON_HEADER}")
+  endif()
+
+  set(Protobuf_VERSION "")
+  set(Protobuf_LIB_VERSION "")
+  file(STRINGS ${_PROTOBUF_COMMON_HEADER} _PROTOBUF_COMMON_H_CONTENTS REGEX "#define[ \t]+GOOGLE_PROTOBUF_VERSION[ \t]+")
+  if(_PROTOBUF_COMMON_H_CONTENTS MATCHES "#define[ \t]+GOOGLE_PROTOBUF_VERSION[ \t]+([0-9]+)")
+      set(Protobuf_LIB_VERSION "${CMAKE_MATCH_1}")
+  endif()
+  unset(_PROTOBUF_COMMON_H_CONTENTS)
+
+  math(EXPR _PROTOBUF_MAJOR_VERSION "${Protobuf_LIB_VERSION} / 1000000")
+  math(EXPR _PROTOBUF_MINOR_VERSION "${Protobuf_LIB_VERSION} / 1000 % 1000")
+  math(EXPR _PROTOBUF_SUBMINOR_VERSION "${Protobuf_LIB_VERSION} % 1000")
+  set(Protobuf_VERSION "${_PROTOBUF_MAJOR_VERSION}.${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}")
+
+  if(Protobuf_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+        "${_PROTOBUF_COMMON_HEADER} reveals protobuf ${Protobuf_VERSION}")
+  endif()
+
+  if(Protobuf_PROTOC_EXECUTABLE)
+    # Check Protobuf compiler version to be aligned with libraries version
+    execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE} --version
+                    OUTPUT_VARIABLE _PROTOBUF_PROTOC_EXECUTABLE_VERSION)
+
+    if("${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" MATCHES "libprotoc ([0-9.]+)")
+      set(_PROTOBUF_PROTOC_EXECUTABLE_VERSION "${CMAKE_MATCH_1}")
+    endif()
+
+    if(Protobuf_DEBUG)
+      message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+          "${Protobuf_PROTOC_EXECUTABLE} reveals version ${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}")
+    endif()
+
+    if(NOT "${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" VERSION_EQUAL "${Protobuf_VERSION}")
+      message(WARNING "Protobuf compiler version ${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}"
+        " doesn't match library version ${Protobuf_VERSION}")
+    endif()
+  endif()
+
+  if(Protobuf_LIBRARY)
+      if(NOT TARGET protobuf::libprotobuf)
+          add_library(protobuf::libprotobuf UNKNOWN IMPORTED)
+          set_target_properties(protobuf::libprotobuf PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}")
+          if(EXISTS "${Protobuf_LIBRARY}")
+            set_target_properties(protobuf::libprotobuf PROPERTIES
+              IMPORTED_LOCATION "${Protobuf_LIBRARY}")
+          endif()
+          if(EXISTS "${Protobuf_LIBRARY_RELEASE}")
+            set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
+              IMPORTED_CONFIGURATIONS RELEASE)
+            set_target_properties(protobuf::libprotobuf PROPERTIES
+              IMPORTED_LOCATION_RELEASE "${Protobuf_LIBRARY_RELEASE}")
+          endif()
+          if(EXISTS "${Protobuf_LIBRARY_DEBUG}")
+            set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
+              IMPORTED_CONFIGURATIONS DEBUG)
+            set_target_properties(protobuf::libprotobuf PROPERTIES
+              IMPORTED_LOCATION_DEBUG "${Protobuf_LIBRARY_DEBUG}")
+          endif()
+          if (Protobuf_VERSION VERSION_GREATER_EQUAL "3.6")
+            set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
+              INTERFACE_COMPILE_FEATURES cxx_std_11
+            )
+          endif()
+          if (MSVC AND NOT Protobuf_USE_STATIC_LIBS)
+            set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
+              INTERFACE_COMPILE_DEFINITIONS "PROTOBUF_USE_DLLS"
+            )
+          endif()
+          if(UNIX AND TARGET Threads::Threads)
+            set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
+                INTERFACE_LINK_LIBRARIES Threads::Threads)
+          endif()
+      endif()
+  endif()
+
+  if(Protobuf_LITE_LIBRARY)
+      if(NOT TARGET protobuf::libprotobuf-lite)
+          add_library(protobuf::libprotobuf-lite UNKNOWN IMPORTED)
+          set_target_properties(protobuf::libprotobuf-lite PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}")
+          if(EXISTS "${Protobuf_LITE_LIBRARY}")
+            set_target_properties(protobuf::libprotobuf-lite PROPERTIES
+              IMPORTED_LOCATION "${Protobuf_LITE_LIBRARY}")
+          endif()
+          if(EXISTS "${Protobuf_LITE_LIBRARY_RELEASE}")
+            set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY
+              IMPORTED_CONFIGURATIONS RELEASE)
+            set_target_properties(protobuf::libprotobuf-lite PROPERTIES
+              IMPORTED_LOCATION_RELEASE "${Protobuf_LITE_LIBRARY_RELEASE}")
+          endif()
+          if(EXISTS "${Protobuf_LITE_LIBRARY_DEBUG}")
+            set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY
+              IMPORTED_CONFIGURATIONS DEBUG)
+            set_target_properties(protobuf::libprotobuf-lite PROPERTIES
+              IMPORTED_LOCATION_DEBUG "${Protobuf_LITE_LIBRARY_DEBUG}")
+          endif()
+          if (MSVC AND NOT Protobuf_USE_STATIC_LIBS)
+            set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY
+              INTERFACE_COMPILE_DEFINITIONS "PROTOBUF_USE_DLLS"
+            )
+          endif()
+          if(UNIX AND TARGET Threads::Threads)
+            set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY
+                INTERFACE_LINK_LIBRARIES Threads::Threads)
+          endif()
+      endif()
+  endif()
+
+  if(Protobuf_PROTOC_LIBRARY)
+      if(NOT TARGET protobuf::libprotoc)
+          add_library(protobuf::libprotoc UNKNOWN IMPORTED)
+          set_target_properties(protobuf::libprotoc PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${Protobuf_INCLUDE_DIR}")
+          if(EXISTS "${Protobuf_PROTOC_LIBRARY}")
+            set_target_properties(protobuf::libprotoc PROPERTIES
+              IMPORTED_LOCATION "${Protobuf_PROTOC_LIBRARY}")
+          endif()
+          if(EXISTS "${Protobuf_PROTOC_LIBRARY_RELEASE}")
+            set_property(TARGET protobuf::libprotoc APPEND PROPERTY
+              IMPORTED_CONFIGURATIONS RELEASE)
+            set_target_properties(protobuf::libprotoc PROPERTIES
+              IMPORTED_LOCATION_RELEASE "${Protobuf_PROTOC_LIBRARY_RELEASE}")
+          endif()
+          if(EXISTS "${Protobuf_PROTOC_LIBRARY_DEBUG}")
+            set_property(TARGET protobuf::libprotoc APPEND PROPERTY
+              IMPORTED_CONFIGURATIONS DEBUG)
+            set_target_properties(protobuf::libprotoc PROPERTIES
+              IMPORTED_LOCATION_DEBUG "${Protobuf_PROTOC_LIBRARY_DEBUG}")
+          endif()
+          if (Protobuf_VERSION VERSION_GREATER_EQUAL "3.6")
+            set_property(TARGET protobuf::libprotoc APPEND PROPERTY
+              INTERFACE_COMPILE_FEATURES cxx_std_11
+            )
+          endif()
+          if (MSVC AND NOT Protobuf_USE_STATIC_LIBS)
+            set_property(TARGET protobuf::libprotoc APPEND PROPERTY
+              INTERFACE_COMPILE_DEFINITIONS "PROTOBUF_USE_DLLS"
+            )
+          endif()
+          if(UNIX AND TARGET Threads::Threads)
+            set_property(TARGET protobuf::libprotoc APPEND PROPERTY
+                INTERFACE_LINK_LIBRARIES Threads::Threads)
+          endif()
+      endif()
+  endif()
+
+  if(Protobuf_PROTOC_EXECUTABLE)
+      if(NOT TARGET protobuf::protoc)
+          add_executable(protobuf::protoc IMPORTED)
+          if(EXISTS "${Protobuf_PROTOC_EXECUTABLE}")
+            set_target_properties(protobuf::protoc PROPERTIES
+              IMPORTED_LOCATION "${Protobuf_PROTOC_EXECUTABLE}")
+          endif()
+      endif()
+  endif()
+endif()
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Protobuf
+    REQUIRED_VARS Protobuf_LIBRARIES Protobuf_INCLUDE_DIR
+    VERSION_VAR Protobuf_VERSION
+)
+
+if(Protobuf_FOUND)
+    set(Protobuf_INCLUDE_DIRS ${Protobuf_INCLUDE_DIR})
+endif()
+
+# Restore the original find library ordering
+if( Protobuf_USE_STATIC_LIBS )
+  set(CMAKE_FIND_LIBRARY_SUFFIXES ${_protobuf_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
+endif()
+
+# Backwards compatibility
+# Define upper case versions of output variables
+foreach(Camel
+    Protobuf_SRC_ROOT_FOLDER
+    Protobuf_IMPORT_DIRS
+    Protobuf_DEBUG
+    Protobuf_INCLUDE_DIRS
+    Protobuf_LIBRARIES
+    Protobuf_PROTOC_LIBRARIES
+    Protobuf_LITE_LIBRARIES
+    Protobuf_LIBRARY
+    Protobuf_PROTOC_LIBRARY
+    Protobuf_INCLUDE_DIR
+    Protobuf_PROTOC_EXECUTABLE
+    Protobuf_LIBRARY_DEBUG
+    Protobuf_PROTOC_LIBRARY_DEBUG
+    Protobuf_LITE_LIBRARY
+    Protobuf_LITE_LIBRARY_DEBUG
+    )
+    string(TOUPPER ${Camel} UPPER)
+    set(${UPPER} ${${Camel}})
+endforeach()
diff --git a/cmake/modules/FindReadline.cmake b/cmake/modules/FindReadline.cmake
new file mode 100644 (file)
index 0000000..a5adae9
--- /dev/null
@@ -0,0 +1,42 @@
+# - Find readline library
+# This module looks for the GNU gettext tools. This module defines the
+# following values:
+#
+
+if(READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
+        # Already in cache, be silent
+        set(READLINE_FIND_QUIETLY TRUE)
+endif(READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
+
+set(READLINE_LIBRARY)
+set(READLINE_INCLUDE_DIR)
+
+FIND_PATH(READLINE_INCLUDE_DIR readline/readline.h
+  /usr/include
+  /usr/include/readline
+  /usr/local/include
+  /usr/include/readline
+)
+
+# make find_library look only for shared lib
+# otherwise it would find the static libreadline.a
+SET(CMAKE_FIND_LIBRARY_SUFFIXES_BACKUP ${CMAKE_FIND_LIBRARY_SUFFIXES})
+SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so")
+FIND_LIBRARY(READLINE_LIBRARY readline
+  PATHS
+  /usr/lib
+  /usr/lib64
+  /usr/local/lib
+  /usr/local/lib64
+)
+SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BACKUP})
+
+if(READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
+   MESSAGE( STATUS "readline found: includes in ${READLINE_INCLUDE_DIR}, library in ${READLINE_LIBRARY}")
+   set(READLINE_FOUND TRUE)
+else(READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
+   MESSAGE( STATUS "readline not found")
+endif(READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
+
+MARK_AS_ADVANCED(READLINE_INCLUDE_DIR READLINE_LIBRARY)
+
index 4091c4f..beca02b 100644 (file)
@@ -6,8 +6,8 @@ ELSE (DEFINED ZYPP_PREFIX)
 ENDIF (DEFINED ZYPP_PREFIX)
 
 if(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY)
-       # Already in cache, be silent
-       SET(ZYPP_FIND_QUIETLY TRUE)     
+        # Already in cache, be silent
+        SET(ZYPP_FIND_QUIETLY TRUE)
 endif(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY)
 
 set(ZYPP_LIBRARY)
@@ -29,6 +29,16 @@ IF (DEFINED ZYPP_PREFIX)
     NO_SYSTEM_ENVIRONMENT_PATH
     NO_CMAKE_SYSTEM_PATH
   )
+
+  FIND_LIBRARY(ZYPP_TUI_LIBRARY NAMES zypp-tui
+    PATHS
+    ${ZYPP_PREFIX}/lib
+    ${ZYPP_PREFIX}/lib64
+    NO_DEFAULT_PATH
+    NO_SYSTEM_ENVIRONMENT_PATH
+    NO_CMAKE_SYSTEM_PATH
+  )
+
 ELSE (DEFINED ZYPP_PREFIX)
   FIND_PATH(ZYPP_INCLUDE_DIR zypp/ZYpp.h
     /usr/include
@@ -39,10 +49,15 @@ ELSE (DEFINED ZYPP_PREFIX)
     /usr/lib
     /usr/local/lib
   )
+  FIND_LIBRARY(ZYPP_TUI_LIBRARY NAMES zypp-tui
+    PATHS
+    /usr/lib
+    /usr/local/lib
+  )
 ENDIF (DEFINED ZYPP_PREFIX)
 
 if(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY)
-   MESSAGE( STATUS "ZYpp found: includes in ${ZYPP_INCLUDE_DIR}, library in ${ZYPP_LIBRARY}")
+   MESSAGE( STATUS "ZYpp found: includes in ${ZYPP_INCLUDE_DIR}, library in ${ZYPP_LIBRARY}, tui library in ${ZYPP_TUI_LIBRARY}")
    set(ZYPP_FOUND TRUE)
 else(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY)
    MESSAGE( FATAL "ZYpp not found")
index a5303df..b6d9454 100644 (file)
@@ -4,4 +4,4 @@
 
 INCLUDE ( FindPkgConfig )
 
-PKG_SEARCH_MODULE( LIBPROXY libproxy-1.0 )
+PKG_CHECK_MODULES( LIBPROXY libproxy-1.0 )
index c9cb801..21a1960 100644 (file)
@@ -12,7 +12,9 @@ ENDIF ( NOT DOT )
 
 SET( ZYPP_PROJECT_ROOT   ${LIBZYPP_SOURCE_DIR} )
 SET( ZYPP_SOURCE_DIR     ${LIBZYPP_SOURCE_DIR}/zypp )
-SET( ZYPP_CORE_SOURCE_DIR     ${LIBZYPP_SOURCE_DIR}/zypp-core )
+SET( ZYPP_CORE_SOURCE_DIR   ${LIBZYPP_SOURCE_DIR}/zypp-core )
+SET( ZYPP_MEDIA_SOURCE_DIR  ${LIBZYPP_SOURCE_DIR}/zypp-media)
+SET( ZYPP_CURL_SOURCE_DIR   ${LIBZYPP_SOURCE_DIR}/zypp-curl )
 SET( ZYPP_DOCINCLUDE_DIR ${LIBZYPP_SOURCE_DIR}/doc/autoinclude )
 SET( ZYPP_EXAMPLE_DIR    ${LIBZYPP_SOURCE_DIR}/examples )
 
@@ -65,4 +67,3 @@ INSTALL( DIRECTORY
 ### ##################################################
 ENDIF ( DOXYGEN )
 ### ##################################################
-
index 0c04efa..6f8bad2 100644 (file)
@@ -69,7 +69,7 @@ WARN_LOGFILE           =
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-INPUT                  = @ZYPP_DOCINCLUDE_DIR@ @ZYPP_SOURCE_DIR@ @ZYPP_CORE_SOURCE_DIR@
+INPUT                  = @ZYPP_DOCINCLUDE_DIR@ @ZYPP_SOURCE_DIR@ @ZYPP_CORE_SOURCE_DIR@ @ZYPP_MEDIA_SOURCE_DIR@ @ZYPP_CURL_SOURCE_DIR@
 FILE_PATTERNS          = *.h *.hh *.hxx *.hpp *.h++ *.c *.cc *.cxx *.cpp *.c++ *.tcc *.hcc *.doc
 RECURSIVE              = YES
 EXCLUDE                =
@@ -118,6 +118,7 @@ DISABLE_INDEX          = NO
 ENUM_VALUES_PER_LINE   = 4
 GENERATE_TREEVIEW      = YES
 TREEVIEW_WIDTH         = 250
+USE_MATHJAX            = YES
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
index 45dd0ed..1789df1 100644 (file)
 \li (\c ZYPP_LIBSAT_FULLLOG=1) deprecated since \c libzypp-10.x, prefer \c ZYPP_LIBSOLV_FULLLOG
 \li \c LIBSOLV_DEBUGMASK=<INT> Pass value to libsolv::pool_setdebugmask
 
+\li \c ZYPP_MEDIANETWORK=1 Turn on the media network backend (the upcoming default).
 \li \c ZYPP_MEDIA_CURL_DEBUG=<1|2> Log http headers, if \c 2 also log server responses.
 \li \c ZYPP_MEDIA_CURL_IPRESOLVE=<4|6> Tell curl to resolve names to IPv4/IPv6 addresses only.
+\li \c ZYPP_METALINK_DEBUG=1 Log URL and priority of the mirrors parsed from a metalink file.
+\li \c ZYPP_MULTICURL=0 Turn off multicurl (metalink and zsync) and fall back to plain libcurl.
 
 \li \c ZYPP_RPM_DEBUG=1 Log verbose output from all rpm commands.
 
index 5f502e3..7bc69d2 100644 (file)
@@ -189,7 +189,10 @@ To use a local RIS service create a directory /somewhere on your disk (or access
 </repoindex>
 \endverbatim
 
-%{VAR} always refers to the value defined in the <tt>repoindex</tt> tag (reserved names are 'ttl' and 'alias'). %{alias} is available within a <tt>repo</tt> tag after the alias was defined there.
+%{VAR} always refers to the value defined in the <tt>repoindex</tt> tag. Reserved names are 'ttl' and 'alias'.
+
+- <tt>ttl="SECONDS"</tt> defines the matadata's expected time to live in case autorefresh is turned on for the service. It's the number of seconds that should pass before the service is autorefreshed again. It is not available as variable.
+- %{alias} is available within a <tt>repo</tt> tag after the alias was defined there.
 
 Given the file is located at /somewhere/repo/repoindex.xml, add the service by:
 \verbatim
index 134b340..5d5d98b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # spec file for package libzypp
 #
-# Copyright (c) 2005-2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
-%if 0%{?is_opensuse} && (0%{?sle_version} >= 150100 || 0%{?suse_version} > 1500)
+%if 0%{?suse_version} > 1500 || 0%{?sle_version} >= 150400 || (0%{?is_opensuse} && 0%{?sle_version} >= 150100)
 %bcond_without zchunk
 %else
 %bcond_with zchunk
@@ -44,8 +44,8 @@
 Name:           libzypp
 Version:        @VERSION@
 Release:        0
-License:        GPL-2.0+
-Url:            https://github.com/openSUSE/libzypp
+License:        GPL-2.0-or-later
+URL:            https://github.com/openSUSE/libzypp
 Summary:        Library for package, patch, pattern and product management
 Group:          System/Packages
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
@@ -82,6 +82,11 @@ BuildRequires:  boost-devel
 %endif
 BuildRequires:  dejagnu
 BuildRequires:  doxygen
+BuildRequires:  texlive-latex
+BuildRequires:  texlive-xcolor
+BuildRequires:  texlive-newunicodechar
+BuildRequires:  texlive-dvips
+BuildRequires:  ghostscript
 BuildRequires:  gcc-c++ >= 7
 BuildRequires:  gettext-devel
 BuildRequires:  graphviz
@@ -95,17 +100,14 @@ BuildRequires:  pkgconfig
 BuildRequires:  pkg-config
 %endif
 
-BuildRequires:  libsolv-devel >= 0.7.17
-%if 0%{?suse_version} >= 1100
+BuildRequires:  libsolv-devel >= 0.7.24
 BuildRequires:  libsolv-tools
 %requires_eq    libsolv-tools
-%else
-Requires:       libsolv-tools
-%endif
 
 BuildRequires:  glib2-devel
 BuildRequires:  libsigc++2-devel
 BuildRequires:  protobuf-devel
+BuildRequires:  readline-devel >= 5.1
 
 # required for testsuite
 %if %{with mediabackend_tests}
@@ -143,18 +145,12 @@ BuildRequires:    fcgi-devel
 %endif
 
 %define min_curl_version 7.19.4
+BuildRequires:  libcurl-devel >= %{min_curl_version}
 %if 0%{?suse_version}
-%if 0%{?suse_version} >= 1100
 # Code11+
-BuildRequires:  libcurl-devel >= %{min_curl_version}
 Requires:       libcurl4   >= %{min_curl_version}
 %else
-# Code10
-BuildRequires:  curl-devel
-%endif
-%else
 # Other distros (Fedora)
-BuildRequires:  libcurl-devel >= %{min_curl_version}
 Requires:       libcurl   >= %{min_curl_version}
 %endif
 
@@ -195,6 +191,7 @@ Summary:        Header files for libzypp, a library for package management
 Group:          Development/Libraries/C and C++
 Provides:       yast2-packagemanager-devel
 Obsoletes:      yast2-packagemanager-devel
+Provides:       libzypp-tui-devel = 1
 %if 0%{?suse_version} >= 1330
 Requires:       libboost_headers-devel
 Requires:       libboost_program_options-devel
@@ -214,18 +211,13 @@ Requires:       rpm-devel > 4.4
 Requires:       zlib-devel
 Requires:       libudev-devel
 %if 0%{?suse_version}
-%if 0%{?suse_version} >= 1100
 # Code11+
 Requires:       libcurl-devel >= %{min_curl_version}
 %else
-# Code10
-Requires:       curl-devel
-%endif
-%else
 # Other distros (Fedora)
 Requires:       libcurl-devel >= %{min_curl_version}
 %endif
-%if 0%{?suse_version} >= 1100
+%if 0%{?suse_version}
 %requires_ge    libsolv-devel
 %else
 Requires:       libsolv-devel
@@ -387,13 +379,13 @@ done
 %files devel
 %defattr(-,root,root)
 %{_libdir}/libzypp.so
+%{_libdir}/libzypp-tui.a
 %{_datadir}/cmake/Modules/*
 %{_includedir}/zypp
 %{_includedir}/zypp-core
 %{_includedir}/zypp-media
 %{_includedir}/zypp-curl
-%{_libdir}/pkgconfig/libzypp.pc
-%{_libdir}/pkgconfig/libzypp.pc
+%{_includedir}/zypp-tui
 %{_libdir}/pkgconfig/libzypp.pc
 
 %files devel-doc
index 6d4303e..c80fdf4 100755 (executable)
@@ -64,6 +64,9 @@ test -f "$CHANGESFILE" || errexit "No changes file '$CHANGESFILE'"
 VERSIONFILE="VERSION.cmake"
 test -f "$VERSIONFILE" || errexit "No version file '$VERSIONFILE'"
 
+SPECFILE=$(ls *.spec.cmake)
+grep -q "^# Copyright (c) $(date +"%Y")" "$SPECFILE" || errexit "Fix copyright date in spec file '$SPECFILE'"
+
 function getversion() {
   cat "$VERSIONFILE" \
   | awk '
index f61e226..8f02279 100644 (file)
@@ -1,4 +1,256 @@
 -------------------------------------------------------------------
+Wed Oct 25 16:03:51 CEST 2023 - ma@suse.de
+
+- Stop using boost version 1 timer library (fixes #489,
+  bsc#1215294)
+- version 17.31.23 (22)
+
+-------------------------------------------------------------------
+Thu Oct 12 14:26:36 CEST 2023 - ma@suse.de
+
+- Preliminary disable 'rpm --runposttrans' usage for chrooted
+  systems (bsc#1216091)
+  This limits the %transfiletrigger(postun|in) support in the
+  default installer if --root is used (as described in bsc#1041742).
+  The chrooted execution of the scripts in 'rpm --runposttrans'
+  broke in rpm-4.18. It's expected to be fixed in rpm-4.19.
+  Then we'll enable the feature again.
+- fix comment typo on zypp.conf (boo#1215979)
+- version 17.31.22 (22)
+
+-------------------------------------------------------------------
+Thu Sep 21 14:54:42 CEST 2023 - ma@suse.de
+
+- Attempt to delay %transfiletrigger(postun|in) execution if rpm
+  supports it (bsc#1041742)
+  Decide during installation whether rpm is capable of delayed
+  %posttrans %transfiletrigger(postun|in) execution or whether we
+  can just handle the packages %posttrans. On TW a delayed
+  %transfiletrigger handling is possible since rpm-4.17.
+- Make sure the old target is deleted before a new one is created
+  (bsc#1203760)
+- version 17.31.21 (22)
+
+-------------------------------------------------------------------
+Thu Aug 24 15:33:45 CEST 2023 - ma@suse.de
+
+- Fixup changes for 17.31.16. Remove faulty reference to a bug
+  actually fixed in 2019.
+- version 17.31.20 (22)
+
+-------------------------------------------------------------------
+Wed Aug 16 16:54:34 CEST 2023 - ma@suse.de
+
+- Fix zypp-tui/output/Out.h to build with clang.
+- Fix zypp/Arch.h for clang (fixes #478)
+  Clang seems to have issues with picking the overload in
+  std::men_fn if there is a static overload of a member function.
+  We need to explicitely specify the correct type of the function
+  pointer. To make sure this would not break compiling a
+  application with clang that builds against libzypp this patch
+  works around the problem.
+- version 17.31.19 (22)
+
+-------------------------------------------------------------------
+Fri Aug  4 17:40:19 CEST 2023 - ma@suse.de
+
+- SINGLE_RPMTRANS: Respect ZYPP_READONLY_HACK when checking the
+  zypp-rpm lock (fixes openSUSE/openSUSE-repos#29)
+- version 17.31.18 (22)
+
+-------------------------------------------------------------------
+Fri Jul 28 12:26:54 CEST 2023 - ma@suse.de
+
+- Fix wrong filesize exceeded dl abort in zyppng::Downloader
+  (bsc#1213673)
+  In some cases when downloading very small files we can run into
+  issues when the URL is protected by credentials.
+- version 17.31.17 (22)
+
+-------------------------------------------------------------------
+Mon Jul 24 16:58:18 CEST 2023 - ma@suse.de
+
+- Fix negative ZYPP_LOCK_TIMEOUT not waiting forever (bsc#1213231)
+- Don't cleanup orphaned dirs if read-only mode was promised
+  (bsc#1210740)
+- version 17.31.16 (22)
+
+-------------------------------------------------------------------
+Wed Jun 28 12:34:18 CEST 2023 - ma@suse.de
+
+- Fix build against protobuf >= 22 (fixes #465, closes #466)
+  Port away from protobuf_generate_cpp. Upstream protobuf does not
+  export protobuf_generate_cpp by default anymore.
+  Use protobuf_generate instead, which is also available on older
+  versions.
+- Remove SUSE < SLE11 constructs (fixes #464).
+- version 17.31.15 (22)
+
+-------------------------------------------------------------------
+Thu Jun 15 12:00:07 CEST 2023 - ma@suse.de
+
+- build: honor libproxy.pc's includedir (bsc#1212222)
+- Curl: trim all custom headers (bsc#1212187)
+  HTTP/2 RFC 9113 forbids fields ending with a space. So we make
+  sure all custom headers are trimmed. This also includes headers
+  returned by URL-Resolver plugins.
+- version 17.31.14 (22)
+
+-------------------------------------------------------------------
+Mon Jun 12 16:37:13 CEST 2023 - ma@suse.de
+
+- curl: Trim user agent string (bsc#1212187)
+  HTTP/2 RFC 9113 forbids fields ending with a space. Violation
+  results in curl error: 92: HTTP/2 PROTOCOL_ERROR.
+- version 17.31.13 (22)
+
+-------------------------------------------------------------------
+Mon Jun  5 12:15:55 CEST 2023 - ma@suse.de
+
+- Do not unconditionally release a medium if provideFile failed
+  (bsc#1211661)
+- libzypp.spec.cmake: remove duplicate file listing.
+- version 17.31.12 (22)
+
+-------------------------------------------------------------------
+Fri Apr 28 13:40:07 CEST 2023 - ma@suse.de
+
+- MediaCurl: Fix endless loop if wrong credentials are stored in
+  credentials.cat (bsc#1210870)
+  Since libzypp-17.31.7 wrong credentials stored in credentials.cat
+  may lead to an endless loop. Rather than asking for the right
+  credentials, the stored ones are used again and again.
+- zypp.conf: Introduce 'download.connect_timeout' [60 sec.]
+  (bsc#1208329)
+  Maximum time in seconds that you allow the connection phase to
+  the server to take. This only limits the connection phase, it has
+  no impact once it has connected. (see also CURLOPT_CONNECTTIMEOUT)
+- commit: Try to provide /dev fs if not present (fixes #444)
+- fix build with boost 1.82.
+- version 17.31.11 (22)
+
+-------------------------------------------------------------------
+Mon Apr 24 08:30:44 CEST 2023 - aschnell@suse.com
+
+- fix build with boost 1.82
+
+-------------------------------------------------------------------
+Thu Apr 13 16:48:40 CEST 2023 - ma@suse.de
+
+- BuildRequires: libsolv-devel >= 0.7.24 for x86_64_v[234]
+  support.
+- version 17.31.10 (22)
+
+-------------------------------------------------------------------
+Fri Mar 31 18:35:00 CEST 2023 - ma@suse.de
+
+- Workround bsc#1195633 while libsolv <= 0.7.23 is used.
+- Fix potential endless loop in new ZYPP_MEDIANETWORK.
+- ZYPP_METALINK_DEBUG=1: Log URL and priority of the mirrors
+  parsed from a metalink file.
+- multicurl: propagate ssl settings stored in repo url
+  (boo#1127591)
+  Closes #335.
+- Teach MediaNetwork to retry on HTTP2 errors.
+- fix CapDetail to return Rel::NONE if an EXPRESSION is used as a
+  NAMED cap.
+- Capability: support parsing richdeps from string.
+- defaultLoadSystem: default to LS_NOREFRESH if not root.
+- Detect x86_64_v[234]: Fix LZCNT bit used in detection (fixes
+  #439)
+  Merges rpm-software-management/rpm#2412: The bit for LZCNT is in
+  CPUID 0x80000001, not 1.
+- Detect x86_64_v[234] architecture levels (fixes #439)
+- Support x86_64_v[234] architecture levels (for #439)
+- version 17.31.9 (22)
+
+-------------------------------------------------------------------
+Mon Feb 13 16:48:56 CET 2023 - ma@suse.de
+
+- ProgressData: enforce reporting the INIT||END state
+  (bsc#1206949)
+- ps: fix service detection on newer Tumbleweed systems
+  (bsc#1205636)
+- version 17.31.8 (22)
+
+-------------------------------------------------------------------
+Sat Dec 24 02:22:11 CET 2022 - ma@suse.de
+
+- Hint to "zypper removeptf" to remove PTFs.
+- Removing a PTF without enabled repos should always fail
+  (bsc#1203248)
+  Without enabled repos, the dependent PTF-packages would be
+  removed (not replaced!) as well. To remove a PTF "zypper install
+  -- -PTF" or a dedicated "zypper removeptf PTF" should be used.
+  This will update the installed PTF packages to theit latest
+  version.
+- version 17.31.7 (22)
+
+-------------------------------------------------------------------
+Fri Nov 25 13:41:55 CET 2022 - ma@suse.de
+
+- Avoid calling getsockopt when we know the info already.
+  This patch hopefully fixes logging on WSL, getsockopt seems to
+  not be fully supported but the code required it when accepting
+  new socket connections. (for bsc#1178233)
+- Enhance yaml-cpp detection (fixes #428)
+- No need to redirect 'history.logfile=/dev/null' into the target.
+- MultiCurl: Make sure to reset the progress function when
+  falling back.
+- version 17.31.6 (22)
+
+-------------------------------------------------------------------
+Mon Nov  7 13:09:46 CET 2022 - ma@suse.de
+
+- Create '.no_auto_prune' in the package cache dir to prevent auto
+  cleanup of orphaned repositories (bsc#1204956)
+- properly reset range requests (bsc#1204548)
+- version 17.31.5 (22)
+
+-------------------------------------------------------------------
+Mon Oct 17 12:53:40 CEST 2022 - ma@suse.de
+
+- Do not clean up MediaSetAccess before using the geoip file
+  (fixes #424)
+- version 17.31.4 (22)
+
+-------------------------------------------------------------------
+Fri Oct 14 14:09:51 CEST 2022 - ma@suse.de
+
+- Improve download of optional files (fixes #416)
+- Do not use geoip rewrites if the repo has explicit country
+  settings.
+- Implement geoIP feature for zypp.
+  This patch adds a feature to rewrite request URLs to the repo
+  servers by querying a geoIP file from download.opensuse.org. This
+  file can return a redirection target depending on the clients IP
+  adress, this way we can directly contact a local mirror of d.o.o
+  instead. The redir target stays valid for 24hrs.
+  This feature can be disabled in zypp.conf by setting
+  'download.use_geoip_mirror = false'.
+- Use a dynamic fallback for BLKSIZE in downloads.
+  When not receiving a blocklist via metalink file from the server
+  MediaMultiCurl used to fallback to a fixed, relatively small
+  BLKSIZE. This patch changes the fallback into a dynamic value
+  based on the filesize using a similar metric as the MirrorCache
+  implementation on the server side.
+- Skip media.1/media download for http repo status calc.
+  This patch allows zypp to skip a extra media.1/media download to
+  calculate if a repository needs to be refreshed. This
+  optimisation only takes place if the repo does specify only
+  downloading base urls.
+- version 17.31.3 (22)
+
+-------------------------------------------------------------------
+Wed Oct  5 18:02:15 CEST 2022 - ma@suse.de
+
+- Resolver: Fix missing --[no]-recommends initialization in
+  update (fixes #openSUSE/zypper#459, bsc#1201972)
+- Log ONLY_NAMESPACE_RECOMMENDED because this is what corresponds
+  to --[no]-recommends.
+- version 17.31.2 (22)
+
+-------------------------------------------------------------------
 Fri Sep  2 16:38:42 CEST 2022 - ma@suse.de
 
 - UsrEtc: Store logrotate files in %{_distconfdir} if defined
@@ -11,6 +263,9 @@ Fri Sep  2 16:38:42 CEST 2022 - ma@suse.de
 - Stop using std::*ary_function; deprecated and removed in c++17.
 - Don't expose header files which use types not available in
   c++11.  In 15.3 and older, YAST and PK compile with -std=c++11.
+- Remove no longer needed %post code (bsc#1203649)
+- Enable zck support for SLE15-SP4 and newer. On Leap it is enabled
+  since 15.1 (bsc#1189282)
 - version 17.31.1 (22)
 
 -------------------------------------------------------------------
index 8fb6492..bfac1ae 100644 (file)
@@ -12,7 +12,7 @@ SET( XGETTEXT_OPTIONS ${XGETTEXT_OPTIONS} --copyright-holder=\"SuSE Linux GmbH,
 SET( XGETTEXT_OPTIONS ${XGETTEXT_OPTIONS} --package-name=${POT_NAME} --default-domain=${POT_NAME} )
 
 SET( _abs_POT_FILE_DEPENDS )
-SET( POT_FILE_DEPENDS ${POT_FILE_DEPENDS_ZYPP} ${POT_FILE_DEPENDS_ZYPP_CORE} ${POT_FILE_DEPENDS_ZYPP_MEDIA} ${POT_FILE_DEPENDS_ZYPP_CURL} )
+SET( POT_FILE_DEPENDS ${POT_FILE_DEPENDS_ZYPP} ${POT_FILE_DEPENDS_ZYPP_CORE} ${POT_FILE_DEPENDS_ZYPP_MEDIA} ${POT_FILE_DEPENDS_ZYPP_CURL} ${POT_FILE_DEPENDS_ZYPP_TUI} )
 FOREACH( _currentDepends ${POT_FILE_DEPENDS} )
   SET( _abs_POT_FILE_DEPENDS ${_abs_POT_FILE_DEPENDS} ${LIBZYPP_SOURCE_DIR}/${_currentDepends} )
 ENDFOREACH()
index f124816..23596f4 100644 (file)
--- a/po/af.po
+++ b/po/af.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2006-11-03 12:03\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -3710,54 +3710,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Die SM se naam kan nie met ’n syfer begin nie."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "Die SM se naam kan nie met ’n syfer begin nie."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan lêer nie vir skryf open nie."
@@ -3765,44 +3765,44 @@ msgstr "Kan lêer nie vir skryf open nie."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan werkskermitem '%s' nie open nie"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Kan gids %1 nie skep nie: %2."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3812,44 +3812,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Fout met lees vanaf slapskyf."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ongeldige uitvoerlêernaam."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Terugstel van hulpbronne"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan werkskermitem '%s' nie open nie"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3920,7 +3920,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3948,25 +3948,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ongeldige Url-skema '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4029,7 +4039,7 @@ msgid "No url in repository."
 msgstr "Lêer %1 nie in die bewaarplek gevind nie."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4148,7 +4158,7 @@ msgstr "Ignoreer dié vereiste net hier"
 msgid "generally ignore of some dependencies"
 msgstr "Ignoreer dié vereiste net hier"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4156,329 +4166,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Verbindingsversoek aan:"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Kan %s nie installeer nie vanweë afhanklikheidsprobleme"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Geen voorsiening %s nie"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Daar is geen installeerbare verskaffers van %s nie"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Daar is geen installeerbare verskaffers van %s nie"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "Die navraag bestaan reeds."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Installasie is gestaak soos gelas."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "Voer uit"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4486,73 +4521,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Fout tydens sleutelenkriptering."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "het misluk"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Gewysigde konfigurasielêers vir %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm geberg %s as %s, maar dit was onmoontlik om die verskil te bepaal"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4562,13 +4605,13 @@ msgstr ""
 "Hier is die eerste 25 rëels van verskil:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm geskep %s as %s, maar dit was onmoontlik om die verskil te bepaal"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4581,51 +4624,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Bykomende rpm-uitset:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "geskepte rugsteun %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Inskywing nie gevind nie."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Inskywing nie gevind nie."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Inskywing nie gevind nie."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4752,73 +4795,73 @@ msgstr "Ongeldige parameterbindingsplyt-skeierkarakter"
 msgid "Invalid parameter array join separator character"
 msgstr "Ongeldige parametermatrysaansluit-skeierkarakter"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Opdrag uitgevoer wanneer verbind word"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Kan %s nie vind nie."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Kan %s nie vind nie."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4969,6 +5012,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4988,6 +5035,98 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ja"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nee"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "gedoen"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "fout"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Waarskuwing"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Fout"
+
+# continue button label
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Voortgaan?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Waarskuwing"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Begin met ..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Nie gevind nie"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ja"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nee"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s voorsien %s, maar dit het ’n ander argitektuur."
index e15e796..01d6a6b 100644 (file)
--- a/po/ar.po
+++ b/po/ar.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2020-05-02 19:50+0000\n"
 "Last-Translator: mohammad alhargan <malham1@gmail.com>\n"
 "Language-Team: Arabic <https://l10n.opensuse.org/projects/libzypp/master/ar/"
@@ -3723,52 +3723,52 @@ msgstr[5] "(ستنتهي الصلاحية خلال %d من الأيام)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "البحث عن مفتاح gpg للتشفير %1% في الذاكرة المؤقتة %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "يتم البحث عن معرف لمفتاح gpg رقم %1% في المستودع %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "المستودع %1% لم يقم بتعريف مفتاح إضافي 'مفتاح gpg=' عناوين المواقع."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "تعذرت قراءة دليل المخازن '%1%': تم رفض الإذن"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "فشلت قراءة الدليل '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "تعذرت قراءة ملف المخزن '%1%': تم رفض الإذن"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "لا يمكن أن يبدأ الاسم المستعار للمخزن بنقطة."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "لا يمكن أن يبدأ الاسم المستعار للخدمة بنقطة."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "تعذر فتح الملف '%s' للكتابة."
@@ -3776,13 +3776,13 @@ msgstr "تعذر فتح الملف '%s' للكتابة."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "خدمة غير معروفة '%1%': تتم الآن إزالة مخزن الخدمة الوحيد '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "لم يتم العثور على بيانات تعريف صالحة في أي عنوان URL محدد"
@@ -3792,31 +3792,31 @@ msgstr[3] "لم يتم العثور على بيانات تعريف صالحة ف
 msgstr[4] "لم يتم العثور على بيانات تعريف صالحة في كثير من عناوين URL المحددة"
 msgstr[5] "لم يتم العثور على بيانات تعريف صالحة في عناوين  URL محددة أخرى"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "لا يمكن إنشاء %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "لا يمكن إنشاء دليل لذاكرة التخزين المؤقت لبيانات التعريف."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "يتم الآن بناء الذاكرة المؤقتة لمخزن '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "لا يمكن إنشاء ذاكرة التخزين المؤقت في %s - لا توجد أذونات للكتابة."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "فشل التخزين المؤقت للمخزن (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "نوع مخزن غير معالج"
 
@@ -3826,44 +3826,44 @@ msgstr "نوع مخزن غير معالج"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "حدث خطأ أثناء محاولة القراءة من '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "حدث خطأ غير معروف أثناء القراءة من '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "إضافة المخزن '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "اسم ملف المخزن غير صالح في '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "إزالة المخزن '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "لا يمكن معرفة مكان تخزين المخزن."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "لا يمكن حذف '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "لا يمكن معرفة مكان تخزين الخدمة."
 
@@ -3940,7 +3940,7 @@ msgstr "مطلوب عقد عميل إضافي للحصول على الدعم."
 msgid "Unknown support option. Description not available"
 msgstr "خيار دعم غير معروف. الوصف غير متاح"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3970,13 +3970,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "التعبير العادي '%s' غير صالح"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "التصديق '%s' مطلوب"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3984,7 +3994,7 @@ msgstr ""
 "تفضل بزيارة مركز عملاء SUSE للتحقق ما إذا كان التسجيل صالحًا وغير منته "
 "الصلاحية بعد."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3992,7 +4002,7 @@ msgstr ""
 "تفضل بزيارة Novell Customer Center (مركز خدمة عملاء Novell) للتحقق من صلاحية "
 "التسجيل وعدم انتهائها."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4054,7 +4064,7 @@ msgid "No url in repository."
 msgstr "لا يوجد عنوان url في المخزن."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4219,7 +4229,7 @@ msgstr "توقيف %s عن طريق تجاهل بعض تبعياتها"
 msgid "generally ignore of some dependencies"
 msgstr "تجاهل بشكل عام لبعض التبعيات"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4227,151 +4237,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "طلبات متعارضة"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "بعض مشكلات التبعية"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "الطلب غير مدعوم"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "الموفرون المحذوفون: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4379,243 +4389,276 @@ msgstr ""
 "\n"
 "موفرون غير قابلين للتثبيت: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "الموفرون غير القابلين للتثبيت: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "سيؤدي هذا الطلب إلى تعطل النظام!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "تجاهل تحذير النظام المعطل"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "بتثبيت %1% على الرغم من أنه تم سحبه"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "تسمح بتثبيت  PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "تثبيت %1% على الرغم من أنه مدرج في القائمة السوداء"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "جارٍ تنفيذ برنامج %%posttrans النصي '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "جارٍ تنفيذ برامج %posttrans النصية"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "تم إيقاف التثبيت وفقًا للتعليمات."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " مُنفَّذ"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " فشل التنفيذ"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "تم تنفيذ %s بالفعل كـ %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " تم تخطي التنفيذ أثناء الإيقاف"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "حدث خطأ أثناء إرسال رسالة إعلام بالتحديث."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "رسالة تحديث جديد"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "فشل RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "فشل استيراد المفتاح العمومي %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "أخفقت إزالة المفتاح العام %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "ملفات التكوين التي تم تغييرها لـ %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "قامت rpm بحفظ %s باعتبارها %s، ولكن تعذر تحديد الفرق"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4625,13 +4668,13 @@ msgstr ""
 "فيما يلي أول 25 سطرًا من سطور الفرق:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "قامت rpm بإنشاء %s باعتبارها %s، ولكن تعذر تحديد الفرق"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4644,47 +4687,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "مخرجات rpm إضافية"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "تم إنشاء النسخة الاحتياطية %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "تمت المصادقة على التوقيع"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "نوع التوقيع غير معروف"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "تعذر التحقق من التوقيع"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "تمت المصادقة على التوقيع، لكن المفتاح غير موثوق به"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "تواقيع المفتاح العمومي غير متوفرة"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "الملف غير موجود أو لا يمكن التحقق من توقيعه"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "الملف غير موقع"
 
@@ -4812,40 +4855,40 @@ msgstr "حرف تقسيم مخطط المعلمات الفاصل غير صالح
 msgid "Invalid parameter array join separator character"
 msgstr "حرف ربط مصفوفة المعلمات الفاصل غير صالح"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "تم إنهاء الأمر بالحالة %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "تم إنهاء الأمر بواسطة الإشارة %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "تم إنهاء الأمر بخطأ غير معروف."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "لا يمكن تغيير الجذر الافتراضي إلى '%s' (‏%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "لا يمكن تغيير الدليل الافتراضي إلى '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
@@ -4853,33 +4896,33 @@ msgstr ""
 "'%s' (‏%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "لا يمكن تنفيذ '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "تعذر تقسيم (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5032,6 +5075,10 @@ msgstr "يتعذر الوصول إلى الموقع '%s' مؤقتًا."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " مشكلة في شهادة SSL، تحقق من أن شهادة CA صالحة لـ '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5051,6 +5098,101 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "نعم"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "لا"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "تم"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "الخطأ"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "ملاحظة:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "تحذير:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "خطأ:"
+
+# continue button label
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "هل تريد المتابعة؟"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "تحذير: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "استرداد:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "بدء تشغيل"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "لم يتم العثور عليه"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "لا تتوفر أية تعليمات لهذه المطالبة."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "لا تتوفر أية تعليمات لهذا الخيار"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "إظهار كلّ الخيارات"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "نعم"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "لا"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "جارٍ تنفيذ برنامج %%posttrans النصي '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "جارٍ تنفيذ برامج %posttrans النصية"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "لم يتم توقيع الحزمة!"
 
diff --git a/po/ast.po b/po/ast.po
new file mode 100644 (file)
index 0000000..707cb1f
--- /dev/null
+++ b/po/ast.po
@@ -0,0 +1,5091 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR SuSE Linux GmbH, Nuernberg
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: zypper\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2017-05-07 15:28+0000\n"
+"Last-Translator: Enol P <enolp@softastur.org>\n"
+"Language-Team: Asturian <https://l10n.opensuse.org/projects/zypper/master/"
+"ast/>\n"
+"Language: ast\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.6\n"
+
+#: zypp/CountryCode.cc:50
+msgid "Unknown country: "
+msgstr ""
+
+#. Defined CountryCode constants
+#. Defined LanguageCode constants
+#: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148
+msgid "No Code"
+msgstr ""
+
+#: zypp/CountryCode.cc:158
+msgid "Andorra"
+msgstr ""
+
+#. :AND:020:
+#: zypp/CountryCode.cc:159
+msgid "United Arab Emirates"
+msgstr ""
+
+#. :ARE:784:
+#: zypp/CountryCode.cc:160
+msgid "Afghanistan"
+msgstr ""
+
+#. :AFG:004:
+#: zypp/CountryCode.cc:161
+msgid "Antigua and Barbuda"
+msgstr ""
+
+#. :ATG:028:
+#: zypp/CountryCode.cc:162
+msgid "Anguilla"
+msgstr ""
+
+#. :AIA:660:
+#: zypp/CountryCode.cc:163
+msgid "Albania"
+msgstr ""
+
+#. :ALB:008:
+#: zypp/CountryCode.cc:164
+msgid "Armenia"
+msgstr ""
+
+#. :ARM:051:
+#: zypp/CountryCode.cc:165
+msgid "Netherlands Antilles"
+msgstr ""
+
+#. :ANT:530:
+#: zypp/CountryCode.cc:166
+msgid "Angola"
+msgstr ""
+
+#. :AGO:024:
+#: zypp/CountryCode.cc:167
+msgid "Antarctica"
+msgstr ""
+
+#. :ATA:010:
+#: zypp/CountryCode.cc:168
+msgid "Argentina"
+msgstr ""
+
+#. :ARG:032:
+#: zypp/CountryCode.cc:169
+msgid "American Samoa"
+msgstr ""
+
+#. :ASM:016:
+#: zypp/CountryCode.cc:170
+msgid "Austria"
+msgstr ""
+
+#. :AUT:040:
+#: zypp/CountryCode.cc:171
+msgid "Australia"
+msgstr ""
+
+#. :AUS:036:
+#: zypp/CountryCode.cc:172
+msgid "Aruba"
+msgstr ""
+
+#. :ABW:533:
+#: zypp/CountryCode.cc:173
+msgid "Aland Islands"
+msgstr ""
+
+#. :ALA:248:
+#: zypp/CountryCode.cc:174
+msgid "Azerbaijan"
+msgstr ""
+
+#. :AZE:031:
+#: zypp/CountryCode.cc:175
+msgid "Bosnia and Herzegovina"
+msgstr ""
+
+#. :BIH:070:
+#: zypp/CountryCode.cc:176
+msgid "Barbados"
+msgstr ""
+
+#. :BRB:052:
+#: zypp/CountryCode.cc:177
+msgid "Bangladesh"
+msgstr ""
+
+#. :BGD:050:
+#: zypp/CountryCode.cc:178
+msgid "Belgium"
+msgstr ""
+
+#. :BEL:056:
+#: zypp/CountryCode.cc:179
+msgid "Burkina Faso"
+msgstr ""
+
+#. :BFA:854:
+#: zypp/CountryCode.cc:180
+msgid "Bulgaria"
+msgstr ""
+
+#. :BGR:100:
+#: zypp/CountryCode.cc:181
+msgid "Bahrain"
+msgstr ""
+
+#. :BHR:048:
+#: zypp/CountryCode.cc:182
+msgid "Burundi"
+msgstr ""
+
+#. :BDI:108:
+#: zypp/CountryCode.cc:183
+msgid "Benin"
+msgstr ""
+
+#. :BEN:204:
+#: zypp/CountryCode.cc:184
+msgid "Bermuda"
+msgstr ""
+
+#. :BMU:060:
+#: zypp/CountryCode.cc:185
+msgid "Brunei Darussalam"
+msgstr ""
+
+#. :BRN:096:
+#: zypp/CountryCode.cc:186
+msgid "Bolivia"
+msgstr ""
+
+#. :BOL:068:
+#: zypp/CountryCode.cc:187
+msgid "Brazil"
+msgstr ""
+
+#. :BRA:076:
+#: zypp/CountryCode.cc:188
+msgid "Bahamas"
+msgstr ""
+
+#. :BHS:044:
+#: zypp/CountryCode.cc:189
+msgid "Bhutan"
+msgstr ""
+
+#. :BTN:064:
+#: zypp/CountryCode.cc:190
+msgid "Bouvet Island"
+msgstr ""
+
+#. :BVT:074:
+#: zypp/CountryCode.cc:191
+msgid "Botswana"
+msgstr ""
+
+#. :BWA:072:
+#: zypp/CountryCode.cc:192
+msgid "Belarus"
+msgstr ""
+
+#. :BLR:112:
+#: zypp/CountryCode.cc:193
+msgid "Belize"
+msgstr ""
+
+#. :BLZ:084:
+#: zypp/CountryCode.cc:194
+msgid "Canada"
+msgstr ""
+
+#. :CAN:124:
+#: zypp/CountryCode.cc:195
+msgid "Cocos (Keeling) Islands"
+msgstr ""
+
+#. :CCK:166:
+#. :CAF:140:
+#: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198
+msgid "Congo"
+msgstr ""
+
+#. :COD:180:
+#: zypp/CountryCode.cc:197
+msgid "Central African Republic"
+msgstr ""
+
+#. :COG:178:
+#: zypp/CountryCode.cc:199
+msgid "Switzerland"
+msgstr ""
+
+#. :CHE:756:
+#: zypp/CountryCode.cc:200
+msgid "Cote D'Ivoire"
+msgstr ""
+
+#. :CIV:384:
+#: zypp/CountryCode.cc:201
+msgid "Cook Islands"
+msgstr ""
+
+#. :COK:184:
+#: zypp/CountryCode.cc:202
+msgid "Chile"
+msgstr ""
+
+#. :CHL:152:
+#: zypp/CountryCode.cc:203
+msgid "Cameroon"
+msgstr ""
+
+#. :CMR:120:
+#: zypp/CountryCode.cc:204
+msgid "China"
+msgstr ""
+
+#. :CHN:156:
+#: zypp/CountryCode.cc:205
+msgid "Colombia"
+msgstr ""
+
+#. :COL:170:
+#: zypp/CountryCode.cc:206
+msgid "Costa Rica"
+msgstr ""
+
+#. :CRI:188:
+#: zypp/CountryCode.cc:207
+msgid "Cuba"
+msgstr ""
+
+#. :CUB:192:
+#: zypp/CountryCode.cc:208
+msgid "Cape Verde"
+msgstr ""
+
+#. :CPV:132:
+#: zypp/CountryCode.cc:209
+msgid "Christmas Island"
+msgstr ""
+
+#. :CXR:162:
+#: zypp/CountryCode.cc:210
+msgid "Cyprus"
+msgstr ""
+
+#. :CYP:196:
+#: zypp/CountryCode.cc:211
+msgid "Czech Republic"
+msgstr ""
+
+#. :CZE:203:
+#: zypp/CountryCode.cc:212
+msgid "Germany"
+msgstr ""
+
+#. :DEU:276:
+#: zypp/CountryCode.cc:213
+msgid "Djibouti"
+msgstr ""
+
+#. :DJI:262:
+#: zypp/CountryCode.cc:214
+msgid "Denmark"
+msgstr ""
+
+#. :DNK:208:
+#: zypp/CountryCode.cc:215
+msgid "Dominica"
+msgstr ""
+
+#. :DMA:212:
+#: zypp/CountryCode.cc:216
+msgid "Dominican Republic"
+msgstr ""
+
+#. :DOM:214:
+#: zypp/CountryCode.cc:217
+msgid "Algeria"
+msgstr ""
+
+#. :DZA:012:
+#: zypp/CountryCode.cc:218
+msgid "Ecuador"
+msgstr ""
+
+#. :ECU:218:
+#: zypp/CountryCode.cc:219
+msgid "Estonia"
+msgstr ""
+
+#. :EST:233:
+#: zypp/CountryCode.cc:220
+msgid "Egypt"
+msgstr ""
+
+#. :EGY:818:
+#: zypp/CountryCode.cc:221
+msgid "Western Sahara"
+msgstr ""
+
+#. :ESH:732:
+#: zypp/CountryCode.cc:222
+msgid "Eritrea"
+msgstr ""
+
+#. :ERI:232:
+#: zypp/CountryCode.cc:223
+msgid "Spain"
+msgstr ""
+
+#. :ESP:724:
+#: zypp/CountryCode.cc:224
+msgid "Ethiopia"
+msgstr ""
+
+#. :ETH:231:
+#: zypp/CountryCode.cc:225
+msgid "Finland"
+msgstr ""
+
+#. :FIN:246:
+#: zypp/CountryCode.cc:226
+msgid "Fiji"
+msgstr ""
+
+#. :FJI:242:
+#: zypp/CountryCode.cc:227
+msgid "Falkland Islands (Malvinas)"
+msgstr ""
+
+#. :FLK:238:
+#: zypp/CountryCode.cc:228
+msgid "Federated States of Micronesia"
+msgstr ""
+
+#. :FSM:583:
+#: zypp/CountryCode.cc:229
+msgid "Faroe Islands"
+msgstr ""
+
+#. :FRO:234:
+#: zypp/CountryCode.cc:230
+msgid "France"
+msgstr ""
+
+#. :FRA:250:
+#: zypp/CountryCode.cc:231
+msgid "Metropolitan France"
+msgstr ""
+
+#. :FXX:249:
+#: zypp/CountryCode.cc:232
+msgid "Gabon"
+msgstr ""
+
+#. :GAB:266:
+#: zypp/CountryCode.cc:233
+msgid "United Kingdom"
+msgstr ""
+
+#. :GBR:826:
+#: zypp/CountryCode.cc:234
+msgid "Grenada"
+msgstr ""
+
+#. :GRD:308:
+#: zypp/CountryCode.cc:235
+msgid "Georgia"
+msgstr ""
+
+#. :GEO:268:
+#: zypp/CountryCode.cc:236
+msgid "French Guiana"
+msgstr ""
+
+#. :GUF:254:
+#: zypp/CountryCode.cc:237
+msgid "Guernsey"
+msgstr ""
+
+#: zypp/CountryCode.cc:238
+msgid "Ghana"
+msgstr ""
+
+#. :GHA:288:
+#: zypp/CountryCode.cc:239
+msgid "Gibraltar"
+msgstr ""
+
+#. :GIB:292:
+#: zypp/CountryCode.cc:240
+msgid "Greenland"
+msgstr ""
+
+#. :GRL:304:
+#: zypp/CountryCode.cc:241
+msgid "Gambia"
+msgstr ""
+
+#. :GMB:270:
+#: zypp/CountryCode.cc:242
+msgid "Guinea"
+msgstr ""
+
+#. :GIN:324:
+#: zypp/CountryCode.cc:243
+msgid "Guadeloupe"
+msgstr ""
+
+#. :GLP:312:
+#: zypp/CountryCode.cc:244
+msgid "Equatorial Guinea"
+msgstr ""
+
+#. :GNQ:226:
+#: zypp/CountryCode.cc:245
+msgid "Greece"
+msgstr ""
+
+#. :GRC:300:
+#: zypp/CountryCode.cc:246
+msgid "South Georgia and the South Sandwich Islands"
+msgstr ""
+
+#. :SGS:239:
+#: zypp/CountryCode.cc:247
+msgid "Guatemala"
+msgstr ""
+
+#. :GTM:320:
+#: zypp/CountryCode.cc:248
+msgid "Guam"
+msgstr ""
+
+#. :GUM:316:
+#: zypp/CountryCode.cc:249
+msgid "Guinea-Bissau"
+msgstr ""
+
+#. :GNB:624:
+#: zypp/CountryCode.cc:250
+msgid "Guyana"
+msgstr ""
+
+#. :GUY:328:
+#: zypp/CountryCode.cc:251
+msgid "Hong Kong"
+msgstr ""
+
+#. :HKG:344:
+#: zypp/CountryCode.cc:252
+msgid "Heard Island and McDonald Islands"
+msgstr ""
+
+#. :HMD:334:
+#: zypp/CountryCode.cc:253
+msgid "Honduras"
+msgstr ""
+
+#. :HND:340:
+#: zypp/CountryCode.cc:254
+msgid "Croatia"
+msgstr ""
+
+#. :HRV:191:
+#: zypp/CountryCode.cc:255
+msgid "Haiti"
+msgstr ""
+
+#. :HTI:332:
+#: zypp/CountryCode.cc:256
+msgid "Hungary"
+msgstr ""
+
+#. :HUN:348:
+#: zypp/CountryCode.cc:257
+msgid "Indonesia"
+msgstr ""
+
+#. :IDN:360:
+#: zypp/CountryCode.cc:258
+msgid "Ireland"
+msgstr ""
+
+#. :IRL:372:
+#: zypp/CountryCode.cc:259
+msgid "Israel"
+msgstr ""
+
+#. :ISR:376:
+#: zypp/CountryCode.cc:260
+msgid "Isle of Man"
+msgstr ""
+
+#: zypp/CountryCode.cc:261
+msgid "India"
+msgstr ""
+
+#. :IND:356:
+#: zypp/CountryCode.cc:262
+msgid "British Indian Ocean Territory"
+msgstr ""
+
+#. :IOT:086:
+#: zypp/CountryCode.cc:263
+msgid "Iraq"
+msgstr ""
+
+#. :IRQ:368:
+#: zypp/CountryCode.cc:264
+msgid "Iran"
+msgstr ""
+
+#. :IRN:364:
+#: zypp/CountryCode.cc:265
+msgid "Iceland"
+msgstr ""
+
+#. :ISL:352:
+#: zypp/CountryCode.cc:266
+msgid "Italy"
+msgstr ""
+
+#. :ITA:380:
+#: zypp/CountryCode.cc:267
+msgid "Jersey"
+msgstr ""
+
+#: zypp/CountryCode.cc:268
+msgid "Jamaica"
+msgstr ""
+
+#. :JAM:388:
+#: zypp/CountryCode.cc:269
+msgid "Jordan"
+msgstr ""
+
+#. :JOR:400:
+#: zypp/CountryCode.cc:270
+msgid "Japan"
+msgstr ""
+
+#. :JPN:392:
+#: zypp/CountryCode.cc:271
+msgid "Kenya"
+msgstr ""
+
+#. :KEN:404:
+#: zypp/CountryCode.cc:272
+msgid "Kyrgyzstan"
+msgstr ""
+
+#. :KGZ:417:
+#: zypp/CountryCode.cc:273
+msgid "Cambodia"
+msgstr ""
+
+#. :KHM:116:
+#: zypp/CountryCode.cc:274
+msgid "Kiribati"
+msgstr ""
+
+#. :KIR:296:
+#: zypp/CountryCode.cc:275
+msgid "Comoros"
+msgstr ""
+
+#. :COM:174:
+#: zypp/CountryCode.cc:276
+msgid "Saint Kitts and Nevis"
+msgstr ""
+
+#. :KNA:659:
+#: zypp/CountryCode.cc:277
+msgid "North Korea"
+msgstr ""
+
+#. :PRK:408:
+#: zypp/CountryCode.cc:278
+msgid "South Korea"
+msgstr ""
+
+#. :KOR:410:
+#: zypp/CountryCode.cc:279
+msgid "Kuwait"
+msgstr ""
+
+#. :KWT:414:
+#: zypp/CountryCode.cc:280
+msgid "Cayman Islands"
+msgstr ""
+
+#. :CYM:136:
+#: zypp/CountryCode.cc:281
+msgid "Kazakhstan"
+msgstr ""
+
+#. :KAZ:398:
+#: zypp/CountryCode.cc:282
+msgid "Lao People's Democratic Republic"
+msgstr ""
+
+#. :LAO:418:
+#: zypp/CountryCode.cc:283
+msgid "Lebanon"
+msgstr ""
+
+#. :LBN:422:
+#: zypp/CountryCode.cc:284
+msgid "Saint Lucia"
+msgstr ""
+
+#. :LCA:662:
+#: zypp/CountryCode.cc:285
+msgid "Liechtenstein"
+msgstr ""
+
+#. :LIE:438:
+#: zypp/CountryCode.cc:286
+msgid "Sri Lanka"
+msgstr ""
+
+#. :LKA:144:
+#: zypp/CountryCode.cc:287
+msgid "Liberia"
+msgstr ""
+
+#. :LBR:430:
+#: zypp/CountryCode.cc:288
+msgid "Lesotho"
+msgstr ""
+
+#. :LSO:426:
+#: zypp/CountryCode.cc:289
+msgid "Lithuania"
+msgstr ""
+
+#. :LTU:440:
+#: zypp/CountryCode.cc:290
+msgid "Luxembourg"
+msgstr ""
+
+#. :LUX:442:
+#: zypp/CountryCode.cc:291
+msgid "Latvia"
+msgstr ""
+
+#. :LVA:428:
+#: zypp/CountryCode.cc:292
+msgid "Libya"
+msgstr ""
+
+#. :LBY:434:
+#: zypp/CountryCode.cc:293
+msgid "Morocco"
+msgstr ""
+
+#. :MAR:504:
+#: zypp/CountryCode.cc:294
+msgid "Monaco"
+msgstr ""
+
+#. :MCO:492:
+#: zypp/CountryCode.cc:295
+msgid "Moldova"
+msgstr ""
+
+#. :MDA:498:
+#: zypp/CountryCode.cc:296
+msgid "Montenegro"
+msgstr ""
+
+#: zypp/CountryCode.cc:297
+msgid "Saint Martin"
+msgstr ""
+
+#: zypp/CountryCode.cc:298
+msgid "Madagascar"
+msgstr ""
+
+#. :MDG:450:
+#: zypp/CountryCode.cc:299
+msgid "Marshall Islands"
+msgstr ""
+
+#. :MHL:584:
+#: zypp/CountryCode.cc:300
+msgid "Macedonia"
+msgstr ""
+
+#. :MKD:807:
+#: zypp/CountryCode.cc:301
+msgid "Mali"
+msgstr ""
+
+#. :MLI:466:
+#: zypp/CountryCode.cc:302
+msgid "Myanmar"
+msgstr ""
+
+#. :MMR:104:
+#: zypp/CountryCode.cc:303
+msgid "Mongolia"
+msgstr ""
+
+#. :MNG:496:
+#: zypp/CountryCode.cc:304
+msgid "Macao"
+msgstr ""
+
+#. :MAC:446:
+#: zypp/CountryCode.cc:305
+msgid "Northern Mariana Islands"
+msgstr ""
+
+#. :MNP:580:
+#: zypp/CountryCode.cc:306
+msgid "Martinique"
+msgstr ""
+
+#. :MTQ:474:
+#: zypp/CountryCode.cc:307
+msgid "Mauritania"
+msgstr ""
+
+#. :MRT:478:
+#: zypp/CountryCode.cc:308
+msgid "Montserrat"
+msgstr ""
+
+#. :MSR:500:
+#: zypp/CountryCode.cc:309
+msgid "Malta"
+msgstr ""
+
+#. :MLT:470:
+#: zypp/CountryCode.cc:310
+msgid "Mauritius"
+msgstr ""
+
+#. :MUS:480:
+#: zypp/CountryCode.cc:311
+msgid "Maldives"
+msgstr ""
+
+#. :MDV:462:
+#: zypp/CountryCode.cc:312
+msgid "Malawi"
+msgstr ""
+
+#. :MWI:454:
+#: zypp/CountryCode.cc:313
+msgid "Mexico"
+msgstr ""
+
+#. :MEX:484:
+#: zypp/CountryCode.cc:314
+msgid "Malaysia"
+msgstr ""
+
+#. :MYS:458:
+#: zypp/CountryCode.cc:315
+msgid "Mozambique"
+msgstr ""
+
+#. :MOZ:508:
+#: zypp/CountryCode.cc:316
+msgid "Namibia"
+msgstr ""
+
+#. :NAM:516:
+#: zypp/CountryCode.cc:317
+msgid "New Caledonia"
+msgstr ""
+
+#. :NCL:540:
+#: zypp/CountryCode.cc:318
+msgid "Niger"
+msgstr ""
+
+#. :NER:562:
+#: zypp/CountryCode.cc:319
+msgid "Norfolk Island"
+msgstr ""
+
+#. :NFK:574:
+#: zypp/CountryCode.cc:320
+msgid "Nigeria"
+msgstr ""
+
+#. :NGA:566:
+#: zypp/CountryCode.cc:321
+msgid "Nicaragua"
+msgstr ""
+
+#. :NIC:558:
+#: zypp/CountryCode.cc:322
+msgid "Netherlands"
+msgstr ""
+
+#. :NLD:528:
+#: zypp/CountryCode.cc:323
+msgid "Norway"
+msgstr ""
+
+#. :NOR:578:
+#: zypp/CountryCode.cc:324
+msgid "Nepal"
+msgstr ""
+
+#. :NPL:524:
+#. language code: nau na
+#: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781
+msgid "Nauru"
+msgstr ""
+
+#. :NRU:520:
+#: zypp/CountryCode.cc:326
+msgid "Niue"
+msgstr ""
+
+#. :NIU:570:
+#: zypp/CountryCode.cc:327
+msgid "New Zealand"
+msgstr ""
+
+#. :NZL:554:
+#: zypp/CountryCode.cc:328
+msgid "Oman"
+msgstr ""
+
+#. :OMN:512:
+#: zypp/CountryCode.cc:329
+msgid "Panama"
+msgstr ""
+
+#. :PAN:591:
+#: zypp/CountryCode.cc:330
+msgid "Peru"
+msgstr ""
+
+#. :PER:604:
+#: zypp/CountryCode.cc:331
+msgid "French Polynesia"
+msgstr ""
+
+#. :PYF:258:
+#: zypp/CountryCode.cc:332
+msgid "Papua New Guinea"
+msgstr ""
+
+#. :PNG:598:
+#: zypp/CountryCode.cc:333
+msgid "Philippines"
+msgstr ""
+
+#. :PHL:608:
+#: zypp/CountryCode.cc:334
+msgid "Pakistan"
+msgstr ""
+
+#. :PAK:586:
+#: zypp/CountryCode.cc:335
+msgid "Poland"
+msgstr ""
+
+#. :POL:616:
+#: zypp/CountryCode.cc:336
+msgid "Saint Pierre and Miquelon"
+msgstr ""
+
+#. :SPM:666:
+#: zypp/CountryCode.cc:337
+msgid "Pitcairn"
+msgstr ""
+
+#. :PCN:612:
+#: zypp/CountryCode.cc:338
+msgid "Puerto Rico"
+msgstr ""
+
+#. :PRI:630:
+#: zypp/CountryCode.cc:339
+msgid "Palestinian Territory"
+msgstr ""
+
+#. :PSE:275:
+#: zypp/CountryCode.cc:340
+msgid "Portugal"
+msgstr ""
+
+#. :PRT:620:
+#: zypp/CountryCode.cc:341
+msgid "Palau"
+msgstr ""
+
+#. :PLW:585:
+#: zypp/CountryCode.cc:342
+msgid "Paraguay"
+msgstr ""
+
+#. :PRY:600:
+#: zypp/CountryCode.cc:343
+msgid "Qatar"
+msgstr ""
+
+#. :QAT:634:
+#: zypp/CountryCode.cc:344
+msgid "Reunion"
+msgstr ""
+
+#. :REU:638:
+#: zypp/CountryCode.cc:345
+msgid "Romania"
+msgstr ""
+
+#. :ROU:642:
+#: zypp/CountryCode.cc:346
+msgid "Serbia"
+msgstr ""
+
+#: zypp/CountryCode.cc:347
+msgid "Russian Federation"
+msgstr ""
+
+#. :RUS:643:
+#: zypp/CountryCode.cc:348
+msgid "Rwanda"
+msgstr ""
+
+#. :RWA:646:
+#: zypp/CountryCode.cc:349
+msgid "Saudi Arabia"
+msgstr ""
+
+#. :SAU:682:
+#: zypp/CountryCode.cc:350
+msgid "Solomon Islands"
+msgstr ""
+
+#. :SLB:090:
+#: zypp/CountryCode.cc:351
+msgid "Seychelles"
+msgstr ""
+
+#. :SYC:690:
+#: zypp/CountryCode.cc:352
+msgid "Sudan"
+msgstr ""
+
+#. :SDN:736:
+#: zypp/CountryCode.cc:353
+msgid "Sweden"
+msgstr ""
+
+#. :SWE:752:
+#: zypp/CountryCode.cc:354
+msgid "Singapore"
+msgstr ""
+
+#. :SGP:702:
+#: zypp/CountryCode.cc:355
+msgid "Saint Helena"
+msgstr ""
+
+#. :SHN:654:
+#: zypp/CountryCode.cc:356
+msgid "Slovenia"
+msgstr ""
+
+#. :SVN:705:
+#: zypp/CountryCode.cc:357
+msgid "Svalbard and Jan Mayen"
+msgstr ""
+
+#. :SJM:744:
+#: zypp/CountryCode.cc:358
+msgid "Slovakia"
+msgstr ""
+
+#. :SVK:703:
+#: zypp/CountryCode.cc:359
+msgid "Sierra Leone"
+msgstr ""
+
+#. :SLE:694:
+#: zypp/CountryCode.cc:360
+msgid "San Marino"
+msgstr ""
+
+#. :SMR:674:
+#: zypp/CountryCode.cc:361
+msgid "Senegal"
+msgstr ""
+
+#. :SEN:686:
+#: zypp/CountryCode.cc:362
+msgid "Somalia"
+msgstr ""
+
+#. :SOM:706:
+#: zypp/CountryCode.cc:363
+msgid "Suriname"
+msgstr ""
+
+#. :SUR:740:
+#: zypp/CountryCode.cc:364
+msgid "Sao Tome and Principe"
+msgstr ""
+
+#. :STP:678:
+#: zypp/CountryCode.cc:365
+msgid "El Salvador"
+msgstr ""
+
+#. :SLV:222:
+#: zypp/CountryCode.cc:366
+msgid "Syria"
+msgstr ""
+
+#. :SYR:760:
+#: zypp/CountryCode.cc:367
+msgid "Swaziland"
+msgstr ""
+
+#. :SWZ:748:
+#: zypp/CountryCode.cc:368
+msgid "Turks and Caicos Islands"
+msgstr ""
+
+#. :TCA:796:
+#: zypp/CountryCode.cc:369
+msgid "Chad"
+msgstr ""
+
+#. :TCD:148:
+#: zypp/CountryCode.cc:370
+msgid "French Southern Territories"
+msgstr ""
+
+#. :ATF:260:
+#: zypp/CountryCode.cc:371
+msgid "Togo"
+msgstr ""
+
+#. :TGO:768:
+#: zypp/CountryCode.cc:372
+msgid "Thailand"
+msgstr ""
+
+#. :THA:764:
+#: zypp/CountryCode.cc:373
+msgid "Tajikistan"
+msgstr ""
+
+#. :TJK:762:
+#. language code: tkl
+#: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045
+msgid "Tokelau"
+msgstr ""
+
+#. :TKL:772:
+#: zypp/CountryCode.cc:375
+msgid "Turkmenistan"
+msgstr ""
+
+#. :TKM:795:
+#: zypp/CountryCode.cc:376
+msgid "Tunisia"
+msgstr ""
+
+#. :TUN:788:
+#: zypp/CountryCode.cc:377
+msgid "Tonga"
+msgstr ""
+
+#. :TON:776:
+#: zypp/CountryCode.cc:378
+msgid "East Timor"
+msgstr ""
+
+#. :TLS:626:
+#: zypp/CountryCode.cc:379
+msgid "Turkey"
+msgstr ""
+
+#. :TUR:792:
+#: zypp/CountryCode.cc:380
+msgid "Trinidad and Tobago"
+msgstr ""
+
+#. :TTO:780:
+#. language code: tvl
+#: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075
+msgid "Tuvalu"
+msgstr ""
+
+#. :TUV:798:
+#: zypp/CountryCode.cc:382
+msgid "Taiwan"
+msgstr ""
+
+#. :TWN:158:
+#: zypp/CountryCode.cc:383
+msgid "Tanzania"
+msgstr ""
+
+#. :TZA:834:
+#: zypp/CountryCode.cc:384
+msgid "Ukraine"
+msgstr ""
+
+#. :UKR:804:
+#: zypp/CountryCode.cc:385
+msgid "Uganda"
+msgstr ""
+
+#. :UGA:800:
+#: zypp/CountryCode.cc:386
+msgid "United States Minor Outlying Islands"
+msgstr ""
+
+#. :UMI:581:
+#: zypp/CountryCode.cc:387
+msgid "United States"
+msgstr ""
+
+#. :USA:840:
+#: zypp/CountryCode.cc:388
+msgid "Uruguay"
+msgstr ""
+
+#. :URY:858:
+#: zypp/CountryCode.cc:389
+msgid "Uzbekistan"
+msgstr ""
+
+#. :UZB:860:
+#: zypp/CountryCode.cc:390
+msgid "Holy See (Vatican City State)"
+msgstr ""
+
+#. :VAT:336:
+#: zypp/CountryCode.cc:391
+msgid "Saint Vincent and the Grenadines"
+msgstr ""
+
+#. :VCT:670:
+#: zypp/CountryCode.cc:392
+msgid "Venezuela"
+msgstr ""
+
+#. :VEN:862:
+#: zypp/CountryCode.cc:393
+msgid "British Virgin Islands"
+msgstr ""
+
+#. :VGB:092:
+#: zypp/CountryCode.cc:394
+msgid "Virgin Islands, U.S."
+msgstr ""
+
+#. :VIR:850:
+#: zypp/CountryCode.cc:395
+msgid "Vietnam"
+msgstr ""
+
+#. :VNM:704:
+#: zypp/CountryCode.cc:396
+msgid "Vanuatu"
+msgstr ""
+
+#. :VUT:548:
+#: zypp/CountryCode.cc:397
+msgid "Wallis and Futuna"
+msgstr ""
+
+#. :WLF:876:
+#: zypp/CountryCode.cc:398
+msgid "Samoa"
+msgstr ""
+
+#. :WSM:882:
+#: zypp/CountryCode.cc:399
+msgid "Yemen"
+msgstr ""
+
+#. :YEM:887:
+#: zypp/CountryCode.cc:400
+msgid "Mayotte"
+msgstr ""
+
+#. :MYT:175:
+#: zypp/CountryCode.cc:401
+msgid "South Africa"
+msgstr ""
+
+#. :ZAF:710:
+#: zypp/CountryCode.cc:402
+msgid "Zambia"
+msgstr ""
+
+#. :ZMB:894:
+#: zypp/CountryCode.cc:403
+msgid "Zimbabwe"
+msgstr ""
+
+#: zypp/Dep.cc:96
+msgid "Provides"
+msgstr ""
+
+#: zypp/Dep.cc:97
+msgid "Prerequires"
+msgstr ""
+
+#: zypp/Dep.cc:98
+msgid "Requires"
+msgstr ""
+
+#: zypp/Dep.cc:99
+msgid "Conflicts"
+msgstr ""
+
+#: zypp/Dep.cc:100
+msgid "Obsoletes"
+msgstr ""
+
+#: zypp/Dep.cc:101
+msgid "Recommends"
+msgstr ""
+
+#: zypp/Dep.cc:102
+msgid "Suggests"
+msgstr ""
+
+#: zypp/Dep.cc:103
+msgid "Enhances"
+msgstr ""
+
+#: zypp/Dep.cc:104
+msgid "Supplements"
+msgstr ""
+
+#. TranslatorExplanation first %s is key name, second is keyring name
+#: zypp/KeyRing.cc:753
+#, c-format, boost-format
+msgid "Tried to import not existent key %s into keyring %s"
+msgstr ""
+
+#: zypp/KeyRing.cc:759
+msgid "Failed to import key."
+msgstr ""
+
+#: zypp/KeyRing.cc:766
+msgid "Failed to delete key."
+msgstr ""
+
+#: zypp/KeyRing.cc:772
+#, c-format, boost-format
+msgid "Signature file %s not found"
+msgstr ""
+
+#: zypp/LanguageCode.cc:49
+msgid "Unknown language: "
+msgstr ""
+
+#. language code: aar aa
+#: zypp/LanguageCode.cc:161
+msgid "Afar"
+msgstr ""
+
+#. language code: abk ab
+#: zypp/LanguageCode.cc:163
+msgid "Abkhazian"
+msgstr ""
+
+#. language code: ace
+#: zypp/LanguageCode.cc:165
+msgid "Achinese"
+msgstr ""
+
+#. language code: ach
+#: zypp/LanguageCode.cc:167
+msgid "Acoli"
+msgstr ""
+
+#. language code: ada
+#: zypp/LanguageCode.cc:169
+msgid "Adangme"
+msgstr ""
+
+#. language code: ady
+#: zypp/LanguageCode.cc:171
+msgid "Adyghe"
+msgstr ""
+
+#. language code: afa
+#: zypp/LanguageCode.cc:173
+msgid "Afro-Asiatic (Other)"
+msgstr ""
+
+#. language code: afh
+#: zypp/LanguageCode.cc:175
+msgid "Afrihili"
+msgstr ""
+
+#. language code: afr af
+#: zypp/LanguageCode.cc:177
+msgid "Afrikaans"
+msgstr ""
+
+#. language code: ain
+#: zypp/LanguageCode.cc:179
+msgid "Ainu"
+msgstr ""
+
+#. language code: aka ak
+#: zypp/LanguageCode.cc:181
+msgid "Akan"
+msgstr ""
+
+#. language code: akk
+#: zypp/LanguageCode.cc:183
+msgid "Akkadian"
+msgstr ""
+
+#. language code: alb sqi sq
+#: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187
+msgid "Albanian"
+msgstr ""
+
+#. language code: ale
+#: zypp/LanguageCode.cc:189
+msgid "Aleut"
+msgstr ""
+
+#. language code: alg
+#: zypp/LanguageCode.cc:191
+msgid "Algonquian Languages"
+msgstr ""
+
+#. language code: alt
+#: zypp/LanguageCode.cc:193
+msgid "Southern Altai"
+msgstr ""
+
+#. language code: amh am
+#: zypp/LanguageCode.cc:195
+msgid "Amharic"
+msgstr ""
+
+#. language code: ang
+#: zypp/LanguageCode.cc:197
+msgid "English, Old (ca.450-1100)"
+msgstr ""
+
+#. language code: apa
+#: zypp/LanguageCode.cc:199
+msgid "Apache Languages"
+msgstr ""
+
+#. language code: ara ar
+#: zypp/LanguageCode.cc:201
+msgid "Arabic"
+msgstr ""
+
+#. language code: arc
+#: zypp/LanguageCode.cc:203
+msgid "Aramaic"
+msgstr ""
+
+#. language code: arg an
+#: zypp/LanguageCode.cc:205
+msgid "Aragonese"
+msgstr ""
+
+#. language code: arm hye hy
+#: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209
+msgid "Armenian"
+msgstr ""
+
+#. language code: arn
+#: zypp/LanguageCode.cc:211
+msgid "Araucanian"
+msgstr ""
+
+#. language code: arp
+#: zypp/LanguageCode.cc:213
+msgid "Arapaho"
+msgstr ""
+
+#. language code: art
+#: zypp/LanguageCode.cc:215
+msgid "Artificial (Other)"
+msgstr ""
+
+#. language code: arw
+#: zypp/LanguageCode.cc:217
+msgid "Arawak"
+msgstr ""
+
+#. language code: asm as
+#: zypp/LanguageCode.cc:219
+msgid "Assamese"
+msgstr ""
+
+#. language code: ast
+#: zypp/LanguageCode.cc:221
+msgid "Asturian"
+msgstr ""
+
+#. language code: ath
+#: zypp/LanguageCode.cc:223
+msgid "Athapascan Languages"
+msgstr ""
+
+#. language code: aus
+#: zypp/LanguageCode.cc:225
+msgid "Australian Languages"
+msgstr ""
+
+#. language code: ava av
+#: zypp/LanguageCode.cc:227
+msgid "Avaric"
+msgstr ""
+
+#. language code: ave ae
+#: zypp/LanguageCode.cc:229
+msgid "Avestan"
+msgstr ""
+
+#. language code: awa
+#: zypp/LanguageCode.cc:231
+msgid "Awadhi"
+msgstr ""
+
+#. language code: aym ay
+#: zypp/LanguageCode.cc:233
+msgid "Aymara"
+msgstr ""
+
+#. language code: aze az
+#: zypp/LanguageCode.cc:235
+msgid "Azerbaijani"
+msgstr ""
+
+#. language code: bad
+#: zypp/LanguageCode.cc:237
+msgid "Banda"
+msgstr ""
+
+#. language code: bai
+#: zypp/LanguageCode.cc:239
+msgid "Bamileke Languages"
+msgstr ""
+
+#. language code: bak ba
+#: zypp/LanguageCode.cc:241
+msgid "Bashkir"
+msgstr ""
+
+#. language code: bal
+#: zypp/LanguageCode.cc:243
+msgid "Baluchi"
+msgstr ""
+
+#. language code: bam bm
+#: zypp/LanguageCode.cc:245
+msgid "Bambara"
+msgstr ""
+
+#. language code: ban
+#: zypp/LanguageCode.cc:247
+msgid "Balinese"
+msgstr ""
+
+#. language code: baq eus eu
+#: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251
+msgid "Basque"
+msgstr ""
+
+#. language code: bas
+#: zypp/LanguageCode.cc:253
+msgid "Basa"
+msgstr ""
+
+#. language code: bat
+#: zypp/LanguageCode.cc:255
+msgid "Baltic (Other)"
+msgstr ""
+
+#. language code: bej
+#: zypp/LanguageCode.cc:257
+msgid "Beja"
+msgstr ""
+
+#. language code: bel be
+#: zypp/LanguageCode.cc:259
+msgid "Belarusian"
+msgstr ""
+
+#. language code: bem
+#: zypp/LanguageCode.cc:261
+msgid "Bemba"
+msgstr ""
+
+#. language code: ben bn
+#: zypp/LanguageCode.cc:263
+msgid "Bengali"
+msgstr ""
+
+#. language code: ber
+#: zypp/LanguageCode.cc:265
+msgid "Berber (Other)"
+msgstr ""
+
+#. language code: bho
+#: zypp/LanguageCode.cc:267
+msgid "Bhojpuri"
+msgstr ""
+
+#. language code: bih bh
+#: zypp/LanguageCode.cc:269
+msgid "Bihari"
+msgstr ""
+
+#. language code: bik
+#: zypp/LanguageCode.cc:271
+msgid "Bikol"
+msgstr ""
+
+#. language code: bin
+#: zypp/LanguageCode.cc:273
+msgid "Bini"
+msgstr ""
+
+#. language code: bis bi
+#: zypp/LanguageCode.cc:275
+msgid "Bislama"
+msgstr ""
+
+#. language code: bla
+#: zypp/LanguageCode.cc:277
+msgid "Siksika"
+msgstr ""
+
+#. language code: bnt
+#: zypp/LanguageCode.cc:279
+msgid "Bantu (Other)"
+msgstr ""
+
+#. language code: bos bs
+#: zypp/LanguageCode.cc:281
+msgid "Bosnian"
+msgstr ""
+
+#. language code: bra
+#: zypp/LanguageCode.cc:283
+msgid "Braj"
+msgstr ""
+
+#. language code: bre br
+#: zypp/LanguageCode.cc:285
+msgid "Breton"
+msgstr ""
+
+#. language code: btk
+#: zypp/LanguageCode.cc:287
+msgid "Batak (Indonesia)"
+msgstr ""
+
+#. language code: bua
+#: zypp/LanguageCode.cc:289
+msgid "Buriat"
+msgstr ""
+
+#. language code: bug
+#: zypp/LanguageCode.cc:291
+msgid "Buginese"
+msgstr ""
+
+#. language code: bul bg
+#: zypp/LanguageCode.cc:293
+msgid "Bulgarian"
+msgstr ""
+
+#. language code: bur mya my
+#: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297
+msgid "Burmese"
+msgstr ""
+
+#. language code: byn
+#: zypp/LanguageCode.cc:299
+msgid "Blin"
+msgstr ""
+
+#. language code: cad
+#: zypp/LanguageCode.cc:301
+msgid "Caddo"
+msgstr ""
+
+#. language code: cai
+#: zypp/LanguageCode.cc:303
+msgid "Central American Indian (Other)"
+msgstr ""
+
+#. language code: car
+#: zypp/LanguageCode.cc:305
+msgid "Carib"
+msgstr ""
+
+#. language code: cat ca
+#: zypp/LanguageCode.cc:307
+msgid "Catalan"
+msgstr ""
+
+#. language code: cau
+#: zypp/LanguageCode.cc:309
+msgid "Caucasian (Other)"
+msgstr ""
+
+#. language code: ceb
+#: zypp/LanguageCode.cc:311
+msgid "Cebuano"
+msgstr ""
+
+#. language code: cel
+#: zypp/LanguageCode.cc:313
+msgid "Celtic (Other)"
+msgstr ""
+
+#. language code: cha ch
+#: zypp/LanguageCode.cc:315
+msgid "Chamorro"
+msgstr ""
+
+#. language code: chb
+#: zypp/LanguageCode.cc:317
+msgid "Chibcha"
+msgstr ""
+
+#. language code: che ce
+#: zypp/LanguageCode.cc:319
+msgid "Chechen"
+msgstr ""
+
+#. language code: chg
+#: zypp/LanguageCode.cc:321
+msgid "Chagatai"
+msgstr ""
+
+#. language code: chi zho zh
+#: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325
+msgid "Chinese"
+msgstr ""
+
+#. language code: chk
+#: zypp/LanguageCode.cc:327
+msgid "Chuukese"
+msgstr ""
+
+#. language code: chm
+#: zypp/LanguageCode.cc:329
+msgid "Mari"
+msgstr ""
+
+#. language code: chn
+#: zypp/LanguageCode.cc:331
+msgid "Chinook Jargon"
+msgstr ""
+
+#. language code: cho
+#: zypp/LanguageCode.cc:333
+msgid "Choctaw"
+msgstr ""
+
+#. language code: chp
+#: zypp/LanguageCode.cc:335
+msgid "Chipewyan"
+msgstr ""
+
+#. language code: chr
+#: zypp/LanguageCode.cc:337
+msgid "Cherokee"
+msgstr ""
+
+#. language code: chu cu
+#: zypp/LanguageCode.cc:339
+msgid "Church Slavic"
+msgstr ""
+
+#. language code: chv cv
+#: zypp/LanguageCode.cc:341
+msgid "Chuvash"
+msgstr ""
+
+#. language code: chy
+#: zypp/LanguageCode.cc:343
+msgid "Cheyenne"
+msgstr ""
+
+#. language code: cmc
+#: zypp/LanguageCode.cc:345
+msgid "Chamic Languages"
+msgstr ""
+
+#. language code: cop
+#: zypp/LanguageCode.cc:347
+msgid "Coptic"
+msgstr ""
+
+#. language code: cor kw
+#: zypp/LanguageCode.cc:349
+msgid "Cornish"
+msgstr ""
+
+#. language code: cos co
+#: zypp/LanguageCode.cc:351
+msgid "Corsican"
+msgstr ""
+
+#. language code: cpe
+#: zypp/LanguageCode.cc:353
+msgid "Creoles and Pidgins, English-Based (Other)"
+msgstr ""
+
+#. language code: cpf
+#: zypp/LanguageCode.cc:355
+msgid "Creoles and Pidgins, French-Based (Other)"
+msgstr ""
+
+#. language code: cpp
+#: zypp/LanguageCode.cc:357
+msgid "Creoles and Pidgins, Portuguese-Based (Other)"
+msgstr ""
+
+#. language code: cre cr
+#: zypp/LanguageCode.cc:359
+msgid "Cree"
+msgstr ""
+
+#. language code: crh
+#: zypp/LanguageCode.cc:361
+msgid "Crimean Tatar"
+msgstr ""
+
+#. language code: crp
+#: zypp/LanguageCode.cc:363
+msgid "Creoles and Pidgins (Other)"
+msgstr ""
+
+#. language code: csb
+#: zypp/LanguageCode.cc:365
+msgid "Kashubian"
+msgstr ""
+
+#. language code: cus
+#: zypp/LanguageCode.cc:367
+msgid "Cushitic (Other)"
+msgstr ""
+
+#. language code: cze ces cs
+#: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371
+msgid "Czech"
+msgstr ""
+
+#. language code: dak
+#: zypp/LanguageCode.cc:373
+msgid "Dakota"
+msgstr ""
+
+#. language code: dan da
+#: zypp/LanguageCode.cc:375
+msgid "Danish"
+msgstr ""
+
+#. language code: dar
+#: zypp/LanguageCode.cc:377
+msgid "Dargwa"
+msgstr ""
+
+#. language code: day
+#: zypp/LanguageCode.cc:379
+msgid "Dayak"
+msgstr ""
+
+#. language code: del
+#: zypp/LanguageCode.cc:381
+msgid "Delaware"
+msgstr ""
+
+#. language code: den
+#: zypp/LanguageCode.cc:383
+msgid "Slave (Athapascan)"
+msgstr ""
+
+#. language code: dgr
+#: zypp/LanguageCode.cc:385
+msgid "Dogrib"
+msgstr ""
+
+#. language code: din
+#: zypp/LanguageCode.cc:387
+msgid "Dinka"
+msgstr ""
+
+#. language code: div dv
+#: zypp/LanguageCode.cc:389
+msgid "Divehi"
+msgstr ""
+
+#. language code: doi
+#: zypp/LanguageCode.cc:391
+msgid "Dogri"
+msgstr ""
+
+#. language code: dra
+#: zypp/LanguageCode.cc:393
+msgid "Dravidian (Other)"
+msgstr ""
+
+#. language code: dsb
+#: zypp/LanguageCode.cc:395
+msgid "Lower Sorbian"
+msgstr ""
+
+#. language code: dua
+#: zypp/LanguageCode.cc:397
+msgid "Duala"
+msgstr ""
+
+#. language code: dum
+#: zypp/LanguageCode.cc:399
+msgid "Dutch, Middle (ca.1050-1350)"
+msgstr ""
+
+#. language code: dut nld nl
+#: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403
+msgid "Dutch"
+msgstr ""
+
+#. language code: dyu
+#: zypp/LanguageCode.cc:405
+msgid "Dyula"
+msgstr ""
+
+#. language code: dzo dz
+#: zypp/LanguageCode.cc:407
+msgid "Dzongkha"
+msgstr ""
+
+#. language code: efi
+#: zypp/LanguageCode.cc:409
+msgid "Efik"
+msgstr ""
+
+#. language code: egy
+#: zypp/LanguageCode.cc:411
+msgid "Egyptian (Ancient)"
+msgstr ""
+
+#. language code: eka
+#: zypp/LanguageCode.cc:413
+msgid "Ekajuk"
+msgstr ""
+
+#. language code: elx
+#: zypp/LanguageCode.cc:415
+msgid "Elamite"
+msgstr ""
+
+#. language code: eng en
+#: zypp/LanguageCode.cc:417
+msgid "English"
+msgstr ""
+
+#. language code: enm
+#: zypp/LanguageCode.cc:419
+msgid "English, Middle (1100-1500)"
+msgstr ""
+
+#. language code: epo eo
+#: zypp/LanguageCode.cc:421
+msgid "Esperanto"
+msgstr ""
+
+#. language code: est et
+#: zypp/LanguageCode.cc:423
+msgid "Estonian"
+msgstr ""
+
+#. language code: ewe ee
+#: zypp/LanguageCode.cc:425
+msgid "Ewe"
+msgstr ""
+
+#. language code: ewo
+#: zypp/LanguageCode.cc:427
+msgid "Ewondo"
+msgstr ""
+
+#. language code: fan
+#: zypp/LanguageCode.cc:429
+msgid "Fang"
+msgstr ""
+
+#. language code: fao fo
+#: zypp/LanguageCode.cc:431
+msgid "Faroese"
+msgstr ""
+
+#. language code: fat
+#: zypp/LanguageCode.cc:433
+msgid "Fanti"
+msgstr ""
+
+#. language code: fij fj
+#: zypp/LanguageCode.cc:435
+msgid "Fijian"
+msgstr ""
+
+#. language code: fil
+#: zypp/LanguageCode.cc:437
+msgid "Filipino"
+msgstr ""
+
+#. language code: fin fi
+#: zypp/LanguageCode.cc:439
+msgid "Finnish"
+msgstr ""
+
+#. language code: fiu
+#: zypp/LanguageCode.cc:441
+msgid "Finno-Ugrian (Other)"
+msgstr ""
+
+#. language code: fon
+#: zypp/LanguageCode.cc:443
+msgid "Fon"
+msgstr ""
+
+#. language code: fre fra fr
+#: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447
+msgid "French"
+msgstr ""
+
+#. language code: frm
+#: zypp/LanguageCode.cc:449
+msgid "French, Middle (ca.1400-1600)"
+msgstr ""
+
+#. language code: fro
+#: zypp/LanguageCode.cc:451
+msgid "French, Old (842-ca.1400)"
+msgstr ""
+
+#. language code: fry fy
+#: zypp/LanguageCode.cc:453
+msgid "Frisian"
+msgstr ""
+
+#. language code: ful ff
+#: zypp/LanguageCode.cc:455
+msgid "Fulah"
+msgstr ""
+
+#. language code: fur
+#: zypp/LanguageCode.cc:457
+msgid "Friulian"
+msgstr ""
+
+#. language code: gaa
+#: zypp/LanguageCode.cc:459
+msgid "Ga"
+msgstr ""
+
+#. language code: gay
+#: zypp/LanguageCode.cc:461
+msgid "Gayo"
+msgstr ""
+
+#. language code: gba
+#: zypp/LanguageCode.cc:463
+msgid "Gbaya"
+msgstr ""
+
+#. language code: gem
+#: zypp/LanguageCode.cc:465
+msgid "Germanic (Other)"
+msgstr ""
+
+#. language code: geo kat ka
+#: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469
+msgid "Georgian"
+msgstr ""
+
+#. language code: ger deu de
+#: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473
+msgid "German"
+msgstr ""
+
+#. language code: gez
+#: zypp/LanguageCode.cc:475
+msgid "Geez"
+msgstr ""
+
+#. language code: gil
+#: zypp/LanguageCode.cc:477
+msgid "Gilbertese"
+msgstr ""
+
+#. language code: gla gd
+#: zypp/LanguageCode.cc:479
+msgid "Gaelic"
+msgstr ""
+
+#. language code: gle ga
+#: zypp/LanguageCode.cc:481
+msgid "Irish"
+msgstr ""
+
+#. language code: glg gl
+#: zypp/LanguageCode.cc:483
+msgid "Galician"
+msgstr ""
+
+#. language code: glv gv
+#: zypp/LanguageCode.cc:485
+msgid "Manx"
+msgstr ""
+
+#. language code: gmh
+#: zypp/LanguageCode.cc:487
+msgid "German, Middle High (ca.1050-1500)"
+msgstr ""
+
+#. language code: goh
+#: zypp/LanguageCode.cc:489
+msgid "German, Old High (ca.750-1050)"
+msgstr ""
+
+#. language code: gon
+#: zypp/LanguageCode.cc:491
+msgid "Gondi"
+msgstr ""
+
+#. language code: gor
+#: zypp/LanguageCode.cc:493
+msgid "Gorontalo"
+msgstr ""
+
+#. language code: got
+#: zypp/LanguageCode.cc:495
+msgid "Gothic"
+msgstr ""
+
+#. language code: grb
+#: zypp/LanguageCode.cc:497
+msgid "Grebo"
+msgstr ""
+
+#. language code: grc
+#: zypp/LanguageCode.cc:499
+msgid "Greek, Ancient (to 1453)"
+msgstr ""
+
+#. language code: gre ell el
+#: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503
+msgid "Greek, Modern (1453-)"
+msgstr ""
+
+#. language code: grn gn
+#: zypp/LanguageCode.cc:505
+msgid "Guarani"
+msgstr ""
+
+#. language code: guj gu
+#: zypp/LanguageCode.cc:507
+msgid "Gujarati"
+msgstr ""
+
+#. language code: gwi
+#: zypp/LanguageCode.cc:509
+msgid "Gwich'in"
+msgstr ""
+
+#. language code: hai
+#: zypp/LanguageCode.cc:511
+msgid "Haida"
+msgstr ""
+
+#. language code: hat ht
+#: zypp/LanguageCode.cc:513
+msgid "Haitian"
+msgstr ""
+
+#. language code: hau ha
+#: zypp/LanguageCode.cc:515
+msgid "Hausa"
+msgstr ""
+
+#. language code: haw
+#: zypp/LanguageCode.cc:517
+msgid "Hawaiian"
+msgstr ""
+
+#. language code: heb he
+#: zypp/LanguageCode.cc:519
+msgid "Hebrew"
+msgstr ""
+
+#. language code: her hz
+#: zypp/LanguageCode.cc:521
+msgid "Herero"
+msgstr ""
+
+#. language code: hil
+#: zypp/LanguageCode.cc:523
+msgid "Hiligaynon"
+msgstr ""
+
+#. language code: him
+#: zypp/LanguageCode.cc:525
+msgid "Himachali"
+msgstr ""
+
+#. language code: hin hi
+#: zypp/LanguageCode.cc:527
+msgid "Hindi"
+msgstr ""
+
+#. language code: hit
+#: zypp/LanguageCode.cc:529
+msgid "Hittite"
+msgstr ""
+
+#. language code: hmn
+#: zypp/LanguageCode.cc:531
+msgid "Hmong"
+msgstr ""
+
+#. language code: hmo ho
+#: zypp/LanguageCode.cc:533
+msgid "Hiri Motu"
+msgstr ""
+
+#. language code: hsb
+#: zypp/LanguageCode.cc:535
+msgid "Upper Sorbian"
+msgstr ""
+
+#. language code: hun hu
+#: zypp/LanguageCode.cc:537
+msgid "Hungarian"
+msgstr ""
+
+#. language code: hup
+#: zypp/LanguageCode.cc:539
+msgid "Hupa"
+msgstr ""
+
+#. language code: iba
+#: zypp/LanguageCode.cc:541
+msgid "Iban"
+msgstr ""
+
+#. language code: ibo ig
+#: zypp/LanguageCode.cc:543
+msgid "Igbo"
+msgstr ""
+
+#. language code: ice isl is
+#: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547
+msgid "Icelandic"
+msgstr ""
+
+#. language code: ido io
+#: zypp/LanguageCode.cc:549
+msgid "Ido"
+msgstr ""
+
+#. language code: iii ii
+#: zypp/LanguageCode.cc:551
+msgid "Sichuan Yi"
+msgstr ""
+
+#. language code: ijo
+#: zypp/LanguageCode.cc:553
+msgid "Ijo"
+msgstr ""
+
+#. language code: iku iu
+#: zypp/LanguageCode.cc:555
+msgid "Inuktitut"
+msgstr ""
+
+#. language code: ile ie
+#: zypp/LanguageCode.cc:557
+msgid "Interlingue"
+msgstr ""
+
+#. language code: ilo
+#: zypp/LanguageCode.cc:559
+msgid "Iloko"
+msgstr ""
+
+#. language code: ina ia
+#: zypp/LanguageCode.cc:561
+msgid "Interlingua (International Auxiliary Language Association)"
+msgstr ""
+
+#. language code: inc
+#: zypp/LanguageCode.cc:563
+msgid "Indic (Other)"
+msgstr ""
+
+#. language code: ind id
+#: zypp/LanguageCode.cc:565
+msgid "Indonesian"
+msgstr ""
+
+#. language code: ine
+#: zypp/LanguageCode.cc:567
+msgid "Indo-European (Other)"
+msgstr ""
+
+#. language code: inh
+#: zypp/LanguageCode.cc:569
+msgid "Ingush"
+msgstr ""
+
+#. language code: ipk ik
+#: zypp/LanguageCode.cc:571
+msgid "Inupiaq"
+msgstr ""
+
+#. language code: ira
+#: zypp/LanguageCode.cc:573
+msgid "Iranian (Other)"
+msgstr ""
+
+#. language code: iro
+#: zypp/LanguageCode.cc:575
+msgid "Iroquoian Languages"
+msgstr ""
+
+#. language code: ita it
+#: zypp/LanguageCode.cc:577
+msgid "Italian"
+msgstr ""
+
+#. language code: jav jv
+#: zypp/LanguageCode.cc:579
+msgid "Javanese"
+msgstr ""
+
+#. language code: jbo
+#: zypp/LanguageCode.cc:581
+msgid "Lojban"
+msgstr ""
+
+#. language code: jpn ja
+#: zypp/LanguageCode.cc:583
+msgid "Japanese"
+msgstr ""
+
+#. language code: jpr
+#: zypp/LanguageCode.cc:585
+msgid "Judeo-Persian"
+msgstr ""
+
+#. language code: jrb
+#: zypp/LanguageCode.cc:587
+msgid "Judeo-Arabic"
+msgstr ""
+
+#. language code: kaa
+#: zypp/LanguageCode.cc:589
+msgid "Kara-Kalpak"
+msgstr ""
+
+#. language code: kab
+#: zypp/LanguageCode.cc:591
+msgid "Kabyle"
+msgstr ""
+
+#. language code: kac
+#: zypp/LanguageCode.cc:593
+msgid "Kachin"
+msgstr ""
+
+#. language code: kal kl
+#: zypp/LanguageCode.cc:595
+msgid "Kalaallisut"
+msgstr ""
+
+#. language code: kam
+#: zypp/LanguageCode.cc:597
+msgid "Kamba"
+msgstr ""
+
+#. language code: kan kn
+#: zypp/LanguageCode.cc:599
+msgid "Kannada"
+msgstr ""
+
+#. language code: kar
+#: zypp/LanguageCode.cc:601
+msgid "Karen"
+msgstr ""
+
+#. language code: kas ks
+#: zypp/LanguageCode.cc:603
+msgid "Kashmiri"
+msgstr ""
+
+#. language code: kau kr
+#: zypp/LanguageCode.cc:605
+msgid "Kanuri"
+msgstr ""
+
+#. language code: kaw
+#: zypp/LanguageCode.cc:607
+msgid "Kawi"
+msgstr ""
+
+#. language code: kaz kk
+#: zypp/LanguageCode.cc:609
+msgid "Kazakh"
+msgstr ""
+
+#. language code: kbd
+#: zypp/LanguageCode.cc:611
+msgid "Kabardian"
+msgstr ""
+
+#. language code: kha
+#: zypp/LanguageCode.cc:613
+msgid "Khasi"
+msgstr ""
+
+#. language code: khi
+#: zypp/LanguageCode.cc:615
+msgid "Khoisan (Other)"
+msgstr ""
+
+#. language code: khm km
+#: zypp/LanguageCode.cc:617
+msgid "Khmer"
+msgstr ""
+
+#. language code: kho
+#: zypp/LanguageCode.cc:619
+msgid "Khotanese"
+msgstr ""
+
+#. language code: kik ki
+#: zypp/LanguageCode.cc:621
+msgid "Kikuyu"
+msgstr ""
+
+#. language code: kin rw
+#: zypp/LanguageCode.cc:623
+msgid "Kinyarwanda"
+msgstr ""
+
+#. language code: kir ky
+#: zypp/LanguageCode.cc:625
+msgid "Kirghiz"
+msgstr ""
+
+#. language code: kmb
+#: zypp/LanguageCode.cc:627
+msgid "Kimbundu"
+msgstr ""
+
+#. language code: kok
+#: zypp/LanguageCode.cc:629
+msgid "Konkani"
+msgstr ""
+
+#. language code: kom kv
+#: zypp/LanguageCode.cc:631
+msgid "Komi"
+msgstr ""
+
+#. language code: kon kg
+#: zypp/LanguageCode.cc:633
+msgid "Kongo"
+msgstr ""
+
+#. language code: kor ko
+#: zypp/LanguageCode.cc:635
+msgid "Korean"
+msgstr ""
+
+#. language code: kos
+#: zypp/LanguageCode.cc:637
+msgid "Kosraean"
+msgstr ""
+
+#. language code: kpe
+#: zypp/LanguageCode.cc:639
+msgid "Kpelle"
+msgstr ""
+
+#. language code: krc
+#: zypp/LanguageCode.cc:641
+msgid "Karachay-Balkar"
+msgstr ""
+
+#. language code: kro
+#: zypp/LanguageCode.cc:643
+msgid "Kru"
+msgstr ""
+
+#. language code: kru
+#: zypp/LanguageCode.cc:645
+msgid "Kurukh"
+msgstr ""
+
+#. language code: kua kj
+#: zypp/LanguageCode.cc:647
+msgid "Kuanyama"
+msgstr ""
+
+#. language code: kum
+#: zypp/LanguageCode.cc:649
+msgid "Kumyk"
+msgstr ""
+
+#. language code: kur ku
+#: zypp/LanguageCode.cc:651
+msgid "Kurdish"
+msgstr ""
+
+#. language code: kut
+#: zypp/LanguageCode.cc:653
+msgid "Kutenai"
+msgstr ""
+
+#. language code: lad
+#: zypp/LanguageCode.cc:655
+msgid "Ladino"
+msgstr ""
+
+#. language code: lah
+#: zypp/LanguageCode.cc:657
+msgid "Lahnda"
+msgstr ""
+
+#. language code: lam
+#: zypp/LanguageCode.cc:659
+msgid "Lamba"
+msgstr ""
+
+#. language code: lao lo
+#: zypp/LanguageCode.cc:661
+msgid "Lao"
+msgstr ""
+
+#. language code: lat la
+#: zypp/LanguageCode.cc:663
+msgid "Latin"
+msgstr ""
+
+#. language code: lav lv
+#: zypp/LanguageCode.cc:665
+msgid "Latvian"
+msgstr ""
+
+#. language code: lez
+#: zypp/LanguageCode.cc:667
+msgid "Lezghian"
+msgstr ""
+
+#. language code: lim li
+#: zypp/LanguageCode.cc:669
+msgid "Limburgan"
+msgstr ""
+
+#. language code: lin ln
+#: zypp/LanguageCode.cc:671
+msgid "Lingala"
+msgstr ""
+
+#. language code: lit lt
+#: zypp/LanguageCode.cc:673
+msgid "Lithuanian"
+msgstr ""
+
+#. language code: lol
+#: zypp/LanguageCode.cc:675
+msgid "Mongo"
+msgstr ""
+
+#. language code: loz
+#: zypp/LanguageCode.cc:677
+msgid "Lozi"
+msgstr ""
+
+#. language code: ltz lb
+#: zypp/LanguageCode.cc:679
+msgid "Luxembourgish"
+msgstr ""
+
+#. language code: lua
+#: zypp/LanguageCode.cc:681
+msgid "Luba-Lulua"
+msgstr ""
+
+#. language code: lub lu
+#: zypp/LanguageCode.cc:683
+msgid "Luba-Katanga"
+msgstr ""
+
+#. language code: lug lg
+#: zypp/LanguageCode.cc:685
+msgid "Ganda"
+msgstr ""
+
+#. language code: lui
+#: zypp/LanguageCode.cc:687
+msgid "Luiseno"
+msgstr ""
+
+#. language code: lun
+#: zypp/LanguageCode.cc:689
+msgid "Lunda"
+msgstr ""
+
+#. language code: luo
+#: zypp/LanguageCode.cc:691
+msgid "Luo (Kenya and Tanzania)"
+msgstr ""
+
+#. language code: lus
+#: zypp/LanguageCode.cc:693
+msgid "Lushai"
+msgstr ""
+
+#. language code: mac mkd mk
+#: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697
+msgid "Macedonian"
+msgstr ""
+
+#. language code: mad
+#: zypp/LanguageCode.cc:699
+msgid "Madurese"
+msgstr ""
+
+#. language code: mag
+#: zypp/LanguageCode.cc:701
+msgid "Magahi"
+msgstr ""
+
+#. language code: mah mh
+#: zypp/LanguageCode.cc:703
+msgid "Marshallese"
+msgstr ""
+
+#. language code: mai
+#: zypp/LanguageCode.cc:705
+msgid "Maithili"
+msgstr ""
+
+#. language code: mak
+#: zypp/LanguageCode.cc:707
+msgid "Makasar"
+msgstr ""
+
+#. language code: mal ml
+#: zypp/LanguageCode.cc:709
+msgid "Malayalam"
+msgstr ""
+
+#. language code: man
+#: zypp/LanguageCode.cc:711
+msgid "Mandingo"
+msgstr ""
+
+#. language code: mao mri mi
+#: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715
+msgid "Maori"
+msgstr ""
+
+#. language code: map
+#: zypp/LanguageCode.cc:717
+msgid "Austronesian (Other)"
+msgstr ""
+
+#. language code: mar mr
+#: zypp/LanguageCode.cc:719
+msgid "Marathi"
+msgstr ""
+
+#. language code: mas
+#: zypp/LanguageCode.cc:721
+msgid "Masai"
+msgstr ""
+
+#. language code: may msa ms
+#: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725
+msgid "Malay"
+msgstr ""
+
+#. language code: mdf
+#: zypp/LanguageCode.cc:727
+msgid "Moksha"
+msgstr ""
+
+#. language code: mdr
+#: zypp/LanguageCode.cc:729
+msgid "Mandar"
+msgstr ""
+
+#. language code: men
+#: zypp/LanguageCode.cc:731
+msgid "Mende"
+msgstr ""
+
+#. language code: mga
+#: zypp/LanguageCode.cc:733
+msgid "Irish, Middle (900-1200)"
+msgstr ""
+
+#. language code: mic
+#: zypp/LanguageCode.cc:735
+msgid "Mi'kmaq"
+msgstr ""
+
+#. language code: min
+#: zypp/LanguageCode.cc:737
+msgid "Minangkabau"
+msgstr ""
+
+#. language code: mis
+#: zypp/LanguageCode.cc:739
+msgid "Miscellaneous Languages"
+msgstr ""
+
+#. language code: mkh
+#: zypp/LanguageCode.cc:741
+msgid "Mon-Khmer (Other)"
+msgstr ""
+
+#. language code: mlg mg
+#: zypp/LanguageCode.cc:743
+msgid "Malagasy"
+msgstr ""
+
+#. language code: mlt mt
+#: zypp/LanguageCode.cc:745
+msgid "Maltese"
+msgstr ""
+
+#. language code: mnc
+#: zypp/LanguageCode.cc:747
+msgid "Manchu"
+msgstr ""
+
+#. language code: mni
+#: zypp/LanguageCode.cc:749
+msgid "Manipuri"
+msgstr ""
+
+#. language code: mno
+#: zypp/LanguageCode.cc:751
+msgid "Manobo Languages"
+msgstr ""
+
+#. language code: moh
+#: zypp/LanguageCode.cc:753
+msgid "Mohawk"
+msgstr ""
+
+#. language code: mol mo
+#: zypp/LanguageCode.cc:755
+msgid "Moldavian"
+msgstr ""
+
+#. language code: mon mn
+#: zypp/LanguageCode.cc:757
+msgid "Mongolian"
+msgstr ""
+
+#. language code: mos
+#: zypp/LanguageCode.cc:759
+msgid "Mossi"
+msgstr ""
+
+#. language code: mul
+#: zypp/LanguageCode.cc:761
+msgid "Multiple Languages"
+msgstr ""
+
+#. language code: mun
+#: zypp/LanguageCode.cc:763
+msgid "Munda languages"
+msgstr ""
+
+#. language code: mus
+#: zypp/LanguageCode.cc:765
+msgid "Creek"
+msgstr ""
+
+#. language code: mwl
+#: zypp/LanguageCode.cc:767
+msgid "Mirandese"
+msgstr ""
+
+#. language code: mwr
+#: zypp/LanguageCode.cc:769
+msgid "Marwari"
+msgstr ""
+
+#. language code: myn
+#: zypp/LanguageCode.cc:771
+msgid "Mayan Languages"
+msgstr ""
+
+#. language code: myv
+#: zypp/LanguageCode.cc:773
+msgid "Erzya"
+msgstr ""
+
+#. language code: nah
+#: zypp/LanguageCode.cc:775
+msgid "Nahuatl"
+msgstr ""
+
+#. language code: nai
+#: zypp/LanguageCode.cc:777
+msgid "North American Indian"
+msgstr ""
+
+#. language code: nap
+#: zypp/LanguageCode.cc:779
+msgid "Neapolitan"
+msgstr ""
+
+#. language code: nav nv
+#: zypp/LanguageCode.cc:783
+msgid "Navajo"
+msgstr ""
+
+#. language code: nbl nr
+#: zypp/LanguageCode.cc:785
+msgid "Ndebele, South"
+msgstr ""
+
+#. language code: nde nd
+#: zypp/LanguageCode.cc:787
+msgid "Ndebele, North"
+msgstr ""
+
+#. language code: ndo ng
+#: zypp/LanguageCode.cc:789
+msgid "Ndonga"
+msgstr ""
+
+#. language code: nds
+#: zypp/LanguageCode.cc:791
+msgid "Low German"
+msgstr ""
+
+#. language code: nep ne
+#: zypp/LanguageCode.cc:793
+msgid "Nepali"
+msgstr ""
+
+#. language code: new
+#: zypp/LanguageCode.cc:795
+msgid "Nepal Bhasa"
+msgstr ""
+
+#. language code: nia
+#: zypp/LanguageCode.cc:797
+msgid "Nias"
+msgstr ""
+
+#. language code: nic
+#: zypp/LanguageCode.cc:799
+msgid "Niger-Kordofanian (Other)"
+msgstr ""
+
+#. language code: niu
+#: zypp/LanguageCode.cc:801
+msgid "Niuean"
+msgstr ""
+
+#. language code: nno nn
+#: zypp/LanguageCode.cc:803
+msgid "Norwegian Nynorsk"
+msgstr ""
+
+#. language code: nob nb
+#: zypp/LanguageCode.cc:805
+msgid "Norwegian Bokmal"
+msgstr ""
+
+#. language code: nog
+#: zypp/LanguageCode.cc:807
+msgid "Nogai"
+msgstr ""
+
+#. language code: non
+#: zypp/LanguageCode.cc:809
+msgid "Norse, Old"
+msgstr ""
+
+#. language code: nor no
+#: zypp/LanguageCode.cc:811
+msgid "Norwegian"
+msgstr ""
+
+#. language code: nso
+#: zypp/LanguageCode.cc:813
+msgid "Northern Sotho"
+msgstr ""
+
+#. language code: nub
+#: zypp/LanguageCode.cc:815
+msgid "Nubian Languages"
+msgstr ""
+
+#. language code: nwc
+#: zypp/LanguageCode.cc:817
+msgid "Classical Newari"
+msgstr ""
+
+#. language code: nya ny
+#: zypp/LanguageCode.cc:819
+msgid "Chichewa"
+msgstr ""
+
+#. language code: nym
+#: zypp/LanguageCode.cc:821
+msgid "Nyamwezi"
+msgstr ""
+
+#. language code: nyn
+#: zypp/LanguageCode.cc:823
+msgid "Nyankole"
+msgstr ""
+
+#. language code: nyo
+#: zypp/LanguageCode.cc:825
+msgid "Nyoro"
+msgstr ""
+
+#. language code: nzi
+#: zypp/LanguageCode.cc:827
+msgid "Nzima"
+msgstr ""
+
+#. language code: oci oc
+#: zypp/LanguageCode.cc:829
+msgid "Occitan (post 1500)"
+msgstr ""
+
+#. language code: oji oj
+#: zypp/LanguageCode.cc:831
+msgid "Ojibwa"
+msgstr ""
+
+#. language code: ori or
+#: zypp/LanguageCode.cc:833
+msgid "Oriya"
+msgstr ""
+
+#. language code: orm om
+#: zypp/LanguageCode.cc:835
+msgid "Oromo"
+msgstr ""
+
+#. language code: osa
+#: zypp/LanguageCode.cc:837
+msgid "Osage"
+msgstr ""
+
+#. language code: oss os
+#: zypp/LanguageCode.cc:839
+msgid "Ossetian"
+msgstr ""
+
+#. language code: ota
+#: zypp/LanguageCode.cc:841
+msgid "Turkish, Ottoman (1500-1928)"
+msgstr ""
+
+#. language code: oto
+#: zypp/LanguageCode.cc:843
+msgid "Otomian Languages"
+msgstr ""
+
+#. language code: paa
+#: zypp/LanguageCode.cc:845
+msgid "Papuan (Other)"
+msgstr ""
+
+#. language code: pag
+#: zypp/LanguageCode.cc:847
+msgid "Pangasinan"
+msgstr ""
+
+#. language code: pal
+#: zypp/LanguageCode.cc:849
+msgid "Pahlavi"
+msgstr ""
+
+#. language code: pam
+#: zypp/LanguageCode.cc:851
+msgid "Pampanga"
+msgstr ""
+
+#. language code: pan pa
+#: zypp/LanguageCode.cc:853
+msgid "Panjabi"
+msgstr ""
+
+#. language code: pap
+#: zypp/LanguageCode.cc:855
+msgid "Papiamento"
+msgstr ""
+
+#. language code: pau
+#: zypp/LanguageCode.cc:857
+msgid "Palauan"
+msgstr ""
+
+#. language code: peo
+#: zypp/LanguageCode.cc:859
+msgid "Persian, Old (ca.600-400 B.C.)"
+msgstr ""
+
+#. language code: per fas fa
+#: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863
+msgid "Persian"
+msgstr ""
+
+#. language code: phi
+#: zypp/LanguageCode.cc:865
+msgid "Philippine (Other)"
+msgstr ""
+
+#. language code: phn
+#: zypp/LanguageCode.cc:867
+msgid "Phoenician"
+msgstr ""
+
+#. language code: pli pi
+#: zypp/LanguageCode.cc:869
+msgid "Pali"
+msgstr ""
+
+#. language code: pol pl
+#: zypp/LanguageCode.cc:871
+msgid "Polish"
+msgstr ""
+
+#. language code: pon
+#: zypp/LanguageCode.cc:873
+msgid "Pohnpeian"
+msgstr ""
+
+#. language code: por pt
+#: zypp/LanguageCode.cc:875
+msgid "Portuguese"
+msgstr ""
+
+#. language code: pra
+#: zypp/LanguageCode.cc:877
+msgid "Prakrit Languages"
+msgstr ""
+
+#. language code: pro
+#: zypp/LanguageCode.cc:879
+msgid "Provencal, Old (to 1500)"
+msgstr ""
+
+#. language code: pus ps
+#: zypp/LanguageCode.cc:881
+msgid "Pushto"
+msgstr ""
+
+#. language code: que qu
+#: zypp/LanguageCode.cc:883
+msgid "Quechua"
+msgstr ""
+
+#. language code: raj
+#: zypp/LanguageCode.cc:885
+msgid "Rajasthani"
+msgstr ""
+
+#. language code: rap
+#: zypp/LanguageCode.cc:887
+msgid "Rapanui"
+msgstr ""
+
+#. language code: rar
+#: zypp/LanguageCode.cc:889
+msgid "Rarotongan"
+msgstr ""
+
+#. language code: roa
+#: zypp/LanguageCode.cc:891
+msgid "Romance (Other)"
+msgstr ""
+
+#. language code: roh rm
+#: zypp/LanguageCode.cc:893
+msgid "Raeto-Romance"
+msgstr ""
+
+#. language code: rom
+#: zypp/LanguageCode.cc:895
+msgid "Romany"
+msgstr ""
+
+#. language code: rum ron ro
+#: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899
+msgid "Romanian"
+msgstr ""
+
+#. language code: run rn
+#: zypp/LanguageCode.cc:901
+msgid "Rundi"
+msgstr ""
+
+#. language code: rus ru
+#: zypp/LanguageCode.cc:903
+msgid "Russian"
+msgstr ""
+
+#. language code: sad
+#: zypp/LanguageCode.cc:905
+msgid "Sandawe"
+msgstr ""
+
+#. language code: sag sg
+#: zypp/LanguageCode.cc:907
+msgid "Sango"
+msgstr ""
+
+#. language code: sah
+#: zypp/LanguageCode.cc:909
+msgid "Yakut"
+msgstr ""
+
+#. language code: sai
+#: zypp/LanguageCode.cc:911
+msgid "South American Indian (Other)"
+msgstr ""
+
+#. language code: sal
+#: zypp/LanguageCode.cc:913
+msgid "Salishan Languages"
+msgstr ""
+
+#. language code: sam
+#: zypp/LanguageCode.cc:915
+msgid "Samaritan Aramaic"
+msgstr ""
+
+#. language code: san sa
+#: zypp/LanguageCode.cc:917
+msgid "Sanskrit"
+msgstr ""
+
+#. language code: sas
+#: zypp/LanguageCode.cc:919
+msgid "Sasak"
+msgstr ""
+
+#. language code: sat
+#: zypp/LanguageCode.cc:921
+msgid "Santali"
+msgstr ""
+
+#. language code: scc srp sr
+#: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925
+msgid "Serbian"
+msgstr ""
+
+#. language code: scn
+#: zypp/LanguageCode.cc:927
+msgid "Sicilian"
+msgstr ""
+
+#. language code: sco
+#: zypp/LanguageCode.cc:929
+msgid "Scots"
+msgstr ""
+
+#. language code: scr hrv hr
+#: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933
+msgid "Croatian"
+msgstr ""
+
+#. language code: sel
+#: zypp/LanguageCode.cc:935
+msgid "Selkup"
+msgstr ""
+
+#. language code: sem
+#: zypp/LanguageCode.cc:937
+msgid "Semitic (Other)"
+msgstr ""
+
+#. language code: sga
+#: zypp/LanguageCode.cc:939
+msgid "Irish, Old (to 900)"
+msgstr ""
+
+#. language code: sgn
+#: zypp/LanguageCode.cc:941
+msgid "Sign Languages"
+msgstr ""
+
+#. language code: shn
+#: zypp/LanguageCode.cc:943
+msgid "Shan"
+msgstr ""
+
+#. language code: sid
+#: zypp/LanguageCode.cc:945
+msgid "Sidamo"
+msgstr ""
+
+#. language code: sin si
+#: zypp/LanguageCode.cc:947
+msgid "Sinhala"
+msgstr ""
+
+#. language code: sio
+#: zypp/LanguageCode.cc:949
+msgid "Siouan Languages"
+msgstr ""
+
+#. language code: sit
+#: zypp/LanguageCode.cc:951
+msgid "Sino-Tibetan (Other)"
+msgstr ""
+
+#. language code: sla
+#: zypp/LanguageCode.cc:953
+msgid "Slavic (Other)"
+msgstr ""
+
+#. language code: slo slk sk
+#: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957
+msgid "Slovak"
+msgstr ""
+
+#. language code: slv sl
+#: zypp/LanguageCode.cc:959
+msgid "Slovenian"
+msgstr ""
+
+#. language code: sma
+#: zypp/LanguageCode.cc:961
+msgid "Southern Sami"
+msgstr ""
+
+#. language code: sme se
+#: zypp/LanguageCode.cc:963
+msgid "Northern Sami"
+msgstr ""
+
+#. language code: smi
+#: zypp/LanguageCode.cc:965
+msgid "Sami Languages (Other)"
+msgstr ""
+
+#. language code: smj
+#: zypp/LanguageCode.cc:967
+msgid "Lule Sami"
+msgstr ""
+
+#. language code: smn
+#: zypp/LanguageCode.cc:969
+msgid "Inari Sami"
+msgstr ""
+
+#. language code: smo sm
+#: zypp/LanguageCode.cc:971
+msgid "Samoan"
+msgstr ""
+
+#. language code: sms
+#: zypp/LanguageCode.cc:973
+msgid "Skolt Sami"
+msgstr ""
+
+#. language code: sna sn
+#: zypp/LanguageCode.cc:975
+msgid "Shona"
+msgstr ""
+
+#. language code: snd sd
+#: zypp/LanguageCode.cc:977
+msgid "Sindhi"
+msgstr ""
+
+#. language code: snk
+#: zypp/LanguageCode.cc:979
+msgid "Soninke"
+msgstr ""
+
+#. language code: sog
+#: zypp/LanguageCode.cc:981
+msgid "Sogdian"
+msgstr ""
+
+#. language code: som so
+#: zypp/LanguageCode.cc:983
+msgid "Somali"
+msgstr ""
+
+#. language code: son
+#: zypp/LanguageCode.cc:985
+msgid "Songhai"
+msgstr ""
+
+#. language code: sot st
+#: zypp/LanguageCode.cc:987
+msgid "Sotho, Southern"
+msgstr ""
+
+#. language code: spa es
+#: zypp/LanguageCode.cc:989
+msgid "Spanish"
+msgstr ""
+
+#. language code: srd sc
+#: zypp/LanguageCode.cc:991
+msgid "Sardinian"
+msgstr ""
+
+#. language code: srr
+#: zypp/LanguageCode.cc:993
+msgid "Serer"
+msgstr ""
+
+#. language code: ssa
+#: zypp/LanguageCode.cc:995
+msgid "Nilo-Saharan (Other)"
+msgstr ""
+
+#. language code: ssw ss
+#: zypp/LanguageCode.cc:997
+msgid "Swati"
+msgstr ""
+
+#. language code: suk
+#: zypp/LanguageCode.cc:999
+msgid "Sukuma"
+msgstr ""
+
+#. language code: sun su
+#: zypp/LanguageCode.cc:1001
+msgid "Sundanese"
+msgstr ""
+
+#. language code: sus
+#: zypp/LanguageCode.cc:1003
+msgid "Susu"
+msgstr ""
+
+#. language code: sux
+#: zypp/LanguageCode.cc:1005
+msgid "Sumerian"
+msgstr ""
+
+#. language code: swa sw
+#: zypp/LanguageCode.cc:1007
+msgid "Swahili"
+msgstr ""
+
+#. language code: swe sv
+#: zypp/LanguageCode.cc:1009
+msgid "Swedish"
+msgstr ""
+
+#. language code: syr
+#: zypp/LanguageCode.cc:1011
+msgid "Syriac"
+msgstr ""
+
+#. language code: tah ty
+#: zypp/LanguageCode.cc:1013
+msgid "Tahitian"
+msgstr ""
+
+#. language code: tai
+#: zypp/LanguageCode.cc:1015
+msgid "Tai (Other)"
+msgstr ""
+
+#. language code: tam ta
+#: zypp/LanguageCode.cc:1017
+msgid "Tamil"
+msgstr ""
+
+#. language code: tat tt
+#: zypp/LanguageCode.cc:1019
+msgid "Tatar"
+msgstr ""
+
+#. language code: tel te
+#: zypp/LanguageCode.cc:1021
+msgid "Telugu"
+msgstr ""
+
+#. language code: tem
+#: zypp/LanguageCode.cc:1023
+msgid "Timne"
+msgstr ""
+
+#. language code: ter
+#: zypp/LanguageCode.cc:1025
+msgid "Tereno"
+msgstr ""
+
+#. language code: tet
+#: zypp/LanguageCode.cc:1027
+msgid "Tetum"
+msgstr ""
+
+#. language code: tgk tg
+#: zypp/LanguageCode.cc:1029
+msgid "Tajik"
+msgstr ""
+
+#. language code: tgl tl
+#: zypp/LanguageCode.cc:1031
+msgid "Tagalog"
+msgstr ""
+
+#. language code: tha th
+#: zypp/LanguageCode.cc:1033
+msgid "Thai"
+msgstr ""
+
+#. language code: tib bod bo
+#: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037
+msgid "Tibetan"
+msgstr ""
+
+#. language code: tig
+#: zypp/LanguageCode.cc:1039
+msgid "Tigre"
+msgstr ""
+
+#. language code: tir ti
+#: zypp/LanguageCode.cc:1041
+msgid "Tigrinya"
+msgstr ""
+
+#. language code: tiv
+#: zypp/LanguageCode.cc:1043
+msgid "Tiv"
+msgstr ""
+
+#. language code: tlh
+#: zypp/LanguageCode.cc:1047
+msgid "Klingon"
+msgstr ""
+
+#. language code: tli
+#: zypp/LanguageCode.cc:1049
+msgid "Tlingit"
+msgstr ""
+
+#. language code: tmh
+#: zypp/LanguageCode.cc:1051
+msgid "Tamashek"
+msgstr ""
+
+#. language code: tog
+#: zypp/LanguageCode.cc:1053
+msgid "Tonga (Nyasa)"
+msgstr ""
+
+#. language code: ton to
+#: zypp/LanguageCode.cc:1055
+msgid "Tonga (Tonga Islands)"
+msgstr ""
+
+#. language code: tpi
+#: zypp/LanguageCode.cc:1057
+msgid "Tok Pisin"
+msgstr ""
+
+#. language code: tsi
+#: zypp/LanguageCode.cc:1059
+msgid "Tsimshian"
+msgstr ""
+
+#. language code: tsn tn
+#: zypp/LanguageCode.cc:1061
+msgid "Tswana"
+msgstr ""
+
+#. language code: tso ts
+#: zypp/LanguageCode.cc:1063
+msgid "Tsonga"
+msgstr ""
+
+#. language code: tuk tk
+#: zypp/LanguageCode.cc:1065
+msgid "Turkmen"
+msgstr ""
+
+#. language code: tum
+#: zypp/LanguageCode.cc:1067
+msgid "Tumbuka"
+msgstr ""
+
+#. language code: tup
+#: zypp/LanguageCode.cc:1069
+msgid "Tupi Languages"
+msgstr ""
+
+#. language code: tur tr
+#: zypp/LanguageCode.cc:1071
+msgid "Turkish"
+msgstr ""
+
+#. language code: tut
+#: zypp/LanguageCode.cc:1073
+msgid "Altaic (Other)"
+msgstr ""
+
+#. language code: twi tw
+#: zypp/LanguageCode.cc:1077
+msgid "Twi"
+msgstr ""
+
+#. language code: tyv
+#: zypp/LanguageCode.cc:1079
+msgid "Tuvinian"
+msgstr ""
+
+#. language code: udm
+#: zypp/LanguageCode.cc:1081
+msgid "Udmurt"
+msgstr ""
+
+#. language code: uga
+#: zypp/LanguageCode.cc:1083
+msgid "Ugaritic"
+msgstr ""
+
+#. language code: uig ug
+#: zypp/LanguageCode.cc:1085
+msgid "Uighur"
+msgstr ""
+
+#. language code: ukr uk
+#: zypp/LanguageCode.cc:1087
+msgid "Ukrainian"
+msgstr ""
+
+#. language code: umb
+#: zypp/LanguageCode.cc:1089
+msgid "Umbundu"
+msgstr ""
+
+#. language code: und
+#: zypp/LanguageCode.cc:1091
+msgid "Undetermined"
+msgstr ""
+
+#. language code: urd ur
+#: zypp/LanguageCode.cc:1093
+msgid "Urdu"
+msgstr ""
+
+#. language code: uzb uz
+#: zypp/LanguageCode.cc:1095
+msgid "Uzbek"
+msgstr ""
+
+#. language code: vai
+#: zypp/LanguageCode.cc:1097
+msgid "Vai"
+msgstr ""
+
+#. language code: ven ve
+#: zypp/LanguageCode.cc:1099
+msgid "Venda"
+msgstr ""
+
+#. language code: vie vi
+#: zypp/LanguageCode.cc:1101
+msgid "Vietnamese"
+msgstr ""
+
+#. language code: vol vo
+#: zypp/LanguageCode.cc:1103
+msgid "Volapuk"
+msgstr ""
+
+#. language code: vot
+#: zypp/LanguageCode.cc:1105
+msgid "Votic"
+msgstr ""
+
+#. language code: wak
+#: zypp/LanguageCode.cc:1107
+msgid "Wakashan Languages"
+msgstr ""
+
+#. language code: wal
+#: zypp/LanguageCode.cc:1109
+msgid "Walamo"
+msgstr ""
+
+#. language code: war
+#: zypp/LanguageCode.cc:1111
+msgid "Waray"
+msgstr ""
+
+#. language code: was
+#: zypp/LanguageCode.cc:1113
+msgid "Washo"
+msgstr ""
+
+#. language code: wel cym cy
+#: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117
+msgid "Welsh"
+msgstr ""
+
+#. language code: wen
+#: zypp/LanguageCode.cc:1119
+msgid "Sorbian Languages"
+msgstr ""
+
+#. language code: wln wa
+#: zypp/LanguageCode.cc:1121
+msgid "Walloon"
+msgstr ""
+
+#. language code: wol wo
+#: zypp/LanguageCode.cc:1123
+msgid "Wolof"
+msgstr ""
+
+#. language code: xal
+#: zypp/LanguageCode.cc:1125
+msgid "Kalmyk"
+msgstr ""
+
+#. language code: xho xh
+#: zypp/LanguageCode.cc:1127
+msgid "Xhosa"
+msgstr ""
+
+#. language code: yao
+#: zypp/LanguageCode.cc:1129
+msgid "Yao"
+msgstr ""
+
+#. language code: yap
+#: zypp/LanguageCode.cc:1131
+msgid "Yapese"
+msgstr ""
+
+#. language code: yid yi
+#: zypp/LanguageCode.cc:1133
+msgid "Yiddish"
+msgstr ""
+
+#. language code: yor yo
+#: zypp/LanguageCode.cc:1135
+msgid "Yoruba"
+msgstr ""
+
+#. language code: ypk
+#: zypp/LanguageCode.cc:1137
+msgid "Yupik Languages"
+msgstr ""
+
+#. language code: zap
+#: zypp/LanguageCode.cc:1139
+msgid "Zapotec"
+msgstr ""
+
+#. language code: zen
+#: zypp/LanguageCode.cc:1141
+msgid "Zenaga"
+msgstr ""
+
+#. language code: zha za
+#: zypp/LanguageCode.cc:1143
+msgid "Zhuang"
+msgstr ""
+
+#. language code: znd
+#: zypp/LanguageCode.cc:1145
+msgid "Zande"
+msgstr ""
+
+#. language code: zul zu
+#: zypp/LanguageCode.cc:1147
+msgid "Zulu"
+msgstr ""
+
+#. language code: zun
+#: zypp/LanguageCode.cc:1149
+msgid "Zuni"
+msgstr ""
+
+#: zypp/ProblemSolution.cc:114
+msgid "Following actions will be done:"
+msgstr ""
+
+#. translators: an annotation to a gpg keys expiry date
+#: zypp/PublicKey.cc:64
+msgid "does not expire"
+msgstr ""
+
+#. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12"
+#: zypp/PublicKey.cc:69
+#, boost-format
+msgid "expired: %1%"
+msgstr ""
+
+#. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12"
+#: zypp/PublicKey.cc:74
+#, boost-format
+msgid "expires: %1%"
+msgstr ""
+
+#. translators: an annotation to a gpg keys expiry date
+#: zypp/PublicKey.cc:83
+msgid "(does not expire)"
+msgstr ""
+
+#. translators: an annotation to a gpg keys expiry date
+#: zypp/PublicKey.cc:92
+msgid "(EXPIRED)"
+msgstr ""
+
+#. translators: an annotation to a gpg keys expiry date
+#: zypp/PublicKey.cc:96
+msgid "(expires within 24h)"
+msgstr ""
+
+#. translators: an annotation to a gpg keys expiry date
+#: zypp/PublicKey.cc:100
+#, c-format, boost-format
+msgid "(expires in %d day)"
+msgid_plural "(expires in %d days)"
+msgstr[0] ""
+msgstr[1] ""
+
+#. translator: %1% is a gpg key ID like 3DBDC284
+#. %2% is a cache directories path
+#: zypp/RepoInfo.cc:548
+#, boost-format
+msgid "Looking for gpg key ID %1% in cache %2%."
+msgstr ""
+
+#. translator: %1% is a gpg key ID like 3DBDC284
+#. %2% is a repositories name
+#: zypp/RepoInfo.cc:576
+#, boost-format
+msgid "Looking for gpg key ID %1% in repository %2%."
+msgstr ""
+
+#. translator: %1% is a repositories name
+#: zypp/RepoInfo.cc:600
+#, boost-format
+msgid "Repository %1% does not define additional 'gpgkey=' URLs."
+msgstr ""
+
+#: zypp/RepoManager.cc:320
+#, boost-format
+msgid "Cannot read repo directory '%1%': Permission denied"
+msgstr ""
+
+#. TranslatorExplanation '%s' is a pathname
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
+#: zypp/repo/PluginServices.cc:49
+#, c-format, boost-format
+msgid "Failed to read directory '%s'"
+msgstr ""
+
+#: zypp/RepoManager.cc:338
+#, boost-format
+msgid "Cannot read repo file '%1%': Permission denied"
+msgstr ""
+
+#: zypp/RepoManager.cc:361
+msgid "Repository alias cannot start with dot."
+msgstr ""
+
+#: zypp/RepoManager.cc:372
+msgid "Service alias cannot start with dot."
+msgstr ""
+
+#. TranslatorExplanation '%s' is a filename
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
+#, c-format, boost-format
+msgid "Can't open file '%s' for writing."
+msgstr ""
+
+#. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
+#. %1% = service name
+#. %2% = repository name
+#: zypp/RepoManager.cc:895
+#, boost-format
+msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
+msgstr ""
+
+#. we will throw this later if no URL checks out fine
+#: zypp/RepoManager.cc:1152
+msgid "Valid metadata not found at specified URL"
+msgid_plural "Valid metadata not found at specified URLs"
+msgstr[0] ""
+msgstr[1] ""
+
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
+#, c-format, boost-format
+msgid "Can't create %s"
+msgstr ""
+
+#: zypp/RepoManager.cc:1212
+msgid "Can't create metadata cache directory."
+msgstr ""
+
+#: zypp/RepoManager.cc:1365
+#, c-format, boost-format
+msgid "Building repository '%s' cache"
+msgstr ""
+
+#: zypp/RepoManager.cc:1385
+#, c-format, boost-format
+msgid "Can't create cache at %s - no writing permissions."
+msgstr ""
+
+#: zypp/RepoManager.cc:1446
+#, c-format, boost-format
+msgid "Failed to cache repo (%d)."
+msgstr ""
+
+#: zypp/RepoManager.cc:1457
+msgid "Unhandled repository type"
+msgstr ""
+
+#. prepare exception to be thrown if the type could not be determined
+#. due to a media exception. We can't throw right away, because of some
+#. problems with proxy servers returning an incorrect error
+#. on ftp file-not-found(bnc #335906). Instead we'll check another types
+#. before throwing.
+#. TranslatorExplanation '%s' is an URL
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
+#, c-format, boost-format
+msgid "Error trying to read from '%s'"
+msgstr ""
+
+#. TranslatorExplanation '%s' is an URL
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
+#, c-format, boost-format
+msgid "Unknown error reading from '%s'"
+msgstr ""
+
+#: zypp/RepoManager.cc:1685
+#, c-format, boost-format
+msgid "Adding repository '%s'"
+msgstr ""
+
+#. TranslatorExplanation '%s' is an URL
+#: zypp/RepoManager.cc:1773
+#, c-format, boost-format
+msgid "Invalid repo file name at '%s'"
+msgstr ""
+
+#: zypp/RepoManager.cc:1814
+#, c-format, boost-format
+msgid "Removing repository '%s'"
+msgstr ""
+
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
+msgid "Can't figure out where the repo is stored."
+msgstr ""
+
+#. TranslatorExplanation '%s' is a filename
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
+#, c-format, boost-format
+msgid "Can't delete '%s'"
+msgstr ""
+
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
+msgid "Can't figure out where the service is stored."
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:14
+msgid "unknown"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:17
+msgid "unsupported"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:20
+msgid "Level 1"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:23
+msgid "Level 2"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:26
+msgid "Level 3"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:29
+msgid "Additional Customer Contract Necessary"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:31
+msgid "invalid"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:39
+msgid "The level of support is unspecified"
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:42
+msgid "The vendor does not provide support."
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:45
+msgid ""
+"Problem determination, which means technical support designed to provide "
+"compatibility information, installation assistance, usage support, on-going "
+"maintenance and basic troubleshooting. Level 1 Support is not intended to "
+"correct product defect errors."
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:48
+msgid ""
+"Problem isolation, which means technical support designed to duplicate "
+"customer problems, isolate problem area and provide resolution for problems "
+"not resolved by Level 1 Support."
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:51
+msgid ""
+"Problem resolution, which means technical support designed to resolve "
+"complex problems by engaging engineering in resolution of product defects "
+"which have been identified by Level 2 Support."
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:54
+msgid "An additional customer contract is necessary for getting support."
+msgstr ""
+
+#: zypp/VendorSupportOptions.cc:56
+msgid "Unknown support option. Description not available"
+msgstr ""
+
+#: zypp/ZYppFactory.cc:376
+#, c-format, boost-format
+msgid ""
+"System management is locked by the application with pid %d (%s).\n"
+"Close this application before trying again."
+msgstr ""
+
+#: zypp/base/StrMatcher.cc:152
+#, c-format, boost-format
+msgid "Unknown match mode '%s'"
+msgstr ""
+
+#: zypp/base/StrMatcher.cc:153
+#, c-format, boost-format
+msgid "Unknown match mode '%s' for pattern '%s'"
+msgstr ""
+
+#: zypp/base/StrMatcher.cc:157
+#, c-format, boost-format
+msgid "Invalid regular expression '%s': regcomp returned %d"
+msgstr ""
+
+#: zypp/base/StrMatcher.cc:158
+#, c-format, boost-format
+msgid "Invalid regular expression '%s'"
+msgstr ""
+
+#. !\todo add comma to the message for the next release
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
+#, c-format, boost-format
+msgid "Authentication required for '%s'"
+msgstr ""
+
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
+msgid ""
+"Visit the SUSE Customer Center to check whether your registration is valid "
+"and has not expired."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
+msgid ""
+"Visit the Novell Customer Center to check whether your registration is valid "
+"and has not expired."
+msgstr ""
+
+#: zypp/media/MediaHandler.cc:338
+msgid ""
+"Create attach point: Can't find a writable directory to create an attach "
+"point"
+msgstr ""
+
+#: zypp/misc/CheckAccessDeleted.cc:455
+msgid "Please install package 'lsof' first."
+msgstr ""
+
+#: zypp/parser/RepoindexFileReader.cc:197
+#, c-format, boost-format
+msgid "Required attribute '%s' is missing."
+msgstr ""
+
+#: zypp/parser/RepoindexFileReader.cc:209
+#, c-format, boost-format
+msgid "One or both of '%s' or '%s' attributes is required."
+msgstr ""
+
+#: zypp/repo/PackageProvider.cc:331
+msgid "Signature verification failed"
+msgstr ""
+
+#. TranslatorExplanation %s = package being checked for integrity
+#: zypp/repo/PackageProvider.cc:462
+#, c-format, boost-format
+msgid ""
+"Package %s seems to be corrupted during transfer. Do you want to retry "
+"retrieval?"
+msgstr ""
+
+#. TranslatorExplanation %s = name of the package being processed.
+#: zypp/repo/PackageProvider.cc:486
+#, c-format, boost-format
+msgid "Failed to provide Package %s. Do you want to retry retrieval?"
+msgstr ""
+
+#: zypp/repo/PackageProvider.cc:609
+msgid "applydeltarpm check failed."
+msgstr ""
+
+#: zypp/repo/PackageProvider.cc:620
+msgid "applydeltarpm failed."
+msgstr ""
+
+#: zypp/repo/RepoException.cc:129
+msgid "Service plugin does not support changing an attribute."
+msgstr ""
+
+#: zypp/repo/RepoProvideFile.cc:248
+#, c-format, boost-format
+msgid "Can't provide file '%s' from repository '%s'"
+msgstr ""
+
+#: zypp/repo/RepoProvideFile.cc:254
+msgid "No url in repository."
+msgstr ""
+
+#. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
+#, boost-format
+msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
+msgstr ""
+
+#. [lhs][rhs] 0 = installed; 1 = to be installed
+#. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
+#: zypp/sat/FileConflicts.cc:34
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from package\n"
+"     %2%\n"
+"  conflicts with file from package\n"
+"     %3%"
+msgstr ""
+
+#. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
+#: zypp/sat/FileConflicts.cc:40
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from package\n"
+"     %2%\n"
+"  conflicts with file from install of\n"
+"     %3%"
+msgstr ""
+
+#. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
+#: zypp/sat/FileConflicts.cc:47
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from install of\n"
+"     %2%\n"
+"  conflicts with file from package\n"
+"     %3%"
+msgstr ""
+
+#. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
+#: zypp/sat/FileConflicts.cc:53
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from install of\n"
+"     %2%\n"
+"  conflicts with file from install of\n"
+"     %3%"
+msgstr ""
+
+#. [lhs][rhs] 0 = installed; 1 = to be installed
+#. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2)
+#: zypp/sat/FileConflicts.cc:68
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from package\n"
+"     %2%\n"
+"  conflicts with file\n"
+"     %3%\n"
+"  from package\n"
+"     %4%"
+msgstr ""
+
+#. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2)
+#: zypp/sat/FileConflicts.cc:76
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from package\n"
+"     %2%\n"
+"  conflicts with file\n"
+"     %3%\n"
+"  from install of\n"
+"     %4%"
+msgstr ""
+
+#. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2)
+#: zypp/sat/FileConflicts.cc:85
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from install of\n"
+"     %2%\n"
+"  conflicts with file\n"
+"     %3%\n"
+"  from package\n"
+"     %4%"
+msgstr ""
+
+#. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2)
+#: zypp/sat/FileConflicts.cc:93
+#, boost-format
+msgid ""
+"File %1%\n"
+"  from install of\n"
+"     %2%\n"
+"  conflicts with file\n"
+"     %3%\n"
+"  from install of\n"
+"     %4%"
+msgstr ""
+
+#: zypp/sat/detail/PoolImpl.cc:201
+msgid "Can not create sat-pool."
+msgstr ""
+
+#. TranslatorExplanation %s = name of package, patch, selection ...
+#: zypp/solver/detail/ProblemSolutionIgnore.cc:42
+#, c-format, boost-format
+msgid "break %s by ignoring some of its dependencies"
+msgstr ""
+
+#: zypp/solver/detail/ProblemSolutionIgnore.cc:48
+msgid "generally ignore of some dependencies"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1144
+#, boost-format
+msgid ""
+"the installed %1% does not belong to a distupgrade repository and must be "
+"replaced"
+msgstr ""
+
+#. just in case
+#: zypp/solver/detail/SATResolver.cc:1146
+#, boost-format
+msgid "the to be installed %1% does not belong to a distupgrade repository"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1150
+#, boost-format
+msgid "the installed %1% has inferior architecture"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1152
+#, boost-format
+msgid "the to be installed %1% has inferior architecture"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1155
+#, boost-format
+msgid "problem with the installed %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1158
+msgid "conflicting requests"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1161
+msgid "some dependency problem"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1164
+#, boost-format
+msgid "nothing provides the requested '%1%'"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
+msgid "Have you enabled all the required repositories?"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1168
+#, boost-format
+msgid "the requested package %1% does not exist"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1172
+msgid "unsupported request"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1175
+#, boost-format
+msgid "'%1%' is provided by the system and cannot be erased"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1178
+#, boost-format
+msgid "%1% is not installable"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1183
+#, boost-format
+msgid "nothing provides '%1%' needed by the installed %2%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1185
+#, boost-format
+msgid "nothing provides '%1%' needed by the to be installed %2%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1188
+#, boost-format
+msgid "cannot install both %1% and %2%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1193
+#, boost-format
+msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1195
+#, boost-format
+msgid ""
+"the installed %1% conflicts with '%2%' provided by the to be installed %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1199
+#, boost-format
+msgid ""
+"the to be installed %1% conflicts with '%2%' provided by the installed %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1201
+#, boost-format
+msgid ""
+"the to be installed %1% conflicts with '%2%' provided by the to be installed "
+"%3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1208
+#, boost-format
+msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1210
+#, boost-format
+msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1214
+#, boost-format
+msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1216
+#, boost-format
+msgid ""
+"the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1221
+#, boost-format
+msgid "the installed %1% conflicts with '%2%' provided by itself"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1223
+#, boost-format
+msgid "the to be installed %1% conflicts with '%2%' provided by itself"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1255
+#, boost-format
+msgid ""
+"the installed %1% requires '%2%', but this requirement cannot be provided"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1257
+#, boost-format
+msgid ""
+"the to be installed %1% requires '%2%', but this requirement cannot be "
+"provided"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1259
+msgid "deleted providers: "
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1269
+msgid ""
+"\n"
+"not installable providers: "
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1271
+msgid "not installable providers: "
+msgstr ""
+
+#. translator: %1% is the name of a PTF, %2% the name of a patch.
+#: zypp/solver/detail/SATResolver.cc:1308
+#, boost-format
+msgid "%1% is not yet fully integrated into %2%."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1309
+msgid ""
+"Typically you want to keep the PTF and choose to not install the maintenance "
+"patches."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
+#, boost-format
+msgid "The installed %1% blocks the desired action."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1325
+msgid "Typically you want to keep the PTF and choose to cancel the action."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1382
+#, boost-format
+msgid "remove lock to allow removal of %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
+#, boost-format
+msgid "do not install %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
+#, boost-format
+msgid "keep %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1411
+#, boost-format
+msgid "remove lock to allow installation of %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
+msgid "This request will break your system!"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
+msgid "ignore the warning of a broken system"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1468
+#, boost-format
+msgid "do not ask to install a solvable providing %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1490
+#, boost-format
+msgid "do not ask to delete all solvables providing %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1503
+#, boost-format
+msgid "do not install most recent version of %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1524
+#, boost-format
+msgid "keep %1% despite the inferior architecture"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1529
+#, boost-format
+msgid "install %1% despite the inferior architecture"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1538
+#, boost-format
+msgid "keep obsolete %1%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1543
+#, boost-format
+msgid "install %1% from excluded repository"
+msgstr ""
+
+#. translator: %1% is a package name
+#: zypp/solver/detail/SATResolver.cc:1557
+#, boost-format
+msgid "install %1% although it has been retracted"
+msgstr ""
+
+#. translator: %1% is a package name
+#: zypp/solver/detail/SATResolver.cc:1560
+#, boost-format
+msgid "allow installing the PTF %1%"
+msgstr ""
+
+#. translator: %1% is a package name
+#: zypp/solver/detail/SATResolver.cc:1563
+#, boost-format
+msgid "install %1% although it is blacklisted"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1583
+#, boost-format
+msgid "downgrade of %1% to %2%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1590
+#, boost-format
+msgid "architecture change of %1% to %2%"
+msgstr ""
+
+#. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
+#: zypp/solver/detail/SATResolver.cc:1601
+#, boost-format
+msgid ""
+"install %1% (with vendor change)\n"
+"  %2%  -->  %3%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1606
+#, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1615
+#, boost-format
+msgid "replacement of %1% with %2%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1626
+#, boost-format
+msgid "deinstallation of %1%"
+msgstr ""
+
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
+#, boost-format
+msgid "Running %1% script"
+msgstr ""
+
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
+
+#: zypp/target/TargetException.cc:27
+msgid "Installation has been aborted as directed."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:452
+msgid " executed"
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:474
+msgid " execution failed"
+msgstr ""
+
+#. translators: We may find the same script content in files with different names.
+#. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
+#. message for a log file. Preferably start translation with "%s"
+#: zypp/target/TargetImpl.cc:591
+#, c-format, boost-format
+msgid "%s already executed as %s)"
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:601
+msgid " execution skipped while aborting"
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
+msgid "Error sending update message notification."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:800
+msgid "New update message"
+msgstr ""
+
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
+#. TranslatorExplanation after semicolon is error message
+#. TranslatorExplanation the colon is followed by an error message
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
+msgid "RPM failed: "
+msgstr ""
+
+#. Translator: %1% is a gpg public key
+#: zypp/target/rpm/RpmDb.cc:793
+#, boost-format
+msgid "Failed to import public key %1%"
+msgstr ""
+
+#. Translator: %1% is a gpg public key
+#: zypp/target/rpm/RpmDb.cc:860
+#, boost-format
+msgid "Failed to remove public key %1%"
+msgstr ""
+
+#: zypp/target/rpm/RpmDb.cc:1272
+msgid "Package header is not signed!"
+msgstr ""
+
+#: zypp/target/rpm/RpmDb.cc:1274
+msgid "Package payload is not signed!"
+msgstr ""
+
+#. Translator: %s = name of an rpm package. A list of diffs follows
+#. this message.
+#: zypp/target/rpm/RpmDb.cc:1611
+#, c-format, boost-format
+msgid "Changed configuration files for %s:"
+msgstr ""
+
+#. %s = filenames
+#: zypp/target/rpm/RpmDb.cc:1810
+#, c-format, boost-format
+msgid "rpm saved %s as %s, but it was impossible to determine the difference"
+msgstr ""
+
+#. %s = filenames
+#: zypp/target/rpm/RpmDb.cc:1812
+#, c-format, boost-format
+msgid ""
+"rpm saved %s as %s.\n"
+"Here are the first 25 lines of difference:\n"
+msgstr ""
+
+#. %s = filenames
+#: zypp/target/rpm/RpmDb.cc:1815
+#, c-format, boost-format
+msgid "rpm created %s as %s, but it was impossible to determine the difference"
+msgstr ""
+
+#. %s = filenames
+#: zypp/target/rpm/RpmDb.cc:1817
+#, c-format, boost-format
+msgid ""
+"rpm created %s as %s.\n"
+"Here are the first 25 lines of difference:\n"
+msgstr ""
+
+#. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout)
+#. TranslatorExplanation Text is followed by a ':'  and the actual output.
+#. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
+#. TranslatorExplanation Text is followed by a ':'  and the actual output.
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
+msgid "Additional rpm output"
+msgstr ""
+
+#: zypp/target/rpm/RpmDb.cc:2212
+#, c-format, boost-format
+msgid "created backup %s"
+msgstr ""
+
+#. translators: possible rpm package signature check result [brief]
+#: zypp/target/rpm/RpmDb.cc:2233
+msgid "Signature is OK"
+msgstr ""
+
+#. translators: possible rpm package signature check result [brief]
+#: zypp/target/rpm/RpmDb.cc:2235
+msgid "Unknown type of signature"
+msgstr ""
+
+#. translators: possible rpm package signature check result [brief]
+#: zypp/target/rpm/RpmDb.cc:2237
+msgid "Signature does not verify"
+msgstr ""
+
+#. translators: possible rpm package signature check result [brief]
+#: zypp/target/rpm/RpmDb.cc:2239
+msgid "Signature is OK, but key is not trusted"
+msgstr ""
+
+#. translators: possible rpm package signature check result [brief]
+#: zypp/target/rpm/RpmDb.cc:2241
+msgid "Signatures public key is not available"
+msgstr ""
+
+#. translators: possible rpm package signature check result [brief]
+#: zypp/target/rpm/RpmDb.cc:2243
+msgid "File does not exist or signature can't be checked"
+msgstr ""
+
+#. translators: possible rpm package signature check result [brief]
+#: zypp/target/rpm/RpmDb.cc:2245
+msgid "File is unsigned"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr ""
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#: zypp-core/base/Exception.cc:150
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
+#, c-format, boost-format
+msgid "Url scheme does not allow a %s"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:239
+#, c-format, boost-format
+msgid "Invalid %s component '%s'"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:246
+#, c-format, boost-format
+msgid "Invalid %s component"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
+msgid "Query string parsing not supported for this URL"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:901
+msgid "Url scheme is a required component"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:907
+#, c-format, boost-format
+msgid "Invalid Url scheme '%s'"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1026
+msgid "Url scheme does not allow a username"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1060
+msgid "Url scheme does not allow a password"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1089
+msgid "Url scheme requires a host component"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1099
+msgid "Url scheme does not allow a host component"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1126
+#, c-format, boost-format
+msgid "Invalid host component '%s'"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1147
+msgid "Url scheme does not allow a port"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1158
+#, c-format, boost-format
+msgid "Invalid port component '%s'"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1175
+msgid "Url scheme requires path name"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
+msgid "Relative path not allowed if authority exists"
+msgstr ""
+
+#: zypp-core/url/UrlUtils.cc:111
+msgid "Encoded string contains a NUL byte"
+msgstr ""
+
+#: zypp-core/url/UrlUtils.cc:173
+msgid "Invalid parameter array split separator character"
+msgstr ""
+
+#: zypp-core/url/UrlUtils.cc:213
+msgid "Invalid parameter map split separator character"
+msgstr ""
+
+#: zypp-core/url/UrlUtils.cc:283
+msgid "Invalid parameter array join separator character"
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
+#, c-format, boost-format
+msgid "Command exited with status %d."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:33
+#, c-format, boost-format
+msgid "Failed to mount %s on %s"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:43
+#, c-format, boost-format
+msgid "Failed to unmount %s"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:48
+#, c-format, boost-format
+msgid "Bad file name: %s"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:53
+#, c-format, boost-format
+msgid "Medium not opened when trying to perform action '%s'."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:58
+#: zypp-curl/ng/network/networkrequesterror.cc:138
+#, c-format, boost-format
+msgid "File '%s' not found on medium '%s'"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:63
+#, c-format, boost-format
+msgid "Cannot write file '%s'."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:68
+msgid "Medium not attached"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:73
+msgid "Bad media attach point"
+msgstr ""
+
+#. TranslatorExplanation: curl is the name of a library, don't translate
+#: zypp-media/mediaexception.cc:79
+#, c-format, boost-format
+msgid "Download (curl) initialization failed for '%s'"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:84
+#, c-format, boost-format
+msgid "System exception '%s' on medium '%s'."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:89
+#, c-format, boost-format
+msgid "Path '%s' on medium '%s' is not a file."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:94
+#, c-format, boost-format
+msgid "Path '%s' on medium '%s' is not a directory."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:101
+msgid "Malformed URI"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:111
+msgid "Empty host name in URI"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:116
+msgid "Empty filesystem in URI"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:121
+msgid "Empty destination in URI"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:126
+#, c-format, boost-format
+msgid "Unsupported URI scheme in '%s'."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:131
+msgid "Operation not supported by medium"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:138
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+"Error message: %s\n"
+msgstr ""
+
+#. TranslatorExplanation: curl is the name of a library, don't translate
+#: zypp-media/mediaexception.cc:146
+#, c-format, boost-format
+msgid "Error occurred while setting download (curl) options for '%s':"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:153
+#, c-format, boost-format
+msgid "Media source '%s' does not contain the desired medium"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:158
+#, c-format, boost-format
+msgid "Medium '%s' is in use by another instance"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:164
+msgid "Cannot eject any media"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:166
+#, c-format, boost-format
+msgid "Cannot eject media '%s'"
+msgstr ""
+
+#: zypp-media/mediaexception.cc:181
+#, c-format, boost-format
+msgid "Permission to access '%s' denied."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:189
+#: zypp-curl/ng/network/networkrequesterror.cc:122
+#, c-format, boost-format
+msgid "Timeout exceeded when accessing '%s'."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:197
+#, c-format, boost-format
+msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:205
+#: zypp-curl/ng/network/networkrequesterror.cc:118
+#, c-format, boost-format
+msgid "Location '%s' is temporarily unaccessible."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:213
+#, c-format, boost-format
+msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
+msgstr ""
+
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
+#: zypp-curl/auth/curlauthdata.cc:97
+#, c-format, boost-format
+msgid "Unsupported HTTP authentication method '%s'"
+msgstr ""
+
+#: zypp-curl/ng/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp-curl/ng/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Sí"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Non"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "fecho"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "fallu"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Alvertencia: "
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Fallu"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "¿Siguir?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Alvertencia: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Recibiendo:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "aniciando"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Nun s'alcontró"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "nun hai ayuda disponible pa esta opción"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "amosar toles opciones"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "sí"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "non"
index 2a24eb7..c9da87c 100644 (file)
--- a/po/be.po
+++ b/po/be.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2006-01-04 08:58+0100\n"
 "Last-Translator: Alexander Nyakhaychyk <nyakhaychyk@gmail.com>\n"
 "Language-Team: Belarusian <i18n@suse.de>\n"
@@ -3802,52 +3802,52 @@ msgstr[2] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3855,44 +3855,44 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Дадаць уключаныя сховішчы"
@@ -3903,44 +3903,44 @@ msgstr "Дадаць уключаныя сховішчы"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Невядомая опцыя для каманды '%1': %2"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Даданне ўключаных сховішчаў..."
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Выдаленне непатрэбных сховішчаў..."
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4010,7 +4010,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4038,25 +4038,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Памылковае значэнне для опцыі '%1': %2"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4116,7 +4126,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4233,7 +4243,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4241,393 +4251,426 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Змяніць канфігурацыю IrDA"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4635,13 +4678,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4652,47 +4695,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4819,72 +4862,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5034,6 +5077,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5053,6 +5100,96 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Так"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Не"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "Інданэзія"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Памылка"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Заўвага:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Папярэджванне:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Памылка:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Працягнуць?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Папярэджванне"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:422
+#, fuzzy
+msgid "No help available for this prompt."
+msgstr "Даведка не даступна"
+
+#: zypp-tui/output/OutNormal.cc:439
+#, fuzzy
+msgid "no help available for this option"
+msgstr "Даведка не даступна"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "да"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "не"
+
 #, fuzzy
 #~ msgid "Have you enabled all requested repositories?"
 #~ msgstr "Выдаліць непатрэбныя сховішчы"
index cf11531..f531985 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.bg\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2017-10-23 11:43+0000\n"
 "Last-Translator: Dimitar Zahariev <mitko@tuionui.com>\n"
 "Language-Team: Bulgarian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -3955,52 +3955,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Неуспешно зареждане на модула \"%s\"."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Файлът не може да бъде отворен за запис."
@@ -4008,43 +4008,43 @@ msgstr "Файлът не може да бъде отворен за запис.
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Не може да се създаде %s: %m\n"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Достъпът до носителя за обновяване на драйверите е неуспешен."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4054,44 +4054,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Грешка при четенето от дискетата."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "невалидно име на услуга '%1'."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "%s не може да бъде инсталиран"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4161,7 +4161,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4189,25 +4189,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "невалидно име на услуга '%1'."
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4269,7 +4279,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4388,7 +4398,7 @@ msgstr "Пренебрегване на това изискване само т
 msgid "generally ignore of some dependencies"
 msgstr "Пренебрегване на това изискване само тук"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4396,327 +4406,352 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "%s не може да бъде инсталиран поради пробем със зависимостите"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Никой не доставя %s"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Няма инсталируеми доставчици на %s"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Няма инсталируеми доставчици на %s"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "Настройването чрез %s бе неуспешно."
@@ -4724,72 +4759,80 @@ msgstr "Настройването чрез %s бе неуспешно."
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "пропадна."
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Променени файлове с настройки за %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm запази %s като %s, но е невъзможно да се открие разликата"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4799,13 +4842,13 @@ msgstr ""
 "Ето първите 25 реда от разликите:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm създаде %s като %s, но е невъзможно да се открие разликата"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4818,51 +4861,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Допълнителен изход от rpm:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "създадено резервно копие %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "KScreensaver не е открит."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "KScreensaver не е открит."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "KScreensaver не е открит."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4991,73 +5034,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Команда за изпълнение при свързване"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Възникнала е грешка при отварянето на %s: %m"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5207,6 +5250,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5226,6 +5273,100 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Да"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Не"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "Индонезия"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Грешка"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Предупреждение"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Грешка"
+
+#: zypp-tui/output/Out.h:56
+#, fuzzy
+msgid "Continue?"
+msgstr "Продължаване"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Предупреждение"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Стартиране..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "не работи"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "да"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "не"
+
 #, fuzzy
 #~ msgid "Package is not signed!"
 #~ msgstr "Пакетът има невалидна сигнатура."
index 2b3dea8..38ced37 100644 (file)
--- a/po/bn.po
+++ b/po/bn.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: @PACKAGE@\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2005-07-29 15:37+0530\n"
 "Last-Translator: Priyavert Sharma<priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions <linux_team@agreeya.com>\n"
@@ -3709,52 +3709,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "লেখার জন্যে ফাইল খুলতে পারে না।"
@@ -3762,44 +3762,44 @@ msgstr "লেখার জন্যে ফাইল খুলতে পার
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "'%s' ডেস্কটপ বস্তু খুলতে পারে না"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "ডায়রেক্টরি %1: %2 তৈরী করা যাচ্ছে না"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3809,44 +3809,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ফ্লপি ডিস্ক থেকে পড়ায় ত্রুটি।"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "রপ্তানি ফাইলনাম অবৈধ৷"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "সংস্থান পুনঃস্থাপন করছে"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' ডেস্কটপ বস্তু খুলতে পারে না"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3916,7 +3916,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3944,25 +3944,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "অবৈধ Url যোজনা %s"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, fuzzy, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "সত্যতা যাচাইয়ের ধরন"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4029,7 +4039,7 @@ msgid "No url in repository."
 msgstr "রিপোসিটারিতে ফাইল %1 পাওয়া যায়নি"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4148,7 +4158,7 @@ msgstr "কিছু অমীমাংসিত আবশ্যকতা আছ
 msgid "generally ignore of some dependencies"
 msgstr "কিছু অমীমাংসিত আবশ্যকতা আছে..."
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4156,329 +4166,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "এর সাথে সংযোগের অনুরোধ: "
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "নির্ভরতা সমস্যাগুলির কারণে %s স্থাপন করতে পারে না"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "কোনওটাই %s প্রদান করে না"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "ইতিমধ্যে এই অনুরোধ করা হয়ে গিয়েছে"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "নির্দেশমত স্থাপনা বাতিল করা হয়েছে।"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "সম্পাদন করুন"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4486,73 +4521,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "কী এনক্রিপশনে ত্রুটি"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "ব্যর্থ"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr " %s-এর জন্য পরিবর্তিত কনফিগারেশন ফাইলসমূহ :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm %s কে %sরূপে সংরক্ষণ করেছিল ,কিন্তু পার্থক্য নিরূপণ করা অসম্ভব হয়েছিল "
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4562,13 +4605,13 @@ msgstr ""
 "এখানে পার্থক্যের প্রথম ২৫ টি লাইন দেওয়া আছে:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm %s কে %sরূপে সংরক্ষণ করেছিল ,কিন্তু পার্থক্য নিরূপণ করা  অসম্ভব হয়েছিল "
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4581,51 +4624,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "অতিরিক্ত তথ্য"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s ব্যাকআপ তৈরী করছে"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "এন্ট্রি পাওয়া যায়নি"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "এন্ট্রি পাওয়া যায়নি"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "এন্ট্রি পাওয়া যায়নি"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4752,73 +4795,73 @@ msgstr "অবৈধ প্যারামিটার ম্যাপ স্প
 msgid "Invalid parameter array join separator character"
 msgstr "অবৈধ প্যারামিটার এরে জয়েন সেপারেটর ক্যারেক্টার"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "সংযোগ সাধনের সময়ে আদেশ সম্পন্ন হয়েছে"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "%s খুঁজে পায় না।"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "%s খুঁজে পায় না।"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4969,6 +5012,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4988,6 +5035,96 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "হ্যাঁ"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "না"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "ইন্দোনেশিয়া"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "ভুল"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "পূর্বাভাস"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "ত্রুটি"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "এগিয়ে যাবেন?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "পূর্বাভাস"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "স্টর্টিং..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "পাওয়া যায় নি"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "হ্যাঁ"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "না"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।"
index 13f8ebc..c6779cf 100644 (file)
--- a/po/bs.po
+++ b/po/bs.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2002-07-23 18:27+0200\n"
 "Last-Translator: Damir Bjelobradic <Nagual@lugbih.org>\n"
 "Language-Team: Bosnian <i18n@suse.de>\n"
@@ -4212,52 +4212,52 @@ msgstr[2] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4265,44 +4265,44 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ne mogu pokrenuti naredbu \"%s\""
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4312,44 +4312,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ne mogu pokrenuti naredbu \"%s\""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4420,7 +4420,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4448,25 +4448,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4528,7 +4538,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4645,7 +4655,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4653,324 +4663,349 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "&Nemoj instalirati"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "%s podešavanje nije uspjelo."
@@ -4978,71 +5013,79 @@ msgstr "%s podešavanje nije uspjelo."
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Editor konfiguracijskih datoteka"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5050,13 +5093,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5067,48 +5110,48 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "&Dodatne informacije za korisnika"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -5235,73 +5278,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Naredba koja se izvršava pri spajanju"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Couldn't open file: %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5451,6 +5494,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5470,6 +5517,98 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Da"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ne"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "Indonesija"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Greška"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Greška"
+
+#: zypp-tui/output/Out.h:56
+#, fuzzy
+msgid "Continue?"
+msgstr "Nastavi"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Postavke"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Novi moduli nisu pronađeni."
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+#, fuzzy
+msgid "yes"
+msgstr "Da"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
 #, fuzzy
 #~ msgid "%s is not installable"
 #~ msgstr "Nova instalacija"
index 59caa06..7ecbbc0 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-14 22:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-09-21 16:15+0000\n"
 "Last-Translator: David Medina <medipas@gmail.com>\n"
 "Language-Team: Catalan <https://l10n.opensuse.org/projects/libzypp/master/ca/"
 ">\n"
@@ -4107,52 +4107,52 @@ msgstr[1] "(caduca d'aquí a %d dies)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Cercant la clau gpg amb l'ID %1% a la cau %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Cercant la clau gpg amb l'ID %1% al repositori %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "El repositori %1% no defineix URL \"gpgkey=\" addicionals."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "No es pot llegir el directori del repositori %1%: permís denegat"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Error a l'hora de llegir el directori %s"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "No es pot llegir el fitxer de repositori %1%: permís denegat"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "L'àlies del repositori no pot començar amb un punt."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "L'àlies del servei no pot començar amb un punt."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "No es pot obrir el fitxer %s per a l'escriptura."
@@ -4160,44 +4160,44 @@ msgstr "No es pot obrir el fitxer %s per a l'escriptura."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Servei desconegut \"%1%\": suprimint el repositori de serveis orfe %2%"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "No s'han trobat metadades vàlides a l'URL especificat"
 msgstr[1] "No s'han trobat metadades vàlides als URL especificats"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "No es pot crear %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "No es pot crear el directori cau de metadades."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construint la memòria cau del repositori %s"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "No es pot crear la memòria cau a %s - no se'n té permisos d'escriptura."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Error a l'hora de carregar el repositori (%d) a la memòria cau."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Tipus de repositori no manejat"
 
@@ -4207,44 +4207,44 @@ msgstr "Tipus de repositori no manejat"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Error en intentar llegir de '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Error desconegut a l'hora de llegir '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Afegint el repositori %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nom de repositori no vàlid a \"%s\""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Suprimint el repositori %s"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "No es pot esbrinar on es desa el repositori."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "No es pot esborrar %s"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "No s'ha sabut trobar on es guarda el servei."
 
@@ -4324,7 +4324,7 @@ msgstr "Un contracte addicional de client és necessari per obtenir-ne suport."
 msgid "Unknown support option. Description not available"
 msgstr "Opció de suport desconeguda. No n'hi ha descripció disponible."
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4354,13 +4354,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expressió regular no vàlida: \"%s\""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Cal autenticació per a '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Es tornarà a intentar..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Es deixarà estar després de %1% intents."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4368,7 +4378,7 @@ msgstr ""
 "Visiteu el Centre de clientela de SUSE per comprovar si el vostre registre "
 "és vàlid i no ha caducat."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4376,7 +4386,7 @@ msgstr ""
 "Visiteu el Novell Customer Center per comprovar si el vostre registre encara "
 "és vàlid i no ha caducat."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4440,7 +4450,7 @@ msgid "No url in repository."
 msgstr "No URL al repositori."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4606,7 +4616,7 @@ msgstr "trenca %s ignorant-ne algunes de les dependències"
 msgid "generally ignore of some dependencies"
 msgstr "ignora generalment algunes dependències"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4616,87 +4626,87 @@ msgstr ""
 "distribució i s'ha de reemplaçar"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "el %1% per instal·lar no pertany a un repositori d'actualització de la "
 "distribució"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "el %1% instal·lat té una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "el %1% per instal·lar té una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema amb el %1% instal·lat"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "demandes conflictives"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "problemes de dependències"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "no hi ha res que proporcioni el %1% requerit"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Heu habilitat tots els repositoris requerits?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "el paquet requerit %1% no existeix"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "petició no suportada"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "%1% és proporcionat pel sistema i no es pot esborrar"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% no és instal·lable"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "no hi ha res que proporcioni %1%, necessari per al %2% instal·lat"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "no hi ha res que proporcioni %1%, necessari per al %2% per instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "no es poden instal·lar tots dos: %1% i %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "el %1% instal·lat té conflicte amb %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4704,14 +4714,14 @@ msgstr ""
 "el %1% instal·lat té conflicte amb el %2%, proporcionat per %3% per "
 "instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "el %1% per instal·lar té conflicte amb %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4720,47 +4730,47 @@ msgstr ""
 "el %1% per instal·lar té conflicte amb el %2%, proporcionat per %3% per "
 "instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "el %1% instal·lat fa obsolet %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "el %1% instal·lat fa obsolet %2%, proporcionat per %3% per instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "el %1% per instal·lar fa obsolet %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "el %1% per instal·lar fa obsolet %2%, proporcionat per %3% per instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "el %1% instal·lat té conflicte amb %2%, proporcionat per si mateix"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "el %1% per instal·lar té conflicte amb %2%, proporcionat per si mateix"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "el %1% instal·lat requereix %2%, però aquest requisit no es pot proporcionar"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4769,11 +4779,11 @@ msgstr ""
 "el %1% per instal·lar requereix %2%, però aquest requisit no es pot "
 "proporcionar"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "proveïdors suprimits: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4781,17 +4791,17 @@ msgstr ""
 "\n"
 "proveïdors no desistal·lables: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "proveïdors no desinstal·lables: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% encara no s'ha integrat plenament a %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4800,112 +4810,135 @@ msgstr ""
 "instal·lar els pedaços de manteniment."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"La supressió del PTF %1% instal·lat en aquest context també suprimirà (no "
+"substituirà!) els paquets PTF inclosos."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"El PTF s'hauria de suprimir cridant %1%. Això actualitzarà els paquets PTF "
+"inclosos en lloc de suprimir-los."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "Normalment, voleu mantenir el PTF o opteu per cancel·lar l'acció."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "El %1% instal·lat bloqueja l'acció desitjada."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Normalment, voleu mantenir el PTF i opteu per cancel·lar l'acció."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "suprimeix el bloqueig per permetre la supressió de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "no instal·lis %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "mantén %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "suprimeix el bloqueig per permetre la instal·lació de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Aquesta petició trencarà l'estabilitat del sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignora l'avís de sistema trencat"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "no preguntis la instal·lació d'un resoluble que proporcioni %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "no preguntis la supressió de tots els resolubles que proporcionin %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "no instal·lis la versió més recent de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantén %1% malgrat l'arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instal·la %1% malgrat l'arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantén obsolet %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "instal·la %1% des d'un repositori exclòs"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instal·la %1% tot i que ha estat retret"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "permet instal·lar el PTF (format de text net) %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instal·la %1% tot i que és a la llista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "degradació de %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "canvi d'arquitectura de %1% a %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4914,7 +4947,7 @@ msgstr ""
 "instal·la %1% (amb canvi de proveïdor)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4923,102 +4956,118 @@ msgstr ""
 "instal·la %1% del proveïdor %2%\n"
 "  i reemplaça %3% del proveïdor %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "reemplaçament de %1% per %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "desinstal·lació de %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "Executant scripts posteriors a la transacció"
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Executant l'script %%posttrans \"%1%\""
+msgid "Running %1% script"
+msgstr "Executant l'script %1%"
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Executant scripts %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "Sortida de l'script %1%:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "La instal·lació s'ha avortat tal com heu indicat."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " executat"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " ha fallat l'execució"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s ja s'ha executat com a %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " execució omesa mentre s'avortava"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 "S'ha produït un error durant l'enviament de la notificació d'actualització."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nou missatge d'actualització"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"Senyal rebut: \"%1% (%2%)\", per garantir la coherència del sistema, no és "
+"possible cancel·lar una transacció rpm en execució."
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "No s'ha pogut executar la transacció a causa dels problemes següents:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Ha fallat l'RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Error a l'hora d'importar la clau pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Ha fallat suprimir la clau pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "La capçalera del paquet no està signada!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "El contingut del paquet no està signat!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Fitxers de configuració modificats per a %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5026,7 +5075,7 @@ msgstr ""
 "diferència"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5036,7 +5085,7 @@ msgstr ""
 "Aquestes són les primeres 25 línies de diferència:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5044,7 +5093,7 @@ msgstr ""
 "diferència"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5057,47 +5106,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Sortida addicional de l'rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "còpia de seguretat creada %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "La signatura és correcta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tipus de signatura desconeguda"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "La signatura no es verifica"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "La signatura és correcta, però no és de confiança"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "La clau pública de signatures no està disponible"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "El fitxer no existeix o la signatura no es pot comprovar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "El fitxer no està signat."
 
@@ -5225,72 +5274,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr "El caràcter separador d'unió de matriu de paràmetres no és vàlid"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "L'ordre ha acabat amb l'estatus %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "L'ordre s'ha aturat a causa del senyal %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "L'ordre s'ha executat sense que hi hagués cap error conegut."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "S'han donat arguments de generació no vàlids."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "No es pot crear la canonada de control."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "No es pot fer chroot a \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "No es pot fer chdir a \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "No es pot fer chdir a \"%s\" dins chroot \"%s\" (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "No es pot executar \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "No es pot bifurcar (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "No es pot executar %s, ha fallat l'ordre chdir (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "No es pot executar %s, ha fallat l'ordre chroot (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "No es pot executar %s, ha fallat l'ordre exec (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "No es pot executar %s, error inesperat."
@@ -5447,6 +5496,10 @@ msgstr ""
 " Problema de certificat SSL, verifiqueu que el certificat CA és correcte per "
 "a \"%s\"."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "No hi ha recursos lliures disponibles per adjuntar el mitjà."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5470,6 +5523,101 @@ msgstr ""
 "Error de baixada (curl) per a %s.\n"
 "No es pot obtenir la resposta d'HTTP.\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Sí"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "No"
+
+# ID
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "fet"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "atenció"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "error"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Atenció!"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Avís!"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Error:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Continuo?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Avís! "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Obtenint"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "començant"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "no trobat"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "No hi ha ajuda per a aquesta entrada."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "no hi ha ajuda disponible per a aquesta opció"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "mostra totes les opcions"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "sí"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "no"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Executant l'script %%posttrans \"%1%\""
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Executant scripts %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "El paquet no està signat!"
 
index f441017..539ea09 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -19,8 +19,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-04-06 23:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-09-21 16:15+0000\n"
 "Last-Translator: Aleš Kastner <alkas@volny.cz>\n"
 "Language-Team: Czech <https://l10n.opensuse.org/projects/libzypp/master/cs/>"
 "\n"
@@ -3929,52 +3929,52 @@ msgstr[2] "(vyprší během %d dnů)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Hledám ID klíče gpg %1% v paměti %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Hledám ID klíče gpg %1% v úložišti %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Úložiště %1% nedefinuje přídavná URL 'gpgkey='."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nelze číst z adresáře úložiště %1%: Přístup odepřen"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Chyba při čtení z adresáře %s"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nelze přečíst soubor úložiště %1%: Přístup odepřen"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Alias úložiště nemůže začínat tečkou."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Alias služby nemůže začínat tečkou."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nelze otevřít soubor '%s' pro zápis."
@@ -3982,44 +3982,44 @@ msgstr "Nelze otevřít soubor '%s' pro zápis."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Neznámá služba '%1%': Odstraňuje se osiřelé úložiště služby '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Na zadané adrese URL nebyla nalezena platná metadata"
 msgstr[1] "Na zadaných adresách URL nebyla nalezena platná metadata"
 msgstr[2] "Na zadaných adresách URL nebyla nalezena platná metadata"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nelze vytvořit %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Nelze vytvořit adresář s mezipamětí metadat."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Vytváří se vyrovnávací paměť úložiště '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
-msgstr "Nelze vytvořit mezipaměť v adresáři %s - chybí oprávnění k zápisu."
+msgstr "Nelze vytvořit mezipaměť v %s - chybí oprávnění k zápisu."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Chyba při načítání úložiště do mezipaměti (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Nepodporovaný typ úložiště"
 
@@ -4029,44 +4029,44 @@ msgstr "Nepodporovaný typ úložiště"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Chyba při čtení z '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Neznámá chyba při čtení z '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Přidává se úložiště %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Název souboru úložiště na adrese URL „%s“ je neplatný"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Odebírá se úložiště %s"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Nelze zjistit umístění úložiště."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' nelze smazat"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Nelze zjistit umístění služby."
 
@@ -4145,7 +4145,7 @@ msgstr "Získání podpory vyžaduje další smlouvu se zákazníkem."
 msgid "Unknown support option. Description not available"
 msgstr "Neznámá volba podpory. Popis není dostupný"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4175,13 +4175,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Neplatný regulární výraz: '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Pro '%s' je vyžadováno ověřování"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Zkusím to znovu..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Vzdávám se po %1% pokusech."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4189,7 +4199,7 @@ msgstr ""
 "Pro kontrolu, zda je Vaše registrace platná a aktivní, navštivte Zákaznické "
 "centrum SUSE."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4197,7 +4207,7 @@ msgstr ""
 "Obraťte se na zákaznické centrum společnosti Novell a zkontrolujte, zda je "
 "vaše registrace platná a zda nevypršela."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4259,7 +4269,7 @@ msgid "No url in repository."
 msgstr "Adresa URL nebyla nalezena v repozitáři."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Očekáváno médium %1%/%2% identifikované podle souboru '%3%' s obsahem:"
@@ -4424,7 +4434,7 @@ msgstr "porušit %s ignorováním některých z jeho závislostí"
 msgid "generally ignore of some dependencies"
 msgstr "obecně ignorovat některé závislosti"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4434,91 +4444,91 @@ msgstr ""
 "nahrazeno"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "instalovaný %1% nepochází z distribučního úložiště"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "nainstalované %1% má starší architekturu"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1% k instalaci má starší architekturu"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problém s instalovaným %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "protichůdné požadavky"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "nějaký problém se závislostmi"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nikdo neposkytuje požadované '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Povolili jste všechna požadovaná úložiště?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "požadovaný balíček %1% neexistuje"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "nepodporovaný požadavek"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' poskytuje systém a nelze jej vymazat"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% není instalovatelný"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nikdo neposkytuje '%1%' potřebné nainstalovaným %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "nikdo neposkytuje '%1%' potřebné k instalaci %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "nelze nainstalovat %1% i %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "nainstalovaný %1% je v konfliktu s '%2%' poskytnutým nainstalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "nainstalovaný %1% je v konfliktu s '%2%' potřebným k instalaci %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4526,7 +4536,7 @@ msgstr ""
 "%1%, který se má instalovat, je v konfliktu s '%2%' poskytnutým "
 "nainstalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4534,23 +4544,23 @@ msgid ""
 msgstr ""
 "má se instalovat %1%, ale je v konfliktu s '%2%' poskytnutým %3% k instalaci"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "nainstalované %1% zastarává '%2%' poskytované nainstalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "nainstalované %1% zastarává '%2%' poskytované %3%, jež se má instalovat"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "má se instalovat %1% jež zastarává '%2%' poskytované instalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4558,23 +4568,23 @@ msgstr ""
 "Má se instalovat %1%, jež zastarává '%2%' poskytované %3%, jež se má "
 "instalovat"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "nainstalované %1% je v konfliktu s '%2%' poskytnutým samo sebou"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "má se instalovat %1%, ale je v konfliktu s '%2%' poskytnutým jím samým"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr "nainstalované %1% vyžaduje '%2%', ale tento požadavek nelze splnit"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4582,11 +4592,11 @@ msgid ""
 msgstr ""
 "má se instalovat %1% vyžadující '%2%', ale tento požadavek nelze splnit"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "odstranění poskytovatelé: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4594,17 +4604,17 @@ msgstr ""
 "\n"
 "neinstalovatelní poskytovatelé: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "neinstalovatelní poskytovatelé: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% ještě není plně zaintegrován do %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4613,112 +4623,135 @@ msgstr ""
 "záplaty."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"Odstranění nainstalovaného %1% v tomto kontextu odstraní (nikoli nahradí!) "
+"také obsažené balíčky PTF."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"Tímto se obsažené balíčky PTF aktualizují a neodstraní. PTF by měly být "
+"odstraněny voláním '%1%'."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "Obvykle chcete PTF ponechat nebo se rozhodnete akci zrušit."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "Nainstalovaný %1% blokuje vyžadovanou akci."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Obvykle budete chtít ponechat PTF a vybrat zrušení této akce."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "odstraňte zámek, aby šlo odebrat %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "neinstalujte %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "ponechte %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "odstraňte zámek a tím povolte instalaci %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Tento požadavek poškodí váš systém!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorovat varování poškozeného systému"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "nežádejte instalaci řešení poskytující %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "nepožadovat smazání všech řešitelných problémů poskytujících% 1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "neinstalujte nejnovější verzi %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "ponechte %1% navzdory starší architektuře"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instalujte %1% navzdory starší architektuře"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "zachovejte zastaralou %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "nainstalujte %1% z vyloučeného úložiště"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instalovat %1%, ačkoli byl odvolán"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "umožnit instalaci PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instalovat %1%, ačkoli je na indexu"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "downgrade z %1% na %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "změna architektury %1% na %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4727,7 +4760,7 @@ msgstr ""
 "nainstalovat %1% (se změnou dodavatele)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4736,107 +4769,123 @@ msgstr ""
 "instalovat %1% od dodavatele %2%\n"
 "  nahradit %3% od dodavatele %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "náhrada %1% %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "odinstalace %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "Spuštění skriptů po transakci"
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Běží skript %%posttrans '%1%'"
+msgid "Running %1% script"
+msgstr "Spuštění skriptu %1%"
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Běží skripty %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "Výstup skriptu %1%:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Instalace byla zrušena podle příkazu."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " provedeno"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " provádění selhalo"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s je již prováděn jako %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " provádění přeskočeno během ukončování"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Chyba při odesílání oznámení o aktualizaci."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nová zpráva o aktualizaci"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"Přijat signál: \"%1% (%2%)\" - kvůli konzistenci systému nelze zrušit "
+"probíhající transakci RPM."
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "Provedení transakce se nezdařilo kvůli následujícím problémům:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM selhalo: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nepodařilo se importovat veřejný klíč %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Nepodařilo se smazat veřejný klíč %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "Hlavička balíčku není podepsaná!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "Obsah balíčku není podepsán!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Změněné konfigurační soubory pro %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "Program rpm uložil %s jako %s, ale nebylo možné zjistit rozdíl"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4846,13 +4895,13 @@ msgstr ""
 "Prvních 25 řádek rozdílů:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "Program rpm vytvořil %s jako %s, ale nebylo možné zjistit rozdíl"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4865,47 +4914,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Další výstup programu rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "vytvořena záloha %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Podpis je v pořádku"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Neznámý typ podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Podpis nelze ověřit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Podpis je v pořádku, ale klíč není důvěryhodný"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Veřejný klíč podpisu není k dispozici"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Soubor neexistuje nebo podpis nemůže být zkontrolován"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Soubor není podepsaný"
 
@@ -5032,40 +5081,40 @@ msgstr "Neplatný oddělovací znak mapy parametrů"
 msgid "Invalid parameter array join separator character"
 msgstr "Neplatný oddělovací znak spojení pole parametrů"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Příkaz skončil se stavem %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Příkaz byl ukončen signálem %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Příkaz skončil s neznámou chybou."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Zadány neplatné argumenty spawn."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Nelze vytvořit řídicí kanál."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Nelze změnit kořenový adresář na '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Nelze změnit adresář na '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
@@ -5073,33 +5122,33 @@ msgstr ""
 "'%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Nelze spustit '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Nelze forknout (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Nelze spustit '%s', chyba chdir (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Nelze spustit '%s', chyba chroot (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Nelze spustit '%s', chyba exec (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Nelze spustit '%s', neočekávaná chyba."
@@ -5254,6 +5303,10 @@ msgstr ""
 " Problém s SSL certifikátem, ověřte, že je certifikát certifikační autority "
 "pro '%s' v pořádku."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Pro připojení média nejsou k dispozici žádné volné zdroje."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5277,6 +5330,100 @@ msgstr ""
 "Chyba stahování (curl) pro '%s':\n"
 "Nelze načíst odpověď HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ano"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ne"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "dokončeno"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "upozornění"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "chyba"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Poznámka:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Pozor:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Chyba:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Pokračovat?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Upozornění: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Získávám:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "startuji"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "nenalezeno"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "K této výzvě není k dispozici žádná nápověda."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "k této volbě není k dispozici žádná nápověda"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "zobrazí všechny volby"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ano"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ne"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Běží skript %%posttrans '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Běží skripty %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Balíček není podepsaný!"
 
index 5252fcb..3d2bd45 100644 (file)
--- a/po/cy.po
+++ b/po/cy.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2003-09-23 10:33+0200\n"
 "Last-Translator: Kevin Donnelly <kevin@dotmon.com>\n"
 "Language-Team: Welsh <i18n@suse.de>\n"
@@ -4014,52 +4014,52 @@ msgstr[4] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4067,13 +4067,13 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
@@ -4082,31 +4082,31 @@ msgstr[2] ""
 msgstr[3] ""
 msgstr[4] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Arsefydlu %s: \"%s\""
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4116,44 +4116,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Arsefydlu %s: \"%s\""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4224,7 +4224,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4252,25 +4252,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4331,7 +4341,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4448,7 +4458,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4456,323 +4466,348 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Arsefydlu"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4780,71 +4815,79 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Copïo ffeiliau ffurfweddu i'r cysawd a osodwyd"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4852,13 +4895,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4869,47 +4912,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -5036,73 +5079,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Y gorchymyn a weithredir wrth gysylltu"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Couldn't open file: %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5252,6 +5295,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5271,6 +5318,95 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ie"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nage"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Gwall"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Gwall"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "heb gysylltu"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+#, fuzzy
+msgid "yes"
+msgstr "Ie"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
 #, fuzzy
 #~ msgid "Package is not signed!"
 #~ msgstr "Mae llofnod annilys gan yr RPM."
index 414be63..09c0e0b 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libzypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2019-12-06 11:54+0000\n"
 "Last-Translator: scootergrisen <scootergrisen@gmail.com>\n"
 "Language-Team: Danish <https://l10n.opensuse.org/projects/libzypp/master/da/"
@@ -3705,52 +3705,52 @@ msgstr[1] "(udløber om %d dage)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Leder efter gpg nøgle-ID'et %1% i mellemlageret %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Leder efter gpg nøgle-ID'et %1% i softwarearkivet %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Softwarekilden %1% definerer ikke yderligere 'gpgkey='-URL'er."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Kan ikke læse softwarekildemappen \"%1%\": Adgang nægtet"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Kunne ikke læse mappen \"%s\""
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Kan ikke læse softwarekildefilen \"%1%\": Adgang nægtet"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Alias for softwarekilde må ikke starte med punktum."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Alias for tjeneste må ikke starte med punktum."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan ikke åbne filen \"%s\" til skrivning."
@@ -3758,44 +3758,44 @@ msgstr "Kan ikke åbne filen \"%s\" til skrivning."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Ukendt tjeneste \"%1%\": Fjerner forældreløs tjeneste-softwarekilde \"%2%\""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Der blev ikke fundet gyldige metadata på den angivne URL"
 msgstr[1] "Der blev ikke fundet gyldige metadata på de angivne URL'er"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan ikke oprette %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Kan ikke oprette mappe med metadata-cache."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Opbygger cache for softwarekilden '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan ikke oprette cache i %s - ingen skriverettigheder."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Caching af softwarekilde (%d) mislykkedes."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Ikke-håndteret softwarekilde-type"
 
@@ -3805,44 +3805,44 @@ msgstr "Ikke-håndteret softwarekilde-type"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Fejl under forsøg på at læse fra \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ukendt fejl ved læsning fra \"%s\""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Tilføjer softwarekilden '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ugyldig softwarekilde-filnavn i \"%s\""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Fjerner softwarekilden '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Kan ikke regne ud hvor softwarekilden er lagret."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan ikke slette \"%s\""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Kan ikke regne ud hvor tjenesten er lagret."
 
@@ -3922,7 +3922,7 @@ msgstr "En yderligere kundekontrakt er nødvendig for at få support."
 msgid "Unknown support option. Description not available"
 msgstr "Ukendt support-mulighed. Beskrivelse ikke tilgængelig"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3952,13 +3952,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ugyldigt regulært udtryk '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentificering påkrævet for '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3966,7 +3976,7 @@ msgstr ""
 "Besøg SUSE-kundercenteret for at tjekke om din registrering er gyldig og "
 "ikke er udløbet."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3974,7 +3984,7 @@ msgstr ""
 "Besøg Novell-kundercenteret for at tjekke om din registrering er gyldig og "
 "ikke er udløbet."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4038,7 +4048,7 @@ msgid "No url in repository."
 msgstr "Ingen URL i softwarekilden."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4203,7 +4213,7 @@ msgstr "ødelæg %s ved at ignorere nogle af dens afhængigheder"
 msgid "generally ignore of some dependencies"
 msgstr "ignorér generelt nogle afhængigheder"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4211,151 +4221,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "modstridende forespørgsler"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "et eller andet afhængighedsproblem"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "ikke understøttet anmodning"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "slettede udbydere: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4363,243 +4373,276 @@ msgstr ""
 "\n"
 "ikke-installérbare leverandører: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "ikke-installérbare leverandører: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Denne anmodning vil ødelægge dit system!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorér advarslen om et ødelagt system"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "installér %1%, selvom den er blevet tilbagetrukket"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "giv tillade til installation af PTF'en %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "installér %1%, selvom den er sortlistet"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Udfører %%posttrans-scriptet '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Udfører %posttrans-scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Installation er blevet afbrudt som ønsket."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " afviklet"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " afvikling mislykkedes"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s er allerede kørt som %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " afvikling skippet under afbrydelse"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Fejl under afsendelse af bekendtgørelse af opdateringsbesked."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Besked om ny opdatering"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM mislykkedes: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Import af offentlig nøgle %1% mislykkedes"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Fjernelse af den offentlige nøgle %1% mislykkedes"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Konfigurationsfiler er ændret for %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm gemte %s som %s, men det var umuligt at bestemme forskellen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4609,13 +4652,13 @@ msgstr ""
 "Her er de første 25 linjer af forskelle:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm oprettede %s som %s, men det var umuligt at bestemme forskellen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4628,47 +4671,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Yderligere rpm-output"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "backup %s blev oprettet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Signatur er OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Ukendt signaturtype"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Signaturen verificerer ikke"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signaturen er OK, men nøglen er ikke betroet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Signaturens offentlige nøgle er ikke tilgængelig"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Filen findes ikke eller signaturen kan ikke tjekkes"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Filen er uden signatur"
 
@@ -4795,72 +4838,72 @@ msgstr "Ugyldigt skilletegn for parameter-map"
 msgid "Invalid parameter array join separator character"
 msgstr "Ugyldigt skilletegn for parameter-array join"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Kommando afsluttet med status %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Kommando dræbtes af signalet %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Kommando afsluttet med ukendt fejl."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Kan ikke skifte rodmappe til '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Kan ikke skifte mappe til \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Kan ikke skifte mappe til \"%s\" indenfor chroot \"%s\" (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Kan ikke eksekvere '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Kan ikke forgrene (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5013,6 +5056,10 @@ msgstr "Placeringen \"%s\" er midlertidigt utilgængelig."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL-certifikatproblem. Tjek at CA-certifikatet er OK for '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5032,6 +5079,99 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ja"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nej"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "udført"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "fejl"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Bemærk:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Advarsel:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Fejl:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Vil du fortsætte?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Advarsel: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Henter:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "starter"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "ikke fundet"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Ingen hjælp tilgængelig for denne forespørgsel."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "ingen hjælp tilgængelig for dette tilvalg"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "vis alle tilvalg"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ja"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nej"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Udfører %%posttrans-scriptet '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Udfører %posttrans-scripts"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Pakke er ikke signeret!"
 
index 48b5967..66e0507 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -17,8 +17,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-04 18:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-02-06 15:14+0000\n"
 "Last-Translator: Gemineo <vistatec@gemineo.de>\n"
 "Language-Team: German <https://l10n.opensuse.org/projects/libzypp/master/de/"
 ">\n"
@@ -3717,52 +3717,52 @@ msgstr[1] "(läuft innerhalb von %d Tagen ab)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Suche nach der GPG-Key-ID %1% im Cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Suche nach der GPG-Key-ID %1% im Repository %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repository %1% definiert keine zusätzlichen 'gpgkey='-URLs."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Repo-Verzeichnis '%1%' kann nicht gelesen werden: Zugriff verweigert"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Verzeichnis '%s' konnte nicht gelesen werden"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Repo-Datei '%1%' kann nicht gelesen werden: Zugriff verweigert"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Ein Repository-Alias darf nicht mit einem Punkt beginnen."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Ein Dienst-Alias darf nicht mit einem Punkt beginnen."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Datei '%s' konnte nicht zum Schreiben geöffnet werden."
@@ -3770,45 +3770,45 @@ msgstr "Datei '%s' konnte nicht zum Schreiben geöffnet werden."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Unbekannter Dienst '%1%': Verwaistes Dienst-Repository '%2%' wird entfernt"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Keine gültigen Metadaten bei dem festgelegten URL gefunden"
 msgstr[1] "Keine gültigen Metadaten bei den festgelegten URLs gefunden"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s konnte nicht erstellt werden"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Metadaten-Cache-Verzeichnis konnte nicht erstellt werden."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Cache für Repository '%s' erzeugen"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Cache konnte auf %s nicht erstellt werden - keine Schreibberechtigungen."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Repo (%d) konnte nicht im Cache gespeichert werden."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Unverarbeiteter Repository-Typ"
 
@@ -3818,44 +3818,44 @@ msgstr "Unverarbeiteter Repository-Typ"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Fehler beim Versuch, aus '%s' zu lesen"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Unbekannter Fehler beim Lesen aus '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Repository '%s' hinzufügen"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Repo-Dateiname bei '%s' ungültig"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Repository '%s' entfernen"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Speicherort des Repos kann nicht gefunden werden."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' kann nicht gelöscht werden"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Speicherort des Dienstes kann nicht gefunden werden."
 
@@ -3938,7 +3938,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Unbekannte Support-Option. Keine Beschreibung vorhanden"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3968,13 +3968,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ungültiger regulärer Ausdruck '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authentifizierung erforderlich für '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Werde es erneut versuchen..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Gebe nach %1% Versuchen auf."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3982,7 +3992,7 @@ msgstr ""
 "Besuchen Sie den SUSE Customer Center zur Prüfung, ob Ihre Registrierung "
 "gültig und nicht abgelaufen ist."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3990,7 +4000,7 @@ msgstr ""
 "Besuchen Sie den Novell Customer Center zur Prüfung, ob Ihre Registrierung "
 "gültig und nicht abgelaufen ist."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4057,7 +4067,7 @@ msgid "No url in repository."
 msgstr "Das Repository enthält keine URL."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4223,7 +4233,7 @@ msgstr "%s durch Ignorieren einiger Abhängigkeiten brechen"
 msgid "generally ignore of some dependencies"
 msgstr "Einige Abhängigkeiten allgemein ignorieren"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4233,87 +4243,87 @@ msgstr ""
 "ersetzt werden"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "das zu installierende %1% gehört nicht zu einem distupgrade-Repository"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "das installierte %1% hat eine minderwertige Architektur"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "das zu installierende %1% hat eine minderwertige Architektur"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "Problem mit dem installierten %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "In Konflikt stehende Anforderungen"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "Abhängigkeitsproblem"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nichts stellt das angeforderte '%1%' bereit"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Haben Sie alle erforderlichen Repositorys aktiviert?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "das angeforderte Paket %1% ist nicht vorhanden"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "nicht unterstützte Anforderung"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' wird vom System bereitgestellt und kann nicht gelöscht werden"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% ist nicht installierbar"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nichts stellt '%1%' bereit, das vom installierten %2% benötigt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "nichts stellt '%1%' bereit, das vom zu installierenden %2% benötigt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "kann nicht %1% und %2% installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "das installierte %1% steht im Konflikt mit '%2%', das vom installierten %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4321,7 +4331,7 @@ msgstr ""
 "das installierte %1% steht im Konflikt mit '%2%', das von dem zu "
 "installierenden %3% bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4329,7 +4339,7 @@ msgstr ""
 "das zu installierende %1% steht im Konflikt mit '%2%', das vom installierten "
 "%3% bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4338,28 +4348,28 @@ msgstr ""
 "das zu installierende %1% steht im Konflikt mit '%2%', das vom zu "
 "installierenden %3% bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "das installierte %1% ersetzt '%2%', das vom installierten %3% bereitgestellt "
 "wird"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "das installierte %1% ersetzt '%2%', das durch das zu installierende %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "das zu installierende %1% ersetzt '%2%', das vom installierten %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4367,21 +4377,21 @@ msgstr ""
 "das zu installierende %1% ersetzt '%2%', das durch das zu installierende %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "das installierte %1% steht im Konflikt mit dem von ihm selbst "
 "bereitgestellten '%2%'"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "das zu installierende %1% steht im Konflikt mit dem von ihm selbst "
 "bereitgestellten '%2%'"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4389,7 +4399,7 @@ msgstr ""
 "das installierte %1% erfordert '%2%', aber diese Anforderung kann nicht "
 "bereitgestellt werden"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4398,11 +4408,11 @@ msgstr ""
 "das zu installierende %1% erfordert '%2%', aber diese Anforderung kann nicht "
 "bereitgestellt werden"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "Gelöschte Anbieter: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4410,17 +4420,17 @@ msgstr ""
 "\n"
 "Nicht installierbare Anbieter: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "Nicht installierbare Anbieter: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% ist noch nicht vollständig in %2% integriert."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4429,115 +4439,138 @@ msgstr ""
 "installieren."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"Das Entfernen des installierten %1% in diesem Zusammenhang entfernt (nicht "
+"ersetzt!) auch die enthaltenen PTF-Pakete."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"Das PTF sollte durch den Aufruf von '%1%' entfernt werden. Dies aktualisiert "
+"die enthaltenen PTF-Pakete, anstatt sie zu entfernen."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "Normalerweise möchten Sie die PTF behalten oder die Aktion abbrechen."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "Das installierte %1% blockiert die gewünschte Aktion."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Normalerweise möchten Sie das PTF behalten und brechen die Aktion ab."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "Sperre entfernen, um das Entfernen von %1% zuzulassen"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "%1% nicht installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "%1% beibehalten"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "Sperre entfernen, um Installation von %1% zuzulassen"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Diese Anfrage bringt Ihr System zum Absturz!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "Warnung vor einem beschädigten System ignorieren"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 "Installation eines auflösbaren Elements, das %1% bereitstellt, nicht "
 "anfordern"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 "Löschen aller auflösbaren Elemente, die %1% bereitstellen, nicht anfordern"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "neueste Version von %1% nicht installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "%1% trotz der minderwertigen Architektur beibehalten"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "%1% trotz der minderwertigen Architektur installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "veraltetes %1% beibehalten"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "%1% aus ausgeschlossenem Repository installieren"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "%1% installieren, obwohl es widerrufen wurde"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "Erlauben das PTF %1% zu installieren"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "%1% installieren, obwohl es geblacklistet ist"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "Herabstufung von %1% auf %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "Architekturänderung von %1% in %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4546,7 +4579,7 @@ msgstr ""
 "%1% installieren (mit Herstellerwechsel)\n"
 "  %2% --> %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4555,62 +4588,76 @@ msgstr ""
 "%1% von Hersteller %2% installieren\n"
 "und %3% von Hersteller %4% ersetzen"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "Ersetzung von %1% durch %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "Deinstallation von %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "%%posttrans script '%1%' wird ausgeführt"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "%posttrans scripts werden ausgeführt"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Die Installation wurde gemäß Anweisung abgebrochen."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " ausgeführt"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " Ausführung fehlgeschlagen"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s bereits als %s ausgeführt)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " Ausführung beim Abbrechen übersprungen"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Fehler beim Senden der Aktualisierungsbenachrichtigung."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Neue Aktualisierungsbenachrichtigung"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 "Die Ausführung der Transaktion ist aufgrund der folgenden Probleme "
@@ -4618,40 +4665,40 @@ msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM fehlgeschlagen: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Importieren des öffentlichen Schlüssels %1% fehlgeschlagen"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Entfernen des öffentlichen Schlüssels %1% fehlgeschlagen"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
-msgstr ""
+msgstr "Paket-Kopfdaten sind nicht signiert!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
-msgstr ""
+msgstr "Paket-Nutzdaten sind nicht signiert!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Geänderte Konfigurationsdateien für %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4659,7 +4706,7 @@ msgstr ""
 "werden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4669,7 +4716,7 @@ msgstr ""
 "Hier die ersten 25 Zeilen mit Unterschieden:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4677,7 +4724,7 @@ msgstr ""
 "werden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4690,47 +4737,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Zusätzliche rpm-Ausgabe"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "Sicherung %s erstellt"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Signatur ist OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Unbekannter Signaturtyp"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Signatur ist nicht OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signatur ist OK, aber Schlüssel ist nicht verbürgt"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Öffentlicher Schlüssel für Signatur nicht verfügbar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Datei nicht vorhanden oder Signatur kann nicht geprüft werden"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Datei ist unsigniert"
 
@@ -4860,72 +4907,72 @@ msgstr "Ungültiges Trennzeichen für Parameterzuordnungs-Spaltung"
 msgid "Invalid parameter array join separator character"
 msgstr "Ungültiges Trennzeichen für Parameter-Array-Zusammenführung"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Kommando mit Status %d beendet."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Kommando wurde mit Signal %d (%s) beendet."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Kommando mit unbekanntem Fehler beendet."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Ungültige Spawn-Argumente angegeben."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Steuer-Pipe kann nicht erstellt werden."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "chroot zu '%s' (%s) nicht möglich."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Wechsel zu '%s' nicht möglich (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Wechsel zu '%s' innerhalb chroot '%s' nicht möglich (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "exec '%s' (%s) nicht möglich."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "(%s) abzweigen nicht möglich."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "exec '%s' nicht möglich, chdir fehlgeschlagen (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "exec '%s' nicht möglich, chroot fehlgeschlagen (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "exec '%s' nicht möglich, exec fehlgeschlagen (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "exec '%s' nicht möglich, unerwarteter Fehler."
@@ -5085,6 +5132,10 @@ msgstr ""
 " SSL-Zertifikat-Problem; überprüfen Sie, ob das CA-Zertifikat für '%s' in "
 "Ordnung ist."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Keine freien Ressourcen zum Anhängen des Mediums verfügbar."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5108,6 +5159,104 @@ msgstr ""
 "Download (curl) Fehler für '%s':\n"
 "HTTP-Antwort kann nicht abgerufen werden\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ja"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nein"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "fertig"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "Achtung"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "Fehler"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Hinweis:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Warnung:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Fehler:"
+
+# internal key used: Ok
+# internal key used: Ok
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Fortfahren?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Warnung: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Abrufen:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "Starten"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "Nicht gefunden"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Keine Hilfe für diese Eingabeaufforderung verfügbar."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "Keine Hilfe für diese Option verfügbar"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "zeigt alle Optionen"
+
+# For consistency, use the capitalized form #345187
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ja"
+
+# For consistency, use the capitalized form #345187
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nein"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "%%posttrans script '%1%' wird ausgeführt"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "%posttrans scripts werden ausgeführt"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Paket ist nicht signiert!"
 
index 7a8c418..dcb8a4f 100644 (file)
--- a/po/el.po
+++ b/po/el.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Greek (libzypp)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2018-04-29 12:02+0000\n"
 "Last-Translator: Konstantina Tsolakoglou <konstantina@accountant.com>\n"
 "Language-Team: Greek <https://l10n.opensuse.org/projects/libzypp/master/el/"
@@ -3705,52 +3705,52 @@ msgstr[1] "(λήγει σε %d ημέρες)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Αδυναμία ανάγνωσης καταλόγου αποθετηρίου '%1%': Δεν έχετε δικαιώματα"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Αποτυχία ανάγνωσης καταλόγου '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Αδυναμία ανάγνωσης αρχείου αποθετηρίου '%1%': Δεν έχετε δικαιώματα"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Το alias του αποθετηρίου δεν μπορεί να ξεκινά από τελεία."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Το ψευδώνυμο της υπηρεσίας δεν μπορεί να ξεκινά με τελεία."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Αδυναμία ανοίγματος αρχείου '%s' για εγγραφή."
@@ -3758,46 +3758,46 @@ msgstr "Αδυναμία ανοίγματος αρχείου '%s' για εγγ
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Άγνωστη υπηρεσία '%1%': Αφαίρεση του ορφανού αποθετηρίου υπηρεσιών '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Δεν βρέθηκαν έγκυρα μεταδεδομένα στην καθορισμένη URL"
 msgstr[1] "Δεν βρέθηκαν έγκυρα μεταδεδομένα στις καθορισμένες URLs"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Αδυναμία δημιουργίας %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Αδυναμία δημιουργίας καταλόγου μεταδεδομένων λανθάνουσας μνήμης."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Δημιουργία λανθάνουσας μνήμης αποθετηρίου '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Αδυναμία δημιουργίας λανθάνουσας μνήμης στο %s - δεν έχετε δικαιώματα "
 "εγγραφής."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Αποτυχία αποθήκευσης στην λανθάνουσα μνήμη του αποθετηρίου (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Τύπος αδιαχείριστου αποθετηρίου"
 
@@ -3807,44 +3807,44 @@ msgstr "Τύπος αδιαχείριστου αποθετηρίου"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Σφάλμα στην προσπάθεια ανάγνωσης από το '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Άγνωστο σφάλμα κατά την ανάγνωση από '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Προσθήκη αποθετηρίου '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Μη έγκυρο όνομα αρχείου αποθετηρίου στο '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Αφαίρεση αποθετηρίου '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Δεν είναι κατανοητό που είναι αποθηκευμένο το αποθετήριο."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Αδυναμία διαγραφής '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Δεν είναι κατανοητό που είναι αποθηκευμένη η υπηρεσία."
 
@@ -3927,7 +3927,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Άγνωστη επιλογή υποστήριξης. Δεν υπάρχει διαθέσιμη περιγραφή"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3957,19 +3957,29 @@ msgid "Invalid regular expression '%s'"
 msgstr "Μη  έγκυρη κανονική έκφραση '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Απαιτείται πιστοποίηση για '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3977,7 +3987,7 @@ msgstr ""
 "Επισκεφθείτε το Κέντρο Πελατών της Novell για να ελέγξετε εάν η εγγραφή σας "
 "είναι έγκυρη και δεν έχει λήξει."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4041,7 +4051,7 @@ msgid "No url in repository."
 msgstr "Δεν υπάρχει το URL στο αποθετήριο."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4206,7 +4216,7 @@ msgstr "διακοπή %s λόγω αγνόησης μερικών εξαρτή
 msgid "generally ignore of some dependencies"
 msgstr "γενικά αγνόηση μερικών εξαρτήσεων"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4214,151 +4224,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "συγκρουόμενες αιτήσεις"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "κάποιο πρόβλημα εξαρτήσεων"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "μη υποστηριζόμενο αίτημα"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "διαγραμμένοι πάροχοι: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4366,244 +4376,277 @@ msgstr ""
 "\n"
 "μη εγκαταστήσιμοι πάροχοι: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "Μη εγκαταστήσιμοι πάροχοι: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Το αίτημα αυτό θα καταστρέψει το σύστημα σας!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "αγνοήστε την προειδοποίηση ενός κατεστραμμένου συστήματος"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Εκτέλεση %%posttrans script '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Εκτέλεση %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Η εγκατάσταση ματαιώθηκε σύμφωνα με τις οδηγίες."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " εκτελέστηκε"
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " αποτυχία εκτέλεσηης"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "το %s έχει ήδη εκτελεστεί ως %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " η εκτέλεση παραλείφθηκε κατά την ματαίωση"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Σφάλμα κατά την αποστολή μηνύματος ειδοποίησης ενημέρωσης."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Νέο μήνυμα ενημέρωσης"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Το RPM απέτυχε: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Απέτυχε να εισάγει το δημόσιο κλειδί από το αρχείο %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Αδυναμία απομάκρυνσης του δημοσίου κλειδιού %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Αλλαγή αρχείων ρύθμισης για %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "Το rpm αποθήκευσε το  %s ως %s αλλά ήταν αδύνατο να διαφανεί η διαφορά"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4613,13 +4656,13 @@ msgstr ""
 "Εδώ είναι οι πρώτες 25 γραμμές της διαφοράς:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "Το rpm δημιούργησε το %s ως %s αλλά ήταν αδύνατο να διαφανεί η διαφορά"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4632,47 +4675,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Επιπρόσθετο αποτέλεσμα rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "δημιουργήθηκε αντίγραφο ασφαλείας %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Η υπογραφή είναι εντάξει"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Άγνωστος τύπος υπογραφής"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Η υπογραφή δεν μπορεί να επαληθευτεί"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Η υπογραφή είναι εντάξει, αλλά το κλειδί δεν είναι έμπιστο"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Η υπογραφές του δημόσιου κλειδιού δεν είναι διαθέσιμες"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Το αρχείο δεν υπάρχει ή η υπογραφή δεν μπορεί να ελεχθεί"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Το αρχείο δεν είναι υπογεγραμμένο"
 
@@ -4800,72 +4843,72 @@ msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας χω
 msgid "Invalid parameter array join separator character"
 msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας ένωσης διατάξεων παραμέτρων"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Η εντολή τερματίστηκε με κατάσταση %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Η εντολή τερματίστηκε από το σήμα %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Η εντολή τερματίστηκε με άγνωστο σφάλμα."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Αδυναμία chroot σε '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Αδυναμία chdir στο '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Αδυναμία chdir στο '%s' μέσα σε chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Αδυναμία εκτέλεσης του '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Αδυναμία διακλάδωσης (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5023,6 +5066,10 @@ msgstr ""
 " Πρόβλημα πιστοποιητικού SSL, επαληθεύστε ότι το πιστοποιητικό CA είναι "
 "εντάξει για '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5042,6 +5089,103 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ναι"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Όχι"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "έγινε"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "σφάλμα"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Προειδοποιηση: "
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Σφάλμα"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Συνέχεια;"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Προειδοποιηση: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Λήψη:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "εκκίνηση"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Δεν βρέθηκε"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Καμία διαθέσιμη βοήθεια για αυτή την εντολή."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "καμία διαθέσιμη βοήθεια για αυτή την επιλογή"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "εμφάνιση όλων των επιλογών"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ναι"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "όχι"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Εκτέλεση %%posttrans script '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Εκτέλεση %posttrans scripts"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Το πακέτο δεν είναι υπογεγραμμένο!"
 
index 62853a4..5ae5e37 100644 (file)
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2007-08-19 16:20+0100\n"
 "Last-Translator: Benjamin Weber <b.weber@warwick.ac.uk>\n"
 "Language-Team:  <en@li.org>\n"
@@ -3718,54 +3718,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "The VM's name cannot start with a digit."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "The VM's name cannot start with a digit."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Cannot open file for writing."
@@ -3773,45 +3773,45 @@ msgstr "Cannot open file for writing."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Valid metadata not found at specified URL(s)"
 msgstr[1] "Valid metadata not found at specified URL(s)"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Cannot create %s: %m\n"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Cannot create directory %1: %2."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Building repository '%s' cache"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Uploaded %s to repository."
@@ -3822,44 +3822,44 @@ msgstr "Uploaded %s to repository."
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Error parsing metadata for '%s':"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Unknown command '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Adding repository '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Invalid export filename."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Removing repository '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Cannot stat '%s': %m\n"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3931,7 +3931,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3959,25 +3959,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Invalid Url scheme '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authentication required for '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4039,7 +4049,7 @@ msgid "No url in repository."
 msgstr "No url in repository."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4158,7 +4168,7 @@ msgstr "Generally ignore this requirement"
 msgid "generally ignore of some dependencies"
 msgstr "Generally ignore this requirement"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4166,330 +4176,355 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Connection request to: "
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Cannot install %s due to dependency problems"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 #, fuzzy
 msgid "unsupported request"
 msgstr " - not supported"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "None provides %s"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "There are no installable providers of %s"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "There are no installable providers of %s"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "The request already exists."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Installation has been aborted as directed."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "Execute"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4497,73 +4532,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Error during key encryption."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "failed"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Changed configuration files for %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm saved %s as %s, but it was impossible to determine the difference"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4573,14 +4616,14 @@ msgstr ""
 "Here are the first 25 lines of difference:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm created %s as %s, but it was impossible to determine the difference"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4593,51 +4636,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Additional rpm output:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "created backup %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Source package '%s' not found."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Source package '%s' not found."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Source package '%s' not found."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4764,73 +4807,73 @@ msgstr "Invalid parameter map split separator character"
 msgid "Invalid parameter array join separator character"
 msgstr "Invalid parameter array join separator character"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Command executed when connecting"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Can't find %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Can't find %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4983,6 +5026,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5002,6 +5049,97 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Yes"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "No"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "done"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "error"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Warning"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Error"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Continue?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Warning"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Starting..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Not found"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "yes"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "no"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s provides %s, but has another architecture."
index e767391..e3ddc29 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -16,9 +16,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-19 02:12+0000\n"
-"Last-Translator: Matías Silva Bustos <matiasasb@gmail.com>\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-02-08 22:14+0000\n"
+"Last-Translator: Antonio Simón <antonio@trans-mission.com>\n"
 "Language-Team: Spanish <https://l10n.opensuse.org/projects/libzypp/master/es/"
 ">\n"
 "Language: es\n"
@@ -3722,52 +3722,52 @@ msgstr[1] "(expira en %d días)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Buscando la clave gpg identificada con %1% en la caché %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Buscando la clave gpg identificada con %1% en el repositorio %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "El repositorio %1% no define ningún URL 'gpgkey=' adicional."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "No es posible leer el directorio de repositorio %1%: permiso denegado"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Error al leer el directorio %s"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "No es posible leer el archivo de repositorio %1%: permiso denegado"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "El alias del repositorio no puede comenzar con un punto."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "El alias del servicio no puede comenzar con un punto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "No es posible abrir el archivo %s para escribir en él."
@@ -3775,7 +3775,7 @@ msgstr "No es posible abrir el archivo %s para escribir en él."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
@@ -3783,37 +3783,37 @@ msgstr ""
 "huérfano %2%"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "No se han encontrado metadatos válidos en la URL especificada"
 msgstr[1] "No se han encontrado metadatos válidos en las URL especificadas"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "No es posible crear %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "No es posible crear el directorio para el caché de metadatos."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construyendo el caché del repositorio %s"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "No es posible crear el caché en %s, no posee permisos de escritura."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Error al añadir a caché el repositorio (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Tipo de repositorio no gestionado"
 
@@ -3823,44 +3823,44 @@ msgstr "Tipo de repositorio no gestionado"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Error al intentar leer de %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Error desconocido al leer de %s"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Añadiendo el repositorio %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nombre de archivo del repositorio no válido en %s"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Eliminando el repositorio %s"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "No es posible determinar dónde está almacenado el repositorio."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "No es posible suprimir %s"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "No es posible determinar dónde está almacenado el servicio."
 
@@ -3946,7 +3946,7 @@ msgstr "Para obtener asistencia se necesita un contrato adicional de cliente."
 msgid "Unknown support option. Description not available"
 msgstr "Opción de asistencia desconocida. Descripción no disponible"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3976,13 +3976,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expresión regular '%s' no válida"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Se requiere autenticación para %s"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Se intentará de nuevo..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Renunciar después de %1% intentos."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3990,7 +4000,7 @@ msgstr ""
 "Visite el Centro de servicios al cliente de SUSE para comprobar si su "
 "registro es válido y no ha caducado."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3998,7 +4008,7 @@ msgstr ""
 "Visite el Centro de servicios al cliente de Novell para comprobar si el "
 "registro es válido y no ha caducado."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4064,7 +4074,7 @@ msgid "No url in repository."
 msgstr "No hay ninguna URL en el repositorio."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4230,7 +4240,7 @@ msgstr "romper %s ignorando algunas de sus dependencias"
 msgid "generally ignore of some dependencies"
 msgstr "ignorar en general algunas dependencias"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4240,89 +4250,89 @@ msgstr ""
 "distribuciones y se debe sustituir"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "el elemento %1% que se va a instalar no pertenece a un repositorio de "
 "actualización de distribuciones"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "el elemento %1% instalado tiene una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "el elemento %1% que se va a instalar tiene una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema con el elemento %1% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "peticiones en conflicto"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "algún problema de dependencia"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nada proporciona el elemento %1% pedido"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "¿Ha habilitado todos los repositorios requeridos?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "el paquete %1% pedido no existe"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "petición no admitida"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "%1% es proporcionado por el sistema y no se puede borrar"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% no es instalable"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nada proporciona %1%, que el elemento %2% instalado necesita"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "nada proporciona %1%, que el elemento %2% que se va a instalar necesita"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "no es posible instalar %1% y %2% conjuntamente"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "el elemento %1% instalado tiene un conflicto con %2%, que proporciona el "
 "elemento %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4330,7 +4340,7 @@ msgstr ""
 "el elemento %1% instalado tiene un conflicto con %2%, que proporciona el "
 "elemento %3% que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4338,7 +4348,7 @@ msgstr ""
 "el elemento %1% que se va a instalar tiene un conflicto con %2%, que "
 "proporciona el elemento %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4347,28 +4357,28 @@ msgstr ""
 "el elemento %1% que se va a instalar tiene un conflicto con %2%, que "
 "proporciona el elemento %3% que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "el elemento %1% instalado desplaza a %2%, proporcionado por el elemento %3% "
 "instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "el elemento %1% instalado desplaza a %2%, proporcionado por el elemento %3% "
 "que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "el elemento %1% que se va a instalar desplaza a %2%, proporcionado por el "
 "elemento %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4376,21 +4386,21 @@ msgstr ""
 "el elemento %1% que se va a instalar desplaza a %2%, proporcionado por el "
 "elemento %3% que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "el elemento %1% instalado tiene un conflicto con %2% proporcionado por sí "
 "mismo"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "el elemento %1% que se va a instalar tiene un conflicto con %2% "
 "proporcionado por sí mismo"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4398,7 +4408,7 @@ msgstr ""
 "el elemento %1% instalado requiere %2%, pero no se puede satisfacer este "
 "requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4407,11 +4417,11 @@ msgstr ""
 "el elemento %1% que se va a instalar requiere %2%, pero no se puede "
 "satisfacer este requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "proveedores suprimidos: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4419,17 +4429,17 @@ msgstr ""
 "\n"
 "proveedores no instalables: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "proveedores no instalables: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% aún no se ha integrado por completo en %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4437,114 +4447,137 @@ msgstr ""
 "Lo habitual es conservar el PTF y no instalar los parches de mantenimiento."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"Eliminar el %1% instalado en este contexto también eliminará (¡no "
+"reemplazará!) los paquetes de PTF incluidos."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"El PTF debe eliminarse llamando a '%1%'. Esto actualizará los paquetes de "
+"PTF incluidos en lugar de eliminarlos."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "Lo habitual es conservar el PTF o cancelar la acción."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "El elemento %1% instalado bloquea la acción deseada."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Lo habitual es conservar el PTF y cancelar la acción."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "elimine el bloqueo para permitir la eliminación de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "no instalar %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "mantener %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "elimine el bloqueo para permitir la instalación de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Esta petición dañará su sistema."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorar la advertencia de daño del sistema"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "no pedir que se instale un elemento solucionable que proporcione %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 "no perdir que se supriman todos los elementos solucionables que proporcionen "
 "%1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "no instalar la versión más reciente de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantener %1% a pesar de que su arquitectura sea inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instalar %1% a pesar de que su arquitectura sea inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantener el elemento %1% obsoleto"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "instalar el elemento %1% del repositorio excluido"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instalar %1% aunque se haya retraído"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "permitir la instalación de PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instalar %1% aunque esté en la lista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "bajar de versión %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "cambio de arquitectura de %1% a %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4553,7 +4586,7 @@ msgstr ""
 "instalar %1% (con cambio de proveedor)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4562,91 +4595,105 @@ msgstr ""
 "instalar %1% del proveedor %2%\n"
 " reemplazando %3% del proveedor %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "sustitución de %1% con %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "desinstalación de %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Ejecutando el guion %%posttrans %1%"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Ejecutando guiones %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "La instalación se ha cancelado siguiendo las indicaciones."
 
 # include/nis_server/io.ycp:567
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " ejecutado"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " error de ejecución"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s ya se ha ejecutado como %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " ejecución omitida mientras se cancela"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Error al enviar la notificación del mensaje de actualización."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nuevo mensaje de actualización"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 "Falló la ejecución de la transacción debido a los siguientes problemas:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM fallido: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Error al importar la clave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Error al eliminar la clave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "¡Cabecera del paquete sin firmar!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "¡Contenido del paquete sin firmar!"
 
@@ -4657,20 +4704,20 @@ msgstr "¡Contenido del paquete sin firmar!"
 # modules/Mail.ycp:563
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Se han modificado los archivos de configuración para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm ha guardado %s como %s, pero no es posible determinar la diferencia"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4680,13 +4727,13 @@ msgstr ""
 "A continuación se presentan las primeras 25 líneas de diferencia:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ha creado %s como %s, pero no es posible determinar la diferencia"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4699,49 +4746,49 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Salida de rpm adicional"
 
 # include/nis_server/io.ycp:582
 # include/backup/ui.ycp:1286
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "creada copia de seguridad %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "La firma es correcta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tipo de firma desconocido"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "La firma no cumple la verificación"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "La firma es correcta, pero la clave no es de confianza"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "La clave pública de firma no está disponible"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "El archivo no existe o no es posible comprobar la firma"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "El fichero no está firmado"
 
@@ -4870,73 +4917,73 @@ msgstr "Carácter separador de división de asignación de parámetros no válid
 msgid "Invalid parameter array join separator character"
 msgstr "Carácter separador de unión de conjunto de parámetros no válido"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "El comando ha terminado con el estado %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "La señal %d (%s) ha interrumpido el comando."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "El comando ha terminado con un error desconocido."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Se han proporcionado argumentos spawn no válidos."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "No es posible crear una tubería de control."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "No es posible aplicar chroot a %s (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "No es posible cambiar al directorio %s (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "No es posible cambiar al directorio %s en chroot %s (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "No es posible ejecutar %s (%s)."
 
 # clients/printconf_write.ycp:121
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "No es posible hacer fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "No es posible ejecutar '%s', chdir falló (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "No es posible ejecutar '%s', falló chroot (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "No es posible ejecutar '%s', falló exec (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "No es posible ejecutar '%s', error inesperado."
@@ -5091,6 +5138,10 @@ msgstr ""
 " Hay un problema con el certificado SSL. Compruebe que la autoridad de "
 "certificación (CA) es correcta para %s."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "No hay recursos libres disponibles para adjuntar medios."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5114,6 +5165,100 @@ msgstr ""
 "(curl) Error de descarga para '%s':\n"
 "No se recibió una respuesta HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Sí"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "No"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "terminado"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "atención"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "error"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Nota:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Advertencia:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Error:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "¿Desea continuar?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Advertencia: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Recuperando:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "iniciando"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "no encontrado"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "No hay ayuda disponible para este mensaje."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "no hay ayuda disponible para esta opción"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "mostrar todas las opciones"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "si"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "no"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Ejecutando el guion %%posttrans %1%"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Ejecutando guiones %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "¡El paquete no está firmado!"
 
index ee55254..6ed3aa5 100644 (file)
--- a/po/et.po
+++ b/po/et.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.et\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2019-12-08 11:54+0000\n"
 "Last-Translator: Jaanus Ojangu <jaanus.ojangu@gmail.com>\n"
 "Language-Team: Estonian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -3707,52 +3707,52 @@ msgstr[1] "(aegub %d päevaga)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Otsitakse gpg võtme ID-d %1% vahemälus %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Otsitakse gpg võtme ID-d %1% repositooriumis %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repositoorium %1% ei defineeri täiendavat 'gpgkey=' URLi."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Ei saa lugeda repo kataloogi '%1%': Juurdepääs on keelatud"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Kataloogi '%s' lugemine nurjus"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Ei saa lugeda repo faili '%1%': Juurdepääs on keelatud"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Hoidlat alias ei saa alata punktiga."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Teenuse alias ei saa alata täpiga."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Faili '%s' avamine kirjutamiseks nurjus."
@@ -3760,43 +3760,43 @@ msgstr "Faili '%s' avamine kirjutamiseks nurjus."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Tundmatu teenus '%1%': Orvustunud teenuse repost '%2%' eemaldamine"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Valitud metaandmeid ei leitud määratud URL-ilt"
 msgstr[1] "Valitud metaandmeid ei leitud määratud URL-delt"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Pole võimalik luua %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Metaandmete vahemälu kataloogi ei saa luua."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Loodava repositooriumi '%s' vahemälu"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Ei saa luua vahemälu kohas %s - puuduvad kirjutamise õigused."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Hoidla puhverdamine nurjus (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Käsitlemata tarkvarahoidla tüüp"
 
@@ -3806,44 +3806,44 @@ msgstr "Käsitlemata tarkvarahoidla tüüp"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Viga lugemisel asukohast '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Tundmatu viga '%s' lugemisel"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Lisatakse repositoorium '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Vigane repo faili nimi '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Eemaldatakse hoidla '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Ei suuda tuvastada, kus hoidla asub."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Faili '%s' ei saa kustutada"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Ei suuda tuvastada, kus teenus asub."
 
@@ -3923,7 +3923,7 @@ msgstr "Kasutajatoe saamiseks on vajalik täiendav kliendileping."
 msgid "Unknown support option. Description not available"
 msgstr "Tundmatu toe valik. Kirjeldus pole saadaval"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3953,13 +3953,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Vigane regulaaravaldis '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autoriseerimine on nõutav '%s' jaoks"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3967,7 +3977,7 @@ msgstr ""
 "Külastage SUSE kliendikeskust, et kontrollida, kas teie registreering on "
 "kehtiv ega ole aegunud."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3975,7 +3985,7 @@ msgstr ""
 "Külastage kliendikeskust, et kontrollida, kas teie registreerimine on kehtiv "
 "ja kas see pole aegunud."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4038,7 +4048,7 @@ msgid "No url in repository."
 msgstr "Repositooriumis ei ole URLi."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4203,7 +4213,7 @@ msgstr "võib katki teha %s ignoneerides mõnda selle sõltuvust"
 msgid "generally ignore of some dependencies"
 msgstr "üldiselt ignoreeritakse mõnda sõltuvust"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4211,151 +4221,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "vastuolulised päringud"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "mingi sõltuvuse probleem"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "mittetoetaud taotlus"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "kustutatud pakkujad: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4363,243 +4373,276 @@ msgstr ""
 "\n"
 "kättesaamatud varustajad: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "kättesaamatud varustajad: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "See päring rikub teie süsteemi!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignoreerige katkise süsteemi hoiatust"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "paigalda %1%, ehkki see on tagasi tõmmatud"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "lubage paigaldada PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "paigaldage %1%, kuigi see on mustas nimekirjas"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Käib %%posttrans script '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Käib %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Paigaldamine on vastavalt juhistele katkestatud."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " käivitatud"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " käivitamine nurjus"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s juba käivitatud kui %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " käivitamine jäeti katkestamise käigus vahele"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Viga uuendusteate teavituse saatmisel."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Uus uuendusteade"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM nurjus: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Avaliku võtme %1% import nurjus"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Avaliku võtme %1% eemaldamine nurjus"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Muudetud seadistuste fail %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm salvestati %s nimega %s, kuid erinevust oli võimatu tuvastada"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4609,13 +4652,13 @@ msgstr ""
 "Siin on esimesed 25 erinevuse rida:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm loodi %s nimega %s, aga oli võimatu leida erinevusi"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4628,47 +4671,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Täiendav rpm-i väljund"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "loodi varukoopia %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Allkiri on korras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tundmatu allkirja tüüp"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Allkirja ei võrrelda"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Allkiri on õige aga võti ei ole usaldatav"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Allkirjade avalik võti pole saadaval"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Faili pole olemas või allkirja pole võimalik kontrollida"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Fail on allkirjastamata"
 
@@ -4795,72 +4838,72 @@ msgstr "Vigane parameeter kaardijaotuse eraldusmärk"
 msgid "Invalid parameter array join separator character"
 msgstr "Vigane parameetrimassiivi liitumismärk"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Käsk lõpetati olekuga %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Käsk lõpetati signaaliga %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Käsk lõpetas tundmatu veaga."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Ei saa chroot läbi viia '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Ei saa kataloogi vahetada 'chdir '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Ei  õnnestunud 'chdir' '%s' 'chroot' sees '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Ei saa käivitada '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "'fork' ei õnnestu (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5015,6 +5058,10 @@ msgstr ""
 " SSL-i probleem sertifikaadiga, kontolli, et SK sertifikaat sobiks '%s' "
 "jaoks."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5034,6 +5081,106 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Jah"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ei"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "valmis"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "viga"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Hoiatus"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Viga"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Kas jätkata?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Hoiatus"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+#, fuzzy
+msgid "Retrieving:"
+msgstr "Eemaldamine"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Alustamine..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Ei leitud"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "jah"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ei"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Käib %%posttrans script '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Käib %posttrans scripts"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Pakett ei ole allkirjastatud!"
 
index 27dabb2..bb255be 100644 (file)
--- a/po/fa.po
+++ b/po/fa.po
@@ -4,9 +4,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: opensuse-i 18n\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2019-05-21 15:55+0000\n"
-"Last-Translator: Mohammad Rezaei Seresht <m_rezaei_seresht@hotmail.com>\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-03-03 15:14+0000\n"
+"Last-Translator: Mohammad Rezaei Seresht <m.networking@gmail.com>\n"
 "Language-Team: Persian <https://l10n.opensuse.org/projects/libzypp/master/fa/"
 ">\n"
 "Language: fa\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.3\n"
+"X-Generator: Weblate 4.9.1\n"
 
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
@@ -1201,7 +1201,7 @@ msgstr "جزایر ویرجین بریتانیا"
 #. :VGB:092:
 #: zypp/CountryCode.cc:394
 msgid "Virgin Islands, U.S."
-msgstr "جزایر ویرجین ایالات متحده"
+msgstr "جزایر ویرجین ایالات متحده."
 
 #. :VIR:850:
 #: zypp/CountryCode.cc:395
@@ -1301,7 +1301,7 @@ msgstr "در حذف کلید ناموفق بود."
 #: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
-msgstr "پرونده ی امضای %s  یافت نشد"
+msgstr "پرونده ی امضای %s یافت نشد"
 
 #: zypp/LanguageCode.cc:49
 msgid "Unknown language: "
@@ -3698,58 +3698,57 @@ msgstr "(در 24 ساعت منقضی میشود)"
 #, c-format, boost-format
 msgid "(expires in %d day)"
 msgid_plural "(expires in %d days)"
-msgstr[0] "(در %d منقضی می شود)"
-msgstr[1] "(در %d منقضی می شود)"
-msgstr[2] "(در %d منقضی می شود)"
+msgstr[0] "(در %d روز منقضی می شود)"
+msgstr[1] "(در %d روز دیگر منقضی می شود)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
-msgstr "در جستجوی کلید gpg %1%  در کش %2% ."
+msgstr "در جستجوی کلید gpg %1% در کش %2% ."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "در جستجوی شناسه کلید gpg %1% در مخزن %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
-msgstr ""
+msgstr "مخزن %1% URL های اضافی 'gpgkey=' را تعریف نمی کند."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "نمیتوان فهرست مخزن '%1%' را خواند: دسترسی غیرمجاز است"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ناموفق در خواندن مسیر '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
-msgstr "نمیتوان پرونده ی مخزن  '%1%' را خواند: دسترسی غیرمجاز است"
+msgstr "نمیتوان پرونده ی مخزن '%1%' را خواند: دسترسی غیرمجاز است"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "نام مستعار مخزن نمیتواند با نقطه شروع شود."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "نام مستعار سرویس نمیتواند با نقطه شروع شود."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "نمیتوان پرونده ی '%s' را برای نوشتن باز کرد."
@@ -3757,44 +3756,43 @@ msgstr "نمیتوان پرونده ی '%s' را برای نوشتن باز کر
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "سرویس ناشناخته '%1%': در حال حذف مخزن سرویس جدا افتاده '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
-msgstr[0] "شبه داده ی معتبر  در آدرس تعیین شده یافت نشد"
-msgstr[1] "شبه داده ی معتبر در آدرسهای تعیین شده یافت نشد"
-msgstr[2] "شبه داده ی معتبر در آدرسهای تعیین شده یافت نشد"
+msgstr[0] "شبه داده ی معتبر در آدرس تعیین شده یافت نشد"
+msgstr[1] "شبه داده ی معتبر در آدرس های تعیین شده یافت نشد"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "نمیتوان %s را ساخت"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "نمیتوان فهرست کش شبه داده را ساخت."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "در حال ساخت کش مخزن '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "نمیتوان کش را در %s ساخت - دسترسی نوشتن نیست."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "ناموفق در کش مخزن (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "نوع مخزن کنترل نشده"
 
@@ -3804,44 +3802,44 @@ msgstr "نوع مخزن کنترل نشده"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "خطا در تلاش برای خواندن از '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
-msgstr "خطای ناشناس در خواندن از  '%s'"
+msgstr "خطای ناشناس در خواندن از '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "در حال اضافه کردن مخزن '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "نام پرونده ی مخزن نامعتبر در '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
-msgstr "در حال حذف مخزن  '%s'"
+msgstr "در حال حذف مخزن '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "نمیتوان کشف کرد که مخزن در کجا ذخیره شده است."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' را نمیتوان حذف کرد"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "نمیتوان کشف کرد سرویس در کجا ذخیره شده است."
 
@@ -3920,7 +3918,7 @@ msgstr "یک قرارداد اضافی مشتری برای دریافت پشتی
 msgid "Unknown support option. Description not available"
 msgstr "اختیار پشتیبانی ناشناخته. تعاریف در دسترس نیستند"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3950,19 +3948,31 @@ msgid "Invalid regular expression '%s'"
 msgstr "عبارت عادی نامعتبر '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "احراز هویت برای '%s' مورد نیاز است"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "دوباره تلاش خواهد کرد..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "تسلیم شدن پس از %1% تلاش."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
+"برای بررسی اینکه آیا ثبت نام شما معتبر است و منقضی نشده است، به مرکز مشتریان "
+"SUSE مراجعه کنید."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3970,7 +3980,7 @@ msgstr ""
 "مرکز مشتریان Novell را برای بررسی اینکه ثبت نام شما معتبر است و منقضی نشده "
 "است را مشاهده کنید."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4034,10 +4044,10 @@ msgid "No url in repository."
 msgstr "هیچ آدرسی در مخزن نیست."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
-msgstr ""
+msgstr "محیط مورد انتظار %1%/%2% شناسایی شده توسط فایل \"%3%\" با محتوا:"
 
 #. [lhs][rhs] 0 = installed; 1 = to be installed
 #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
@@ -4199,159 +4209,159 @@ msgstr "شکستن %s با نادیده گرفتن برخی از وابستگی
 msgid "generally ignore of some dependencies"
 msgstr "نادیده گرفته برخی وابستگیها به صورت عمومی"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
 "replaced"
-msgstr ""
+msgstr "%1% نصب شده متعلق به مخزن disupgrade نیست و باید جایگزین شود"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
-msgstr ""
+msgstr "%1% که قرار است نصب شود به یک مخزن ارتقاء تعلق ندارد"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
-msgstr ""
+msgstr "%1% نصب شده دارای معماری ضعیفی است"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
-msgstr ""
+msgstr "%1% که قرار است نصب شود، معماری پایین‌تری دارد"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
-msgstr ""
+msgstr "مشکل با %1% نصب شده"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "درخواستهای متداخل"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "برخی مشکلات وابستگی"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
-msgstr ""
+msgstr "هیچ چیز \"% 1%\" درخواستی را ارائه نمی دهد"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
-msgstr ""
+msgstr "آیا تمام مخازن مورد نیاز را فعال کرده اید؟"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
-msgstr ""
+msgstr "بسته درخواستی %1% وجود ندارد"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "درخواست پشتیبانی نشده"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
-msgstr ""
+msgstr "\"%1%\" توسط سیستم ارائه شده است و قابل پاک کردن نیست"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
-msgstr ""
+msgstr "%1% قابل نصب نیست"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
-msgstr ""
+msgstr "هیچ چیز «% 1%» مورد نیاز %2% نصب شده را فراهم نمی کند"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
-msgstr ""
+msgstr "هیچ چیز «% 1%» مورد نیاز برای نصب %2% را فراهم نمی کند"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
-msgstr ""
+msgstr "نمی تواند %1% و %2% را نصب کند"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
-msgstr ""
+msgstr "%1% نصب شده با \"%2%\" ارائه شده توسط %3% نصب شده در تضاد است"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
-msgstr ""
+msgstr "%1% نصب شده با \"%2%\" ارائه شده توسط %3% نصب شده در تضاد است"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
-msgstr ""
+msgstr "%1% برای نصب با \"%2%\" ارائه شده توسط %3% نصب شده در تضاد است"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
-msgstr ""
+msgstr "مورد نصب %1% با \"% 2%\" ارائه شده توسط \"%3%\" برای نصب در تضاد است"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
-msgstr ""
+msgstr "%1% نصب شده، \"%2%\" ارائه شده توسط %3% نصب شده منسوخ شده است"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
-msgstr ""
+msgstr "%1% نصب شده، \"%2%\" ارائه شده توسط %3% نصب شده منسوخ شده است"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
-msgstr ""
+msgstr "%1% نصب شده، \"%2%\" ارائه شده توسط %3% نصب شده منسوخ شده است"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
-msgstr ""
+msgstr "مورد نصب %1% منسوخ شده '%2%' ارائه شده توسط 3% برای نصب"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
-msgstr ""
+msgstr "%1% نصب شده با \"%2%\" ارائه شده توسط خودش در تضاد است"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
-msgstr ""
+msgstr "%1% که باید نصب شود با \"%2%\" ارائه شده توسط خودش تضاد دارد"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
-msgstr ""
+msgstr "%1% که باید نصب شود با \"%2%\" ارائه شده توسط خودش تضاد دارد"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
-msgstr ""
+msgstr "برای نصب %1% به \"%2%\" نیاز دارد، اما این نیاز قابل ارائه نیست"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "ارائه دهنده های حذف شده: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4359,243 +4369,284 @@ msgstr ""
 "\n"
 "ارائه دهندگان غیر قابل نصب: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "ارائه دهندگان غیر قابل نصب: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
-msgstr ""
+msgstr "%1% هنوز به طور کامل در %2 ادغام نشده است."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
+msgstr "معمولاً می‌خواهید PTF را نگه دارید و وصله‌های نگهداری را نصب نکنید."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
 msgstr ""
+"حذف %1% نصب شده در این زمینه، بسته‌های PTF موجود را نیز حذف می‌کند (نه "
+"جایگزین!)."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"PTF باید با فراخوانی '%1%' حذف شود. این کار بسته‌های PTF ارائه شده را به‌جای "
+"حذف آن‌ها به‌روزرسانی می‌کند."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "معمولاً می‌خواهید PTF را نگه دارید یا کنش را لغو کنید."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
-msgstr ""
+msgstr "%1% نصب شده عمل مورد نظر را مسدود می کند."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
-msgstr ""
+msgstr "معمولاً می‌خواهید PTF را نگه دارید و کنش را لغو کنید."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
-msgstr ""
+msgstr "حذف قفل برای اجازه حذف %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
-msgstr ""
+msgstr "%1% را نصب نکن"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
-msgstr ""
+msgstr "نگه داشتن %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
-msgstr ""
+msgstr "حذف قفل برای اجازه نصب %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "این درخواست سیستم شما را خواهد شکست!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "نادیده گرفتن هشدار سیستم شکسته شده"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
-msgstr ""
+msgstr "درخواستی برای نصب یک قابل حل ارائه 1% نپرسید"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
-msgstr ""
+msgstr "درخواست حذف همه قابل حل‌های ارائه‌دهنده %1% نکنید"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
-msgstr ""
+msgstr "آخرین نسخه %1% را نصب نکنید"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
-msgstr ""
+msgstr "%1% را با وجود معماری پایین نگه دارید"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
-msgstr ""
+msgstr "با وجود معماری ضعیف، %1% را نصب کنید"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
-msgstr ""
+msgstr "منسوخ نگه داشتن %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
-msgstr ""
+msgstr "%1% را از مخزن حذف شده نصب کنید"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
-msgstr ""
+msgstr "%1% را نصب کنید اگرچه پس گرفته شده است"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
-msgstr ""
+msgstr "اجازه نصب PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
-msgstr ""
+msgstr "%1% را نصب کنید اگرچه در لیست سیاه قرار دارد"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
-msgstr ""
+msgstr "کاهش %1% به %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
-msgstr ""
+msgstr "تغییر معماری %1% به %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
+"نصب %1% (با تغییر vendor)\n"
+"   %2% --> %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
+"نصب %1% از vendor %2%\n"
+"   جایگزینی %3% از vendor %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
-msgstr ""
+msgstr "جایگزینی %1% با %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
+msgstr "حذف نصب %1%"
+
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "نصب انصراف داده شد و یا جهتدار شد."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " اجرا شده"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " اجرا ناموفق بود"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s در حال حاظر اجرا شده به عنوان %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " اجرا در هنگام انصراف پرش شد"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "خطا در ارسال اعلام پیغام بروزرسانی."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "پیغام بروزرسانی جدید"
 
-#: zypp/target/TargetImpl.cc:2688
-msgid "Executing the transaction failed because of the following problems:"
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2739
+msgid "Executing the transaction failed because of the following problems:"
+msgstr "اجرای تراکنش به دلیل مشکلات زیر انجام نشد:"
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM شکست خورد: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "ناموفق در وارد کردن کلید عمومی از پرونده ی %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "ناموفق در حذف کلید عمومی %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
-msgstr ""
+msgstr "سرصفحه بسته امضا نشده است!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
-msgstr ""
+msgstr "محموله بسته امضا نشده است!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "پرونده های پیکربندی تغییر کرده برای %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ذخیره شد %s به عنوان %s، اما تعیین اختلاف امکانپذیر نبود"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4605,13 +4656,13 @@ msgstr ""
 "اینها 25 خط اولیه ی اختلاف ها هستند:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ساخته شد %s به عنوان %s، اما تعیین اختلاف امکانپذیر نبود"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4624,47 +4675,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "خروجی rpm اضافی"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "پشتیبان ساخته شد %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "امضا خوب است"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "نوع امضا ناشناخته است"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "امضا قابل تایید نیست"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "امضا خوب است، اما کلید اعتمادسازی نشده است"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "کلید عمومی امضاها موجود نیست"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "پرونده موجود نیست و یا امضاها قابل بررسی نیستند"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "فایل تایید نشده"
 
@@ -4756,7 +4807,7 @@ msgstr "شکل آدرس یک جزء میزبان را اجازه نمیدهد"
 #: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
-msgstr "جزء میزبان نامعتبر  '%s'"
+msgstr "مؤلفه میزبان نامعتبر «%s»"
 
 #: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
@@ -4765,7 +4816,7 @@ msgstr "شکل آدس یک درگاه را مجاز نمیکند"
 #: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
-msgstr "جزء درگاه نامعتبر  '%s'"
+msgstr "جزء درگاه نامعتبر '%s'"
 
 #: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
@@ -4791,75 +4842,75 @@ msgstr "پارامتر کاراکتر جداکننده ی تقسیمگر نقش
 msgid "Invalid parameter array join separator character"
 msgstr "پارامتر کاراکتر جداکننده ی پیوند آرایه نامعتبر"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "دستور با وضعیت %d خارج شد."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "دستور با سیگنال %d (%s) کشته شد."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "دستور با خطای ناشناخته خارج شد."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
-msgstr ""
+msgstr "آرگومان های ارسال نامعتبر ارائه شده است."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
-msgstr ""
+msgstr "ایجاد لوله کنترل امکان پذیر نیست."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "نمیتوان chroot کرد به '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "نمیتوان chdir کرد به '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "نمیتوان chdir کرد به '%s'  درون chroot '%s' (%s)."
+msgstr "نمیتوان chdir کرد به '%s' درون chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "'%s' (%s) را نمیتوان اجرا کرد."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "نمیتوان fork کرد (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
-msgstr ""
+msgstr "نمی‌توان «%s» را اجرا کرد، chdir ناموفق بود (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
-msgstr ""
+msgstr "نمی‌توان «%s» را اجرا کرد، chroot ناموفق بود (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
-msgstr ""
+msgstr "نمی‌توان «%s» را اجرا کرد، exec ناموفق بود (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
-msgstr ""
+msgstr "نمی‌توان «%s» را اجرا کرد، خطای غیرمنتظره."
 
 #: zypp-media/mediaexception.cc:33
 #, c-format, boost-format
@@ -4991,12 +5042,13 @@ msgstr "اجازه برای دسترسی به '%s' داده نشد."
 #: zypp-curl/ng/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
-msgstr "مهلت زمانی در هنگام دسترسی به '%s' به اتمام رسید."
+msgstr "مهلت زمانی در هنگام دسترسی به '%s' پایان یافت."
 
 #: zypp-media/mediaexception.cc:197
 #, c-format, boost-format
 msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
+"داده های دانلود شده از اندازه فایل مورد انتظار '%s' از '%s' فراتر رفته است."
 
 #: zypp-media/mediaexception.cc:205
 #: zypp-curl/ng/network/networkrequesterror.cc:118
@@ -5009,6 +5061,10 @@ msgstr "مکان '%s' به صورت موقتی غیر قابل دسترسی اس
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " ایراد گواهی SSL، لطفا بررسی کنید که گواهی CA برای '%s' درست است."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "هیچ منبع رایگانی برای پیوست کردن رسانه موجود نیست."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5020,6 +5076,8 @@ msgid ""
 "Download (curl) error for '%s':\n"
 "Error code: %s\n"
 msgstr ""
+"خطای دانلود (curl) برای '%s':\n"
+"کد خطا: %s\n"
 
 #: zypp-curl/ng/network/networkrequesterror.cc:149
 #, c-format, boost-format
@@ -5027,6 +5085,101 @@ msgid ""
 "Download (curl) error for '%s':\n"
 "Unable to retrieve HTTP response\n"
 msgstr ""
+"خطای دانلود (curl) برای '%s':\n"
+"پاسخ HTTP قابل بازیابی نیست\n"
+
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr ""
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr ""
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "در حال اجرای %%اسکریپت posttrans \"% 1%\""
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "اجرای %posttrans scripts"
 
 #~ msgid "Package is not signed!"
 #~ msgstr "بسته مورد تایید نیست!"
index 89a25f6..0dc3c32 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -19,7 +19,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.fi\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2022-03-16 00:12+0000\n"
 "Last-Translator: Tommi Nieminen <software@legisign.org>\n"
 "Language-Team: Finnish <https://l10n.opensuse.org/projects/libzypp/master/fi/"
@@ -3918,52 +3918,52 @@ msgstr[1] "(vanhenee %d päivässä)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Etsitään GPG-avainta %1% välimuistista %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Etsitään GPG-avainta %1% asennuslähteestä %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Asennuslähde %1% ei ole asettanut ”gpgkey=”-lisäverkko-osoitteita."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "repo hakemiston lukeminen ei onnistu '%1%': Pääsy estetty"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Hakemiston \"%s\" lukeminen ei onnistu"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "repo-tiedostoa '%1%' ei voitu lukea: Pääsy estetty"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Asennuslähteen alias ei voi alkaa pisteellä."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Palvelun alias ei voi alkaa pisteellä."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Tiedostoa \"%s\" ei voida avata kirjoitusta varten."
@@ -3971,43 +3971,43 @@ msgstr "Tiedostoa \"%s\" ei voida avata kirjoitusta varten."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Tuntematon palvelu '%1%': Poistetaan orpo palvelulähde '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Annetusta verkko-osoitteesta ei löytynyt kelvollista metatietoa"
 msgstr[1] "Annetuista verkko-osoitteista ei löytynyt kelvollista metatietoa"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ei voi luoda %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Metatiedon välimuistihakemistoa ei voi luoda."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Rakennetaan asennuslähteen \"%s\" välimuistia"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Välimuistia %s ei voida luoda - ei kirjoitusoikeuksia."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Virhe asennuslähteen puskuroinnissa (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Virheellinen asennuslähteen tyyppi"
 
@@ -4017,44 +4017,44 @@ msgstr "Virheellinen asennuslähteen tyyppi"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Virhe luettaessa \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Tuntematon virhe luettaessa \"%s\""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Lisätään asennuslähdettä \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Virheellinen asennuslähteen tiedostonimi \"%s\""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Poistetaan asennuslähdettä \"%s\""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Asennuslähteen sijaintia ei voida päätellä."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "\"%s\" poistaminen ei onnistu"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Palvelun sijaintia ei voida päätellä."
 
@@ -4134,7 +4134,7 @@ msgstr "Tuen saamiseksi edellytetään erillinen asiakassopimus."
 msgid "Unknown support option. Description not available"
 msgstr "Tuntematon tukivaihtoehto. Kuvausta ei ole saatavilla"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4164,20 +4164,30 @@ msgid "Invalid regular expression '%s'"
 msgstr "Virhe säännöllisessä lausekkeessa \"%s\""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "\"%s\" vaatii tunnistautumisen"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 "Tarkista SUSEn asiakaskeskuksessa käymällä, onko rekisteröitymisesi voimassa."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4185,7 +4195,7 @@ msgstr ""
 "Vieraile Novellin asiakaskeskuksessa tarkastamassa onko rekisteröintisi "
 "voimassa ja ettei se ole vanhentunut."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4247,7 +4257,7 @@ msgid "No url in repository."
 msgstr "Asennuslähteen verkko-osoite puuttuu."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4413,7 +4423,7 @@ msgstr "jätä %s riippuvuuksia huomioimatta"
 msgid "generally ignore of some dependencies"
 msgstr "jätä joitakin riippuvuuksia huomiotta"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4421,87 +4431,87 @@ msgid ""
 msgstr "asennettu %1% ei kuulu jakelupäivityslähteeseen ja on korvattava"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "asennettava %1% ei kuulu jakelupäivityslähteeseen"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "asennetulla paketilla %1% on heikompi arkkitehtuuri"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "asennettavalla paketilla %1% on heikompi arkkitehtuuri"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "ongelma asennetussa paketissa %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "ristiriitaiset kyselyt"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "jokin riippuvuusongelma"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "mikään ei tarjoa pyydettyä pakettia ”%1%”"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Onko kaikki vaaditut asennuslähteet otettu käyttöön?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "pyydettyä pakettia %1% ei ole olemassa"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "pyyntöä ei tueta"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "paketin ”%1%” tarjoaa järjestelmä eikä sitä voi poistaa"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% ei ole asennettavissa"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "asennetun paketin %2% vaatimaa pakettia \"%1%” ei tarjoa mikään lähde"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "asennettavan paketin %2% vaatimaa pakettia ”%1%” ei tarjoa mikään lähde"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "ei voida asentaa sekä %1% että %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "asennettu %1% on ristiriidassa asennetun paketin %3% tarjoaman paketin ”%2%” "
 "kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4509,7 +4519,7 @@ msgstr ""
 "asennettu paketti %1% on ristiriidassa asennettavan paketin %3% tarjoaman "
 "paketin ”%2%” kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4517,7 +4527,7 @@ msgstr ""
 "asennettava paketti %1% on ristiriidassa asennetun paketin %3% tarjoaman "
 "paketin ”%2%” kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4526,28 +4536,28 @@ msgstr ""
 "asennettava paketti %1% on ristiriidassa toisen asennettavan paketin %3% "
 "tarjoaman paketin ”%2%” kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "asennettu paketti %1% vanhentaa toisen asennetun paketin %3% tarjoaman "
 "paketin ”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "asennettu paketti %1% vanhentaa asennettavan paketin %3% tarjoaman paketin "
 "”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "asennettava paketti %1% vanhentaa asennetun paketin %3% tarjoaman paketin "
 "”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4555,27 +4565,27 @@ msgstr ""
 "asennettava paketti %1% vanhentaa toisen asennettavan paketin %3% tarjoaman "
 "paketin ”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "asennettu paketti %1% on ristiriidassa itse tarjoamansa paketin ”%2“ kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "asennettava paketti %1% on ristiriidassa itsensä tarjoaman paketin ”%2%” "
 "kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "asennettu paketti %1% vaatii paketin ”%2%” mutta vaatimusta ei voi täyttää"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4583,11 +4593,11 @@ msgid ""
 msgstr ""
 "asennettava paketti %1% vaatii paketin ”%2%” mutta vaatimusta ei voi täyttää"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "poistetut tarjoajat: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4595,17 +4605,17 @@ msgstr ""
 "\n"
 "Poistettavissa olevat tarjoajat: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "poistetut tarjoajat: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% ei vielä ole täysin integroitu paikkaukseen %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4613,112 +4623,131 @@ msgstr ""
 "Tavallisesti haluat säilyttää PTF:n ja olla asentamatta ylläpitopaikkauksia."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "Asennettu %1% estää halutun toimenpiteen."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Tavallisesti haluat säilyttää PTF:n ja perua toimenpiteen."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "avaa lukitus paketin %1% poistamiseksi"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "älä asenna pakettia %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "pidä %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "avaa lukitus paketin %1% asentamiseksi"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Tämä pyyntö rikkoo järjestelmän!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ohita varoitus rikkinäisestä järjestelmästä"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "älä kysy, asennetaanko paketin %1% tarjoavaa ratkaisua"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "älä kysy, poistetaanko paketin %1% tarjoavia ratkaisuja"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "älä asenna paketin %1% uusinta versiota"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "pidä %1% heikommasta arkkitehtuurista huolimatta"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "asenna %1% heikommasta arkkitehtuurista huolimatta"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "pidä vanhentunut %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "asenna %1% pois suljetusta asennuslähteestä"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "asenna %1%, vaikka se on vedetty takaisin"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "salli asentaa PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "asenna %1%, vaikka se on mustalistattu"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "päivitä alaspäin %1% -> %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "arkkitehtuurin muutos %1% -> %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4727,7 +4756,7 @@ msgstr ""
 "asenna %1% (tarjoaja muuttuu)\n"
 "  %2% --> %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4736,108 +4765,122 @@ msgstr ""
 "asenna toimittajalta %2% %1%,\n"
 "joka korvaa paketin %3% toimittajalta %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "korvataan %1% -> %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "poistetaan asennus: %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Suoritetaan %%posttrans-skriptiä ”%1%”"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Suoritetaan %posttrans-skriptejä"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Asennus keskeytettiin."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " suoritettu"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " suoritus epäonnistui"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s on jo suoritettu nimellä %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " suoritus ohitettiin keskeytettäessä"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Virhe lähetettäessä päivityshuomautusta."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Uusi päivitysviesti"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "Toimenpidettä ei voitu suorittaa seuraavien ongelmien takia:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM-virhe: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Avaimen tuonti tiedostosta %1% epäonnistui"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Julkisen avaimen %1% poisto epäonnistui"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "Paketin otsaketta ei ole allekirjoitettu!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "Paketin sisältöä ei ole allekirjoitettu!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Muunnettiin paketin %s asetustiedostoja:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm tallensi tiedoston %s nimellä %s. Erojen selvittäminen ei onnistunut"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4847,13 +4890,13 @@ msgstr ""
 "Tässä ensimmäiset 25 muuttunutta riviä:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm loi tiedoston %s nimellä %s, erojen selvittäminen ei onnistunut"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4866,47 +4909,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "rpm-lisätuloste"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "luotiin varmuuskopio %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Allekirjoitus kelpaa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tuntematon allekirjoituksen tyyppi"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Allekirjoitusta ei voida todentaa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Allekirjoitus kelpaa, mutta avain ei ole luotettu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Allekirjoituksen julkinen avain ei ole saatavilla"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Tiedostoa ei ole tai allekirjoitusta ei voi tarkistaa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Tiedosto on allekirjoittamaton"
 
@@ -5035,72 +5078,72 @@ msgstr "Virheellinen parametrikartan jaon erotin"
 msgid "Invalid parameter array join separator character"
 msgstr "Virheellinen parametritaulukon liitoksen erotin"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Komento päättyi tilaan %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Komento lopetettiin signaalilla %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Komento päättyi tuntemattomaan virheeseen."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Annettu virheellisiä spawn-parametreja."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Hallintaputkea ei voitu luoda."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Hakemistorajoitus (chroot) ei onnistu hakemistoon \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "chdir  '%s' ei onnistu (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "chdir '%s' ei onnistu chroot '%s' sisällä (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "\"%s\" (%s) suorittaminen ei onnistu."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Haarauttaminen (fork) ei onnistu (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Ei voida suorittaa ”%s”: chdir epäonnistui (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Ei voida suorittaa ”%s”: chroot epäonnistui (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Ei voida suorittaa ”%s”: exec epäonnistui (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Ei voida suorittaa ”%s”: tuntematon syy."
@@ -5253,6 +5296,10 @@ msgstr "\"%s\" ei ole hetkellisesti saatavilla."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL-ongelma: Tarkista että CA-varmenne kuuluu \"%s\"."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5276,6 +5323,100 @@ msgstr ""
 "Latausvirhe (curl) kohteelle ”%s”:\n"
 "HTTP-vastausta ei saatu\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Kyllä"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ei"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "valmis"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "huomio"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "virhe"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Huomaa:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Varoitus:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Virhe:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Jatketaanko?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Varoitus: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Ladataan:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "käynnistetään"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "ei löytynyt"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Tälle toiminnolle ei ole ohjetta."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "Tälle valinnalle ei ole ohjetta"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "näyttää kaikki valinnat"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "kyllä"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ei"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Suoritetaan %%posttrans-skriptiä ”%1%”"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Suoritetaan %posttrans-skriptejä"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Pakettia ei ole allekirjoitettu!"
 
index c9171f1..8b73e5b 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -19,11 +19,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.fr\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-04-02 20:12+0000\n"
-"Last-Translator: Lucie Charrier <c.chalu@free.fr>\n"
-"Language-Team: French <https://l10n.opensuse.org/projects/libzypp/master/fr/>"
-"\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-02-09 13:14+0000\n"
+"Last-Translator: Sophie Leroy <sophie@stoquart.com>\n"
+"Language-Team: French <https://l10n.opensuse.org/projects/libzypp/master/fr/"
+">\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -3721,54 +3721,54 @@ msgstr[1] "(expire dans %d jours)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Recherche de la clé gpg %1% dans le cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Recherche de la clé gpg %1% dans le dépôt %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Le dépôt %1% ne définie pas d'URL 'gpgkey=' additionnelles."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Impossible de lire le répertoire de dépôt '%1%' : permission refusée"
 
 # TLABEL restore_2002_08_07_0216__88
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Impossible de lire le dossier '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Impossible de lire le fichier de dépôt '%1%' : permission refusée"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "L'alias d'un dépôt ne peut pas commencer par un point."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "L'alias d'un service ne peut pas commencer par un point."
 
 # TLABEL kinternet_2002_02_20_2255__39
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Impossible d'ouvrir le fichier '%s' en écriture."
@@ -3776,44 +3776,44 @@ msgstr "Impossible d'ouvrir le fichier '%s' en écriture."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Service '%1%' inconnu : suppression du dépôt de service orphelin '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Aucune métadonnée valide trouvée à l'URL spécifiée"
 msgstr[1] "Aucune métadonnée valide trouvée aux URL spécifiées"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Impossible de créer %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Impossible de créer le répertoire de cache des métadonnées."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construction du cache du dépôt '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Impossible de créer le cache dans %s - pas d'autorisation en écriture."
 
 # TLABEL restore_2002_08_07_0216__88
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Échec de la mise en cache du dépôt (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Type de dépôt non pris en charge"
 
@@ -3823,44 +3823,44 @@ msgstr "Type de dépôt non pris en charge"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erreur lors de la tentative de lecture depuis '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Erreur de lecture inconnue depuis '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Ajout du dépôt '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nom du fichier de dépôt non valide sur '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Suppression du dépôt '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Impossible de déterminer l'emplacement de stockage du dépôt."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Impossible de supprimer '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Impossible de déterminer l'emplacement de stockage du service."
 
@@ -3942,7 +3942,7 @@ msgstr "Un contrat client additionel est nécessaire pour obtenir du support."
 msgid "Unknown support option. Description not available"
 msgstr "Option de support inconnue. La description n'est pas disponible"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3973,13 +3973,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expression régulière '%s' invalide"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authentification requise pour '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Une nouvelle tentative va être effectuée..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Abandon après %1% tentatives."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3987,7 +3997,7 @@ msgstr ""
 "Visitez SUSE Customer Center pour vérifier si votre enregistrement est "
 "valide et n'a pas expiré."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3995,7 +4005,7 @@ msgstr ""
 "Visitez le Novell Customer Center pour vérifier que votre inscription est "
 "valide et qu'elle n'a pas expiré."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4061,7 +4071,7 @@ msgid "No url in repository."
 msgstr "Pas d'URL dans le dépôt."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4227,7 +4237,7 @@ msgstr "casser %s en ignorant certaines de ses dépendances"
 msgid "generally ignore of some dependencies"
 msgstr "Ignorer généralement certaines dépendances"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4237,90 +4247,90 @@ msgstr ""
 "distribution et doit être remplacé"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "l'élément %1% à installer n'appartient à aucun dépôt de mise à niveau de la "
 "distribution"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "l'élément %1% installé présente une architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "l'élément %1% à installer présente une architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problème avec l'élément %1% installé"
 
 # TLABEL kinternet_2002_02_20_2255__29
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "requêtes conflictuelles"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "Problèmes de dépendance"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "rien ne fournit le/la '%1%' demandé(e)"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Avez-vous activé tous les dépôts requis ?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "le paquetage demandé %1% n'existe pas"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "Requête non supportée"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' est fourni par le système et ne peut pas être effacé"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% n'est pas installable"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "rien ne fournit '%1%' qui est nécessaire pour l'élément %2% installé"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "rien ne fournit '%1%' qui est nécessaire pour l'élément %2% à installer"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "impossible d'installer à la fois %1% et %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "l'élément %1% installé est en conflit avec '%2%' fourni par l'élément %3% "
 "installé"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4328,7 +4338,7 @@ msgstr ""
 "l'élément %1% installé est en conflit avec '%2%' fourni par l'élément %3% à "
 "installer"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4336,7 +4346,7 @@ msgstr ""
 "l'élément %1% à installer est en conflit avec '%2%' fourni par l'élément %3% "
 "installé"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4345,27 +4355,27 @@ msgstr ""
 "l'élément %1% à installer est en conflit avec '%2%' fourni par l'élément %3% "
 "à installer"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "l'élément %1% installé rend obsolète '%2%' fourni par l'élément %3% installé"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "l'élément %1% installé rend obsolète '%2%' fourni par l'élément %3% à "
 "installer"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "l'élément %1% à installer rend obsolète '%2%' fourni par l'élément %3% "
 "installé"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4373,18 +4383,18 @@ msgstr ""
 "l'élément %1% à installer rend obsolète '%2%' fourni par l'élément %3% à "
 "installer"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "l'élément %1% installé est en conflit avec '%2%' fourni par lui-même"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "l'élément %1% à installer est en conflit avec '%2%' fourni par lui-même"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4392,7 +4402,7 @@ msgstr ""
 "l'élément %1% installé nécessite '%2%', mais cette exigence ne peut pas être "
 "remplie"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4401,11 +4411,11 @@ msgstr ""
 "l'élement %1% à installer nécessite '%2%', mais cette exigence ne peut pas "
 "être remplie"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "fournisseurs supprimés : "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4413,17 +4423,17 @@ msgstr ""
 "\n"
 "fournisseurs non installables : "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "fournisseurs non installables : "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% n'est pas totalement intégré dans %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4432,115 +4442,140 @@ msgstr ""
 "les correctifs de maintenance."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"La suppression du PTF installé %1% dans ce contexte supprimera (plutôt que "
+"de remplacer !) les paquets PTF inclus également."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"Le PTF doit être supprimé en appelant '%1%'. Cela mettra à jour les paquets "
+"PTF inclus plutôt que de les supprimer."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+"Généralement, vous souhaitez conserver le PTF ou choisissez d'annuler "
+"l'action."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "Le %1% installé bloque l'action souhaitée."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 "En général, vous souhaitez conserver les correctifs temporaires du programme "
 "et choisissez d'annuler l'action."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "supprimer le verrouillage pour permettre la suppression de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "ne pas installer %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "conserver %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "supprimer le verrouillage pour autoriser l'installation de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Cette requête va casser votre système !"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorer l'avertissement d'un système cassé"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "ne pas demander d'installer un élément résolvable fournissant %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 "ne pas demander de supprimer tous les éléments résolvables fournissant %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "ne pas installer la dernière version de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "conserver %1% malgré l'architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "installer %1% malgré l'architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "conserver l'élément %1% obsolète"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "installer %1% à partir du dépôt exclu"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "installer %1% bien qu'il ait été retiré"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "autoriser l'installation du PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "installer %1% bien qu'il ait été placé en liste noire"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "rétrogradation de %1% à %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "modification de l'architecture de %1% vers %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4549,7 +4584,7 @@ msgstr ""
 "installer %1% (avec le changement de fournisseur)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4558,104 +4593,118 @@ msgstr ""
 "installer %1% du fournisseur %2%\n"
 "en remplaçant %3% du fournisseur %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "remplacement de %1% par %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "désinstallation de %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Exécution du script %%posttrans « %1% »"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Exécution des scripts %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "L'installation a été abandonnée comme demandé."
 
 # TLABEL online_update_2002_01_04_0147__113
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " exécuté"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " échec de l'exécution"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s déjà exécuté en tant que %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " exécution annulée lors de l'abandon"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Erreur lors de l'envoi de la notification de mise à jour par message."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nouveau message de mise à jour"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 "L'exécution de la transaction a échoué en raison des problèmes suivants :"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Échec RPM : "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Impossible d'importer la clé publique %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Impossible de supprimer la clé publique %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "L'en-tête du paquet n'est pas signé !"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
-msgstr ""
+msgstr "Le contenu du paquet n'est pas signé !"
 
 # TLABEL sw_single_2002_01_04_0147__11
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Fichiers de configuration modifiés pour %s :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4663,7 +4712,7 @@ msgstr ""
 "déterminer la différence"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4673,7 +4722,7 @@ msgstr ""
 "Voici les 25 premières lignes qui diffèrent :\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4681,7 +4730,7 @@ msgstr ""
 "différence"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4695,48 +4744,48 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Sortie rpm supplémentaire"
 
 # TLABEL backup_2002_03_14_2340__102
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "sauvegarde %s créée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "La signature est correcte"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Type de signature inconnu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "La signature n'est pas vérifiée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "La signature est correcte mais la clé n'est pas certifiée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "La clé publique des signatures n'est pas disponible"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Le fichier n'existe pas ou la signature ne peut pas être vérifiée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Le fichier n'est pas signé"
 
@@ -4868,74 +4917,74 @@ msgstr ""
 "Caractère séparateur de catégorie de jonction non valide pour l'ensemble de "
 "paramètres"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "La commande s'est terminée avec l'état %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "La commande a été supprimée par le signal %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "La commande s'est terminée à cause d'une erreur inconnue."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Argument spawn fournis non valides."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Impossible de créer un pipe de contrôle."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Impossible d'effectuer une commande chroot vers '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Impossible d'appliquer la commande chdir vers '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 "Impossible d'appliquer la commande chdir à '%s' dans chroot '%s' ('%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Impossible d'exécuter '%s' (%s)."
 
 # TLABEL printconf_2002_03_14_2340__110
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Impossible d'exécuter une commande fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Impossible d'exécuter '%s'. La commande chdir a échoué (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Impossible d'exécuter '%s'. La commande chroot a échoué (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Impossible d'exécuter '%s'. La commande exec a échoué (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Impossible d'exécuter '%s'. Erreur inattendue."
@@ -5096,6 +5145,10 @@ msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 " Problème de certificat SSL, vérifiez que le certificat CA est OK pour '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Aucune ressource libre disponible pour attacher le support."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5119,6 +5172,101 @@ msgstr ""
 "Erreur de téléchargement (curl) pour « %s » :\n"
 "Impossible d'obtenir une réponse HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Oui"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Non"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "fait"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "attention"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "erreur"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Note :"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Avertissement :"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Erreur :"
+
+# internal key used: Ok
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Continuer ?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Avertissement : "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Récupération :"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "Démarrage"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "non trouvé"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Aucune aide disponible pour cette invite."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "Aucune aide disponible pour cette option"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "affiche toutes les options"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "oui"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "non"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Exécution du script %%posttrans « %1% »"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Exécution des scripts %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Le paquet n'est pas signé !"
 
index ce8b8df..ec2a0c5 100644 (file)
--- a/po/gl.po
+++ b/po/gl.po
@@ -14,7 +14,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2020-06-29 19:45+0000\n"
 "Last-Translator: Manuel Vazquez <xixirei@yahoo.es>\n"
 "Language-Team: Galician <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -4044,52 +4044,52 @@ msgstr[1] "(caduca dentro de %d días)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Buscando a chave gpg coa ID %1% no caché %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Buscando a chave gpg coa ID %1% no repositorio %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "O repositorio %1% non ten definida URLs adicionais nos 'gpgkey='."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Non foi posíbel ler o directorio do repositorio %1%: permiso denegado"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Erro ao ler o directorio '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Non foi posíbel ler o ficheiro de repositorio '%1%': permiso denegado"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "O alias do repositorio non pode comezar cun punto."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "O alias do servizo non pode comezar cun punto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Non se puido abrir '%s' para escribir."
@@ -4097,44 +4097,44 @@ msgstr "Non se puido abrir '%s' para escribir."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Servizo descoñecido de '%1%': eliminando o servizo orfo do repositorio '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Metadatos válidos non atopados no URL especificado"
 msgstr[1] "Metadatos válidos non atopados nos URLs especificados"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Non se pode crear '%s'"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Non se pode crear o directorio da caché de metadatos."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construíndo a caché do repositorio '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Non se pode crear a caché en %s - non hai permisos de escritura."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Fallo na caché do repositorio (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Repositorio"
 
@@ -4144,44 +4144,44 @@ msgstr "Repositorio"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erro ao ler desde '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Erro descoñecido ao ler desde '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Engadindo o repositorio '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nome de ficheiro do repositorio incorrecto en '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Eliminando o repositorio '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Non se pode saber onde se atopa almacenado o repositorio."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Non se pode borrar '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Non se pode saber onde se atopa almacenado o servizo."
 
@@ -4261,7 +4261,7 @@ msgstr "Un contrato adicional co cliente é necesario para recibir soporte."
 msgid "Unknown support option. Description not available"
 msgstr "Opción de soporte descoñecida. Descrición non dispoñible"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4291,13 +4291,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expresión regular '%s' incorrecta"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autenticación necesaria para '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4305,7 +4315,7 @@ msgstr ""
 "Visite o Centro de servizos ao cliente de SUSE para comprobar se o seu "
 "rexistro é correcto e non caducou."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4313,7 +4323,7 @@ msgstr ""
 "Visite o Novell Customer Center para verificar se o seu rexistro é válido e "
 "non caducou."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4377,7 +4387,7 @@ msgid "No url in repository."
 msgstr "Non hai ningún enderezo url no repositorio."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4542,7 +4552,7 @@ msgstr "quebrar %s ao ignorar algunhas das dependencias"
 msgid "generally ignore of some dependencies"
 msgstr "polo xeral ignorar algunhas dependencias"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4550,151 +4560,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "peticións en conflito"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "algúns problemas de dependencias"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "petición sen soporte"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "fornecedores eliminados: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4702,243 +4712,276 @@ msgstr ""
 "\n"
 "provedores non instalables: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "provedores non instalables: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Esta solicitude danará o seu sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorar o aviso de sistema danado"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "permitir a instalación de PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instalar %1% aínda que estea na lista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Executando o script %%posttrans '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Executando scripts de %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Abortouse a instalación seguindo as indicacións."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " executado"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " fallou a execución"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s xa executado como %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " ignorada a execución ao abortar"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Erro ao enviar a notificación da mensaxe de actualización."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nova mensaxe de actualización"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Fallou RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Erro ao importar a chave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Erro ao eliminar a chave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Modificados os ficheiros de configuración para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm gardou %s como %s, pero non se pode determinar a diferenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4948,13 +4991,13 @@ msgstr ""
 "A continuación amósanse as primeiras 25 liñas de diferenza:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm creou %s como %s, pero no se pode determinar a diferenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4967,47 +5010,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Saída rpm adicional"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "copia de seguridade %s creada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "A sinatura é correcta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tipo de sinatura descoñecido"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "A sinatura non se dou verificado"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "A sinatura está correcta, mais non se confía na chave"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Non hai dispoñible unha sinatura pública da chave"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Ou o ficheiro non existe ou ou a sinatura non se pode verificar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "O ficheiro está sen asinar"
 
@@ -5137,72 +5180,72 @@ msgid "Invalid parameter array join separator character"
 msgstr ""
 "Parámetro de carácter de separación para a unión de matrices incorrecto"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "A orde rematou co estado %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "O sinal %d (%s) matou a orde."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "A orde rematou cun erro descoñecido."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Non se pode facer chroot a '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Non foi posíbel executar '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Non foi posíbel executar chdir '%s' dentro de '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Non se pode executar  '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "No se pode facer fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5358,6 +5401,10 @@ msgstr ""
 " Problema no certificado SSL, comprobe se a certificación CA é correcta para "
 "'%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5377,6 +5424,101 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Si"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Non"
+
+# ID
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "feito"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "erro"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Aviso:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Erro:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Desexa continuar?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Advertencia: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Obtendo:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "iniciando"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Non atopado"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Non hai axuda dispoñible para este indicador de ordes."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "Non hai axuda dispoñible para esta opción"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "si"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "non"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Executando o script %%posttrans '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Executando scripts de %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "O paquete non está asinado!"
 
index d6b1b63..e2d6c07 100644 (file)
--- a/po/gu.po
+++ b/po/gu.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: nis\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2006-11-11 18:41+0530\n"
 "Last-Translator: Priyavert Sharma<priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions<linux_team@agreeya.com>\n"
@@ -3708,54 +3708,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "VM નું નામ આંકડાથી શરૂ થઇ શકે નહીં."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "VM નું નામ આંકડાથી શરૂ થઇ શકે નહીં."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "લખવા માટે ફાઇલ ખોલી શકાતી નથી."
@@ -3763,44 +3763,44 @@ msgstr "લખવા માટે ફાઇલ ખોલી શકાતી ન
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s ડેસ્કટોપ આઈટમ ખોલી શકાશે નહીં"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "ડિરેક્ટરી %1 બનાવી શકાતી નથી: %2."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3810,44 +3810,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ફ્લોપી ડિસ્કમાંથી વાંચવામાં ભૂલ."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "સાધનો ઉમેરાય છે"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "એક્સપોર્ટ ફાઈલ નું નામ અમાન્ય છે."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "સાધનો ઉમેરાય છે"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "%s ડેસ્કટોપ આઈટમ ખોલી શકાશે નહીં"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3918,7 +3918,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3946,25 +3946,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "અમાન્ય Url યોજના '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4031,7 +4041,7 @@ msgid "No url in repository."
 msgstr "રિપોસીટરીમાં ફાઈલ %1 મળી નહીં."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4150,7 +4160,7 @@ msgstr "આ જરૂરિયાત અહીં માત્ર અવગણ
 msgid "generally ignore of some dependencies"
 msgstr "આ જરૂરિયાત અહીં માત્ર અવગણો"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4158,329 +4168,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "ને જોડાણ માટે વિનંતી કરો:"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "પરાધિનતા મૂશ્કેલીઓને કારણે %s સ્થાપિ શકાયું નથી"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "%s કોઇ આપતું નથી"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "રિક્વેસ્ટ અસ્તિત્વમાં છે જ."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "સૂચના પ્રમાણે સ્થાપન અટકાવેલું હતું."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "ચલાવો"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4488,73 +4523,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "કી એન્ક્રીપ્ટશન દરમિયાન ભૂલ."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "નિષ્ફળ થયું"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s માટે કન્ફિગ્યુરેશન ફાઈલો બદલાઇ:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "%s તરીકે rpm એ %s સાચવ્યું પરંતુ તફાવત જુદો પાડવા તે અશક્ય હતું"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4564,13 +4607,13 @@ msgstr ""
 "અહીં તફાવતોના પ્રથમ 25 લાઇનો છે: \n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "%s તરીકે rpm એ %s રચ્યું પરંતુ તફાવત જુદો પાડવા તેઅશક્ય હતું"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4583,51 +4626,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "વધારાનું rpm આઉટપુટ:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s નું બેકઅપ રચાયું"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "એન્ટ્રી મળી નહીં."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "એન્ટ્રી મળી નહીં."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "એન્ટ્રી મળી નહીં."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4755,73 +4798,73 @@ msgstr "અમાન્ય પારમિતિ મેપ  સ્પ્લિ
 msgid "Invalid parameter array join separator character"
 msgstr "અમાન્ય પારમિતિ એરે જોઇન સ્પ્લિટ સેપરેટર કેરેક્ટર"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "જોડાય ત્યારે કમાન્ડ અમલમાં મૂકવો"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "%s શોધાઈ શકતો નથી."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "%s શોધાઈ શકતો નથી."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4972,6 +5015,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4991,6 +5038,96 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "હા"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "ના"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "પૂર્ણ થયું"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "ભૂલ"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "ચેતવણી"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "ભૂલ"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "ચાલુ રાખવું છે? "
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "ચેતવણી"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "શરૂ થઇ રહ્યું છે..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr " મળ્યું નથી "
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "હા"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ના"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે."
index a1cb20f..030df45 100644 (file)
--- a/po/he.po
+++ b/po/he.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2004-08-09 10:24+0200\n"
 "Last-Translator: xxx <yyy@example.org>\n"
 "Language-Team: Hebrew <i18n@suse.de>\n"
@@ -4193,52 +4193,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4246,44 +4246,44 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
 #  Frame title for installation target hard disk / partition(s)
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "מתקין על:"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4293,45 +4293,45 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #  Frame title for installation target hard disk / partition(s)
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "מתקין על:"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4405,7 +4405,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4433,25 +4433,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4512,7 +4522,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4629,7 +4639,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4637,324 +4647,349 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
 # IT
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "התקן"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4962,72 +4997,80 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #  Commandline help title
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "קורא קובץ הגדרות"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5035,13 +5078,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5052,48 +5095,48 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "מידע נוסף"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, fuzzy, c-format, boost-format
 msgid "created backup %s"
 msgstr "אל תיצור גיבויים"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -5220,73 +5263,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "פקודה לביצוע כאשר מתחברים"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Couldn't open file: %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5438,6 +5481,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5457,6 +5504,97 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "כן"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "לא"
+
+# ID
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "אינדונזיה"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "שגיאה"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "שגיאה"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "לא מחובר"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+#, fuzzy
+msgid "yes"
+msgstr "כן"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "ארכיטקטורה:"
index 5afd549..75d13cc 100644 (file)
--- a/po/hi.po
+++ b/po/hi.po
@@ -4,7 +4,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.hi\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2021-04-08 15:57+0000\n"
 "Last-Translator: Panwar <caspian7pena@gmail.com>\n"
 "Language-Team: Hindi <https://l10n.opensuse.org/projects/libzypp/master/hi/"
@@ -3712,52 +3712,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "लेखन के लिए फाइल नहीं खोल सकता है।"
@@ -3765,44 +3765,44 @@ msgstr "लेखन के लिए फाइल नहीं खोल सक
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "डेस्कटॉप आइटम '%s'"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "डायरेक्टरी को सृजित नहीं कर सकता %1 : %2"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3812,44 +3812,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "फ्लोपी डिस्क पढ़ने में त्रुटि।"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "संसाधन जोड़ रहा"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "अमान्य निर्यात फाइलनाम।"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "संसाधन जोड़ रहा"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "डेस्कटॉप आइटम '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3919,7 +3919,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3947,25 +3947,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "अमान्य Url स्कीम '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4032,7 +4042,7 @@ msgid "No url in repository."
 msgstr "कोष में फाइल %1 नहीं प्राप्त हुई।"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4151,7 +4161,7 @@ msgstr "सिर्फ यहां पर इस आवश्यकता क
 msgid "generally ignore of some dependencies"
 msgstr "सिर्फ यहां पर इस आवश्यकता की अनदेखी कर दें"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4159,329 +4169,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "के लिए कनेक्शन आवेदन : "
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "निर्भरता समस्याओं के कारण %s का संस्थापन नहीं कर सकता"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "कोई नहीं %s प्रदान करता"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "अनुरोध पहले से ही मौजूद है।"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "जैसा निर्देशित था, संस्थापन छोड़ दिया गया।"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "निष्‍पादन"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4489,73 +4524,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "कुंजी एन्क्रिप्शन के दौरान त्रुटि।"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "विफल"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s हेतु विन्यास फ़ाइलें जिन्हें बदला गया :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s के  रूप में %s सहेजा लेकिन अंतर निर्धारित करना असंभव था "
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4565,13 +4608,13 @@ msgstr ""
 "यहां अंतर की पहली 25 पंक्तियां हैं :\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s के  रूप में %s सृजित किया लेकिन अंतर निर्धारित करना असंभव था"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4584,51 +4627,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "अतिरिक्त rpm आउटपुट :"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "बैकअप %s सृजित"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "%s %s नहीं मिला"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "%s %s नहीं मिला"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "%s %s नहीं मिला"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4755,73 +4798,73 @@ msgstr "अमान्य मानक मानचित्र सेपरे
 msgid "Invalid parameter array join separator character"
 msgstr "अमान्य मानक क्रमविन्यास सेपरेटर वर्ण जोड़ें"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "जब कनेक्ट हो रहे हों तब चलाया जाने वाला कमांड"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "%s को नहीं ढूंढ सकता।"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "%s को नहीं ढूंढ सकता।"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4972,6 +5015,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4991,6 +5038,96 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "हाँ"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "नहीं"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "हो गया"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "त्रुटि"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "चेतावनी"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "खराबी"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "जारी रखें?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "चेतावनी"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "आरंभ हो रहा है..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "नहीं मिला"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "हाँ"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "नहीं"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।"
index bfaa38c..ab2b7cb 100644 (file)
--- a/po/hr.po
+++ b/po/hr.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.hr\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2011-04-03 12:05+0200\n"
 "Last-Translator: Krešimir Jozić <kjozic@gmail.com>\n"
 "Language-Team: Croatian <kde-i18n-doc@kde.org>\n"
@@ -3856,52 +3856,52 @@ msgstr[2] "(istječe unutar 24 sata)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repozitorija ne može započeti s točkom."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3909,45 +3909,45 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ne mogu napraviti %s: %m\n"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Ne mogu napraviti datoteku."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3957,44 +3957,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ne mogu obrisati '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4064,7 +4064,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4092,25 +4092,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Neispravan regularni izraz '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4171,7 +4181,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4288,7 +4298,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4296,394 +4306,427 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 #, fuzzy
 msgid "unsupported request"
 msgstr "nije podržano"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr "izvršeno"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr "izvršavanje nije uspjelo"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4691,13 +4734,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4708,47 +4751,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4875,72 +4918,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Ne mogu obrisati '%s'"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5090,6 +5133,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5109,6 +5156,95 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Da"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ne"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "gotovo"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "greška"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Upozorenje:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Greška"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Nastaviti?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Upozorenje:"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Dohvaćam:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "pokrećem"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Datoteka nije pronađena: {0}"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "pomoć nije raspoloživa za ovaj izbor"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "da"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ne"
+
 #~ msgid "problem with installed package %s"
 #~ msgstr "problem s instaliranim paketom %s"
 
index 6415b55..7413d44 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -18,7 +18,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.hu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2019-03-23 20:19+0000\n"
 "Last-Translator: Robert Taisz <robert.taisz@emerald.hu>\n"
 "Language-Team: Hungarian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -3989,25 +3989,25 @@ msgstr[1] "(%d napon belül lejár)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "%1% azonosítójú gpg-kulcs keresése a gyorsítótárban (%2%)."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "%1% azonosítójú gpg-kulcs keresése a telepítési forrásban (%2%)."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "A(z) %1% telepítési forrás nem definiál további 'gpgkey=' URL-címeket."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
@@ -4015,30 +4015,30 @@ msgstr ""
 "megtagadta az engedélyt"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Nem sikerült a(z) '%s' könyvtár beolvasása."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 "A következő telepítésiforrás-fájl nem olvasható: '%1%': A rendszer "
 "megtagadta az engedélyt"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "A telepítési forrás álneve nem kezdődhet ponttal."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "A szolgáltatás álneve nem kezdődhet ponttal."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "A '%s' fájl nem nyitható meg írásra."
@@ -4046,45 +4046,45 @@ msgstr "A '%s' fájl nem nyitható meg írásra."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Ismeretlen '%1%' szolgáltatás: az árva '%2%' szolgáltatástároló eltávolítása"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "A megadott URL-címen nem találhatók érvényes metaadatok"
 msgstr[1] "A megadott URL-címeken nem találhatók érvényes metaadatok"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "A(z) %s nem hozható létre"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Nem hozható létre a metaadat gyorsítótár-könyvtára."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "A(z) '%s' telepítési forrás gyorsítótárának felépítése"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Írási engedélyek hiányában nem hozható létre gyorsítótár a(z) %s helyen."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Nem sikerült a tároló gyorsítótárazása (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Nem kezelt tárolótípus"
 
@@ -4094,44 +4094,44 @@ msgstr "Nem kezelt tárolótípus"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Hiba történt a következőből való olvasás során: \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ismeretlen hiba a '%s' beolvasása közben"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "A(z) '%s' telepítési forrás hozzáadása"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Érvénytelen tárolónév: '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "A(z) '%s' telepítési forrás eltávolítása"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Nem sikerült a tároló felismerése."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "A(z) '%s' törlése sikertelen"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Nem sikerült a szolgáltatás felismerése."
 
@@ -4210,7 +4210,7 @@ msgstr "További ügyfélszerződés szükséges a támogatáshoz."
 msgid "Unknown support option. Description not available"
 msgstr "Ismeretlen támogatási opció. Leírás nem található"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4240,13 +4240,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Érvénytelen reguláris kifejezés '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Felhasználóhitelesítés szükséges ehhez: '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4254,7 +4264,7 @@ msgstr ""
 "Keresse fel a SUSE Ügyfélközpontot, és ellenőrizze, hogy a regisztrációja "
 "érvényes-e, illetve nem járt-e le."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4262,7 +4272,7 @@ msgstr ""
 "Látogassa meg a Novell Ügyfélközpotot (Novell Customer Center), hogy "
 "ellenőrizni tudja, hogy a regisztrációja érvényes és nem jár re."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4325,7 +4335,7 @@ msgid "No url in repository."
 msgstr "A telepítés forrás nem tartalmaz url-t."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4490,7 +4500,7 @@ msgstr "%s csomag megtörése néhány függőség figyelmen kívül hagyásáva
 msgid "generally ignore of some dependencies"
 msgstr "egyes függőségek általános mellőzése"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4498,151 +4508,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "ütköző kérelmek"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "bizonyos függőségi probléma"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "nem támogatott kérelem"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "törölt csomagok: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4650,225 +4660,258 @@ msgstr ""
 "\n"
 "nem telepíthető szolgáltatók: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "nem telepíthető szolgáltatók: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "A kért módosítás a rendszer meghibásodásához vezet!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "a hibás rendszer figyelmeztetésének figyelmen kívül hagyása"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "'%1%' %%posttrans parancsfájl végrehajtása"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "%posttrans parancsfájlok végrehajtása"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "A kérésnek megfelelően a telepítés megszakad."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " végrehajtva"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " végrehajtás sikertelen"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s már futtatva volt mint %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " megszakítás közben a végrehajtás átugorva"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Hiba történt a frissítési értesítés küldésekor."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Új frissítési üzenet"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM sikertelen: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nem sikerült a(z) %1% fájlból importálni a publikus kulcsot"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "A(z) %1% publikus kulcs eltávolítása sikertelen"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
@@ -4877,13 +4920,13 @@ msgstr ""
 # menuentries/menuentry_lan_sendmail.ycp:14
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s módosított konfigurációs fájljai:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4891,7 +4934,7 @@ msgstr ""
 "különbséget"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4901,7 +4944,7 @@ msgstr ""
 "A különbség első 25 sora:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4909,7 +4952,7 @@ msgstr ""
 "különbséget"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4922,47 +4965,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "További rpm kimenet"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s másolata létrehozva"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Az aláírás rendben van"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Ismeretlen típusú aláírás"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Az aláírás nem felelt meg az ellenőrzésen"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Az aláírás rendben van, de a kulcs nem megbízható"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Az aláírások nyilvános kulcsa nem érhető el"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "A fájl nem létezik, vagy nem ellenőrizhető az aláírása"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "A fájl nincs aláírva"
 
@@ -5093,73 +5136,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr "Érvénytelen tömbösszefűzés-elválasztó (array join separator) karakter"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "A parancs a következő állapottal lépett ki: %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "A parancs végrehajtását a(z) %d szignál megszakította (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "A parancs végrehajtása ismeretlen hibával leállt."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "A chroot sikertelen ide: '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Sikertelen chdir a(z) '%s' könyvtárra (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 "Sikertelen chdir a(z) '%s' könyvtárra a következő gyökéren belül: '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "'%s' végrehajtása sikertelen (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "A forkolás sikertelen (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5317,6 +5360,10 @@ msgstr ""
 " hiba az SSL-tanúsítvánnyal, ellenőrizze, hogy megfelelő-e a CA tanúsítványa "
 "a következőhöz: '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5336,6 +5383,100 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Igen"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nem"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "kész"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "hiba"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Megjegyzés:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Figyelmeztetés:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Hiba:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Folytatja?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Figyelmeztetés: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Letöltés:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "indítás"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "nem található"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Ennél a parancssornál nem érhető el a súgó."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "ehhez a paraméterhez nem tartozik súgó"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "az összes lehetőség megjelenítése"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "igen"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nem"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "'%1%' %%posttrans parancsfájl végrehajtása"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "%posttrans parancsfájlok végrehajtása"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "A csomag nincs aláírva."
 
index e16694c..68d3fce 100644 (file)
--- a/po/id.po
+++ b/po/id.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-05-20 11:13+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-09-23 11:15+0000\n"
 "Last-Translator: Kukuh Syafaat <syafaatkukuh@gmail.com>\n"
 "Language-Team: Indonesian <https://l10n.opensuse.org/projects/libzypp/master/"
 "id/>\n"
@@ -4146,52 +4146,52 @@ msgstr[0] "(Kedaluwarsa dalam %d hari)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Mencari kunci gpg ID %1% dalam singgahan %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Mencari kunci gpg ID %1% dalam repositori %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repositori %1% tidak mendefinisikan 'gpgkey=' URL tambahan."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Tidak dapat membaca direktori repo '%1%': Izin ditolak"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Gagal membaca direktori '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Tidak dapat membaca berkas repo '%1%': Izin ditolak"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repositori tidak dapat dimulai dengan titik."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Alias layanan tidak dapat dimulai dengan titik."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Tidak dapat membuka berkas '%s' untuk menulis."
@@ -4199,7 +4199,7 @@ msgstr "Tidak dapat membuka berkas '%s' untuk menulis."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
@@ -4207,36 +4207,36 @@ msgstr ""
 "terpakai '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Metadata yang valid tidak ditemukan pada URL yang ditentukan"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Tidak dapat membuat %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Tidak dapat membuat metadata direktori singgahan."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Membangun repositori singgahan '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Tidak dapat membuat singgahan di %s - tidak ada izin untuk menulis."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Gagal untuk membuat repo singgahan (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Jenis repositori yang tidak tertangani"
 
@@ -4246,44 +4246,44 @@ msgstr "Jenis repositori yang tidak tertangani"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Galat saat membaca dari '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Galat tidak diketahui dari '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Menambah repositori '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nama berkas repo tidak valid di '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Menghapus reposotori '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Tidak dapat mengetahui di mana repo disimpan."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Tidak dapat menghapus '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Tidak dapat mengetahui di mana layanan disimpan."
 
@@ -4364,7 +4364,7 @@ msgstr "Kontrak pelanggan tambahan diperlukan untuk mendapatkan dukungan."
 msgid "Unknown support option. Description not available"
 msgstr "Opsi dukungan tidak diketahui. Deskripsi tidak ditemukan"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4394,13 +4394,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ekspresi reguler '%s' tidak valid"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentikasi dibutuhkan untuk '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Akan mencoba lagi..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Menyerah setelah %1% mencoba."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4408,7 +4418,7 @@ msgstr ""
 "Kunjungi Pusat Pelanggan SUSE untuk memeriksa apakah pendaftaran Anda valid "
 "dan belum kedaluwarsa."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4416,7 +4426,7 @@ msgstr ""
 "Kunjungi Pusat Pelanggan Novell untuk memeriksa apakah pendaftaran Anda "
 "valid dan tidak kedaluwarsa."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4481,7 +4491,7 @@ msgid "No url in repository."
 msgstr "Tidak ada url pada repositori."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4647,7 +4657,7 @@ msgstr "patahkan %s dengan mengabaikan beberapa dependensi"
 msgid "generally ignore of some dependencies"
 msgstr "umumnya mengabaikan beberapa dependensi"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4655,84 +4665,84 @@ msgid ""
 msgstr "%1% yang dipasang bukan milik repositori distupgrade dan harus diganti"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "yang akan dipasang %1% bukan milik repositori distupgrade"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "%1% yang terpasang memiliki arsitektur yang lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "yang akan dipasang %1% memiliki arsitektur yang lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "masalah dengan %1% yang terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "permintaan konflik"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "beberapa dependensi bermasalah"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "tidak ada yang menyediakan '%1%' yang diminta"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Apakah Anda mengaktifkan semua repositori yang diperlukan?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "paket yang diminta %1% tidak ada"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "permintaan tidak didukung"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' disediakan oleh sistem dan tidak dapat dihapus"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% tidak dapat dipasang"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "tidak ada yang menyediakan '%1%' yang diperlukan oleh %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "tidak ada yang menyediakan '%1%' yang diperlukan untuk dipasang %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "tidak dapat memasang %1% dan %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "konflik %1% yang dipasang dengan '%2%' yang disediakan oleh %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4740,7 +4750,7 @@ msgstr ""
 "%1% yang dipasang bertentangan dengan '%2%' yang disediakan oleh yang akan "
 "dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4748,7 +4758,7 @@ msgstr ""
 "yang akan dipasang %1% konflik dengan '%2%' yang disediakan oleh %3% yang "
 "terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4757,40 +4767,40 @@ msgstr ""
 "yang akan dipasang %1% konflik dengan '%2%' disediakan oleh yang akan "
 "dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "%1% usang yang terpasang '%2%' disediakan oleh %3% yang terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "%1% usang yang terpasang '%2%' disediakan oleh yang akan dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "yang akan dipasang %1% usang '%2%' disediakan oleh %3% yang terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "yang akan dipasang %1% usang '%2%' disediakan oleh yang akan dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "konflik %1% yang dipasang dengan '%2%' yang disediakan dengan sendirinya"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "yang akan dipasang %1% konflik dengan '%2%' yang disediakan sendiri"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4798,7 +4808,7 @@ msgstr ""
 "%1% yang dipasang membutuhkan '%2%', tetapi persyaratan ini tidak dapat "
 "disediakan"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4807,11 +4817,11 @@ msgstr ""
 "yang akan dipasang %1% membutuhkan '%2%', tetapi persyaratan ini tidak dapat "
 "disediakan"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "penyedia dihapus: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4819,17 +4829,17 @@ msgstr ""
 "\n"
 "penyedia tidak dapat dihapus: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "penyedia tidak dapat dihapus: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% belum sepenuhnya terintegrasi ke dalam %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4838,114 +4848,139 @@ msgstr ""
 "tambalan pemeliharaan."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"Menghapus %1% yang dipasang dalam konteks ini akan menghapus (bukan "
+"mengganti!) paket PTF yang disertakan juga."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"PTF harus dihapus dengan memanggil '%1%'. Ini akan memutakhirkan paket PTF "
+"yang disertakan alih-alih menghapusnya."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+"Biasanya Anda ingin mempertahankan PTF atau memilih untuk membatalkan "
+"tindakan."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "%1% yang dipasang memblokir tindakan yang diinginkan."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 "Biasanya Anda ingin mempertahankan PTF dan memilih untuk membatalkan "
 "tindakan."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "hapus kunci untuk memungkinkan penghapusan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "jangan pasang %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "pertahankan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "hapus kunci untuk memungkinkan pemasangan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Permintaan ini akan merusak sistem anda!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "abaikan peringatan sistem yang rusak"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "jangan meminta untuk memasang solvable yang menyediakan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "jangan meminta untuk menghapus semua solvables yang menyediakan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "jangan memasang versi terbaru %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "pertahankan %1% meskipun arsitekturnya lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "pasang %1% meskipun arsitekturnya lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "biarkan usang %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "pasang %1% dari repositori yang dikecualikan"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "pasang %1% meskipun telah ditarik kembali"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "memungkinkan untuk memasang PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "pasang %1% meskipun masuk daftar hitam"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "turunkan %1% ke %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "perubahan arsitektur dari %1% menjadi %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4954,7 +4989,7 @@ msgstr ""
 "pasang %1% (dengan perubahan vendor)\n"
 "  %2% --> %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4963,101 +4998,117 @@ msgstr ""
 "pasang %1% dari vendor %2%\n"
 "  menggantikan %3% dari vendor %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "penggantian %1% dengan %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "pemasangan ulang %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "Menjalankan skrip pasca transaksi"
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Menjalankan skrip '%1%' %%posttrans"
+msgid "Running %1% script"
+msgstr "Menjalankan skrip %1%."
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Menjalankan skrip %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "%1% keluaran skrip:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Pemasangan dibatalkan sesuai perintah."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " tereksekusi"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " eksekusi gagal"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s sudah dieksekusi sebagai %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " eksekusi dilewati saat membatalkan"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Galat mengirim pesan notifikasi pemutakhiran."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Pesan baru"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"Sinyal yang diterima :\"%1% (%2%)\", untuk memastikan konsistensi sistem, "
+"tidak mungkin membatalkan transaksi rpm yang sedang berjalan."
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "Mengeksekusi transaksi gagal karena masalah berikut:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM gagal: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Gagal mengimpor kunci publik %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Gagal menghapus kunci publik %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "Header paket tidak ditandatangani!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "Payload paket tidak ditandatangani!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Mengubah berkas konfigurasi untuk %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5065,7 +5116,7 @@ msgstr ""
 "perbedaannya"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5075,7 +5126,7 @@ msgstr ""
 "Ini adalah perbedaan 25 baris pertama:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5083,7 +5134,7 @@ msgstr ""
 "perbedaannya"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5096,47 +5147,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Keluaran rpm tambahan"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "membuat cadangan %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Tanda tangan OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tanda tangan tidak dikenal"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Tanda tangan tidak terverifikasi"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Tanda tangan OK, tetapi kunci tidak terpercaya"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Tanda tangan kunci publik tidak tersedia"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Berkas tidak ada atau tanda tangan tidak dapat diperiksa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Berkas tidak ditandatangani"
 
@@ -5263,72 +5314,72 @@ msgstr "Karakter pemisah parameter map tidak valid"
 msgid "Invalid parameter array join separator character"
 msgstr "Karakter pemisah susunan join tidak valid"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Perintah berhenti dengan status %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Perintah terhenti oleh sinyal %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Perintah berhenti dengan galat yang tidak diketahui."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Argumen spawn yang diberikan tidak valid."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Tidak dapat membuat pipa kontrol."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Tidak dapat chroot untuk '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Tidak dapat membuka ke '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Tidak dapat chdir ke '%s' dalam chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Tidak dapat mengeksekusi '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Tidak dapat melakukan fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Tak bisa eksekusi '%s', chdir gagal (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Tak bisa eksekusi '%s', chroot gagal (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Tak bisa eksekusi '%s', eksekusi gagal (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Tak bisa eksekusi '%s', kesalahan tak terduga."
@@ -5481,6 +5532,10 @@ msgstr "Lokasi '%s' tidak dapat diakses sementara waktu."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " Masalah SSL Sertifikat, pastikan CA cert sudah benar untuk '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Tidak ada sumber daya bebas yang tersedia untuk melampirkan media."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5504,6 +5559,101 @@ msgstr ""
 "Kesalahan unduhan (curl) untuk '%s':\n"
 "Tidak dapat mengambil respon HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ya"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Tidak"
+
+# ID
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "selesai"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "perhatian"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "galat"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Catatan:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Peringatan:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Galat:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Lanjutkan?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Peringatan: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Mengambil:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "mulai"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "tidak ditemukan"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Tidak ada bantuan yang tersedia untuk permintaan ini."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "tidak ada bantuan yang tersedia untuk opsi ini"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "tampilkan semua opsi"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ya"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "tidak"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Menjalankan skrip '%1%' %%posttrans"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Menjalankan skrip %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Paket tidak ditandatangani!"
 
index 2302bbf..bd07f9a 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -14,8 +14,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-04 18:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-02-07 15:14+0000\n"
 "Last-Translator: Davide Aiello <davide.aiello@novilingulists.com>\n"
 "Language-Team: Italian <https://l10n.opensuse.org/projects/libzypp/master/it/"
 ">\n"
@@ -3715,52 +3715,52 @@ msgstr[1] "(scade entro %d giorni)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Ricerca dell'ID %1% della chiave GPG nella cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Ricerca dell'ID %1% della chiave GPG nel repository %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Il repository %1% non definisce URL aggiuntivi 'gpgkey=' ."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Impossibile leggere la directory '%1%' del repository: permesso negato"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Impossibile leggere la directory '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Impossibile leggere il file '%1%' del repository: permesso negato"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "L'alias di un repository non può iniziare con un punto."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "L'alias di un servizio non può iniziare con un punto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Impossibile aprire il file '%s' in scrittura."
@@ -3768,44 +3768,44 @@ msgstr "Impossibile aprire il file '%s' in scrittura."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Servizio '%1%' sconosciuto: rimozione del repository dei servizi orfani '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Non sono stati trovati metadati validi all'URL specificato"
 msgstr[1] "Non sono stati trovati metadati validi agli URL specificati"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Impossibile creare %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Impossibile creare la directory della cache dei metadati."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Costruzione della cache del repository '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Impossibile creare la cache in %s - permessi di scrittura mancanti."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Impossibile creare la cache del repo (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Tipo di repository non gestito"
 
@@ -3815,44 +3815,44 @@ msgstr "Tipo di repository non gestito"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Errore durante il tentativo di lettura da '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Errore sconosciuto durante la lettura da '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Aggiunta del repository '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nome file del repository non valido a '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Rimozione del repository '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Impossibile trovare ubicazione di memorizzazione del repository."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Impossibile eliminare '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Impossibile trovare ubicazione di memorizzazione del servizio."
 
@@ -3934,7 +3934,7 @@ msgstr "È necessario un contratto cliente aggiuntivo per ottenere supporto."
 msgid "Unknown support option. Description not available"
 msgstr "Opzione di supporto sconosciuta. Descrizione non disponibile"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3964,13 +3964,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Espressione regolare '%s' non valida"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "È richiesta l'autenticazione per '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Verrà eseguito un nuovo tentativo..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "L'operazione verrà annullata dopo %1% tentativi."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3978,7 +3988,7 @@ msgstr ""
 "Visitare SUSE Customer Center per verificare se la registrazione è valida e "
 "che non sia scaduta."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3986,7 +3996,7 @@ msgstr ""
 "Visitare Novell Customer Center per verificare che la registrazione sia "
 "valida e che non sia scaduta."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4050,7 +4060,7 @@ msgid "No url in repository."
 msgstr "Nessun URL nel repository."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Supporto previsto %1%/%2% identificato dal file '%3%' con contenuto:"
@@ -4215,7 +4225,7 @@ msgstr "installa comunque %s ignorando alcune delle sue dipendenze"
 msgid "generally ignore of some dependencies"
 msgstr "generalmente ignora alcune dipendenze"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4225,98 +4235,98 @@ msgstr ""
 "distribuzione e deve essere sostituito"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "%1% da installare non appartiene a un repository di aggiornamento della "
 "distribuzione"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "%1% installato presenta un'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1% da installare presenta un'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema con %1% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "richieste in conflitto"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "alcuni problemi di dipendenze"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nessun elemento fornisce '%1%' obbligatorio"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Sono stati abilitati tutti i repository richiesti?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "il pacchetto richiesto %1% non esiste"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "richiesta non supportata"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' viene fornito dal sistema e non può essere cancellato"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% non è installabile"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nessun elemento fornisce '%1%' obbligatorio per %2% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "nessun elemento fornisce '%1%' obbligatorio per %2% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "impossibile installare %1% e %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "%1% installato è in conflitto con '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "%1% installato è in conflitto con '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "%1% da installare è in conflitto con '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4324,45 +4334,45 @@ msgid ""
 msgstr ""
 "%1% da installare è in conflitto con '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "%1% installato rende obsoleto '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "%1% installato rende obsoleto '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "%1% da installare rende obsoleto '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "%1% da installare rende obsoleto '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "%1% installato è in conflitto con '%2%' fornito da se stesso"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "%1% da installare è in conflitto con '%2%' fornito da se stesso"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "%1% installato richiede '%2%', ma non è possibile fornire questo requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4370,11 +4380,11 @@ msgid ""
 msgstr ""
 "%1% da installare richiede '%2%', ma non è possibile fornire questo requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "provider cancellati: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4382,17 +4392,17 @@ msgstr ""
 "\n"
 "impossibile installare i provider: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "provider non installabili: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% non è ancora completamente integrato in %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4401,114 +4411,139 @@ msgstr ""
 "patch di manutenzione."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"In questo contesto, la rimozione della %1% installata rimuoverà (non "
+"sostituirà) anche i pacchetti PTF inclusi."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"Rimuovere la PTF richiamando '%1%'. In tal modo i pacchetti PTF inclusi "
+"verranno aggiornati anziché rimossi."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+"Di norma si suppone di voler mantenere la PTF o scegliere di annullare "
+"l'azione."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "%1% installato blocca l'azione desiderata."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 "In genere, è consigliabile mantenere il PTF e scegliere di annullare "
 "l'azione."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "rimuovi il blocco per consentire la rimozione di %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "non installare %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "mantieni %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "rimuovi il blocco per consentire l'installazione di %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Questa richiesta potrebbe danneggiare il sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignora avviso di sistema malfunzionante"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "non chiedere di installare un risolubile che fornisce %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "non chiedere di eliminare tutti i risolubili che forniscono %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "non installare la versione più recente di %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantieni %1% nonostante l'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "installa %1% nonostante l'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantieni %1% obsoleto"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "installa %1% dal repository escluso"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "installare %1% anche se è stato ritirato"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "consentire installazione di PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "Installare %1% anche se è nella black list"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "downgrade di %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "modifica di architettura di %1% in %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4517,7 +4552,7 @@ msgstr ""
 "installa %1% (con cambio di fornitore)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4526,103 +4561,117 @@ msgstr ""
 "installa %1% dal fornitore %2%\n"
 "  sostituzione di %3% del fornitore %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "sostituzione di %1% con %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "disinstallazione di %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Esecuzione dello script %%posttrans '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Esecuzione degli script %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "L'installazione è stata interrotta come indicato."
 
 # TLABEL modules/inst_config_x11.ycp:578
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " eseguito"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " esecuzione non riuscita"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s già eseguito come %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " esecuzione saltata durante l'annullamento"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Errore nell'invio della notifica del messaggio di aggiornamento."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nuovo messaggio di aggiornamento"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 "L'esecuzione della transazione non è riuscita a causa dei seguenti problemi:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM non riuscito: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Errore importazione della chiave pubblica %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Errore rimozione della chiave pubblica %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
-msgstr ""
+msgstr "L'intestazione del pacchetto non è firmata!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
-msgstr ""
+msgstr "Il contenuto del pacchetto non è firmato!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "File di configurazione modificati per %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4630,7 +4679,7 @@ msgstr ""
 "differenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4640,7 +4689,7 @@ msgstr ""
 "Di seguito sono riportate le prime 25 righe di differenza:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4648,7 +4697,7 @@ msgstr ""
 "differenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4661,47 +4710,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Output aggiuntivo di rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "creata copia di backup di %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "La firma è corretta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tipo di firma sconosciuto"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "La firma non è verificabile"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "La firma è corretta, ma non è attendibile"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "La chiave pubblica delle firme non è disponibile"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Il file non esiste o la firma non può essere verificata"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "File non firmato"
 
@@ -4830,73 +4879,73 @@ msgstr "Carattere di separazione di divisione mappa di parametri non valido"
 msgid "Invalid parameter array join separator character"
 msgstr "Carattere di separazione unione della matrice di parametri non valido"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Il comando è terminato con stato %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Il comando è stato terminato dal segnale %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Il comando è terminato con un errore sconosciuto."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Argomenti di distribuzione non validi forniti."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Impossibile creare la pipe di controllo."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Impossibile eseguire il comando chroot in '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Impossibile eseguire chdir verso '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Impossibile eseguire chdir verso '%s' dentro la chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Impossibile eseguire '%s' (%s)."
 
 # TLABEL modules/installation.ycp:287
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Impossibile eseguire il comando fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Impossibile eseguire '%s', chdir non riuscito (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Impossibile eseguire '%s', chroot non riuscito (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Impossibile eseguire '%s'; esecuzione non riuscita (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Impossibile eseguire '%s', errore inaspettato."
@@ -5052,6 +5101,10 @@ msgstr ""
 " Problemi con il certificato SSL, verificare che il certificato CA sia "
 "valido per '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Nessuna risorsa gratuita disponibile da collegare al supporto."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5075,6 +5128,102 @@ msgstr ""
 "Errore di download (curl) per '%s':\n"
 "Impossibile recuperare la risposta HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Sì"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "No"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "fine"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "attenzione"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "errore"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Nota:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Avvertenza:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Errore:"
+
+# internal key used: Ok
+# internal key used: Ok
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Continuare?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Avvertenza: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Recupero di:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "avvio"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "non trovato"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Nessun aiuto disponibile per questa richiesta."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "nessun aiuto disponibile per questa opzione"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "mostra tutte le opzioni"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "sì"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "no"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Esecuzione dello script %%posttrans '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Esecuzione degli script %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Il pacchetto non è firmato!"
 
index 19a65ac..c0d8315 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-15 12:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-09-21 16:15+0000\n"
 "Last-Translator: Yasuhiko Kamata <belphegor@belbel.or.jp>\n"
 "Language-Team: Japanese <https://l10n.opensuse.org/projects/libzypp/master/"
 "ja/>\n"
@@ -3708,54 +3708,54 @@ msgstr[0] "(あと %d 日で期限切れ)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "キャッシュ %2% 内で gpg 鍵 ID %1% を検索しています。"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "リポジトリ %2% 内で gpg 鍵 ID %1% を検索しています。"
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "リポジトリ %1% は 'gpgkey=' で追加の URL を指定していません。"
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 "リポジトリのディレクトリ '%1%' を読み込むことができません: 許可がありません"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ディレクトリ '%s' の読み込みに失敗しました"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 "リポジトリのファイル '%1%' を読み込むことができません: 許可がありません"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "リポジトリの別名をドットから始めることはできません。"
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "サービスの別名をドットから始めることはできません。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "ファイル '%s' を書き込み用に開くことができません。"
@@ -3763,43 +3763,43 @@ msgstr "ファイル '%s' を書き込み用に開くことができません。
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "不明なサービス '%1%' です: 孤立したサービスリポジトリ '%2%' を削除しています"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "指定した URL には正しいメタデータがありません"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s を作成できません"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "メタデータのキャッシュディレクトリを作成できません。"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "リポジトリ '%s' のキャッシュを構築しています"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "%s にキャッシュを作成できません - 書き込み許可がありません。"
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "リポジトリ (%d) のキャッシュに失敗しました。"
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "未処理のリポジトリタイプ"
 
@@ -3809,44 +3809,44 @@ msgstr "未処理のリポジトリタイプ"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "'%s' から読み取り時にエラーが発生しました"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "'%s' からの読み取り時に不明なエラーが発生しました"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "リポジトリ '%s' を追加しています"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s' にあるリポジトリのファイル名が正しくありません"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "リポジトリ '%s' を削除しています"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "リポジトリがどこに保存されたのかがわかりません。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' を削除することができません"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "サービスの保管場所がわかりません。"
 
@@ -3923,7 +3923,7 @@ msgstr "サポートを得るには、追加の顧客契約が必要です。"
 msgid "Unknown support option. Description not available"
 msgstr "不明なサポートオプションです。説明は利用できません"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3953,13 +3953,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "正規表現 '%s' が正しくありません"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' にアクセスするにはユーザ認証が必要です"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "再試行しています..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "%1% 回再試行したので中止しています。"
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3967,7 +3977,7 @@ msgstr ""
 "SUSE カスタマーセンターを開いて、お使いの登録が有効であること、および期限切れ"
 "になっていないことをご確認ください。"
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3975,7 +3985,7 @@ msgstr ""
 "Novellカスタマーセンターへアクセスし、登録が有効であるか、有効期限切れになっ"
 "ていないかを確認してください。"
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4037,7 +4047,7 @@ msgid "No url in repository."
 msgstr "リポジトリにURLが設定されていません。"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4204,7 +4214,7 @@ msgstr "いくつかの依存関係を無視することによって %s を壊
 msgid "generally ignore of some dependencies"
 msgstr "いくつかの依存関係をおおよそ無視する"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4214,90 +4224,90 @@ msgstr ""
 "ればならないものです"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "これからインストールする %1% は distupgrade リポジトリに属していません"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "インストール済みの %1% は下位のアーキテクチャに属しています"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "これからインストールする %1% は下位のアーキテクチャに属しています"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "インストール済みの %1% に問題があります"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "要求が矛盾しています"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "何らかの依存関係の問題"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "要求された '%1%' を提供するものがありません"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
-msgstr "å¿\85è¦\81ã\81ªã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\82\92å\85¨ã\81¦æ\9c\89å\8a¹å\8c\96ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8bã\81©ã\81\86ã\81\8bã\81\94確èª\8dã\81\8fã\81 ã\81\95ã\81\84ã\80\82"
+msgstr "å¿\85è¦\81ã\81ªã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\82\92å\85¨ã\81¦æ\9c\89å\8a¹å\8c\96ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\81\8b?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "要求されたパッケージ %1% は存在していません"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "サポートされていない要求"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' はシステム側で提供されているものであり、消去できません"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% はインストールできません"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 "インストール済みの %2% によって必要とされている '%1%' を提供するものがありま"
 "せん"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "これからインストールする %2% によって必要とされている '%1%' を提供するものが"
 "ありません"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "%1% と %2% を同時にインストールすることはできません"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' と"
 "矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4305,7 +4315,7 @@ msgstr ""
 "インストール済みの %1% は、これからインストールする %3% によって提供される "
 "'%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4313,7 +4323,7 @@ msgstr ""
 "これからインストールする %1% は、インストール済みの %3% によって提供される "
 "'%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4322,28 +4332,28 @@ msgstr ""
 "これからインストールする %1% は、これからインストールする %3% によって提供さ"
 "れる '%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' を"
 "廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' を"
 "廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "これからインストールする %1% は、インストール済みの %3% によって提供される "
 "'%2%' を廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4351,17 +4361,17 @@ msgstr ""
 "これからインストールする %1% は、これからインストールする %2% によって提供さ"
 "れる '%2%' を廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "インストール済みの %1% は、それ自身が提供する '%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "これからインストールする %1% は、それ自身が提供する '%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4369,7 +4379,7 @@ msgstr ""
 "インストール済みの %1% は '%2%' を必要としていますが、この要件を満たすものが"
 "ありません"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4378,11 +4388,11 @@ msgstr ""
 "これからインストールする %1% は '%2%' を必要としていますが、この要件を満たす"
 "ものがありません"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "削除したプロバイダ: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4390,17 +4400,17 @@ msgstr ""
 "\n"
 "インストール不可能なプロバイダ: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "インストール不可能なプロバイダ: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% は未だ %2% に完全統合されていません。"
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4409,112 +4419,135 @@ msgstr ""
 "が一般的です。"
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"この状況下において、インストールされている %1% を削除すると、その中に含まれて"
+"いる PTF パッケージも削除 (置換ではありません!) することになります。"
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"PTF を削除したい場合は、 '%1%' を実行してください。このコマンドを実行すること"
+"により、 PTF パッケージを削除せずに更新できます。"
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "PTF はそのまま維持するか、処理をキャンセルするのが一般的です。"
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "インストール済みの %1% が処理をブロックしています。"
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "PTF をそのまま維持し、この処理をキャンセルするのが一般的です。"
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "%1% を削除できるようにするには、ロックを解除してください"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "%1% をインストールしません"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "%1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "%1% をインストールできるようにするには、ロックを解除してください"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "この要求はシステムを壊してしまいます!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "システムが破壊される警告を無視する"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "%1% を提供する解決方法のインストールについて確認を行いません"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "%1% を提供する全ての解決方法の削除について確認を行いません"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "%1% の最新バージョンをインストールしません"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "下位のアーキテクチャですが、 %1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "下位のアーキテクチャですが、 %1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "古い %1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "除外されたリポジトリから %1% をインストールします"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "撤回済みの %1% をインストールする"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "PTF %1% のインストールを許可する"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "ブラックリスト設定されている %1% をインストールする"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "%1% を %2% にダウングレードします"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "%1% のアーキテクチャを %2% に変更します"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4523,7 +4556,7 @@ msgstr ""
 "%1% をインストールします (ベンダの変更を伴います)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4532,107 +4565,123 @@ msgstr ""
 "ベンダ %4% からの %3% を\n"
 "  ベンダ %2% からの %1% に置き換えてインストールします"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "%1% を %2% で置き換えます"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "%1% をアンインストールします"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "処理後スクリプトを実行しています"
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "%%posttrans スクリプト '%1%' を実行しています"
+msgid "Running %1% script"
+msgstr "%1% スクリプトを実行しています"
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "%postrans スクリプトを実行しています"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "%1% スクリプトの出力:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "指示通りにインストールが中止されました。"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " 実行済み"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " 実行失敗"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s は %s として実行済みです)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " 中止しているため実行をスキップ"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "更新メッセージ通知の送信時にエラーが発生しました。"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "新しい更新メッセージ"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"シグナル \"%1% (%2%)\" を受信しましたが、システムの一貫性が確保できなくなるた"
+"め、現在実行中の RPM トランザクションはキャンセルできません。"
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "下記の問題が発生したことによって処理が失敗しました:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPMの失敗: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "公開鍵をファイル %1% からインポートすることができませんでした"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "公開鍵 %1% を削除することができませんでした"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "パッケージヘッダに署名がありません!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "パッケージペイロードに署名がありません!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s 向けに変更された設定ファイル:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpmは %s を %s として保存しましたが、差異を判別できませんでした"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4642,13 +4691,13 @@ msgstr ""
 "以下は差異のある最初の25行です。\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpmは %s を %s として作成しましたが、差異を判別できませんでした"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4661,47 +4710,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "追加のrpm出力"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "バックアップ %s が作成されました"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "署名に問題はありません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "不明な種類の署名です"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "署名は正しくありません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "署名に問題はありませんが、鍵を信頼していません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "署名の公開鍵がありません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "ファイルが存在しないか、署名を確認できません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "ファイルに署名がありません"
 
@@ -4829,73 +4878,73 @@ msgstr "無効なパラメータマップ区切り文字"
 msgid "Invalid parameter array join separator character"
 msgstr "無効なパラメータ配列結合文字"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "コマンドは状態 %d で終了しました。"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "コマンドはシグナル %d (%s)で終了しました。"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "コマンドは不明なエラーで終了しました。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "正しくない実行パラメータが指定されました。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "制御パイプを作成できませんでした。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "'%s' (%s)にchrootすることができません。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "ディレクトリを '%s' (%s)に変更できません。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 "chroot '%s' (%s)の実行中にディレクトリを '%s' に変更することはできません。"
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "'%s' (%s)を実行することができません。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "fork (%s)することができません。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "'%s' を実行できません。 chdir が失敗しました (%s) 。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "'%s' を実行できません。 chroot が失敗しました (%s) 。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "'%s' を実行できません。 exec が失敗しました (%s) 。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "'%s' を実行できません。予期しないエラーです。"
@@ -5052,6 +5101,10 @@ msgstr ""
 " SSL 証明書に問題があります。 '%s' について証明機関に問題がないかどうか確認し"
 "てください。"
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "メディアを接続するのに十分なリソースがありません。"
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5075,6 +5128,102 @@ msgstr ""
 "'%s' のダウンロード (curl) でエラーが発生しました:\n"
 "HTTP レスポンスの取得ができませんでした\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "はい (y)"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "いいえ (n)"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "完了"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "注意"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "エラー"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "注意:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "警告:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "エラー:"
+
+# internal key used: Ok
+# internal key used: Ok
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "続行しますか?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "警告: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "取得しています:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "開始しています"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "見つかりません"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "このプロンプトに対するヘルプは用意されていません。"
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "このオプションに対するヘルプは用意されていません"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "すべてのオプションを表示"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "はい"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "いいえ"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "%%posttrans スクリプト '%1%' を実行しています"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "%postrans スクリプトを実行しています"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "パッケージに署名がありません!"
 
index 5c87be7..497abc8 100644 (file)
--- a/po/ka.po
+++ b/po/ka.po
@@ -8,26 +8,27 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2009-03-06 01:28+0400\n"
-"Last-Translator: George Machitidze <giomac@gmail.com>\n"
-"Language-Team: Georgian <>\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-01-28 15:14+0000\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <https://l10n.opensuse.org/projects/libzypp/master/"
+"ka/>\n"
 "Language: ka\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: Lokalize 0.2\n"
+"X-Generator: Weblate 4.9.1\n"
 
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
-msgstr ""
+msgstr "უცნობი ქვეყანა: "
 
 #. Defined CountryCode constants
 #. Defined LanguageCode constants
 #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148
 msgid "No Code"
-msgstr ""
+msgstr "კოდის გარეშე"
 
 #: zypp/CountryCode.cc:158
 msgid "Andorra"
@@ -36,7 +37,7 @@ msgstr "ანდირა"
 #. :AND:020:
 #: zypp/CountryCode.cc:159
 msgid "United Arab Emirates"
-msgstr ""
+msgstr "არაბეთის გაერთიანებული ემირატები"
 
 #. :ARE:784:
 #: zypp/CountryCode.cc:160
@@ -51,7 +52,7 @@ msgstr "ანტიგუა და ბარბუდა"
 #. :ATG:028:
 #: zypp/CountryCode.cc:162
 msgid "Anguilla"
-msgstr ""
+msgstr "ანგილა"
 
 #. :AIA:660:
 #: zypp/CountryCode.cc:163
@@ -66,7 +67,7 @@ msgstr "სომხეთი"
 #. :ARM:051:
 #: zypp/CountryCode.cc:165
 msgid "Netherlands Antilles"
-msgstr ""
+msgstr "ნიდერლანდების ანტილის კუნძულები (NL)"
 
 #. :ANT:530:
 #: zypp/CountryCode.cc:166
@@ -86,7 +87,7 @@ msgstr "არგენტინა"
 #. :ARG:032:
 #: zypp/CountryCode.cc:169
 msgid "American Samoa"
-msgstr ""
+msgstr "ამერიკული სამოა"
 
 #. :ASM:016:
 #: zypp/CountryCode.cc:170
@@ -101,12 +102,12 @@ msgstr "ავსტრალია"
 #. :AUS:036:
 #: zypp/CountryCode.cc:172
 msgid "Aruba"
-msgstr ""
+msgstr "არუბა"
 
 #. :ABW:533:
 #: zypp/CountryCode.cc:173
 msgid "Aland Islands"
-msgstr ""
+msgstr "ალანდის კუნძულები"
 
 #. :ALA:248:
 #: zypp/CountryCode.cc:174
@@ -166,7 +167,7 @@ msgstr "ბერმუდები"
 #. :BMU:060:
 #: zypp/CountryCode.cc:185
 msgid "Brunei Darussalam"
-msgstr ""
+msgstr "ბრუნეი"
 
 #. :BRN:096:
 #: zypp/CountryCode.cc:186
@@ -191,7 +192,7 @@ msgstr "ბუტანი"
 #. :BTN:064:
 #: zypp/CountryCode.cc:190
 msgid "Bouvet Island"
-msgstr ""
+msgstr "ბუვეტის კუნძული"
 
 #. :BVT:074:
 #: zypp/CountryCode.cc:191
@@ -211,43 +212,43 @@ msgstr "ბელიზი"
 #. :BLZ:084:
 #: zypp/CountryCode.cc:194
 msgid "Canada"
-msgstr ""
+msgstr "კანადა"
 
 #. :CAN:124:
 #: zypp/CountryCode.cc:195
 msgid "Cocos (Keeling) Islands"
-msgstr ""
+msgstr "ქოქოს (კეელინგ) კუნძულები"
 
 #. :CCK:166:
 #. :CAF:140:
 #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198
 msgid "Congo"
-msgstr ""
+msgstr "კონგო"
 
 #. :COD:180:
 #: zypp/CountryCode.cc:197
 msgid "Central African Republic"
-msgstr ""
+msgstr "ცენტრალური აფრიკის რესპუბლიკა"
 
 #. :COG:178:
 #: zypp/CountryCode.cc:199
 msgid "Switzerland"
-msgstr ""
+msgstr "შვეიცარია"
 
 #. :CHE:756:
 #: zypp/CountryCode.cc:200
 msgid "Cote D'Ivoire"
-msgstr ""
+msgstr "კოტ-დ’ივუარი"
 
 #. :CIV:384:
 #: zypp/CountryCode.cc:201
 msgid "Cook Islands"
-msgstr ""
+msgstr "კუკის კუნძულები (ახალი ზელანდია)"
 
 #. :COK:184:
 #: zypp/CountryCode.cc:202
 msgid "Chile"
-msgstr ""
+msgstr "ჩილე"
 
 #. :CHL:152:
 #: zypp/CountryCode.cc:203
@@ -257,67 +258,67 @@ msgstr "კამერუნი"
 #. :CMR:120:
 #: zypp/CountryCode.cc:204
 msgid "China"
-msgstr ""
+msgstr "ჩინეთი"
 
 #. :CHN:156:
 #: zypp/CountryCode.cc:205
 msgid "Colombia"
-msgstr ""
+msgstr "კოლუმბია"
 
 #. :COL:170:
 #: zypp/CountryCode.cc:206
 msgid "Costa Rica"
-msgstr ""
+msgstr "კოსტა რიკა"
 
 #. :CRI:188:
 #: zypp/CountryCode.cc:207
 msgid "Cuba"
-msgstr ""
+msgstr "კუბა"
 
 #. :CUB:192:
 #: zypp/CountryCode.cc:208
 msgid "Cape Verde"
-msgstr ""
+msgstr "კაბო ვერდე"
 
 #. :CPV:132:
 #: zypp/CountryCode.cc:209
 msgid "Christmas Island"
-msgstr ""
+msgstr "შობის კუნძული"
 
 #. :CXR:162:
 #: zypp/CountryCode.cc:210
 msgid "Cyprus"
-msgstr ""
+msgstr "კვიპროსი"
 
 #. :CYP:196:
 #: zypp/CountryCode.cc:211
 msgid "Czech Republic"
-msgstr ""
+msgstr "ჩეხეთი"
 
 #. :CZE:203:
 #: zypp/CountryCode.cc:212
 msgid "Germany"
-msgstr ""
+msgstr "გერმანია"
 
 #. :DEU:276:
 #: zypp/CountryCode.cc:213
 msgid "Djibouti"
-msgstr ""
+msgstr "ჯიბუტი"
 
 #. :DJI:262:
 #: zypp/CountryCode.cc:214
 msgid "Denmark"
-msgstr ""
+msgstr "დანია"
 
 #. :DNK:208:
 #: zypp/CountryCode.cc:215
 msgid "Dominica"
-msgstr ""
+msgstr "დომინიკა"
 
 #. :DMA:212:
 #: zypp/CountryCode.cc:216
 msgid "Dominican Republic"
-msgstr ""
+msgstr "დომენიკის რესპუბლიკა"
 
 #. :DOM:214:
 #: zypp/CountryCode.cc:217
@@ -327,67 +328,67 @@ msgstr "ალჟირი"
 #. :DZA:012:
 #: zypp/CountryCode.cc:218
 msgid "Ecuador"
-msgstr ""
+msgstr "ეკვადორი"
 
 #. :ECU:218:
 #: zypp/CountryCode.cc:219
 msgid "Estonia"
-msgstr ""
+msgstr "ესტონეთი"
 
 #. :EST:233:
 #: zypp/CountryCode.cc:220
 msgid "Egypt"
-msgstr ""
+msgstr "ეგვიპტე"
 
 #. :EGY:818:
 #: zypp/CountryCode.cc:221
 msgid "Western Sahara"
-msgstr ""
+msgstr "დასავლეთ საჰარა"
 
 #. :ESH:732:
 #: zypp/CountryCode.cc:222
 msgid "Eritrea"
-msgstr ""
+msgstr "ერითრეა"
 
 #. :ERI:232:
 #: zypp/CountryCode.cc:223
 msgid "Spain"
-msgstr ""
+msgstr "ესპანეთი"
 
 #. :ESP:724:
 #: zypp/CountryCode.cc:224
 msgid "Ethiopia"
-msgstr ""
+msgstr "ეთიოპია"
 
 #. :ETH:231:
 #: zypp/CountryCode.cc:225
 msgid "Finland"
-msgstr ""
+msgstr "ფინეთი"
 
 #. :FIN:246:
 #: zypp/CountryCode.cc:226
 msgid "Fiji"
-msgstr ""
+msgstr "ფიჯი"
 
 #. :FJI:242:
 #: zypp/CountryCode.cc:227
 msgid "Falkland Islands (Malvinas)"
-msgstr ""
+msgstr "ფოლკლენდის კუნძულები"
 
 #. :FLK:238:
 #: zypp/CountryCode.cc:228
 msgid "Federated States of Micronesia"
-msgstr ""
+msgstr "მიკრონეზიის ფედერალური შტატები"
 
 #. :FSM:583:
 #: zypp/CountryCode.cc:229
 msgid "Faroe Islands"
-msgstr ""
+msgstr "ფარერის კუნძულები"
 
 #. :FRO:234:
 #: zypp/CountryCode.cc:230
 msgid "France"
-msgstr ""
+msgstr "საფრანგეთი"
 
 #. :FRA:250:
 #: zypp/CountryCode.cc:231
@@ -397,17 +398,17 @@ msgstr ""
 #. :FXX:249:
 #: zypp/CountryCode.cc:232
 msgid "Gabon"
-msgstr ""
+msgstr "გაბონი"
 
 #. :GAB:266:
 #: zypp/CountryCode.cc:233
 msgid "United Kingdom"
-msgstr ""
+msgstr "დიდი ბრიტანეთი"
 
 #. :GBR:826:
 #: zypp/CountryCode.cc:234
 msgid "Grenada"
-msgstr ""
+msgstr "გრენადა"
 
 #. :GRD:308:
 #: zypp/CountryCode.cc:235
@@ -417,81 +418,81 @@ msgstr "საქართველო"
 #. :GEO:268:
 #: zypp/CountryCode.cc:236
 msgid "French Guiana"
-msgstr ""
+msgstr "ფრანგული გვიანა"
 
 #. :GUF:254:
 #: zypp/CountryCode.cc:237
 msgid "Guernsey"
-msgstr ""
+msgstr "გერნსი"
 
 #: zypp/CountryCode.cc:238
 msgid "Ghana"
-msgstr ""
+msgstr "განა"
 
 #. :GHA:288:
 #: zypp/CountryCode.cc:239
 msgid "Gibraltar"
-msgstr ""
+msgstr "გიბრალტარი"
 
 #. :GIB:292:
 #: zypp/CountryCode.cc:240
 msgid "Greenland"
-msgstr ""
+msgstr "გრენლანდია"
 
 #. :GRL:304:
 #: zypp/CountryCode.cc:241
 msgid "Gambia"
-msgstr ""
+msgstr "გამბია"
 
 #. :GMB:270:
 #: zypp/CountryCode.cc:242
 msgid "Guinea"
-msgstr ""
+msgstr "გვინეა"
 
 #. :GIN:324:
 #: zypp/CountryCode.cc:243
 msgid "Guadeloupe"
-msgstr ""
+msgstr "გვადალუპე"
 
 #. :GLP:312:
 #: zypp/CountryCode.cc:244
 msgid "Equatorial Guinea"
-msgstr ""
+msgstr "ეკვატორული გვინეა"
 
 #. :GNQ:226:
 #: zypp/CountryCode.cc:245
 msgid "Greece"
-msgstr ""
+msgstr "საბერძნეთი"
 
 #. :GRC:300:
 #: zypp/CountryCode.cc:246
 msgid "South Georgia and the South Sandwich Islands"
-msgstr ""
+msgstr "სამხრეთ ჯორჯია და სამხრეთ სენდვიჩის კუნძულები"
 
 #. :SGS:239:
 #: zypp/CountryCode.cc:247
 msgid "Guatemala"
-msgstr ""
+msgstr "გვატემალა"
 
 #. :GTM:320:
 #: zypp/CountryCode.cc:248
 msgid "Guam"
-msgstr ""
+msgstr "გუამი"
 
 #. :GUM:316:
 #: zypp/CountryCode.cc:249
 msgid "Guinea-Bissau"
-msgstr ""
+msgstr "გვინეა-ბისაუ"
 
 #. :GNB:624:
 #: zypp/CountryCode.cc:250
 msgid "Guyana"
-msgstr ""
+msgstr "გაიანა"
 
 #. :GUY:328:
 #: zypp/CountryCode.cc:251
 msgid "Hong Kong"
-msgstr ""
+msgstr "ჰონგკონგი"
 
 #. :HKG:344:
 #: zypp/CountryCode.cc:252
@@ -501,27 +502,27 @@ msgstr ""
 #. :HMD:334:
 #: zypp/CountryCode.cc:253
 msgid "Honduras"
-msgstr ""
+msgstr "ჰონდურასი"
 
 #. :HND:340:
 #: zypp/CountryCode.cc:254
 msgid "Croatia"
-msgstr ""
+msgstr "ხორვატია"
 
 #. :HRV:191:
 #: zypp/CountryCode.cc:255
 msgid "Haiti"
-msgstr ""
+msgstr "ჰაიტი"
 
 #. :HTI:332:
 #: zypp/CountryCode.cc:256
 msgid "Hungary"
-msgstr ""
+msgstr "უნგრეთი"
 
 #. :HUN:348:
 #: zypp/CountryCode.cc:257
 msgid "Indonesia"
-msgstr ""
+msgstr "ინდონეზია"
 
 #. :IDN:360:
 #: zypp/CountryCode.cc:258
@@ -536,16 +537,16 @@ msgstr "ისრაელი"
 #. :ISR:376:
 #: zypp/CountryCode.cc:260
 msgid "Isle of Man"
-msgstr ""
+msgstr "მენის კუნძული"
 
 #: zypp/CountryCode.cc:261
 msgid "India"
-msgstr ""
+msgstr "ინდოეთი"
 
 #. :IND:356:
 #: zypp/CountryCode.cc:262
 msgid "British Indian Ocean Territory"
-msgstr ""
+msgstr "ბრიტანეთის ინდოეთის ოკეანის ტერიტორია"
 
 #. :IOT:086:
 #: zypp/CountryCode.cc:263
@@ -560,7 +561,7 @@ msgstr "ირანი"
 #. :IRN:364:
 #: zypp/CountryCode.cc:265
 msgid "Iceland"
-msgstr ""
+msgstr "ისლანდია"
 
 #. :ISL:352:
 #: zypp/CountryCode.cc:266
@@ -570,7 +571,7 @@ msgstr "იტალია"
 #. :ITA:380:
 #: zypp/CountryCode.cc:267
 msgid "Jersey"
-msgstr ""
+msgstr "ჯერსი"
 
 #: zypp/CountryCode.cc:268
 msgid "Jamaica"
@@ -579,7 +580,7 @@ msgstr "იამაიკა"
 #. :JAM:388:
 #: zypp/CountryCode.cc:269
 msgid "Jordan"
-msgstr ""
+msgstr "იორდანია"
 
 #. :JOR:400:
 #: zypp/CountryCode.cc:270
@@ -589,12 +590,12 @@ msgstr "იაპონია"
 #. :JPN:392:
 #: zypp/CountryCode.cc:271
 msgid "Kenya"
-msgstr ""
+msgstr "კენია"
 
 #. :KEN:404:
 #: zypp/CountryCode.cc:272
 msgid "Kyrgyzstan"
-msgstr ""
+msgstr "ყირგიზეთი"
 
 #. :KGZ:417:
 #: zypp/CountryCode.cc:273
@@ -604,658 +605,656 @@ msgstr "კამბოჯა"
 #. :KHM:116:
 #: zypp/CountryCode.cc:274
 msgid "Kiribati"
-msgstr ""
+msgstr "კირიბატი"
 
 #. :KIR:296:
 #: zypp/CountryCode.cc:275
 msgid "Comoros"
-msgstr ""
+msgstr "კომორი"
 
 #. :COM:174:
 #: zypp/CountryCode.cc:276
 msgid "Saint Kitts and Nevis"
-msgstr ""
+msgstr "სენტ კიტსი და ნევისი"
 
 #. :KNA:659:
 #: zypp/CountryCode.cc:277
 msgid "North Korea"
-msgstr ""
+msgstr "ჩრდილოეთ კორეა"
 
 #. :PRK:408:
 #: zypp/CountryCode.cc:278
 msgid "South Korea"
-msgstr ""
+msgstr "სამხრეთ კორეა"
 
 #. :KOR:410:
 #: zypp/CountryCode.cc:279
 msgid "Kuwait"
-msgstr ""
+msgstr "ქუვეიტი"
 
 #. :KWT:414:
 #: zypp/CountryCode.cc:280
 msgid "Cayman Islands"
-msgstr ""
+msgstr "კაიმანის კუნძულები"
 
 #. :CYM:136:
 #: zypp/CountryCode.cc:281
 msgid "Kazakhstan"
-msgstr ""
+msgstr "ყაზახეთი"
 
 #. :KAZ:398:
 #: zypp/CountryCode.cc:282
 msgid "Lao People's Democratic Republic"
-msgstr ""
+msgstr "ლაოსის სახალხო დემოკრატიული რესპუბლიკა"
 
 #. :LAO:418:
 #: zypp/CountryCode.cc:283
 msgid "Lebanon"
-msgstr ""
+msgstr "ლიბანი"
 
 #. :LBN:422:
 #: zypp/CountryCode.cc:284
 msgid "Saint Lucia"
-msgstr ""
+msgstr "წმინდა ლუჩია"
 
 #. :LCA:662:
 #: zypp/CountryCode.cc:285
 msgid "Liechtenstein"
-msgstr ""
+msgstr "ლიჰტენშტაინი"
 
 #. :LIE:438:
 #: zypp/CountryCode.cc:286
 msgid "Sri Lanka"
-msgstr ""
+msgstr "შრი ლანკა"
 
 #. :LKA:144:
 #: zypp/CountryCode.cc:287
 msgid "Liberia"
-msgstr ""
+msgstr "ლიბერია"
 
 #. :LBR:430:
 #: zypp/CountryCode.cc:288
 msgid "Lesotho"
-msgstr ""
+msgstr "ლესოტო"
 
 #. :LSO:426:
 #: zypp/CountryCode.cc:289
 msgid "Lithuania"
-msgstr ""
+msgstr "ლიეტუვა"
 
 #. :LTU:440:
 #: zypp/CountryCode.cc:290
 msgid "Luxembourg"
-msgstr ""
+msgstr "ლუქსემბურგი"
 
 #. :LUX:442:
 #: zypp/CountryCode.cc:291
 msgid "Latvia"
-msgstr ""
+msgstr "ლატვია"
 
 #. :LVA:428:
 #: zypp/CountryCode.cc:292
 msgid "Libya"
-msgstr ""
+msgstr "ლიბია"
 
 #. :LBY:434:
 #: zypp/CountryCode.cc:293
 msgid "Morocco"
-msgstr ""
+msgstr "მაროკო"
 
 #. :MAR:504:
 #: zypp/CountryCode.cc:294
 msgid "Monaco"
-msgstr ""
+msgstr "მონაკო"
 
 #. :MCO:492:
 #: zypp/CountryCode.cc:295
 msgid "Moldova"
-msgstr ""
+msgstr "მოლდოვა"
 
 #. :MDA:498:
 #: zypp/CountryCode.cc:296
 msgid "Montenegro"
-msgstr ""
+msgstr "მონტენეგრო"
 
 #: zypp/CountryCode.cc:297
-#, fuzzy
 msgid "Saint Martin"
-msgstr "á\83\9bá\83®á\83\90á\83 á\83\93á\83\90á\83\9bá\83­á\83\94á\83 ი"
+msgstr "á\83¡á\83\94á\83\9cá\83¢ á\83\9bá\83\90á\83 á\83¢á\83\98á\83\9cი"
 
 #: zypp/CountryCode.cc:298
 msgid "Madagascar"
-msgstr ""
+msgstr "მადაგასკარი"
 
 #. :MDG:450:
 #: zypp/CountryCode.cc:299
 msgid "Marshall Islands"
-msgstr ""
+msgstr "მარშალის კუნძულები"
 
 #. :MHL:584:
 #: zypp/CountryCode.cc:300
 msgid "Macedonia"
-msgstr ""
+msgstr "მაკედონია"
 
 #. :MKD:807:
 #: zypp/CountryCode.cc:301
 msgid "Mali"
-msgstr ""
+msgstr "მალი"
 
 #. :MLI:466:
 #: zypp/CountryCode.cc:302
 msgid "Myanmar"
-msgstr ""
+msgstr "მიანმარი"
 
 #. :MMR:104:
 #: zypp/CountryCode.cc:303
 msgid "Mongolia"
-msgstr ""
+msgstr "მონღოლეთი"
 
 #. :MNG:496:
 #: zypp/CountryCode.cc:304
 msgid "Macao"
-msgstr ""
+msgstr "მაკაო"
 
 #. :MAC:446:
 #: zypp/CountryCode.cc:305
 msgid "Northern Mariana Islands"
-msgstr ""
+msgstr "ჩრდილოეთ მარიანას კუნძულები"
 
 #. :MNP:580:
 #: zypp/CountryCode.cc:306
 msgid "Martinique"
-msgstr ""
+msgstr "მარტინიკა"
 
 #. :MTQ:474:
 #: zypp/CountryCode.cc:307
 msgid "Mauritania"
-msgstr ""
+msgstr "მავრიტანია"
 
 #. :MRT:478:
 #: zypp/CountryCode.cc:308
 msgid "Montserrat"
-msgstr ""
+msgstr "მონტსერატი"
 
 #. :MSR:500:
 #: zypp/CountryCode.cc:309
 msgid "Malta"
-msgstr ""
+msgstr "მალტა"
 
 #. :MLT:470:
 #: zypp/CountryCode.cc:310
 msgid "Mauritius"
-msgstr ""
+msgstr "მავრიკი"
 
 #. :MUS:480:
 #: zypp/CountryCode.cc:311
 msgid "Maldives"
-msgstr ""
+msgstr "მალდივები"
 
 #. :MDV:462:
 #: zypp/CountryCode.cc:312
 msgid "Malawi"
-msgstr ""
+msgstr "მალავი"
 
 #. :MWI:454:
 #: zypp/CountryCode.cc:313
 msgid "Mexico"
-msgstr ""
+msgstr "მექსიკა"
 
 #. :MEX:484:
 #: zypp/CountryCode.cc:314
 msgid "Malaysia"
-msgstr ""
+msgstr "მალაიზია"
 
 #. :MYS:458:
 #: zypp/CountryCode.cc:315
 msgid "Mozambique"
-msgstr ""
+msgstr "მოზამბიკი"
 
 #. :MOZ:508:
 #: zypp/CountryCode.cc:316
 msgid "Namibia"
-msgstr ""
+msgstr "ნამიბია"
 
 #. :NAM:516:
 #: zypp/CountryCode.cc:317
 msgid "New Caledonia"
-msgstr ""
+msgstr "ახალი კალედონია"
 
 #. :NCL:540:
 #: zypp/CountryCode.cc:318
 msgid "Niger"
-msgstr ""
+msgstr "ნიგერი"
 
 #. :NER:562:
 #: zypp/CountryCode.cc:319
 msgid "Norfolk Island"
-msgstr ""
+msgstr "ნორფოლკის კუნძული"
 
 #. :NFK:574:
 #: zypp/CountryCode.cc:320
 msgid "Nigeria"
-msgstr ""
+msgstr "ნიგერია"
 
 #. :NGA:566:
 #: zypp/CountryCode.cc:321
 msgid "Nicaragua"
-msgstr ""
+msgstr "ნიკარაგუა"
 
 #. :NIC:558:
 #: zypp/CountryCode.cc:322
 msgid "Netherlands"
-msgstr ""
+msgstr "ჰოლანდია"
 
 #. :NLD:528:
 #: zypp/CountryCode.cc:323
 msgid "Norway"
-msgstr ""
+msgstr "ნორვეგია"
 
 #. :NOR:578:
 #: zypp/CountryCode.cc:324
 msgid "Nepal"
-msgstr ""
+msgstr "ნეპალი"
 
 #. :NPL:524:
 #. language code: nau na
 #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781
 msgid "Nauru"
-msgstr ""
+msgstr "ნაურუ"
 
 #. :NRU:520:
 #: zypp/CountryCode.cc:326
 msgid "Niue"
-msgstr ""
+msgstr "ნიუე"
 
 #. :NIU:570:
 #: zypp/CountryCode.cc:327
 msgid "New Zealand"
-msgstr ""
+msgstr "ახალი ზელანდია"
 
 #. :NZL:554:
 #: zypp/CountryCode.cc:328
 msgid "Oman"
-msgstr ""
+msgstr "ომანი"
 
 #. :OMN:512:
 #: zypp/CountryCode.cc:329
 msgid "Panama"
-msgstr ""
+msgstr "პანამა"
 
 #. :PAN:591:
 #: zypp/CountryCode.cc:330
 msgid "Peru"
-msgstr ""
+msgstr "პერუ"
 
 #. :PER:604:
 #: zypp/CountryCode.cc:331
 msgid "French Polynesia"
-msgstr ""
+msgstr "ფრანგული პოლინეზია"
 
 #. :PYF:258:
 #: zypp/CountryCode.cc:332
 msgid "Papua New Guinea"
-msgstr ""
+msgstr "პაპუა ახალი გვინეა"
 
 #. :PNG:598:
 #: zypp/CountryCode.cc:333
 msgid "Philippines"
-msgstr ""
+msgstr "ფილიპინები"
 
 #. :PHL:608:
 #: zypp/CountryCode.cc:334
 msgid "Pakistan"
-msgstr ""
+msgstr "პაკისტანი"
 
 #. :PAK:586:
 #: zypp/CountryCode.cc:335
 msgid "Poland"
-msgstr ""
+msgstr "პოლონეთი"
 
 #. :POL:616:
 #: zypp/CountryCode.cc:336
 msgid "Saint Pierre and Miquelon"
-msgstr ""
+msgstr "წმინდა პიერი და მიქელონი"
 
 #. :SPM:666:
 #: zypp/CountryCode.cc:337
 msgid "Pitcairn"
-msgstr ""
+msgstr "პიტკერნი"
 
 #. :PCN:612:
 #: zypp/CountryCode.cc:338
 msgid "Puerto Rico"
-msgstr ""
+msgstr "პუერტო რიკო"
 
 #. :PRI:630:
 #: zypp/CountryCode.cc:339
 msgid "Palestinian Territory"
-msgstr ""
+msgstr "პალესტინის ტერიტორია"
 
 #. :PSE:275:
 #: zypp/CountryCode.cc:340
 msgid "Portugal"
-msgstr ""
+msgstr "პორტუგალია"
 
 #. :PRT:620:
 #: zypp/CountryCode.cc:341
 msgid "Palau"
-msgstr ""
+msgstr "პალაუ"
 
 #. :PLW:585:
 #: zypp/CountryCode.cc:342
 msgid "Paraguay"
-msgstr ""
+msgstr "პარაგვაი"
 
 #. :PRY:600:
 #: zypp/CountryCode.cc:343
 msgid "Qatar"
-msgstr ""
+msgstr "ყატარი"
 
 #. :QAT:634:
 #: zypp/CountryCode.cc:344
 msgid "Reunion"
-msgstr ""
+msgstr "რეიუნიონი"
 
 #. :REU:638:
 #: zypp/CountryCode.cc:345
 msgid "Romania"
-msgstr ""
+msgstr "რუმინეთი"
 
 #. :ROU:642:
 #: zypp/CountryCode.cc:346
-#, fuzzy
 msgid "Serbia"
-msgstr "á\83\90á\83\96á\83\94á\83 á\83\91á\83\90á\83\98á\83¯á\83\90á\83\9cი"
+msgstr "á\83¡á\83\94á\83 á\83\91á\83\94á\83\97ი"
 
 #: zypp/CountryCode.cc:347
 msgid "Russian Federation"
-msgstr ""
+msgstr "რუსეთის ფედერაცია"
 
 #. :RUS:643:
 #: zypp/CountryCode.cc:348
 msgid "Rwanda"
-msgstr ""
+msgstr "რუანდა"
 
 #. :RWA:646:
 #: zypp/CountryCode.cc:349
 msgid "Saudi Arabia"
-msgstr ""
+msgstr "საუდის არაბეთი"
 
 #. :SAU:682:
 #: zypp/CountryCode.cc:350
 msgid "Solomon Islands"
-msgstr ""
+msgstr "სოლომონის კუნძულები"
 
 #. :SLB:090:
 #: zypp/CountryCode.cc:351
 msgid "Seychelles"
-msgstr ""
+msgstr "სეიშელები"
 
 #. :SYC:690:
 #: zypp/CountryCode.cc:352
 msgid "Sudan"
-msgstr ""
+msgstr "სუდანი"
 
 #. :SDN:736:
 #: zypp/CountryCode.cc:353
 msgid "Sweden"
-msgstr ""
+msgstr "შვედეთი"
 
 #. :SWE:752:
 #: zypp/CountryCode.cc:354
 msgid "Singapore"
-msgstr ""
+msgstr "სინგაპური"
 
 #. :SGP:702:
 #: zypp/CountryCode.cc:355
 msgid "Saint Helena"
-msgstr ""
+msgstr "წმინდა ელენე"
 
 #. :SHN:654:
 #: zypp/CountryCode.cc:356
 msgid "Slovenia"
-msgstr ""
+msgstr "სლოვენია"
 
 #. :SVN:705:
 #: zypp/CountryCode.cc:357
 msgid "Svalbard and Jan Mayen"
-msgstr ""
+msgstr "სვალბარდი და ან-მაიენი"
 
 #. :SJM:744:
 #: zypp/CountryCode.cc:358
 msgid "Slovakia"
-msgstr ""
+msgstr "სლოვაკეთი"
 
 #. :SVK:703:
 #: zypp/CountryCode.cc:359
 msgid "Sierra Leone"
-msgstr ""
+msgstr "სიერა ლეონე"
 
 #. :SLE:694:
 #: zypp/CountryCode.cc:360
 msgid "San Marino"
-msgstr ""
+msgstr "სან მარინო"
 
 #. :SMR:674:
 #: zypp/CountryCode.cc:361
 msgid "Senegal"
-msgstr ""
+msgstr "სენეგალი"
 
 #. :SEN:686:
 #: zypp/CountryCode.cc:362
 msgid "Somalia"
-msgstr ""
+msgstr "სომალი"
 
 #. :SOM:706:
 #: zypp/CountryCode.cc:363
 msgid "Suriname"
-msgstr ""
+msgstr "სურინამი"
 
 #. :SUR:740:
 #: zypp/CountryCode.cc:364
 msgid "Sao Tome and Principe"
-msgstr ""
+msgstr "საო ტომე და პრინციპე"
 
 #. :STP:678:
 #: zypp/CountryCode.cc:365
 msgid "El Salvador"
-msgstr ""
+msgstr "ელ სალვადორი"
 
 #. :SLV:222:
 #: zypp/CountryCode.cc:366
 msgid "Syria"
-msgstr ""
+msgstr "სირია"
 
 #. :SYR:760:
 #: zypp/CountryCode.cc:367
 msgid "Swaziland"
-msgstr ""
+msgstr "ესვატინი"
 
 #. :SWZ:748:
 #: zypp/CountryCode.cc:368
 msgid "Turks and Caicos Islands"
-msgstr ""
+msgstr "ტერქსისა და კაიკოსის კუნძულები"
 
 #. :TCA:796:
 #: zypp/CountryCode.cc:369
 msgid "Chad"
-msgstr ""
+msgstr "ჩადი"
 
 #. :TCD:148:
 #: zypp/CountryCode.cc:370
 msgid "French Southern Territories"
-msgstr ""
+msgstr "ფრანგული სამხრეთ ტერიტორიები"
 
 #. :ATF:260:
 #: zypp/CountryCode.cc:371
 msgid "Togo"
-msgstr ""
+msgstr "ტოგო"
 
 #. :TGO:768:
 #: zypp/CountryCode.cc:372
 msgid "Thailand"
-msgstr ""
+msgstr "ტაილანდი"
 
 #. :THA:764:
 #: zypp/CountryCode.cc:373
 msgid "Tajikistan"
-msgstr ""
+msgstr "ტაჯიკეთი"
 
 #. :TJK:762:
 #. language code: tkl
 #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045
 msgid "Tokelau"
-msgstr ""
+msgstr "ტოკელაუ"
 
 #. :TKL:772:
 #: zypp/CountryCode.cc:375
 msgid "Turkmenistan"
-msgstr ""
+msgstr "თურქმენეთი"
 
 #. :TKM:795:
 #: zypp/CountryCode.cc:376
 msgid "Tunisia"
-msgstr ""
+msgstr "ტუნისი"
 
 #. :TUN:788:
 #: zypp/CountryCode.cc:377
 msgid "Tonga"
-msgstr ""
+msgstr "ტონგა"
 
 #. :TON:776:
 #: zypp/CountryCode.cc:378
 msgid "East Timor"
-msgstr ""
+msgstr "აღმოსავლეთ ტიმორი"
 
 #. :TLS:626:
 #: zypp/CountryCode.cc:379
 msgid "Turkey"
-msgstr ""
+msgstr "თურქეთი"
 
 #. :TUR:792:
 #: zypp/CountryCode.cc:380
 msgid "Trinidad and Tobago"
-msgstr ""
+msgstr "ტრინიდადი და ტობაგო"
 
 #. :TTO:780:
 #. language code: tvl
 #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075
 msgid "Tuvalu"
-msgstr ""
+msgstr "ტუვალუ"
 
 #. :TUV:798:
 #: zypp/CountryCode.cc:382
 msgid "Taiwan"
-msgstr ""
+msgstr "ტაივანი"
 
 #. :TWN:158:
 #: zypp/CountryCode.cc:383
 msgid "Tanzania"
-msgstr ""
+msgstr "ტანზანია"
 
 #. :TZA:834:
 #: zypp/CountryCode.cc:384
 msgid "Ukraine"
-msgstr ""
+msgstr "უკრაინა"
 
 #. :UKR:804:
 #: zypp/CountryCode.cc:385
 msgid "Uganda"
-msgstr ""
+msgstr "უგანდა"
 
 #. :UGA:800:
 #: zypp/CountryCode.cc:386
 msgid "United States Minor Outlying Islands"
-msgstr ""
+msgstr "შეერთებული შტატების მცირე გარემდებარე კუნძულები"
 
 #. :UMI:581:
 #: zypp/CountryCode.cc:387
 msgid "United States"
-msgstr ""
+msgstr "ამერიკის შეერთებული შტატები"
 
 #. :USA:840:
 #: zypp/CountryCode.cc:388
 msgid "Uruguay"
-msgstr ""
+msgstr "ურუგვაი"
 
 #. :URY:858:
 #: zypp/CountryCode.cc:389
 msgid "Uzbekistan"
-msgstr ""
+msgstr "უზბეკეთი"
 
 #. :UZB:860:
 #: zypp/CountryCode.cc:390
 msgid "Holy See (Vatican City State)"
-msgstr ""
+msgstr "წმიდა საყდართან (ვატიკანის ქალაქი სახელმწიფო)"
 
 #. :VAT:336:
 #: zypp/CountryCode.cc:391
 msgid "Saint Vincent and the Grenadines"
-msgstr ""
+msgstr "სენტ ვინცენტი და გრენადინები"
 
 #. :VCT:670:
 #: zypp/CountryCode.cc:392
 msgid "Venezuela"
-msgstr ""
+msgstr "ვენესუელა"
 
 #. :VEN:862:
 #: zypp/CountryCode.cc:393
 msgid "British Virgin Islands"
-msgstr ""
+msgstr "ბრიტანეთის ვირჯინიის კუნძულები"
 
 #. :VGB:092:
 #: zypp/CountryCode.cc:394
 msgid "Virgin Islands, U.S."
-msgstr ""
+msgstr "ვირჯინიის კუნძულები, აშშ."
 
 #. :VIR:850:
 #: zypp/CountryCode.cc:395
 msgid "Vietnam"
-msgstr ""
+msgstr "ვიეტნამი"
 
 #. :VNM:704:
 #: zypp/CountryCode.cc:396
 msgid "Vanuatu"
-msgstr ""
+msgstr "ვანუატუ"
 
 #. :VUT:548:
 #: zypp/CountryCode.cc:397
 msgid "Wallis and Futuna"
-msgstr ""
+msgstr "ვალისი და ფუტუნა"
 
 #. :WLF:876:
 #: zypp/CountryCode.cc:398
 msgid "Samoa"
-msgstr ""
+msgstr "სამოა"
 
 #. :WSM:882:
 #: zypp/CountryCode.cc:399
 msgid "Yemen"
-msgstr ""
+msgstr "იემენი"
 
 #. :YEM:887:
 #: zypp/CountryCode.cc:400
 msgid "Mayotte"
-msgstr ""
+msgstr "მეიოტი"
 
 #. :MYT:175:
 #: zypp/CountryCode.cc:401
 msgid "South Africa"
-msgstr ""
+msgstr "სამხრეთ აფრიკა"
 
 #. :ZAF:710:
 #: zypp/CountryCode.cc:402
 msgid "Zambia"
-msgstr ""
+msgstr "ზამბია"
 
 #. :ZMB:894:
 #: zypp/CountryCode.cc:403
 msgid "Zimbabwe"
-msgstr ""
+msgstr "ზიმბაბვე"
 
 #: zypp/Dep.cc:96
 msgid "Provides"
-msgstr ""
+msgstr "მომწოდებლები"
 
 #: zypp/Dep.cc:97
 msgid "Prerequires"
@@ -1263,15 +1262,15 @@ msgstr ""
 
 #: zypp/Dep.cc:98
 msgid "Requires"
-msgstr ""
+msgstr "ესაჭიროება"
 
 #: zypp/Dep.cc:99
 msgid "Conflicts"
-msgstr ""
+msgstr "კონფლიქტები"
 
 #: zypp/Dep.cc:100
 msgid "Obsoletes"
-msgstr ""
+msgstr "მოძველებული"
 
 #: zypp/Dep.cc:101
 msgid "Recommends"
@@ -1297,11 +1296,11 @@ msgstr ""
 
 #: zypp/KeyRing.cc:759
 msgid "Failed to import key."
-msgstr ""
+msgstr "გასაღების შემოტანის შეცდომა."
 
 #: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
-msgstr ""
+msgstr "გასაღების წაშლის შეცდომა."
 
 #: zypp/KeyRing.cc:772
 #, c-format, boost-format
@@ -1310,17 +1309,17 @@ msgstr ""
 
 #: zypp/LanguageCode.cc:49
 msgid "Unknown language: "
-msgstr ""
+msgstr "უცნობი ენა: "
 
 #. language code: aar aa
 #: zypp/LanguageCode.cc:161
 msgid "Afar"
-msgstr ""
+msgstr "აფარი"
 
 #. language code: abk ab
 #: zypp/LanguageCode.cc:163
 msgid "Abkhazian"
-msgstr ""
+msgstr "აბხაზური"
 
 #. language code: ace
 #: zypp/LanguageCode.cc:165
@@ -1340,7 +1339,7 @@ msgstr ""
 #. language code: ady
 #: zypp/LanguageCode.cc:171
 msgid "Adyghe"
-msgstr ""
+msgstr "ადიღეური"
 
 #. language code: afa
 #: zypp/LanguageCode.cc:173
@@ -1365,7 +1364,7 @@ msgstr ""
 #. language code: aka ak
 #: zypp/LanguageCode.cc:181
 msgid "Akan"
-msgstr ""
+msgstr "აკანი"
 
 #. language code: akk
 #: zypp/LanguageCode.cc:183
@@ -1395,7 +1394,7 @@ msgstr ""
 #. language code: amh am
 #: zypp/LanguageCode.cc:195
 msgid "Amharic"
-msgstr ""
+msgstr "ამჰარული"
 
 #. language code: ang
 #: zypp/LanguageCode.cc:197
@@ -1420,7 +1419,7 @@ msgstr "არამეული"
 #. language code: arg an
 #: zypp/LanguageCode.cc:205
 msgid "Aragonese"
-msgstr ""
+msgstr "არაგონური"
 
 #. language code: arm hye hy
 #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209
@@ -1450,12 +1449,12 @@ msgstr ""
 #. language code: asm as
 #: zypp/LanguageCode.cc:219
 msgid "Assamese"
-msgstr ""
+msgstr "ასამური"
 
 #. language code: ast
 #: zypp/LanguageCode.cc:221
 msgid "Asturian"
-msgstr ""
+msgstr "ასთურიანული"
 
 #. language code: ath
 #: zypp/LanguageCode.cc:223
@@ -1475,7 +1474,7 @@ msgstr ""
 #. language code: ave ae
 #: zypp/LanguageCode.cc:229
 msgid "Avestan"
-msgstr ""
+msgstr "ავესტანი"
 
 #. language code: awa
 #: zypp/LanguageCode.cc:231
@@ -1485,7 +1484,7 @@ msgstr ""
 #. language code: aym ay
 #: zypp/LanguageCode.cc:233
 msgid "Aymara"
-msgstr ""
+msgstr "აიმარა"
 
 #. language code: aze az
 #: zypp/LanguageCode.cc:235
@@ -1505,7 +1504,7 @@ msgstr ""
 #. language code: bak ba
 #: zypp/LanguageCode.cc:241
 msgid "Bashkir"
-msgstr ""
+msgstr "ბაშკირი"
 
 #. language code: bal
 #: zypp/LanguageCode.cc:243
@@ -1520,12 +1519,12 @@ msgstr ""
 #. language code: ban
 #: zypp/LanguageCode.cc:247
 msgid "Balinese"
-msgstr ""
+msgstr "ბალინური"
 
 #. language code: baq eus eu
 #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251
 msgid "Basque"
-msgstr ""
+msgstr "ბასკური"
 
 #. language code: bas
 #: zypp/LanguageCode.cc:253
@@ -1540,7 +1539,7 @@ msgstr "ბალტიური (სხვა)"
 #. language code: bej
 #: zypp/LanguageCode.cc:257
 msgid "Beja"
-msgstr ""
+msgstr "ბეჟა"
 
 #. language code: bel be
 #: zypp/LanguageCode.cc:259
@@ -1550,12 +1549,12 @@ msgstr "ბელორუსული"
 #. language code: bem
 #: zypp/LanguageCode.cc:261
 msgid "Bemba"
-msgstr ""
+msgstr "ბემბა"
 
 #. language code: ben bn
 #: zypp/LanguageCode.cc:263
 msgid "Bengali"
-msgstr ""
+msgstr "ბენგალური"
 
 #. language code: ber
 #: zypp/LanguageCode.cc:265
@@ -1570,7 +1569,7 @@ msgstr ""
 #. language code: bih bh
 #: zypp/LanguageCode.cc:269
 msgid "Bihari"
-msgstr ""
+msgstr "ბიჰარი"
 
 #. language code: bik
 #: zypp/LanguageCode.cc:271
@@ -1585,7 +1584,7 @@ msgstr ""
 #. language code: bis bi
 #: zypp/LanguageCode.cc:275
 msgid "Bislama"
-msgstr ""
+msgstr "ბისლამა"
 
 #. language code: bla
 #: zypp/LanguageCode.cc:277
@@ -1610,7 +1609,7 @@ msgstr ""
 #. language code: bre br
 #: zypp/LanguageCode.cc:285
 msgid "Breton"
-msgstr ""
+msgstr "ბრეტონული"
 
 #. language code: btk
 #: zypp/LanguageCode.cc:287
@@ -1625,7 +1624,7 @@ msgstr ""
 #. language code: bug
 #: zypp/LanguageCode.cc:291
 msgid "Buginese"
-msgstr ""
+msgstr "ბუგინური"
 
 #. language code: bul bg
 #: zypp/LanguageCode.cc:293
@@ -1635,7 +1634,7 @@ msgstr "ბულგარული"
 #. language code: bur mya my
 #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297
 msgid "Burmese"
-msgstr ""
+msgstr "ბირმული"
 
 #. language code: byn
 #: zypp/LanguageCode.cc:299
@@ -1660,7 +1659,7 @@ msgstr ""
 #. language code: cat ca
 #: zypp/LanguageCode.cc:307
 msgid "Catalan"
-msgstr ""
+msgstr "კატალანური"
 
 #. language code: cau
 #: zypp/LanguageCode.cc:309
@@ -1680,7 +1679,7 @@ msgstr ""
 #. language code: cha ch
 #: zypp/LanguageCode.cc:315
 msgid "Chamorro"
-msgstr ""
+msgstr "ჩამორო"
 
 #. language code: chb
 #: zypp/LanguageCode.cc:317
@@ -1690,7 +1689,7 @@ msgstr ""
 #. language code: che ce
 #: zypp/LanguageCode.cc:319
 msgid "Chechen"
-msgstr ""
+msgstr "ჩეჩნური"
 
 #. language code: chg
 #: zypp/LanguageCode.cc:321
@@ -1700,7 +1699,7 @@ msgstr ""
 #. language code: chi zho zh
 #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325
 msgid "Chinese"
-msgstr ""
+msgstr "ჩინური"
 
 #. language code: chk
 #: zypp/LanguageCode.cc:327
@@ -1710,7 +1709,7 @@ msgstr ""
 #. language code: chm
 #: zypp/LanguageCode.cc:329
 msgid "Mari"
-msgstr ""
+msgstr "მარული"
 
 #. language code: chn
 #: zypp/LanguageCode.cc:331
@@ -1730,22 +1729,22 @@ msgstr ""
 #. language code: chr
 #: zypp/LanguageCode.cc:337
 msgid "Cherokee"
-msgstr ""
+msgstr "ჩეროკი"
 
 #. language code: chu cu
 #: zypp/LanguageCode.cc:339
 msgid "Church Slavic"
-msgstr ""
+msgstr "ეკლესიის სლავური"
 
 #. language code: chv cv
 #: zypp/LanguageCode.cc:341
 msgid "Chuvash"
-msgstr ""
+msgstr "ჩუვაშური"
 
 #. language code: chy
 #: zypp/LanguageCode.cc:343
 msgid "Cheyenne"
-msgstr ""
+msgstr "შეიენი"
 
 #. language code: cmc
 #: zypp/LanguageCode.cc:345
@@ -1755,17 +1754,17 @@ msgstr ""
 #. language code: cop
 #: zypp/LanguageCode.cc:347
 msgid "Coptic"
-msgstr ""
+msgstr "კოპტური"
 
 #. language code: cor kw
 #: zypp/LanguageCode.cc:349
 msgid "Cornish"
-msgstr ""
+msgstr "კორნიშური"
 
 #. language code: cos co
 #: zypp/LanguageCode.cc:351
 msgid "Corsican"
-msgstr ""
+msgstr "კორსიკული"
 
 #. language code: cpe
 #: zypp/LanguageCode.cc:353
@@ -1790,7 +1789,7 @@ msgstr ""
 #. language code: crh
 #: zypp/LanguageCode.cc:361
 msgid "Crimean Tatar"
-msgstr ""
+msgstr "ყირიმელი თათრული"
 
 #. language code: crp
 #: zypp/LanguageCode.cc:363
@@ -1800,7 +1799,7 @@ msgstr ""
 #. language code: csb
 #: zypp/LanguageCode.cc:365
 msgid "Kashubian"
-msgstr ""
+msgstr "კაშუბური"
 
 #. language code: cus
 #: zypp/LanguageCode.cc:367
@@ -1810,7 +1809,7 @@ msgstr ""
 #. language code: cze ces cs
 #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371
 msgid "Czech"
-msgstr ""
+msgstr "ჩეხური"
 
 #. language code: dak
 #: zypp/LanguageCode.cc:373
@@ -1820,7 +1819,7 @@ msgstr ""
 #. language code: dan da
 #: zypp/LanguageCode.cc:375
 msgid "Danish"
-msgstr ""
+msgstr "დანიური"
 
 #. language code: dar
 #: zypp/LanguageCode.cc:377
@@ -1835,7 +1834,7 @@ msgstr ""
 #. language code: del
 #: zypp/LanguageCode.cc:381
 msgid "Delaware"
-msgstr ""
+msgstr "დელავერი"
 
 #. language code: den
 #: zypp/LanguageCode.cc:383
@@ -1855,7 +1854,7 @@ msgstr ""
 #. language code: div dv
 #: zypp/LanguageCode.cc:389
 msgid "Divehi"
-msgstr ""
+msgstr "დივეხი"
 
 #. language code: doi
 #: zypp/LanguageCode.cc:391
@@ -1870,7 +1869,7 @@ msgstr ""
 #. language code: dsb
 #: zypp/LanguageCode.cc:395
 msgid "Lower Sorbian"
-msgstr ""
+msgstr "ქვედა სორბული"
 
 #. language code: dua
 #: zypp/LanguageCode.cc:397
@@ -1885,7 +1884,7 @@ msgstr ""
 #. language code: dut nld nl
 #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403
 msgid "Dutch"
-msgstr ""
+msgstr "ჰოლანდიური"
 
 #. language code: dyu
 #: zypp/LanguageCode.cc:405
@@ -1895,7 +1894,7 @@ msgstr ""
 #. language code: dzo dz
 #: zypp/LanguageCode.cc:407
 msgid "Dzongkha"
-msgstr ""
+msgstr "ძონგკხა"
 
 #. language code: efi
 #: zypp/LanguageCode.cc:409
@@ -1930,17 +1929,17 @@ msgstr "ინგლისური, შუასაუკუნეების
 #. language code: epo eo
 #: zypp/LanguageCode.cc:421
 msgid "Esperanto"
-msgstr ""
+msgstr "ესპერანტო"
 
 #. language code: est et
 #: zypp/LanguageCode.cc:423
 msgid "Estonian"
-msgstr ""
+msgstr "ესტონური"
 
 #. language code: ewe ee
 #: zypp/LanguageCode.cc:425
 msgid "Ewe"
-msgstr ""
+msgstr "Ewe"
 
 #. language code: ewo
 #: zypp/LanguageCode.cc:427
@@ -1955,7 +1954,7 @@ msgstr ""
 #. language code: fao fo
 #: zypp/LanguageCode.cc:431
 msgid "Faroese"
-msgstr ""
+msgstr "ფაროული"
 
 #. language code: fat
 #: zypp/LanguageCode.cc:433
@@ -1965,17 +1964,17 @@ msgstr ""
 #. language code: fij fj
 #: zypp/LanguageCode.cc:435
 msgid "Fijian"
-msgstr ""
+msgstr "ფიჯიური"
 
 #. language code: fil
 #: zypp/LanguageCode.cc:437
 msgid "Filipino"
-msgstr ""
+msgstr "ფილიპინები"
 
 #. language code: fin fi
 #: zypp/LanguageCode.cc:439
 msgid "Finnish"
-msgstr ""
+msgstr "ფინური"
 
 #. language code: fiu
 #: zypp/LanguageCode.cc:441
@@ -1990,7 +1989,7 @@ msgstr ""
 #. language code: fre fra fr
 #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447
 msgid "French"
-msgstr ""
+msgstr "ფრანგული"
 
 #. language code: frm
 #: zypp/LanguageCode.cc:449
@@ -2005,7 +2004,7 @@ msgstr ""
 #. language code: fry fy
 #: zypp/LanguageCode.cc:453
 msgid "Frisian"
-msgstr ""
+msgstr "ფრისული"
 
 #. language code: ful ff
 #: zypp/LanguageCode.cc:455
@@ -2015,12 +2014,12 @@ msgstr ""
 #. language code: fur
 #: zypp/LanguageCode.cc:457
 msgid "Friulian"
-msgstr ""
+msgstr "ფრიულური"
 
 #. language code: gaa
 #: zypp/LanguageCode.cc:459
 msgid "Ga"
-msgstr ""
+msgstr "გა"
 
 #. language code: gay
 #: zypp/LanguageCode.cc:461
@@ -2045,7 +2044,7 @@ msgstr "ქართული"
 #. language code: ger deu de
 #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473
 msgid "German"
-msgstr ""
+msgstr "გერმანული"
 
 #. language code: gez
 #: zypp/LanguageCode.cc:475
@@ -2060,7 +2059,7 @@ msgstr ""
 #. language code: gla gd
 #: zypp/LanguageCode.cc:479
 msgid "Gaelic"
-msgstr ""
+msgstr "გელური"
 
 #. language code: gle ga
 #: zypp/LanguageCode.cc:481
@@ -2070,12 +2069,12 @@ msgstr "ირლანდიური"
 #. language code: glg gl
 #: zypp/LanguageCode.cc:483
 msgid "Galician"
-msgstr ""
+msgstr "გალური"
 
 #. language code: glv gv
 #: zypp/LanguageCode.cc:485
 msgid "Manx"
-msgstr ""
+msgstr "მენცი"
 
 #. language code: gmh
 #: zypp/LanguageCode.cc:487
@@ -2095,12 +2094,12 @@ msgstr ""
 #. language code: gor
 #: zypp/LanguageCode.cc:493
 msgid "Gorontalo"
-msgstr ""
+msgstr "გორონტალო"
 
 #. language code: got
 #: zypp/LanguageCode.cc:495
 msgid "Gothic"
-msgstr ""
+msgstr "გოთური"
 
 #. language code: grb
 #: zypp/LanguageCode.cc:497
@@ -2120,12 +2119,12 @@ msgstr ""
 #. language code: grn gn
 #: zypp/LanguageCode.cc:505
 msgid "Guarani"
-msgstr ""
+msgstr "გუარანი"
 
 #. language code: guj gu
 #: zypp/LanguageCode.cc:507
 msgid "Gujarati"
-msgstr ""
+msgstr "გუჯარათული"
 
 #. language code: gwi
 #: zypp/LanguageCode.cc:509
@@ -2145,22 +2144,22 @@ msgstr ""
 #. language code: hau ha
 #: zypp/LanguageCode.cc:515
 msgid "Hausa"
-msgstr ""
+msgstr "ჰაუსა"
 
 #. language code: haw
 #: zypp/LanguageCode.cc:517
 msgid "Hawaiian"
-msgstr ""
+msgstr "ჰავაიური"
 
 #. language code: heb he
 #: zypp/LanguageCode.cc:519
 msgid "Hebrew"
-msgstr ""
+msgstr "ივრითი"
 
 #. language code: her hz
 #: zypp/LanguageCode.cc:521
 msgid "Herero"
-msgstr ""
+msgstr "ჰერერო"
 
 #. language code: hil
 #: zypp/LanguageCode.cc:523
@@ -2175,7 +2174,7 @@ msgstr ""
 #. language code: hin hi
 #: zypp/LanguageCode.cc:527
 msgid "Hindi"
-msgstr ""
+msgstr "ინდური"
 
 #. language code: hit
 #: zypp/LanguageCode.cc:529
@@ -2185,22 +2184,22 @@ msgstr ""
 #. language code: hmn
 #: zypp/LanguageCode.cc:531
 msgid "Hmong"
-msgstr ""
+msgstr "Hmong"
 
 #. language code: hmo ho
 #: zypp/LanguageCode.cc:533
 msgid "Hiri Motu"
-msgstr ""
+msgstr "ჰირი მოგუ"
 
 #. language code: hsb
 #: zypp/LanguageCode.cc:535
 msgid "Upper Sorbian"
-msgstr ""
+msgstr "ზედა სორბიული"
 
 #. language code: hun hu
 #: zypp/LanguageCode.cc:537
 msgid "Hungarian"
-msgstr ""
+msgstr "უნგრული"
 
 #. language code: hup
 #: zypp/LanguageCode.cc:539
@@ -2215,17 +2214,17 @@ msgstr ""
 #. language code: ibo ig
 #: zypp/LanguageCode.cc:543
 msgid "Igbo"
-msgstr ""
+msgstr "იგბო"
 
 #. language code: ice isl is
 #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547
 msgid "Icelandic"
-msgstr ""
+msgstr "ისლანდიური"
 
 #. language code: ido io
 #: zypp/LanguageCode.cc:549
 msgid "Ido"
-msgstr ""
+msgstr "იდო"
 
 #. language code: iii ii
 #: zypp/LanguageCode.cc:551
@@ -2240,12 +2239,12 @@ msgstr ""
 #. language code: iku iu
 #: zypp/LanguageCode.cc:555
 msgid "Inuktitut"
-msgstr ""
+msgstr "ინუკტიტუტი"
 
 #. language code: ile ie
 #: zypp/LanguageCode.cc:557
 msgid "Interlingue"
-msgstr ""
+msgstr "ოქსიდენტური"
 
 #. language code: ilo
 #: zypp/LanguageCode.cc:559
@@ -2265,7 +2264,7 @@ msgstr ""
 #. language code: ind id
 #: zypp/LanguageCode.cc:565
 msgid "Indonesian"
-msgstr ""
+msgstr "ინდონეზიური"
 
 #. language code: ine
 #: zypp/LanguageCode.cc:567
@@ -2280,7 +2279,7 @@ msgstr ""
 #. language code: ipk ik
 #: zypp/LanguageCode.cc:571
 msgid "Inupiaq"
-msgstr ""
+msgstr "ინუპიატი"
 
 #. language code: ira
 #: zypp/LanguageCode.cc:573
@@ -2300,7 +2299,7 @@ msgstr "იტალიური"
 #. language code: jav jv
 #: zypp/LanguageCode.cc:579
 msgid "Javanese"
-msgstr ""
+msgstr "იავური"
 
 #. language code: jbo
 #: zypp/LanguageCode.cc:581
@@ -2330,17 +2329,17 @@ msgstr ""
 #. language code: kab
 #: zypp/LanguageCode.cc:591
 msgid "Kabyle"
-msgstr ""
+msgstr "ქაბილი"
 
 #. language code: kac
 #: zypp/LanguageCode.cc:593
 msgid "Kachin"
-msgstr ""
+msgstr "კაჩინი"
 
 #. language code: kal kl
 #: zypp/LanguageCode.cc:595
 msgid "Kalaallisut"
-msgstr ""
+msgstr "კალაალისუტი"
 
 #. language code: kam
 #: zypp/LanguageCode.cc:597
@@ -2350,7 +2349,7 @@ msgstr ""
 #. language code: kan kn
 #: zypp/LanguageCode.cc:599
 msgid "Kannada"
-msgstr ""
+msgstr "კანნადა"
 
 #. language code: kar
 #: zypp/LanguageCode.cc:601
@@ -2360,7 +2359,7 @@ msgstr ""
 #. language code: kas ks
 #: zypp/LanguageCode.cc:603
 msgid "Kashmiri"
-msgstr ""
+msgstr "კაშმირი"
 
 #. language code: kau kr
 #: zypp/LanguageCode.cc:605
@@ -2375,7 +2374,7 @@ msgstr ""
 #. language code: kaz kk
 #: zypp/LanguageCode.cc:609
 msgid "Kazakh"
-msgstr ""
+msgstr "ყაზახური"
 
 #. language code: kbd
 #: zypp/LanguageCode.cc:611
@@ -2395,7 +2394,7 @@ msgstr ""
 #. language code: khm km
 #: zypp/LanguageCode.cc:617
 msgid "Khmer"
-msgstr ""
+msgstr "კხმერული"
 
 #. language code: kho
 #: zypp/LanguageCode.cc:619
@@ -2405,17 +2404,17 @@ msgstr ""
 #. language code: kik ki
 #: zypp/LanguageCode.cc:621
 msgid "Kikuyu"
-msgstr ""
+msgstr "კიკუიუ"
 
 #. language code: kin rw
 #: zypp/LanguageCode.cc:623
 msgid "Kinyarwanda"
-msgstr ""
+msgstr "კენიარუანდა"
 
 #. language code: kir ky
 #: zypp/LanguageCode.cc:625
 msgid "Kirghiz"
-msgstr ""
+msgstr "ყირგიზული"
 
 #. language code: kmb
 #: zypp/LanguageCode.cc:627
@@ -2480,7 +2479,7 @@ msgstr ""
 #. language code: kur ku
 #: zypp/LanguageCode.cc:651
 msgid "Kurdish"
-msgstr ""
+msgstr "ქურთული"
 
 #. language code: kut
 #: zypp/LanguageCode.cc:653
@@ -2505,17 +2504,17 @@ msgstr ""
 #. language code: lao lo
 #: zypp/LanguageCode.cc:661
 msgid "Lao"
-msgstr ""
+msgstr "ლაოსური"
 
 #. language code: lat la
 #: zypp/LanguageCode.cc:663
 msgid "Latin"
-msgstr ""
+msgstr "ლათინური"
 
 #. language code: lav lv
 #: zypp/LanguageCode.cc:665
 msgid "Latvian"
-msgstr ""
+msgstr "ლატვიური"
 
 #. language code: lez
 #: zypp/LanguageCode.cc:667
@@ -2525,17 +2524,17 @@ msgstr ""
 #. language code: lim li
 #: zypp/LanguageCode.cc:669
 msgid "Limburgan"
-msgstr ""
+msgstr "ლიმბურგანული"
 
 #. language code: lin ln
 #: zypp/LanguageCode.cc:671
 msgid "Lingala"
-msgstr ""
+msgstr "ლინგალა"
 
 #. language code: lit lt
 #: zypp/LanguageCode.cc:673
 msgid "Lithuanian"
-msgstr ""
+msgstr "ლიტვური"
 
 #. language code: lol
 #: zypp/LanguageCode.cc:675
@@ -2550,7 +2549,7 @@ msgstr ""
 #. language code: ltz lb
 #: zypp/LanguageCode.cc:679
 msgid "Luxembourgish"
-msgstr ""
+msgstr "ლუმბურგული"
 
 #. language code: lua
 #: zypp/LanguageCode.cc:681
@@ -2590,7 +2589,7 @@ msgstr ""
 #. language code: mac mkd mk
 #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697
 msgid "Macedonian"
-msgstr ""
+msgstr "მაკედონური"
 
 #. language code: mad
 #: zypp/LanguageCode.cc:699
@@ -2605,12 +2604,12 @@ msgstr ""
 #. language code: mah mh
 #: zypp/LanguageCode.cc:703
 msgid "Marshallese"
-msgstr ""
+msgstr "მარშალური"
 
 #. language code: mai
 #: zypp/LanguageCode.cc:705
 msgid "Maithili"
-msgstr ""
+msgstr "მაითხილი"
 
 #. language code: mak
 #: zypp/LanguageCode.cc:707
@@ -2620,7 +2619,7 @@ msgstr ""
 #. language code: mal ml
 #: zypp/LanguageCode.cc:709
 msgid "Malayalam"
-msgstr ""
+msgstr "მალაიამი"
 
 #. language code: man
 #: zypp/LanguageCode.cc:711
@@ -2630,7 +2629,7 @@ msgstr ""
 #. language code: mao mri mi
 #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715
 msgid "Maori"
-msgstr ""
+msgstr "მაორი"
 
 #. language code: map
 #: zypp/LanguageCode.cc:717
@@ -2640,7 +2639,7 @@ msgstr ""
 #. language code: mar mr
 #: zypp/LanguageCode.cc:719
 msgid "Marathi"
-msgstr ""
+msgstr "მარათი"
 
 #. language code: mas
 #: zypp/LanguageCode.cc:721
@@ -2650,7 +2649,7 @@ msgstr ""
 #. language code: may msa ms
 #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725
 msgid "Malay"
-msgstr ""
+msgstr "მალაიური"
 
 #. language code: mdf
 #: zypp/LanguageCode.cc:727
@@ -2665,7 +2664,7 @@ msgstr ""
 #. language code: men
 #: zypp/LanguageCode.cc:731
 msgid "Mende"
-msgstr ""
+msgstr "მანდი"
 
 #. language code: mga
 #: zypp/LanguageCode.cc:733
@@ -2695,12 +2694,12 @@ msgstr ""
 #. language code: mlg mg
 #: zypp/LanguageCode.cc:743
 msgid "Malagasy"
-msgstr ""
+msgstr "მალაგასი"
 
 #. language code: mlt mt
 #: zypp/LanguageCode.cc:745
 msgid "Maltese"
-msgstr ""
+msgstr "მალტური"
 
 #. language code: mnc
 #: zypp/LanguageCode.cc:747
@@ -2725,12 +2724,12 @@ msgstr ""
 #. language code: mol mo
 #: zypp/LanguageCode.cc:755
 msgid "Moldavian"
-msgstr ""
+msgstr "მოლდავური"
 
 #. language code: mon mn
 #: zypp/LanguageCode.cc:757
 msgid "Mongolian"
-msgstr ""
+msgstr "მონღოლური"
 
 #. language code: mos
 #: zypp/LanguageCode.cc:759
@@ -2745,7 +2744,7 @@ msgstr ""
 #. language code: mun
 #: zypp/LanguageCode.cc:763
 msgid "Munda languages"
-msgstr ""
+msgstr "მუნდას ენები"
 
 #. language code: mus
 #: zypp/LanguageCode.cc:765
@@ -2785,37 +2784,37 @@ msgstr ""
 #. language code: nap
 #: zypp/LanguageCode.cc:779
 msgid "Neapolitan"
-msgstr ""
+msgstr "ნეაპოლიტური"
 
 #. language code: nav nv
 #: zypp/LanguageCode.cc:783
 msgid "Navajo"
-msgstr ""
+msgstr "ნავაიო"
 
 #. language code: nbl nr
 #: zypp/LanguageCode.cc:785
 msgid "Ndebele, South"
-msgstr ""
+msgstr "სამხრეთ ნდებელე"
 
 #. language code: nde nd
 #: zypp/LanguageCode.cc:787
 msgid "Ndebele, North"
-msgstr ""
+msgstr "ჩრდილო ნდებელური"
 
 #. language code: ndo ng
 #: zypp/LanguageCode.cc:789
 msgid "Ndonga"
-msgstr ""
+msgstr "ნდონგა"
 
 #. language code: nds
 #: zypp/LanguageCode.cc:791
 msgid "Low German"
-msgstr ""
+msgstr "ქვემოგერმანული"
 
 #. language code: nep ne
 #: zypp/LanguageCode.cc:793
 msgid "Nepali"
-msgstr ""
+msgstr "ნეპალური"
 
 #. language code: new
 #: zypp/LanguageCode.cc:795
@@ -2840,7 +2839,7 @@ msgstr ""
 #. language code: nno nn
 #: zypp/LanguageCode.cc:803
 msgid "Norwegian Nynorsk"
-msgstr ""
+msgstr "ნორვეგიული ნიუნორსკი"
 
 #. language code: nob nb
 #: zypp/LanguageCode.cc:805
@@ -2860,12 +2859,12 @@ msgstr ""
 #. language code: nor no
 #: zypp/LanguageCode.cc:811
 msgid "Norwegian"
-msgstr ""
+msgstr "ნორვეგიული"
 
 #. language code: nso
 #: zypp/LanguageCode.cc:813
 msgid "Northern Sotho"
-msgstr ""
+msgstr "სამხრეთ-სოზო"
 
 #. language code: nub
 #: zypp/LanguageCode.cc:815
@@ -2880,7 +2879,7 @@ msgstr ""
 #. language code: nya ny
 #: zypp/LanguageCode.cc:819
 msgid "Chichewa"
-msgstr ""
+msgstr "ჩიჩევა"
 
 #. language code: nym
 #: zypp/LanguageCode.cc:821
@@ -2915,12 +2914,12 @@ msgstr ""
 #. language code: ori or
 #: zypp/LanguageCode.cc:833
 msgid "Oriya"
-msgstr ""
+msgstr "ორია"
 
 #. language code: orm om
 #: zypp/LanguageCode.cc:835
 msgid "Oromo"
-msgstr ""
+msgstr "ორომო"
 
 #. language code: osa
 #: zypp/LanguageCode.cc:837
@@ -2930,7 +2929,7 @@ msgstr ""
 #. language code: oss os
 #: zypp/LanguageCode.cc:839
 msgid "Ossetian"
-msgstr ""
+msgstr "ოსური"
 
 #. language code: ota
 #: zypp/LanguageCode.cc:841
@@ -2950,7 +2949,7 @@ msgstr ""
 #. language code: pag
 #: zypp/LanguageCode.cc:847
 msgid "Pangasinan"
-msgstr ""
+msgstr "პანგასინანი"
 
 #. language code: pal
 #: zypp/LanguageCode.cc:849
@@ -2960,7 +2959,7 @@ msgstr ""
 #. language code: pam
 #: zypp/LanguageCode.cc:851
 msgid "Pampanga"
-msgstr ""
+msgstr "პამპანგა"
 
 #. language code: pan pa
 #: zypp/LanguageCode.cc:853
@@ -2985,7 +2984,7 @@ msgstr ""
 #. language code: per fas fa
 #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863
 msgid "Persian"
-msgstr ""
+msgstr "სპარსული"
 
 #. language code: phi
 #: zypp/LanguageCode.cc:865
@@ -2995,17 +2994,17 @@ msgstr ""
 #. language code: phn
 #: zypp/LanguageCode.cc:867
 msgid "Phoenician"
-msgstr ""
+msgstr "ფონეტიკური"
 
 #. language code: pli pi
 #: zypp/LanguageCode.cc:869
 msgid "Pali"
-msgstr ""
+msgstr "პალი"
 
 #. language code: pol pl
 #: zypp/LanguageCode.cc:871
 msgid "Polish"
-msgstr ""
+msgstr "პოლონური"
 
 #. language code: pon
 #: zypp/LanguageCode.cc:873
@@ -3015,7 +3014,7 @@ msgstr ""
 #. language code: por pt
 #: zypp/LanguageCode.cc:875
 msgid "Portuguese"
-msgstr ""
+msgstr "პორტუგალიური"
 
 #. language code: pra
 #: zypp/LanguageCode.cc:877
@@ -3030,12 +3029,12 @@ msgstr ""
 #. language code: pus ps
 #: zypp/LanguageCode.cc:881
 msgid "Pushto"
-msgstr ""
+msgstr "პუშტო"
 
 #. language code: que qu
 #: zypp/LanguageCode.cc:883
 msgid "Quechua"
-msgstr ""
+msgstr "კეჩუა"
 
 #. language code: raj
 #: zypp/LanguageCode.cc:885
@@ -3065,22 +3064,22 @@ msgstr ""
 #. language code: rom
 #: zypp/LanguageCode.cc:895
 msgid "Romany"
-msgstr ""
+msgstr "რომაული"
 
 #. language code: rum ron ro
 #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899
 msgid "Romanian"
-msgstr ""
+msgstr "რუმინული"
 
 #. language code: run rn
 #: zypp/LanguageCode.cc:901
 msgid "Rundi"
-msgstr ""
+msgstr "რუნდი"
 
 #. language code: rus ru
 #: zypp/LanguageCode.cc:903
 msgid "Russian"
-msgstr ""
+msgstr "რუსული"
 
 #. language code: sad
 #: zypp/LanguageCode.cc:905
@@ -3090,12 +3089,12 @@ msgstr ""
 #. language code: sag sg
 #: zypp/LanguageCode.cc:907
 msgid "Sango"
-msgstr ""
+msgstr "სანგო"
 
 #. language code: sah
 #: zypp/LanguageCode.cc:909
 msgid "Yakut"
-msgstr ""
+msgstr "იაკუტიური"
 
 #. language code: sai
 #: zypp/LanguageCode.cc:911
@@ -3115,7 +3114,7 @@ msgstr ""
 #. language code: san sa
 #: zypp/LanguageCode.cc:917
 msgid "Sanskrit"
-msgstr ""
+msgstr "სანსკრიტი"
 
 #. language code: sas
 #: zypp/LanguageCode.cc:919
@@ -3125,17 +3124,17 @@ msgstr ""
 #. language code: sat
 #: zypp/LanguageCode.cc:921
 msgid "Santali"
-msgstr ""
+msgstr "სანტალი"
 
 #. language code: scc srp sr
 #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925
 msgid "Serbian"
-msgstr ""
+msgstr "სერბული"
 
 #. language code: scn
 #: zypp/LanguageCode.cc:927
 msgid "Sicilian"
-msgstr ""
+msgstr "სიცილიური"
 
 #. language code: sco
 #: zypp/LanguageCode.cc:929
@@ -3145,7 +3144,7 @@ msgstr ""
 #. language code: scr hrv hr
 #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933
 msgid "Croatian"
-msgstr ""
+msgstr "ხორვატული"
 
 #. language code: sel
 #: zypp/LanguageCode.cc:935
@@ -3170,7 +3169,7 @@ msgstr ""
 #. language code: shn
 #: zypp/LanguageCode.cc:943
 msgid "Shan"
-msgstr ""
+msgstr "შანი"
 
 #. language code: sid
 #: zypp/LanguageCode.cc:945
@@ -3180,7 +3179,7 @@ msgstr ""
 #. language code: sin si
 #: zypp/LanguageCode.cc:947
 msgid "Sinhala"
-msgstr ""
+msgstr "სინჰალა"
 
 #. language code: sio
 #: zypp/LanguageCode.cc:949
@@ -3200,12 +3199,12 @@ msgstr ""
 #. language code: slo slk sk
 #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957
 msgid "Slovak"
-msgstr ""
+msgstr "სლოვაკური"
 
 #. language code: slv sl
 #: zypp/LanguageCode.cc:959
 msgid "Slovenian"
-msgstr ""
+msgstr "სლოვენური"
 
 #. language code: sma
 #: zypp/LanguageCode.cc:961
@@ -3215,7 +3214,7 @@ msgstr ""
 #. language code: sme se
 #: zypp/LanguageCode.cc:963
 msgid "Northern Sami"
-msgstr ""
+msgstr "ჩრდილო-საამური"
 
 #. language code: smi
 #: zypp/LanguageCode.cc:965
@@ -3235,7 +3234,7 @@ msgstr ""
 #. language code: smo sm
 #: zypp/LanguageCode.cc:971
 msgid "Samoan"
-msgstr ""
+msgstr "სამოური"
 
 #. language code: sms
 #: zypp/LanguageCode.cc:973
@@ -3245,12 +3244,12 @@ msgstr ""
 #. language code: sna sn
 #: zypp/LanguageCode.cc:975
 msgid "Shona"
-msgstr ""
+msgstr "შონა"
 
 #. language code: snd sd
 #: zypp/LanguageCode.cc:977
 msgid "Sindhi"
-msgstr ""
+msgstr "სინდი"
 
 #. language code: snk
 #: zypp/LanguageCode.cc:979
@@ -3265,7 +3264,7 @@ msgstr ""
 #. language code: som so
 #: zypp/LanguageCode.cc:983
 msgid "Somali"
-msgstr ""
+msgstr "სომალი"
 
 #. language code: son
 #: zypp/LanguageCode.cc:985
@@ -3275,17 +3274,17 @@ msgstr ""
 #. language code: sot st
 #: zypp/LanguageCode.cc:987
 msgid "Sotho, Southern"
-msgstr ""
+msgstr "სამხრეთ-სოზო"
 
 #. language code: spa es
 #: zypp/LanguageCode.cc:989
 msgid "Spanish"
-msgstr ""
+msgstr "ესპანური"
 
 #. language code: srd sc
 #: zypp/LanguageCode.cc:991
 msgid "Sardinian"
-msgstr ""
+msgstr "სარდინიული"
 
 #. language code: srr
 #: zypp/LanguageCode.cc:993
@@ -3300,7 +3299,7 @@ msgstr ""
 #. language code: ssw ss
 #: zypp/LanguageCode.cc:997
 msgid "Swati"
-msgstr ""
+msgstr "სვატი"
 
 #. language code: suk
 #: zypp/LanguageCode.cc:999
@@ -3310,7 +3309,7 @@ msgstr ""
 #. language code: sun su
 #: zypp/LanguageCode.cc:1001
 msgid "Sundanese"
-msgstr ""
+msgstr "სუნდური"
 
 #. language code: sus
 #: zypp/LanguageCode.cc:1003
@@ -3325,22 +3324,22 @@ msgstr ""
 #. language code: swa sw
 #: zypp/LanguageCode.cc:1007
 msgid "Swahili"
-msgstr ""
+msgstr "სუაჰილი"
 
 #. language code: swe sv
 #: zypp/LanguageCode.cc:1009
 msgid "Swedish"
-msgstr ""
+msgstr "შვედური"
 
 #. language code: syr
 #: zypp/LanguageCode.cc:1011
 msgid "Syriac"
-msgstr ""
+msgstr "სირიული"
 
 #. language code: tah ty
 #: zypp/LanguageCode.cc:1013
 msgid "Tahitian"
-msgstr ""
+msgstr "ტაიტური"
 
 #. language code: tai
 #: zypp/LanguageCode.cc:1015
@@ -3350,17 +3349,17 @@ msgstr ""
 #. language code: tam ta
 #: zypp/LanguageCode.cc:1017
 msgid "Tamil"
-msgstr ""
+msgstr "თამილური"
 
 #. language code: tat tt
 #: zypp/LanguageCode.cc:1019
 msgid "Tatar"
-msgstr ""
+msgstr "თათრული"
 
 #. language code: tel te
 #: zypp/LanguageCode.cc:1021
 msgid "Telugu"
-msgstr ""
+msgstr "ტელუგური"
 
 #. language code: tem
 #: zypp/LanguageCode.cc:1023
@@ -3380,22 +3379,22 @@ msgstr ""
 #. language code: tgk tg
 #: zypp/LanguageCode.cc:1029
 msgid "Tajik"
-msgstr ""
+msgstr "ტაჯიკური"
 
 #. language code: tgl tl
 #: zypp/LanguageCode.cc:1031
 msgid "Tagalog"
-msgstr ""
+msgstr "ტაგალოგური"
 
 #. language code: tha th
 #: zypp/LanguageCode.cc:1033
 msgid "Thai"
-msgstr ""
+msgstr "ტაილანდური"
 
 #. language code: tib bod bo
 #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037
 msgid "Tibetan"
-msgstr ""
+msgstr "ტიბეტური"
 
 #. language code: tig
 #: zypp/LanguageCode.cc:1039
@@ -3405,7 +3404,7 @@ msgstr ""
 #. language code: tir ti
 #: zypp/LanguageCode.cc:1041
 msgid "Tigrinya"
-msgstr ""
+msgstr "ტიგრინია"
 
 #. language code: tiv
 #: zypp/LanguageCode.cc:1043
@@ -3450,17 +3449,17 @@ msgstr ""
 #. language code: tsn tn
 #: zypp/LanguageCode.cc:1061
 msgid "Tswana"
-msgstr ""
+msgstr "ცვანა"
 
 #. language code: tso ts
 #: zypp/LanguageCode.cc:1063
 msgid "Tsonga"
-msgstr ""
+msgstr "ტონგა"
 
 #. language code: tuk tk
 #: zypp/LanguageCode.cc:1065
 msgid "Turkmen"
-msgstr ""
+msgstr "თურქმენული"
 
 #. language code: tum
 #: zypp/LanguageCode.cc:1067
@@ -3475,7 +3474,7 @@ msgstr ""
 #. language code: tur tr
 #: zypp/LanguageCode.cc:1071
 msgid "Turkish"
-msgstr ""
+msgstr "თურქული"
 
 #. language code: tut
 #: zypp/LanguageCode.cc:1073
@@ -3485,7 +3484,7 @@ msgstr ""
 #. language code: twi tw
 #: zypp/LanguageCode.cc:1077
 msgid "Twi"
-msgstr ""
+msgstr "ტვი"
 
 #. language code: tyv
 #: zypp/LanguageCode.cc:1079
@@ -3495,22 +3494,22 @@ msgstr ""
 #. language code: udm
 #: zypp/LanguageCode.cc:1081
 msgid "Udmurt"
-msgstr ""
+msgstr "უდმურტული"
 
 #. language code: uga
 #: zypp/LanguageCode.cc:1083
 msgid "Ugaritic"
-msgstr ""
+msgstr "უგარათული"
 
 #. language code: uig ug
 #: zypp/LanguageCode.cc:1085
 msgid "Uighur"
-msgstr ""
+msgstr "უიღური"
 
 #. language code: ukr uk
 #: zypp/LanguageCode.cc:1087
 msgid "Ukrainian"
-msgstr ""
+msgstr "უკრაინული"
 
 #. language code: umb
 #: zypp/LanguageCode.cc:1089
@@ -3525,27 +3524,27 @@ msgstr ""
 #. language code: urd ur
 #: zypp/LanguageCode.cc:1093
 msgid "Urdu"
-msgstr ""
+msgstr "ურდუ"
 
 #. language code: uzb uz
 #: zypp/LanguageCode.cc:1095
 msgid "Uzbek"
-msgstr ""
+msgstr "უზბეკური"
 
 #. language code: vai
 #: zypp/LanguageCode.cc:1097
 msgid "Vai"
-msgstr ""
+msgstr "ვაი"
 
 #. language code: ven ve
 #: zypp/LanguageCode.cc:1099
 msgid "Venda"
-msgstr ""
+msgstr "ვენდა"
 
 #. language code: vie vi
 #: zypp/LanguageCode.cc:1101
 msgid "Vietnamese"
-msgstr ""
+msgstr "ვიეტნამური"
 
 #. language code: vol vo
 #: zypp/LanguageCode.cc:1103
@@ -3580,7 +3579,7 @@ msgstr ""
 #. language code: wel cym cy
 #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117
 msgid "Welsh"
-msgstr ""
+msgstr "უელსური"
 
 #. language code: wen
 #: zypp/LanguageCode.cc:1119
@@ -3590,27 +3589,27 @@ msgstr ""
 #. language code: wln wa
 #: zypp/LanguageCode.cc:1121
 msgid "Walloon"
-msgstr ""
+msgstr "ვალუნი"
 
 #. language code: wol wo
 #: zypp/LanguageCode.cc:1123
 msgid "Wolof"
-msgstr ""
+msgstr "ვოლოფი"
 
 #. language code: xal
 #: zypp/LanguageCode.cc:1125
 msgid "Kalmyk"
-msgstr ""
+msgstr "კალმიკური"
 
 #. language code: xho xh
 #: zypp/LanguageCode.cc:1127
 msgid "Xhosa"
-msgstr ""
+msgstr "ხოსა"
 
 #. language code: yao
 #: zypp/LanguageCode.cc:1129
 msgid "Yao"
-msgstr ""
+msgstr "იაო"
 
 #. language code: yap
 #: zypp/LanguageCode.cc:1131
@@ -3620,12 +3619,12 @@ msgstr ""
 #. language code: yid yi
 #: zypp/LanguageCode.cc:1133
 msgid "Yiddish"
-msgstr ""
+msgstr "იდიში"
 
 #. language code: yor yo
 #: zypp/LanguageCode.cc:1135
 msgid "Yoruba"
-msgstr ""
+msgstr "იორუბა"
 
 #. language code: ypk
 #: zypp/LanguageCode.cc:1137
@@ -3645,7 +3644,7 @@ msgstr ""
 #. language code: zha za
 #: zypp/LanguageCode.cc:1143
 msgid "Zhuang"
-msgstr ""
+msgstr "ჟუანგი"
 
 #. language code: znd
 #: zypp/LanguageCode.cc:1145
@@ -3655,7 +3654,7 @@ msgstr ""
 #. language code: zul zu
 #: zypp/LanguageCode.cc:1147
 msgid "Zulu"
-msgstr ""
+msgstr "ზულუ"
 
 #. language code: zun
 #: zypp/LanguageCode.cc:1149
@@ -3707,96 +3706,95 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
-#, fuzzy, c-format, boost-format
+#, c-format, boost-format
 msgid "Failed to read directory '%s'"
-msgstr "Failed to parse: %s."
+msgstr "საქაღალდის ('%s') წაკთხვის შეცდომა"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
-#, fuzzy, c-format, boost-format
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
+#, c-format, boost-format
 msgid "Can't open file '%s' for writing."
-msgstr "Couldn't open file: %s."
+msgstr "ფაილის ('%s') ჩასაწერად გახსნის შეცდომა."
 
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
-#, fuzzy
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
-msgstr[0] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)"
+msgstr[0] "მითითებულ ბმულებზე სწორი მეტამონაცემების პოვნა შეუძლებელია"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
-#, fuzzy, c-format, boost-format
+#: zypp/RepoManager.cc:1446
+#, c-format, boost-format
 msgid "Failed to cache repo (%d)."
-msgstr "Failed to parse: %s."
+msgstr "რეპოს (%d) კეშირების შეცდომა."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3806,44 +3804,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3853,19 +3851,19 @@ msgstr ""
 
 #: zypp/VendorSupportOptions.cc:17
 msgid "unsupported"
-msgstr ""
+msgstr "მხარდაუჭერელი"
 
 #: zypp/VendorSupportOptions.cc:20
 msgid "Level 1"
-msgstr ""
+msgstr "დონე 1"
 
 #: zypp/VendorSupportOptions.cc:23
 msgid "Level 2"
-msgstr ""
+msgstr "დონე 2"
 
 #: zypp/VendorSupportOptions.cc:26
 msgid "Level 3"
-msgstr ""
+msgstr "დონე 3"
 
 #: zypp/VendorSupportOptions.cc:29
 msgid "Additional Customer Contract Necessary"
@@ -3873,7 +3871,7 @@ msgstr ""
 
 #: zypp/VendorSupportOptions.cc:31
 msgid "invalid"
-msgstr ""
+msgstr "არასწორი"
 
 #: zypp/VendorSupportOptions.cc:39
 msgid "The level of support is unspecified"
@@ -3913,7 +3911,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3941,25 +3939,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -3981,7 +3989,7 @@ msgstr ""
 
 #: zypp/repo/PackageProvider.cc:331
 msgid "Signature verification failed"
-msgstr ""
+msgstr "ხელმოწერის გადამოწმების შეცდომა"
 
 #. TranslatorExplanation %s = package being checked for integrity
 #: zypp/repo/PackageProvider.cc:462
@@ -4019,7 +4027,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4136,7 +4144,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4144,393 +4152,426 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
-msgstr ""
+msgstr "ურთიერთგამომრიცხავი მოთხოვნები"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
-msgstr ""
+msgstr "დამოკიდებულების რამდენიმე პრობლემა"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
-msgstr ""
+msgstr "მხარდაუჭერელი მოთხოვნა"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4538,13 +4579,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4555,48 +4596,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
-#, fuzzy
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
-msgstr "დამატებითი კოდი"
+msgstr "RPM-ის დამატებითი გამონატანი"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4639,7 +4679,7 @@ msgstr ""
 
 #: zypp-core/base/Exception.cc:150
 msgid "History:"
-msgstr ""
+msgstr "ისტორია:"
 
 #: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
@@ -4723,72 +4763,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4938,6 +4978,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4957,6 +5001,91 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "დიახ"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "არა"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "გაფთხილება:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "შეცდომა:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "გავაგრძლო?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "მიღება:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "გაშვება"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "ვერ ვიპოვე"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "დიახ"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "არა"
+
 #~ msgid "Cannot create public key %s from %s keyring to file %s"
 #~ msgstr "لا يمكن إنشاء المفتاح العام %s من %s إلى ملف حلقة المفاتيح %s"
 
index 49ae27c..5eeaf65 100644 (file)
--- a/po/km.po
+++ b/po/km.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.km\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2010-06-03 08:04+0700\n"
 "Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
 "Language-Team: Khmer <support@khmeros.info>\n"
@@ -3710,52 +3710,52 @@ msgstr[0] "(ផុត​កំណត់​ក្នុង​រយៈពេល 
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "បាន​បរាជ័យ​ក្នុង​ការ​អាន​ថត '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "ឈ្មោះ​ក្លែងក្លាយ​ឃ្លាំង​មិន​អាច​ចាប់​ផ្តើម​ជា​មួយ​ចំណុច (.)បាន​ទេ ។"
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "ឈ្មោះ​ក្លែងក្លាយ​សេវាមិន​អាច​​ចាប់​ផ្តើម​​ជាមួយចំណុច ​(.)​បាន​ទេ ។"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "មិន​អាច​បើក​ឯកសារ '%s' ដើម្បី​សរសេរ​បានទេ ។"
@@ -3763,43 +3763,43 @@ msgstr "មិន​អាច​បើក​ឯកសារ '%s' ដើម្ប
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "រក​មិន​ឃើញ​ទិន្នន័យ​មេតា​ដែល​ត្រឹមត្រូវ​នៅ URL ដែល​បាន​បញ្ជាក់"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "មិន​អាច​បង្កើត​ %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "មិន​អាច​បង្កើត​ថត​ឃ្លាំង​សម្ងាត់​របស់​ទិន្នន័យ​មេតា ។"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "កំពុង​ស្ថាបនា​ឃ្លាំង '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "មិន​អាច​បង្កើត​ឃ្លាំង​សម្ងាត់​នៅ​ត្រង់​ %s - គ្មាន​សិទ្ធិ​ក្នុង​ការ​សរសេរ ។"
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ឃ្លាំង​ជា​ឃ្លាំង​សម្ងាត់ (%d) ។"
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "ប្រភេទ​ឃ្លាំង​ដែល​មិន​បាន​ដោះស្រាយ"
 
@@ -3809,44 +3809,44 @@ msgstr "ប្រភេទ​ឃ្លាំង​ដែល​មិន​បា
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "កំហុស​ក្នុង​ការ​ព្យាយាម​អាន​ពី '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "មាន​កំហុស​ដែល​មិន​ស្គាល់​ក្នុង​ការ​អាន​ពី '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "កំពុង​បន្ថែម​ឃ្លាំង '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "ឈ្មោះ​ឯកសារ​ឃ្លាំង​មិន​ត្រឹមត្រូវ​នៅ '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "យក​ឃ្លាំង '%s' ចេញ"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "មិន​អាច​ដោះស្រាយ​កន្លែង​ដែល​ឃ្លាំង​ត្រូវ​បាន​ទុក​បានទេ ។"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "មិនអាច​លុប '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "មិនអាច​​ដោះស្រាយ​កន្លែង​ដែល​សេវា​ត្រូវ​បានផ្ទុក​បានទេ ។"
 
@@ -3923,7 +3923,7 @@ msgstr "កិច្ចសន្យា​អតិថិជន​បន្ថែ
 msgid "Unknown support option. Description not available"
 msgstr "មិន​ស្គាល់​ជម្រើស​គាំទ្រ ។ មិនមាន​សេចក្ដីអធិប្បាយ"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3953,26 +3953,36 @@ msgid "Invalid regular expression '%s'"
 msgstr "កន្សោម​ធម្មតា​មិន​ត្រឹមត្រូវ '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "បាន​ទាមទារ​ការ​ផ្ទៀងផ្ទាត់​ភាព​ត្រឹមត្រូវ​សម្រាប់ '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 "មើល​មជ្ឈមណ្ឌល​អតិថិជន​របស់ Novell ដើម្បីពិនិត្យ​មើល​ថាតើ ការ​ចុះឈ្មោះ​ត្រឹមត្រូវ ហើយមិនបាន​ផុត​កំណត់ ។"
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4034,7 +4044,7 @@ msgid "No url in repository."
 msgstr "គ្មាន url នៅ​ក្នុង​ឃ្លាំង ។"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4152,7 +4162,7 @@ msgstr "បំបែក %s ដោយ​មិនអើពើ​ភាព​អ
 msgid "generally ignore of some dependencies"
 msgstr "ជា​ទូទៅ​មិនអើពើ​នឹង​ភាព​អាស្រ័យ​មួយ​ចំនួន"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4160,152 +4170,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "សំណើ​ការ​ប៉ះទង្គិច"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "បញ្ហា​ភាព​អាស្រ័យ​មួយ​ចំនួន"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 #, fuzzy
 msgid "unsupported request"
 msgstr "មិន​បានគាំទ្រ"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "ក្រុមហ៊ុន​ផ្ដល់​ដែល​បាន​លុប ៖ "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4313,243 +4323,276 @@ msgstr ""
 "\n"
 "លុបក្រុមហ៊ុនផ្ដល់ ៖ "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "ក្រុមហ៊ុន​លក់​ដែល​អាច​លុបបាន ៖ "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "សំណើ​នេះ​នឹង​ធ្វើ​ឲ្យ​ប្រព័ន្ធ​របស់​អ្នក​ខូច !"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "មិនអើពើ​នឹង​ការ​ព្រមាន​របស់​ប្រព័ន្ធ​ដែល​ខូច"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "ការ​ដំឡើង ត្រូវបាន​បោះបង់​ដោយ​ផ្ទាល់ ។"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " បាន​ប្រតិបត្តិ"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " បាន​បរាជ័យ​ក្នុងកា​រប្រតិបត្តិ"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " ការ​ប្រតិបត្តិ​បាន​រំលង​ខណៈពេល​បោះបង់"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "កំហុស​ក្នុង​ការ​ផ្ញើ​ការ​ជូនដំណឹង​សារបច្ចុប្បន្នភាព​ ។"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "សារ​បច្ចុប្បន្នភាព​ថ្មី"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM បាន​បរាជ័យ ៖ "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "បរាជ័យក្នុង​ការ​នាំចូល​សោ​សាធារណៈ​ពី​ឯកសារ %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "បរាជ័យ​ក្នុងការ​យក​សោ​សាធារណៈ %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "បាន​ប្ដូរ​ឯកសារ​កំណត់​រចនាសម្ព័ន្ធ​សម្រាប់ %s ៖"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm បានរ​ក្សា​ទុក %s ជា %s ប៉ុន្តែ​វា​អាច​កំណត់​ភាព​ខុស​គ្នា"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4559,13 +4602,13 @@ msgstr ""
 "នេះ​ជា​បន្ទាត់ ២៥ ជួរ​ដំបូង​ខុសគ្នា៖\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm បាន​បង្កើត %s ជា %s ប៉ុន្តែ​វា​មិន​អាច​កំណត់​ភាព​ខុស​គ្នា"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4578,50 +4621,50 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "លទ្ធផល rpm បន្ថែម"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "បាន​បង្កើត​ព័ត៌មាន​បម្រុង %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4750,72 +4793,72 @@ msgstr "តួអក្សរ​បំបែក​សម្រាប់​ពុ
 msgid "Invalid parameter array join separator character"
 msgstr "តួអក្សរ​បំបែក​សម្រាប់​ត​អារេ​ប៉ារ៉ាម៉ែត្រ មិន​ត្រឹមត្រូវ"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ​ដោយ​ស្ថានភាព %d ។"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "ពាក្យ​បញ្ជា​ត្រូវ​បាន​ផ្ដាច់​ដោយ​សញ្ញា %d (%s) ។"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ ដោយ​មាន​កំហុស​មិន​ស្គាល់ ។"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "មិនអាច chdir ទៅ '/' ក្នុង chroot (%s) បានទេ ។"
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "មិនអាច​ប្រតិបត្តិ '%s' (%s) ។"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "មិនអាច​បែងចែក (%s) បានទេ ។"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4968,6 +5011,10 @@ msgstr "ទីតាំង '%s' មិន​ដំណើរការ​ជា​
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " បញ្ហា​វិញ្ញាបនបត្រ SSL ផ្ទៀងផ្ទាត់​ថា​វិញ្ញាបនបត្រ CA គឺ​ត្រឹមត្រូវ​សម្រាប់ '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4987,6 +5034,95 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "បាទ/ចាស"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "ទេ"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "ធ្វើរួច"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "កំហុស"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "ព្រមាន ៖"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "កំហុស"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "បន្ត ?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "ព្រមាន ៖"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "ទៅ​ប្រមូល​យក ៖"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "ចាប់ផ្តើម"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "រក​មិនឃើញ"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "គ្មាន​ជំនួយ​សម្រាប់​ប្រអប់​សំណួរ​នេះ​ទេ ។"
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "គ្មាន​ជំនួយ​សម្រាប់​ជម្រើស​នេះ​ទេ"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "បាទ/ចាស"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ទេ"
+
 #~ msgid "%s does not belong to a distupgrade repository"
 #~ msgstr "%s មិនមែនជា​របស់​ឃ្លាំង distupgrade នោះ​ទេ"
 
index f9d763f..4ab0f87 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.ko\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2019-03-23 20:19+0000\n"
 "Last-Translator: Hwajin Kim <hwajin.kim@e4net.net>\n"
 "Language-Team: Korean <https://l10n.opensuse.org/projects/libzypp/master/ko/"
@@ -3898,52 +3898,52 @@ msgstr[0] "%d(24시간 내 만료)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "%2% 캐시에서 gpg 키 ID %1%을(를) 검색합니다."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "%2% 리포지토리에서 gpg 키 ID %1%을(를) 검색합니다."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "%1% 리포지토리에서 추가 'gpgkey=' URL을 정의하지 않습니다."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "리포지토리 디렉토리 '%1%'을(를) 읽을 수 없음: 사용 권한 거부됨"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "디렉토리 '%s'을(를) 읽지 못했습니다."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "리포지토리 파일 '%1%'을(를) 읽을 수 없음: 사용 권한 거부됨"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "리포지토리 별칭은 점(.)으로 시작할 수 없습니다."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "서비스 별칭은 점(.)으로 시작할 수 없습니다."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "쓰기 위한 파일 '%s'을(를) 열 수 없습니다."
@@ -3951,42 +3951,42 @@ msgstr "쓰기 위한 파일 '%s'을(를) 열 수 없습니다."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "알 수 없는 서비스 '%1%': 독립 서비스 리포지토리 '%2%' 제거 중"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "지정한 URL에는 유효한 메타데이터가 없음"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s을(를) 생성할 수 없음"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "메타 데이터 캐시 디렉토리를 생성할 수 없습니다."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "리포지토리 '%s' 캐시 빌드 중"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "%s에서 캐시를 생성할 수 없음 - 쓰기 권한이 없습니다."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "리포지토리(%d)를 캐시하지 못했습니다."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "리포지토리 유형이 처리되지 않았습니다."
 
@@ -3996,45 +3996,45 @@ msgstr "리포지토리 유형이 처리되지 않았습니다."
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "'%s'에서 읽기를 시도하는 중에 오류가 발생했습니다."
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "'%s'에서 읽는 중에 알 수 없는 오류가 발생했습니다."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "'%s' 리포지토리 추가 중"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s'에서 리포지토리 파일 이름이 잘못되었습니다."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "'%s' 리포지토리 제거 중"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "리포지토리가 저장된 위치를 알 수 없습니다."
 
 #  Frame title for installation target hard disk / partition(s)
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s'을(를) 삭제할 수 없습니다."
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "서비스가 저장된 위치를 알 수 없습니다."
 
@@ -4114,7 +4114,7 @@ msgstr "지원을 받으려면 추가 고객 계약이 필요합니다."
 msgid "Unknown support option. Description not available"
 msgstr "알 수 없는 지원 옵션입니다. 설명을 사용할 수 없습니다."
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4144,13 +4144,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "잘못된 정규식 '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s'에 대한 인증 필요"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4158,14 +4168,14 @@ msgstr ""
 "SUSE 고객 센터를 방문하여 등록이 올바른지, 등록이 만료되지 않았는지 확인합니"
 "다."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 "등록이 유효하고 만료되지 않았는지 확인하려면 Novell 고객 센터에 문의하십시오."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4225,7 +4235,7 @@ msgid "No url in repository."
 msgstr "리포지토리에 URL이 없습니다."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4391,7 +4401,7 @@ msgstr "일부 종속성을 무시하여 %s을(를) 구분합니다."
 msgid "generally ignore of some dependencies"
 msgstr "일부 종속을 일반적으로 무시"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4399,151 +4409,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "요청 충돌"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "일부 종속성 문제"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "지원되지 않는 요청"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "삭제된 공급자: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4551,244 +4561,277 @@ msgstr ""
 "\n"
 "설치 불가능한 공급자: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "설치할 수 없는 공급자: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "이 요청은 시스템을 손상시킵니다!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "손상된 시스템에 대한 경고를 무시합니다."
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "%%posttrans 스크립트 '%1%' 실행 중"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "%posttrans 스크립트 실행 중"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "설치가 지시된 대로 중단되었습니다."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " 실행됨"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " 실행 실패됨"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s이(가) 이미 %s(으)로 실행되었습니다."
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " 중단하는 중 실행 건너뜀"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "업데이트 메시지 알림을 보내는 중에 오류가 발생했습니다."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "새 업데이트 메시지"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM 실패: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "%1% 파일에서 공용 키를 임포트하지 못했습니다."
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "%1% 공용 키를 제거하지 못했습니다."
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #  progress stage
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s에 대한 구성 파일을 변경함:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "RPM은 %s을(를) %s(으)로 저장했지만, 차이점을 구분할 수 없습니다."
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4798,13 +4841,13 @@ msgstr ""
 "다음은 차이에 대한 처음 25개 행입니다.\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "RPM은 %s을(를) %s(으)로 생성했지만, 차이점을 구분할 수 없습니다."
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4818,47 +4861,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "추가 RPM 출력"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "백업 %s을(를) 만들었음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "서명 정상"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "알 수 없는 서명 유형"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "서명을 확인할 수 없음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "서명이 정상이지만 키를 신뢰할 수 없음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "서명 공용 키 사용 불가"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "파일이 존재하지 않거나 서명을 확인할 수 없음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "파일이 서명되지 않음"
 
@@ -4985,72 +5028,72 @@ msgstr "파라미터 맵 분할 구분 문자가 잘못되었습니다."
 msgid "Invalid parameter array join separator character"
 msgstr "파라미터 배열 조인 구분 문자가 잘못되었습니다."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "상태 %d(으)로 명령이 종료되었습니다."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "명령이 신호 %d(%s)에 의해 종료되었습니다."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "알 수 없는 오류와 함께 명령이 종료되었습니다."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "'%s'(%s)에 대해 chroot할 수 없습니다."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "'%s'(%s)(으)로 chdir할 수 없습니다."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "'%s'(chroot '%s' 내부)(%s)(으)로 chdir할 수 없습니다."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "'%s'(%s)을(를) 실행할 수 없습니다."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "fork(%s)할 수 없습니다."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5205,6 +5248,10 @@ msgstr "위치 '%s'에 일시적으로 액세스할 수 없습니다."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL 인증서 문제, '%s'의 CA 인증서에 문제가 없는지 확인하십시오."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5224,6 +5271,100 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "예"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "아니요"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "완료"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "오류"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "참조:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "경고:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "오류:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "계속하시겠습니까?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "경고: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "검색 중:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "시작 중"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "찾을 수 없음"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "이 프롬프트에 사용 가능한 도움말이 없습니다."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "이 옵션에 사용 가능한 도움말이 없습니다."
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "모든 옵션 표시"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "예"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "아니요"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "%%posttrans 스크립트 '%1%' 실행 중"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "%posttrans 스크립트 실행 중"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "패키지가 서명되지 않았습니다!"
 
index 696620d..de14fd1 100644 (file)
--- a/po/ku.po
+++ b/po/ku.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: memory.ku.po\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2005-09-23 00:15+0200\n"
 "Last-Translator: Kurdish Team <i18n@suse.de>\n"
 "Language-Team: Kurdish Team <i18n@suse.de>\n"
@@ -3783,53 +3783,53 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Nekarî pelrêça '%1' biafirîne."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Arşîv nederbasdar e."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Pela '%1' nayê vekirin"
@@ -3837,44 +3837,44 @@ msgstr "Pela '%1' nayê vekirin"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%1$s Biafirîne"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Pelrêç nayê afirandin"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Çavkaniyê &Çalak Bike"
@@ -3885,44 +3885,44 @@ msgstr "Çavkaniyê &Çalak Bike"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Di nivîsandina pela '%1' de çewtî çêbû"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Arşîva %1 tê Afirandin"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Arşîvan Rake"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Bi rastî bila '%1' jê bibe?"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3995,7 +3995,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "tu rave tuneye "
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4023,25 +4023,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Derbirîna bi Pergal(an)"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4103,7 +4113,7 @@ msgid "No url in repository."
 msgstr "Çavkanî hilbijêre."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4221,7 +4231,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4229,313 +4239,338 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Pakêtên nakokiyên wan hene"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 #, fuzzy
 msgid "unsupported request"
 msgstr "Piştgirî"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
@@ -4543,12 +4578,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Sazkirina di nav Pelrêç de"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "Bixebitîne"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "Nivîsandina mîhengan têk çû"
@@ -4556,71 +4591,79 @@ msgstr "Nivîsandina mîhengan têk çû"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Veavakirina IrDA biguherîne"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4628,13 +4671,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4645,51 +4688,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Zêdetir vebijark"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Pel nehat dîtin."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Pel nehat dîtin."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Pel nehat dîtin."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4820,72 +4863,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "%s nehat vebûn."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5036,6 +5079,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5055,6 +5102,101 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Erê"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Na"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "Endonezya"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Çewtî"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Hişyarî:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Çewtî"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Bila bidomîne?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Hişyarî:"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+#, fuzzy
+msgid "Retrieving:"
+msgstr "Tê rakirin"
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Mîheng"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Tu nehat dîtin"
+
+#: zypp-tui/output/OutNormal.cc:422
+#, fuzzy
+msgid "No help available for this prompt."
+msgstr "Tu alîkarî tune ye."
+
+#: zypp-tui/output/OutNormal.cc:439
+#, fuzzy
+msgid "no help available for this option"
+msgstr "Tu alîkarî tune ye"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "erê"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "na"
+
 #, fuzzy
 #~ msgid "problem with installed package %s"
 #~ msgstr "Sazkirina pakêtên hewce pêk nehat."
index 68246c1..0e39d0d 100644 (file)
--- a/po/lt.po
+++ b/po/lt.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2017-06-02 18:02+0000\n"
 "Last-Translator: Mindaugas Baranauskas <opensuse.lietuviu.kalba@gmail.com>\n"
 "Language-Team: Lithuanian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -3808,52 +3808,52 @@ msgstr[3] "(baigsis po %d d.)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nepavyko perskaityti katalogo „%1%“: nepakanka leidimų"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Nepavyko nuskaityti katalogo „%s“"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nepavyko perskaityti rinkmenos „%1%“: nepakanka leidimų"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Saugyklos pseudonimas negali prasidėti tašku."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Paslaugos pseudonimas negali prasidėti tašku."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nepavyksta atverti rinkmenos „%s“ įrašymui."
@@ -3861,14 +3861,14 @@ msgstr "Nepavyksta atverti rinkmenos „%s“ įrašymui."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Nežinoma paslauga „%1%“: pašalinama nebereikalinga paslaugų saugykla „%2%“"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Nurodytu URL nerasta tinkamų meta duomenų"
@@ -3876,31 +3876,31 @@ msgstr[1] "Nurodytuose URL nerasta tinkamų meta duomenų"
 msgstr[2] "Nurodytuose URL nerasta tinkamų meta duomenų"
 msgstr[3] "Nurodytuose URL nerasta tinkamų meta duomenų"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nepavyksta sukurti %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Nepavyko sukurti metaduomenų podėlio katalogo."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Kuriamas saugyklos „%s“ podėlis"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Nepavyksta sukurti podėlio ties %s - nepakanka teisių."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Nepavyko įkelti į saugyklų podėlį (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Nesutvarkytas saugyklos tipas"
 
@@ -3910,44 +3910,44 @@ msgstr "Nesutvarkytas saugyklos tipas"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Klaida bandant nuskaityti „%s“"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Nežinoma klaida skaitant iš „%s“"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Pridedama saugykla „%s“"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Netinkamas saugyklos pavadinimas „%s“"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Pašalinama saugykla „%s“"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Nepavyksta nustatyti, kur patalpinta ši saugykla"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nepavyksta pašalinti „%s“"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Nepavyksta nustatyti, kur patalpinta ši paslauga"
 
@@ -4027,7 +4027,7 @@ msgstr "Norint gauti palaikymą, reikalinga papildoma kliento sutartis."
 msgid "Unknown support option. Description not available"
 msgstr "Nežinomo palaikymo parinktis. Aprašas neprieinamasq"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4057,19 +4057,29 @@ msgid "Invalid regular expression '%s'"
 msgstr "Netinkamas reguliarusis reiškinys „%s“"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "%s reikalauja autentifikacijos"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4077,7 +4087,7 @@ msgstr ""
 "Apsilankykite Novell klientų aptarnavimo centre ir sužinosite, ar Jūsų "
 "registracija dar nėra pasibaigusi."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4139,7 +4149,7 @@ msgid "No url in repository."
 msgstr "Saugykloje nėra url."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4304,7 +4314,7 @@ msgstr "nepaisyti kai kurių priklausomybių ir taip sugadinti %s "
 msgid "generally ignore of some dependencies"
 msgstr "apskritai ignoruoti kai kurias priklausomybes"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4312,151 +4322,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "konfliktuojantys reikalavimai"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "kai kurių priklausomybių problema"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "nepalaikoma užklausa"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "pašalinti galimi pasiūlymai: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4464,243 +4474,276 @@ msgstr ""
 "\n"
 "netinkami įdiegti pasiūlymai: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "netinkami diegimui pasiūlymai: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Šis veiksmas sugadins jūsų sistemą!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "nepaisyti perspėjimų apie riziką sugadinti sistemą"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Diegimas buvo nutrauktas pagal nurodymą."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " įvykdyta"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " įvykdyti nepavyko"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s jau įvykdytas kaip %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " nutraukiant vykdymas sustabdytas"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Siunčiant atnaujinimo pranešimą įvyko klaida."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Naujas atnaujinimo pranešimas"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM klaida:"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nepavyko įkelti viešojo rakto %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Nepavyko pašalinti viešojo rakto %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Pakeistos %s konfigūracijos rinkmenos:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm išsaugojo %s kaip %s, bet neįmanoma nustatyti skirtumo"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4710,13 +4753,13 @@ msgstr ""
 "Pateikiamos pirmosios 25 skirtumų eilutės:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm sukūrė %s kaip %s, bet neįmanoma nustatyti skirtumo"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4729,47 +4772,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Papildoma rpm išvestis"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "padaryta %s atsarginė kopija"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Parašas geras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Nežinomo tipo parašas"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Parašas nepatikrinamas. "
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Parašas geras, bet raktas nepatikimas"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Paašo viešasis raktas neprieinamas"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Nėra rinkmenos arba negalima patikrinti parašo"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4896,72 +4939,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Komanda baigta būsenoje %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Komanda nutraukta naudojant signalą %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Komanda pasibaigė su nežinoma klaida."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Nepavyksta keisti pakeisti aplanko į „%s“ (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Nepavyksta įvykdyti „%s“ (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5115,6 +5158,10 @@ msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 " SSL liudijimo problema, patikrinkite liudijimų įstaigos tvarkingumą „%s“."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5134,6 +5181,92 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Taip"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ne"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "atlikta"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "klaida"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Pastaba:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Įspėjimas:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Klaida:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Tęsti?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Įspėjimas: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Gaunama:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "paleidžiama"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "nerasta"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Čia pagalba neprieinama."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "šiaip parinkčiai paaiškinimo nėra"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "rodyti visas parinktis"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "taip"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ne"
+
 #~ msgid "%s does not belong to a distupgrade repository"
 #~ msgstr ""
 #~ "%s nepriklauso platinamojo paketo naujovinimo (distupgrade) saugyklai"
index 0269203..f1e5de4 100644 (file)
--- a/po/mk.po
+++ b/po/mk.po
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-08-30 07:13+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-05-29 06:14+0000\n"
 "Last-Translator: Kristijan Fremen Velkovski <me@krisfremen.com>\n"
 "Language-Team: Macedonian <https://l10n.opensuse.org/projects/libzypp/master/"
 "mk/>\n"
@@ -879,12 +879,12 @@ msgstr "KStep"
 #. :MAC:446:
 #: zypp/CountryCode.cc:305
 msgid "Northern Mariana Islands"
-msgstr ""
+msgstr "Северните Маријански Острови"
 
 #. :MNP:580:
 #: zypp/CountryCode.cc:306
 msgid "Martinique"
-msgstr ""
+msgstr "Мартиник"
 
 # MR
 # fuzzy
@@ -896,7 +896,7 @@ msgstr "Литвански"
 #. :MRT:478:
 #: zypp/CountryCode.cc:308
 msgid "Montserrat"
-msgstr ""
+msgstr "Монтсерат"
 
 # MT
 # fuzzy
@@ -942,7 +942,7 @@ msgstr "KStep"
 #. :MYS:458:
 #: zypp/CountryCode.cc:315
 msgid "Mozambique"
-msgstr ""
+msgstr "Мозамбик"
 
 #. :MOZ:508:
 #: zypp/CountryCode.cc:316
@@ -1010,7 +1010,7 @@ msgstr "Науру"
 #. :NRU:520:
 #: zypp/CountryCode.cc:326
 msgid "Niue"
-msgstr ""
+msgstr "Ниуе"
 
 # NZ
 #. :NIU:570:
@@ -1021,7 +1021,7 @@ msgstr "Нов Зеланд"
 #. :NZL:554:
 #: zypp/CountryCode.cc:328
 msgid "Oman"
-msgstr ""
+msgstr "Оман"
 
 # PA
 #. :OMN:512:
@@ -1038,25 +1038,24 @@ msgstr "Перу"
 #. :PER:604:
 #: zypp/CountryCode.cc:331
 msgid "French Polynesia"
-msgstr ""
+msgstr "Француска Полинезија"
 
 #. :PYF:258:
 #: zypp/CountryCode.cc:332
 msgid "Papua New Guinea"
-msgstr ""
+msgstr "Папуа Нова Гвинеја"
 
 #. :PNG:598:
 #: zypp/CountryCode.cc:333
 msgid "Philippines"
-msgstr ""
+msgstr "Филипини"
 
 # TJ
 # fuzzy
 #. :PHL:608:
 #: zypp/CountryCode.cc:334
-#, fuzzy
 msgid "Pakistan"
-msgstr "ТаÑ\98ван"
+msgstr "Ð\9fакиÑ\81Ñ\82ан"
 
 # PL
 #. :PAK:586:
@@ -1095,7 +1094,7 @@ msgstr "Португалија"
 #. :PRT:620:
 #: zypp/CountryCode.cc:341
 msgid "Palau"
-msgstr "Парагвај"
+msgstr "Палау"
 
 # PY
 #. :PLW:585:
@@ -1123,9 +1122,8 @@ msgstr "Романија"
 
 #. :ROU:642:
 #: zypp/CountryCode.cc:346
-#, fuzzy
 msgid "Serbia"
-msgstr "СÑ\80пÑ\81ки"
+msgstr "СÑ\80биÑ\98а"
 
 #: zypp/CountryCode.cc:347
 msgid "Russian Federation"
@@ -1147,9 +1145,8 @@ msgstr ""
 # fuzzy
 #. :SAU:682:
 #: zypp/CountryCode.cc:350
-#, fuzzy
 msgid "Solomon Islands"
-msgstr "Ð\98Ñ\80Ñ\81ка"
+msgstr "Соломонови Ð\9eÑ\81Ñ\82Ñ\80ови"
 
 #. :SLB:090:
 #: zypp/CountryCode.cc:351
@@ -1292,9 +1289,8 @@ msgstr ""
 # fuzzy
 #. :TKL:772:
 #: zypp/CountryCode.cc:375
-#, fuzzy
 msgid "Turkmenistan"
-msgstr "Тајван"
+msgstr "Туркменистан"
 
 # TN
 # fuzzy
@@ -1379,9 +1375,8 @@ msgstr "Уругвај"
 # fuzzy
 #. :URY:858:
 #: zypp/CountryCode.cc:389
-#, fuzzy
 msgid "Uzbekistan"
-msgstr "ТаÑ\98ван"
+msgstr "УзбекиÑ\81Ñ\82ан"
 
 #. :UZB:860:
 #: zypp/CountryCode.cc:390
@@ -1403,9 +1398,8 @@ msgstr "Венецуела"
 # fuzzy
 #. :VEN:862:
 #: zypp/CountryCode.cc:393
-#, fuzzy
 msgid "British Virgin Islands"
-msgstr "ФинÑ\81ка"
+msgstr "Ð\91Ñ\80иÑ\82анÑ\81ки Ð\94евÑ\81Ñ\82вени Ð\9eÑ\81Ñ\82Ñ\80ови"
 
 # VI
 # fuzzy
@@ -1505,14 +1499,12 @@ msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
 #: zypp/KeyRing.cc:759
-#, fuzzy
 msgid "Failed to import key."
-msgstr "Failed to parse: %s."
+msgstr "Не успеа да се увезе клучот."
 
 #: zypp/KeyRing.cc:766
-#, fuzzy
 msgid "Failed to delete key."
-msgstr "Failed to parse: %s."
+msgstr "Не успеа да се избрише клучот."
 
 #: zypp/KeyRing.cc:772
 #, c-format, boost-format
@@ -1535,9 +1527,8 @@ msgstr ""
 
 #. language code: ace
 #: zypp/LanguageCode.cc:165
-#, fuzzy
 msgid "Achinese"
-msgstr "Ð\9aинески"
+msgstr "Ð\90кинески"
 
 #. language code: ach
 #: zypp/LanguageCode.cc:167
@@ -1586,9 +1577,8 @@ msgstr ""
 
 #. language code: alb sqi sq
 #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187
-#, fuzzy
 msgid "Albanian"
-msgstr "Романски"
+msgstr "Ð\90лбански"
 
 #. language code: ale
 #: zypp/LanguageCode.cc:189
@@ -1598,16 +1588,14 @@ msgstr ""
 # AU
 #. language code: alg
 #: zypp/LanguageCode.cc:191
-#, fuzzy
 msgid "Algonquian Languages"
-msgstr "Ð\90вÑ\81Ñ\82Ñ\80алиÑ\98а"
+msgstr "Ð\90лгонкиÑ\81ки Ñ\98азиÑ\86и"
 
 # ZA
 #. language code: alt
 #: zypp/LanguageCode.cc:193
-#, fuzzy
 msgid "Southern Altai"
-msgstr "Ð\88Ñ\83жна Ð\90Ñ\84Ñ\80ика"
+msgstr "Ð\88Ñ\83жен Ð\90лÑ\82аÑ\98"
 
 #. language code: amh am
 #: zypp/LanguageCode.cc:195
@@ -1622,9 +1610,8 @@ msgstr ""
 # AU
 #. language code: apa
 #: zypp/LanguageCode.cc:199
-#, fuzzy
 msgid "Apache Languages"
-msgstr "Ð\90вÑ\81Ñ\82Ñ\80алиÑ\98а"
+msgstr "Ð\90паÑ\87и Ñ\98азиÑ\86и"
 
 #. language code: ara ar
 #: zypp/LanguageCode.cc:201
@@ -1635,9 +1622,8 @@ msgstr "Арапски"
 # fuzzy
 #. language code: arc
 #: zypp/LanguageCode.cc:203
-#, fuzzy
 msgid "Aramaic"
-msgstr "Ð\88амаÑ\98ка"
+msgstr "Ð\90Ñ\80амеÑ\98Ñ\81ки"
 
 #. language code: arg an
 #: zypp/LanguageCode.cc:205
@@ -1648,15 +1634,13 @@ msgstr ""
 # fuzzy
 #. language code: arm hye hy
 #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209
-#, fuzzy
 msgid "Armenian"
-msgstr "Ð\90Ñ\80генÑ\82ина"
+msgstr "Ð\95Ñ\80менÑ\81ки"
 
 #. language code: arn
 #: zypp/LanguageCode.cc:211
-#, fuzzy
 msgid "Araucanian"
-msgstr "Ð\9bиÑ\82вански"
+msgstr "Ð\90Ñ\80аÑ\83кански"
 
 #. language code: arp
 #: zypp/LanguageCode.cc:213
@@ -1686,16 +1670,14 @@ msgstr ""
 # AU
 #. language code: ath
 #: zypp/LanguageCode.cc:223
-#, fuzzy
 msgid "Athapascan Languages"
-msgstr "Австралија"
+msgstr "Атапаскански јазици"
 
 # AU
 #. language code: aus
 #: zypp/LanguageCode.cc:225
-#, fuzzy
 msgid "Australian Languages"
-msgstr "Ð\90вÑ\81Ñ\82Ñ\80алиÑ\98а"
+msgstr "Ð\90вÑ\81Ñ\82Ñ\80алиÑ\81ки Ñ\98азиÑ\86и"
 
 #. language code: ava av
 #: zypp/LanguageCode.cc:227
@@ -1721,17 +1703,15 @@ msgstr ""
 # fuzzy
 #. language code: aze az
 #: zypp/LanguageCode.cc:235
-#, fuzzy
 msgid "Azerbaijani"
-msgstr "СÑ\80пски"
+msgstr "Ð\90зеÑ\80беÑ\98Ñ\9fански"
 
 # RW
 # fuzzy
 #. language code: bad
 #: zypp/LanguageCode.cc:237
-#, fuzzy
 msgid "Banda"
-msgstr "Ð\9aанада"
+msgstr "Ð\91анда"
 
 #. language code: bai
 #: zypp/LanguageCode.cc:239
@@ -4065,52 +4045,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
-#, boost-format, c-format
+#, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Неможеше да се прочита директориумот '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4118,43 +4098,43 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
-#, boost-format, c-format
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
+#, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Неможеше да се створи %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
-#, boost-format, c-format
+#: zypp/RepoManager.cc:1446
+#, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Неможеше да се кешира складиштето (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4164,44 +4144,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
-#, boost-format, c-format
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
+#, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Неможеше да се избрише '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4271,7 +4251,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4299,25 +4279,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4378,7 +4368,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4502,7 +4492,7 @@ msgstr "скрши %s со игнорирање некои од неговите
 msgid "generally ignore of some dependencies"
 msgstr "генерално игнорирај некои зависности"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4511,393 +4501,426 @@ msgstr ""
 "инсталираниот %1% не припаѓа во distupgrade складижте и мора да се замени"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "инсталираниот %1% има инфериорна архитектура"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "проблем со инсталираниот %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "спротивставени барања"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "некои проблеми со зависности"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "ништо не го поддржува бараниот '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Дали ги вклучивте сите потребни складишта?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "бараниот пакет %1% не постои"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " егзекуцијата не успеа"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4905,13 +4928,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4922,47 +4945,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -5089,83 +5112,83 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
-#, boost-format, c-format
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
+#, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Неможеше да се chdir-а во '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
 #: zypp-media/mediaexception.cc:33
-#, boost-format, c-format
+#, c-format, boost-format
 msgid "Failed to mount %s on %s"
 msgstr "Неможеше да се монтира %s во %s"
 
 #: zypp-media/mediaexception.cc:43
-#, boost-format, c-format
+#, c-format, boost-format
 msgid "Failed to unmount %s"
 msgstr "Неможеше да се демонтира %s"
 
@@ -5304,6 +5327,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5323,6 +5350,91 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr ""
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr ""
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
index bdad6ce..3ab0029 100644 (file)
--- a/po/mr.po
+++ b/po/mr.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Check hardware-2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2006-11-13 12:55+0530\n"
 "Last-Translator: Priyavert Sharma <priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions <linux_team@agreeya.com>\n"
@@ -3709,54 +3709,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr " VM चे नाव आकड्याने सुरू होता कामा नये. "
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr " VM चे नाव आकड्याने सुरू होता कामा नये. "
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "फाईलरायटिंगसाठी उघडू शकत नाही."
@@ -3764,44 +3764,44 @@ msgstr "फाईलरायटिंगसाठी उघडू शकत न
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr " डेस्कटॉप आयटेम'%s' उघडू शकत नाही"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "डिरेक्टर %1: %2 निर्माण करता आली नाही."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3811,44 +3811,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "फ्लॉपी डिस्कवरुन एरर वाचत आहे."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "पाठवल्याच्या फाईलचे अवैध नांव"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "रिसोर्सेस जतन करत आहे"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr " डेस्कटॉप आयटेम'%s' उघडू शकत नाही"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3919,7 +3919,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3947,25 +3947,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "अवैध Url स्कीम %s"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4030,7 +4040,7 @@ msgid "No url in repository."
 msgstr "भांडारात फाईल %1 आढळली नाही"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4149,7 +4159,7 @@ msgstr "या गरजेकडे येथेच दुर्लक्ष 
 msgid "generally ignore of some dependencies"
 msgstr "या गरजेकडे येथेच दुर्लक्ष करा"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4157,329 +4167,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "यांच्याशी कनेक्शनची रिक्वेस्ट :"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "अवलंबून असण्याच्या (डिपेन्डन्सी) समस्येमुळे %s स्थापित करु शकत नाही"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "कोणतीही गोष्ट %s पुरवत नाही"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "विनंती आधीपासूनच आहे."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "निर्देशानुसार स्थापना मधेच सोडली"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "अमलात आणा"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4487,73 +4522,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "की च्या सांकेतिकीकरणादरम्यान चूक आली"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "अयशस्वी"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s साठी बदललेल्या आकृतीबंध फाईल्स"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s हे %s म्हणन जतन केले, परंतु फरक सांगणे अशक्य"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4561,13 +4604,13 @@ msgid ""
 msgstr "rpm ने %s हे %s म्हणून जतन केले/nफरकाच्या या पहिल्या 25 ओळी\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s  हे %s म्हणून जतन केले फरकाच्या या पहिल्या"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4578,51 +4621,51 @@ msgstr "rpm ने %s हे %s म्हणून जतन केले/nफ
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "अतिरिक्त rpm आऊटपुट"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "बॅकअप %s  निर्माण केले"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "नोंद आढळली नाही"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "नोंद आढळली नाही"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "नोंद आढळली नाही"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4749,73 +4792,73 @@ msgstr "अवैध पॅरामीटर मॅप स्प्लिट 
 msgid "Invalid parameter array join separator character"
 msgstr "अवैध पॅरामीटर अरे जॉईन सेपरेटर कॅरॅक्टर "
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr " कनेक्ट करतांना आदेश वापरला "
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "%s आढळत नाही."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "%s आढळत नाही."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4966,6 +5009,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4985,6 +5032,96 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "होय"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "नाही"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "केले"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "चूक"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "सावधान"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "त्रुटी"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "चालू ठेवायचे?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "सावधान"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "सुरु करत आहे..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "सापडले नाही"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "योय"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "नाहीं"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे."
index 139b4e4..0eebc48 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2022-05-29 21:13+0000\n"
 "Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
 "Language-Team: Norwegian Bokmål <https://l10n.opensuse.org/projects/libzypp/"
@@ -3846,52 +3846,52 @@ msgstr[1] "(utløper innen 24 t)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Kunnne ikke lese katalogen: '%s'."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Et pakkebrønnalias kan ikke begynne med punktum."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Tjenestealiaset kan ikke begynne med punktum."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan ikke åpne filen '%s' for å skrive til den."
@@ -3899,44 +3899,44 @@ msgstr "Kan ikke åpne filen '%s' for å skrive til den."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Ingen gyldige metadata funnet på spesifisert(e) nettadresse(r)"
 msgstr[1] "Ingen gyldige metadata funnet på spesifisert(e) nettadresse(r)"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan ikke opprette %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Kan ikke opprette katalog for metadatamellomlager."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Bygger pakkebrønnmellomlager '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan ikke opprette mellomlager på %s - skrivebeskyttet."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Kunne ikke mellomlagre pakkebrønn (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Pakkebrønntypen er ugyldig"
 
@@ -3946,44 +3946,44 @@ msgstr "Pakkebrønntypen er ugyldig"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Feil under lesing fra '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ukjent feil ved lesing fra '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Legger til pakkebrønn '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ugyldig pakkebrønnfilnavn på '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Fjerner pakkebrønnen '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Finner ikke ut hvor pakkebrønnen er lagret."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan ikke slette '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Finner ikke ut hvor tjenesten er lagret."
 
@@ -4063,7 +4063,7 @@ msgstr "Brukerstøtte krever en tilleggskundekontrakt."
 msgid "Unknown support option. Description not available"
 msgstr "Ukjent brukerstøttevalg. Ingen beskrivelse tilgjengelig"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4093,19 +4093,29 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ugyldig regulært uttrykk '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentisering kreves for '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4113,7 +4123,7 @@ msgstr ""
 "Besøk Novell kundesenter for å kontrollere om din registrering er gyldig og "
 "ikke er utløpt."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4177,7 +4187,7 @@ msgid "No url in repository."
 msgstr "Ingen nettadresse i pakkebrønn."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4295,7 +4305,7 @@ msgstr "ignorer noen avhengigheter selv om %s ikke vil fungere"
 msgid "generally ignore of some dependencies"
 msgstr "ignorer generelt noen avhengigheter"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4303,151 +4313,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "kommandokonflikter"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "en konflikt"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "forespørselen støttes ikke"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "slettede leverandører: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4455,243 +4465,276 @@ msgstr ""
 "\n"
 "uinstallerbare nødvendige pakker: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "uinstallerbare nødvendige pakker: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Denne kommandoen vil skade systemet!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorer advarsel om skadet system"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Installasjonen er avbrutt som angitt."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " kjørt"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " kjøring mislyktes"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s allerede kjørt som %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " kjøring ikke utført under avbrudd"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Feil ved sending av melding om oppdatering."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Melding om ny oppdatering"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM mislyktes: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Kunne ikke importere offentlig nøkkel %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Kunne ikke fjerne offentlig nøkkel %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Endrede konfigurasjonsfiler for %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm lagret %s som %s, men det var umulig å finne noen forskjell"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4701,13 +4744,13 @@ msgstr ""
 "Her er de 25 første avvikende linjene:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm opprettet %s som %s, men det var umulig å finne noen forskjell"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4720,50 +4763,50 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Flere rpm-resultater"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "opprettet sikkerhetskopi %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Signaturfilen %s ikke funnet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Signaturfilen %s ikke funnet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signaturfilen %s ikke funnet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Fil er usignert"
 
@@ -4890,72 +4933,72 @@ msgstr "Ugyldig skilletegn for deling av parametertilordning"
 msgid "Invalid parameter array join separator character"
 msgstr "Ugyldig skilletegn for sammenføyning av parametermatrise"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Kommandoen ble avsluttet med status %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Kommandoen ble drept av signalet %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Kommandoen ble avsluttet med en ukjent feil."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Kan ikke kjøre chroot til '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Kan ikke kjøre chdir til «%s» (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Kan ikke kjøre chdir til «%s» fra chroot «%s» (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Kan ikke kjøre '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Kan ikke splitte (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5108,6 +5151,10 @@ msgstr "Plasseringen '%s' er midlertidig utilgjengelig."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL-sertifikatproblem, bekreft at CA-sertifikat er OK for '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5127,6 +5174,95 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ja"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nei"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "fullført"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "feil"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Advarsel: "
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Feil"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Vil du fortsette?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Advarsel: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Henter:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "starter"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Ikke funnet"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Ingen tilgjengelig hjelp for denne meldingen."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "ingen tilgjengelig hjelp for dette valget"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ja"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nei"
+
 #~ msgid "%s does not belong to a distupgrade repository"
 #~ msgstr "%s tilhører ikke en pakkebrønn for distribusjonsoppgradering"
 
index dbfefce..221e9bf 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -15,8 +15,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.nl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-15 12:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-09-21 16:15+0000\n"
 "Last-Translator: Freek de Kruijf <freek@opensuse.org>\n"
 "Language-Team: Dutch <https://l10n.opensuse.org/projects/libzypp/master/nl/>"
 "\n"
@@ -1303,21 +1303,21 @@ msgstr "Vult aan"
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
-"Er is een poging gedaan om een niet-bestaande sleutel %s te importeren in "
-"sleutelring %s"
+"Er is een poging gedaan om een niet-bestaande sleutel, ‘%s’, te importeren "
+"in sleutelbos %s"
 
 #: zypp/KeyRing.cc:759
 msgid "Failed to import key."
-msgstr "Importeren van sleutel is mislukt."
+msgstr "Het importeren is mislukt."
 
 #: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
-msgstr "Verwijderen van sleutel is mislukt."
+msgstr "Het verwijderen is mislukt."
 
 #: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
-msgstr "Handtekeningbestand %s niet gevonden"
+msgstr "Het ondertekeningbestand, ‘%s’, is niet aangetroffen"
 
 #: zypp/LanguageCode.cc:49
 msgid "Unknown language: "
@@ -3682,91 +3682,91 @@ msgstr "De volgende acties worden uitgevoerd:"
 #. translators: an annotation to a gpg keys expiry date
 #: zypp/PublicKey.cc:64
 msgid "does not expire"
-msgstr "verloopt niet"
+msgstr "vervalt niet"
 
 #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12"
 #: zypp/PublicKey.cc:69
 #, boost-format
 msgid "expired: %1%"
-msgstr "verlopen op: %1%"
+msgstr "vervallen op %1%"
 
 #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12"
 #: zypp/PublicKey.cc:74
 #, boost-format
 msgid "expires: %1%"
-msgstr "verloopt op: %1%"
+msgstr "vervalt op %1%"
 
 #. translators: an annotation to a gpg keys expiry date
 #: zypp/PublicKey.cc:83
 msgid "(does not expire)"
-msgstr "(verloopt niet)"
+msgstr "(vervalt niet)"
 
 #. translators: an annotation to a gpg keys expiry date
 #: zypp/PublicKey.cc:92
 msgid "(EXPIRED)"
-msgstr "(VERLOPEN)"
+msgstr "(VERVALLEN)"
 
 #. translators: an annotation to a gpg keys expiry date
 #: zypp/PublicKey.cc:96
 msgid "(expires within 24h)"
-msgstr "(verloopt binnen 24 uur)"
+msgstr "(vervalt binnen 24 uur)"
 
 #. translators: an annotation to a gpg keys expiry date
 #: zypp/PublicKey.cc:100
 #, c-format, boost-format
 msgid "(expires in %d day)"
 msgid_plural "(expires in %d days)"
-msgstr[0] "(verloopt binnen %d dag)"
-msgstr[1] "(verloopt binnen %d dagen)"
+msgstr[0] "(vervalt binnen %d dag)"
+msgstr[1] "(vervalt binnen %d dagen)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
-msgstr "Zoeken naar gpg-sleutel-ID %1% in cache %2%."
+msgstr "Bezig met zoeken naar gpg-sleutel-id ‘%1%’ in %2%-cache…"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
-msgstr "Zoeken naar gpg-sleutel-ID %1% in opslagruimte %2%."
+msgstr "Bezig met zoeken naar gpg-sleutel-id ‘%1%’ in %2%-installatiebron…"
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Opslagruimte %1% definieert geen extra URL's met 'gpgkey='."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Kan map '%1%' van opslagruimte niet lezen: Toegang geweigerd"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Het lezen van map '%s' is mislukt"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Kan opslagruimtebestand '%1%' niet lezen: Toegang geweigerd"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "De alias van een opslagruimte mag niet met een punt (.) beginnen."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "De alias van een service mag niet met een punt (.) beginnen."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan bestand '%s' niet openen voor schrijven."
@@ -3774,43 +3774,43 @@ msgstr "Kan bestand '%s' niet openen voor schrijven."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Onbekende service '%1%': Verweesde opslagruimte '%2%' verwijderen"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Geen geldige metagegevens op de gespecificeerde URL gevonden"
 msgstr[1] "Geen geldige metagegevens op de gespecificeerde URL's gevonden"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan %s niet aanmaken"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Kan map voor metadata-cache niet aanmaken."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Cache van opslagruimte '%s' wordt gebouwd"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan cache in %s niet aanmaken - geen toegangsrechten."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Kan opslagruimte (%d) niet opslaan in de cache."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Niet behandeld type opslagruimte"
 
@@ -3820,44 +3820,44 @@ msgstr "Niet behandeld type opslagruimte"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Fout bij het lezen van '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Onbekende fout bij lezen van '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
-msgstr "Opslagruimte '%s' wordt toegevoegd"
+msgstr "Bezig met toevoegen van installatiebron ‘%s’…"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
-msgstr "Ongeldige naam van opslagruimtebestand bij '%s'"
+msgstr "Ongeldige naam van installatiebronbestand bij ‘%s’"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
-msgstr "Opslagruimte '%s' wordt verwijderd"
+msgstr "Bezig met verwijderen van installatiebron ‘%s’…"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Kan niet achterhalen waar opslagruimte is opgeslagen."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
-msgstr "Kan '%s' niet verwijderen"
+msgstr "‘%s’ kan niet worden verwijderd"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Kan er niet achter komen waar de service is opgeslagen."
 
@@ -3940,7 +3940,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Onbekende ondersteuningsoptie. Beschrijving niet beschikbaar"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3970,13 +3970,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ongeldige reguliere expressie '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authenticatie vereist voor '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Zal het opnieuw proberen..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Opgegeven na %1% pogingen."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3984,7 +3994,7 @@ msgstr ""
 "Het SUSE Customer Center bezoeken om te controleren of uw registratie geldig "
 "is en niet is verlopen."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3992,7 +4002,7 @@ msgstr ""
 "Ga naar het Novell Customer Center om te controleren of uw registratie "
 "geldig is en niet is verlopen."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4025,14 +4035,14 @@ msgid ""
 "Package %s seems to be corrupted during transfer. Do you want to retry "
 "retrieval?"
 msgstr ""
-"Pakket %s lijkt beschadigd te zijn tijdens de overdracht. Wilt u het opnieuw "
-"ophalen?"
+"Het pakket, ‘%s’, lijkt beschadigd te zijn tijdens de overdracht. Wilt u het "
+"opnieuw ophalen?"
 
 #. TranslatorExplanation %s = name of the package being processed.
 #: zypp/repo/PackageProvider.cc:486
 #, c-format, boost-format
 msgid "Failed to provide Package %s. Do you want to retry retrieval?"
-msgstr "Pakket %s niet gevonden. Wilt u dit opnieuw ophalen?"
+msgstr "Het pakket, ‘%s’, is niet aangetroffen. Wilt u het opnieuw ophalen?"
 
 #: zypp/repo/PackageProvider.cc:609
 msgid "applydeltarpm check failed."
@@ -4056,7 +4066,7 @@ msgid "No url in repository."
 msgstr "Geen URL in opslagruimte."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Verwacht medium %1%/%2% geïdentificeerd door bestand '%3%' met inhoud:"
@@ -4072,10 +4082,10 @@ msgid ""
 "  conflicts with file from package\n"
 "     %3%"
 msgstr ""
-"Bestand %1%\n"
-"  van pakket\n"
+"Het bestand ‘%1%’\n"
+"  in het pakket\n"
 "     %2%\n"
-"  conflicteert met een bestand van pakket\n"
+"  botst met een bestand in het pakket\n"
 "     %3%"
 
 #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
@@ -4088,10 +4098,10 @@ msgid ""
 "  conflicts with file from install of\n"
 "     %3%"
 msgstr ""
-"Bestand %1%\n"
-"  van pakket\n"
+"Het bestand ‘%1%’\n"
+"  in het pakket\n"
 "     %2%\n"
-"  conflicteert met een bestand van de installatie van\n"
+"  botst met een geïnstalleerd bestand van\n"
 "     %3%"
 
 #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
@@ -4104,10 +4114,10 @@ msgid ""
 "  conflicts with file from package\n"
 "     %3%"
 msgstr ""
-"Bestand %1%\n"
+"Het bestand ‘%1%’\n"
 "  van de installatie van\n"
 "     %2%\n"
-"  conflicteert met een bestand van pakket\n"
+"  botst met een bestand van het pakket\n"
 "     %3%"
 
 #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
@@ -4120,10 +4130,10 @@ msgid ""
 "  conflicts with file from install of\n"
 "     %3%"
 msgstr ""
-"Bestand %1%\n"
+"Het bestand ‘%1%’\n"
 "  van de installatie van\n"
 "     %2%\n"
-"  conflicteert met een bestand van de installatie van\n"
+"  botst met een bestand van de installatie van\n"
 "     %3%"
 
 #. [lhs][rhs] 0 = installed; 1 = to be installed
@@ -4139,12 +4149,12 @@ msgid ""
 "  from package\n"
 "     %4%"
 msgstr ""
-"Bestand %1%\n"
-"  van pakket\n"
+"Het bestand ‘%1%’\n"
+"  in het pakket\n"
 "     %2%\n"
-"  conflicteert met een bestand\n"
+"  botst met het bestand\n"
 "     %3%\n"
-"  van pakket\n"
+"  in het pakket\n"
 "     %4%"
 
 #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2)
@@ -4159,10 +4169,10 @@ msgid ""
 "  from install of\n"
 "     %4%"
 msgstr ""
-"Bestand %1%\n"
-"  van pakket\n"
+"Het bestand ‘%1%’\n"
+"  in het pakket\n"
 "     %2%\n"
-"  conflicteert met een bestand\n"
+"  botst met het bestand\n"
 "     %3%\n"
 "  van de installatie van\n"
 "     %4%"
@@ -4179,12 +4189,12 @@ msgid ""
 "  from package\n"
 "     %4%"
 msgstr ""
-"Bestand %1%\n"
+"Het bestand ‘%1%’\n"
 "  van de installatie van\n"
 "     %2%\n"
-"  conflicteert met een bestand\n"
+"  botst met het bestand\n"
 "     %3%\n"
-"  van pakket\n"
+"  in het pakket\n"
 "     %4%"
 
 #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2)
@@ -4199,10 +4209,10 @@ msgid ""
 "  from install of\n"
 "     %4%"
 msgstr ""
-"Bestand %1%\n"
+"Het bestand ‘%1%’\n"
 "  van de installatie van\n"
 "     %2%\n"
-"  conflicteert met een bestand\n"
+"  botst met het bestand\n"
 "     %3%\n"
 "  van de installatie van\n"
 "     %4%"
@@ -4215,13 +4225,13 @@ msgstr "Kan sat-pool niet maken."
 #: zypp/solver/detail/ProblemSolutionIgnore.cc:42
 #, c-format, boost-format
 msgid "break %s by ignoring some of its dependencies"
-msgstr "%s afbreken door enige van zijn afhankelijkheden te negeren"
+msgstr "doorbreek ‘%s’ door enkele afhankelijkheden te negeren"
 
 #: zypp/solver/detail/ProblemSolutionIgnore.cc:48
 msgid "generally ignore of some dependencies"
 msgstr "negeer normaliter enige afhankelijkheden"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4231,315 +4241,340 @@ msgstr ""
 "opwaardering van de distributie en moet vervangen worden"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "de te installeren %1% behoort niet tot een opslagruimte voor opwaarderen van "
 "een distributie"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "de geïnstalleerde %1% heeft een inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "de te installeren %1% heeft een inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
-msgstr "probleem met de geïnstalleerde %1%"
+msgstr "er is een probleem met het geïnstalleerde pakket ‘%1%’"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "conflicterende verzoeken"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "een afhankelijkheidsprobleem"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
-msgstr "niets levert de gevraagde '%1%'"
+msgstr "niets levert de gevraagde ‘%1%’"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
-msgstr "Hebt u alle vereiste opslagruimten ingeschakeld?"
+msgstr "Zijn alle vereiste installatiebronnen ingeschakeld?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
-msgstr "het gevraagde pakket %1% bestaat niet"
+msgstr "het gevraagde pakket, ‘%1%’, bestaat niet"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "niet-ondersteund verzoek"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' wordt geleverd door het systeem en kan niet gewist worden"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% is niet te installeren"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
-msgstr "niets levert '%1%' nodig door het geïnstalleerde %2%"
+msgstr ""
+"er is geen pakket dat ‘%1%’ levert, benodigd door het geïnstalleerde %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
-msgstr "niets levert '%1%' nodig door het te installeren %2%"
+msgstr ""
+"er is geen pakket dat ‘%1%’ levert, benodigd door het te installeren %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
-msgstr "kan niet zowel %1% als %2% installeren"
+msgstr "zowel %1% als %2% kunnen niet worden geïnstalleerd"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
-"het geïnstalleerde %1% is in conflict met '%2%' geleverd door het "
+"het geïnstalleerde %1% botst met ‘%2%’, zoals geleverd door het "
 "geïnstalleerde %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
-"het geïnstalleerde %1% is in conflict met '%2%' geleverd door het te "
+"het geïnstalleerde %1% botst met ‘%2%’, zoals geleverd door het te "
 "installeren %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
-"het te installeren %1% is in conflict met '%2%' geleverd door het "
+"het te installeren %1% botst met ‘%2%’, zoals geleverd door het "
 "geïnstalleerde %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
-"het te installeren %1% is in conflict met '%2%' geleverd door het te "
+"het te installeren %1% botst met ‘%2%’, zoals geleverd door het te "
 "installeren %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
-"het geïnstalleerde %1% maakt '%2%' verouderd geleverd door het "
-"geïnstalleerde %3%"
+"het geïnstalleerde %1% markeert ‘%2%’, geleverd door het geïnstalleerde %3%, "
+"als verouderd"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
-"het geïnstalleerde %1% maakt '%2%' verouderd geleverd door het te "
-"installeren %3%"
+"het geïnstalleerde %1% markeert ‘%2%’, geleverd door het te installeren %3%, "
+"als verouderd"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
-"het te installeren %1% maakt '%2%' verouderd geleverd door het "
-"geïnstalleerde %3%"
+"het te installeren %1% markeert ‘%2%’, geleverd door het geïnstalleerde %3%, "
+"als verouderd"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
-"het te installeren %1% maakt '%2%' verouderd geleverd door het te "
-"installeren %3%"
+"het te installeren %1% markeert ‘%2%’, geleverd door het te installeren %3%, "
+"als verouderd"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
-msgstr "het geïnstalleerde %1% is in conflict met '%2%' geleverd door hemzelf"
+msgstr "het geïnstalleerde %1% botst met ‘%2%’ dat zichzelf aanlevert"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
-msgstr "het te installeren %1% is in conflict met '%2%' geleverd door hemzelf"
+msgstr "het te installeren %1% botst met ‘%2%’ dat zichzelf aanlevert"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
-"het geïnstalleerde %1% vereist '%2%', maar dit vereiste kan niet geleverd "
+"het geïnstalleerde %1% vereist ‘%2%’, maar deze vereiste kan niet geleverd "
 "worden"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
-"het te installeren %1% vereist '%2%', maar dit vereiste kan niet geleverd "
+"het te installeren %1% vereist ‘%2%’, maar deze vereiste kan niet geleverd "
 "worden"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
-msgstr "verwijderde providers: "
+msgstr "verwijderde diensten: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 "\n"
-"niet-installeerbare providers: "
+"niet-installeerbare diensten: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
-msgstr "niet-installeerbare providers: "
+msgstr "niet-installeerbare diensten: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% is nog niet volledig geïntegreerd in %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
-"U wilt Typisch de PTF behouden en er voor te kiezen de patches voor "
-"onderhoud niet te installeren."
+"Normaliter is het het beste als u de PTF wilt behouden en kiest om de "
+"patches voor onderhoud niet te installeren."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"Het geïnstalleerde %1% in deze context zal de meegenomen PTF-pakketten ook "
+"verwijderen (niet vervangen)."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"De PTF zou verwijderd moeten worden door '%1%' aan te roepen. Dit zal de "
+"meegenomen PTF-pakketten bijwerken in plaats van ze te verwijderen."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "U wilt typisch de PTF behouden of kies om de actie te annuleren."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "De geïnstalleerde %1% blokkeert de gewenste actie."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 "U wilt typisch de PTF behouden en er voor kiezen de actie te annuleren."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
-msgstr "vergrendeling verwijderen om verwijdering van %1% toe te staan"
+msgstr "vergrendeling opheffen om verwijdering van %1% toe te staan"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "%1% niet installeren"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "%1% behouden"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
-msgstr "vergrendeling verwijderen om installatie van %1% toe te staan"
+msgstr "vergrendeling opheffen om installatie van %1% toe te staan"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Dit verzoek zal het systeem laten crashen!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
-msgstr "sla geen acht op de waarschuwing voor een gebroken systeem"
+msgstr "negeer de waarschuwing voor een gebroken systeem"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "niet vragen om een oplosbare te installeren die %1% levert"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "niet vragen om alle oplosbaren te verwijderen die %1% levert"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
-msgstr "niet de meest recente versie van %1% installeren"
+msgstr "recentste versie van %1% niet installeren"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
-msgstr "%1% behouden ondanks de inferieure architectuur"
+msgstr "%1% behouden, ondanks de inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
-msgstr "%1% installeren ondanks de inferieure architectuur"
+msgstr "%1% installeren, ondanks de inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
-msgstr "verouderde %1% behouden"
+msgstr "behoud het verouderde pakket ‘%1%’"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
-msgstr "%1% installeren uit uitgesloten opslagruimte"
+msgstr "%1% installeren uit genegeerde installatiebron"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
-msgstr "%1% installeren hoewel het is ingetrokken"
+msgstr "%1% installeren, hoewel het is ingetrokken"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "toestaan de PTF %1% te installeren"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "%1% installeren hoewel het op de zwarte lijst staat"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
-msgstr "afwaarderen van %1% naar %2%"
+msgstr "%1% afwaarderen naar %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
-msgstr "wijziging van architectuur van %1% naar %2%"
+msgstr "architectuur van %1% wijzigen naar %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
-"%1% installeren (met wijziging van leverancier)\n"
+"%1% installeren (met leverancierswijziging)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4548,101 +4583,118 @@ msgstr ""
 "installeer %1% van leverancier %2%\n"
 "  ter vervanging van %3% van leverancier %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
-msgstr "vervanging van %1% door %2%"
+msgstr "%1% vervangen door %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
-msgstr "installatie van %1% ongedaan maken"
+msgstr "verwijder ‘%1%’"
+
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "Scripts voor post-transaction uitvoeren"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "%%posttrans script '%1%' wordt uitgevoerd"
+msgid "Running %1% script"
+msgstr "Script %1% wordt uitgevoerd"
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "%posttrans scripts zijn uitgevoerd"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "Uitvoer van script %1%:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
-msgstr "Installatie is afgebroken volgens de instructies."
+msgstr "De installatie is op verzoek afgebroken."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " uitgevoerd"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
-msgstr " uitvoeren is mislukt"
+msgstr " het uitvoeren is mislukt"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s is al uitgevoerd als %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " uitvoeren is overgeslagen tijdens afbreken"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
-msgstr "Fout bij het zenden van een melding over een bijwerkbericht."
+msgstr "Het bijwerkbericht kan niet worden verstuurd."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
-msgstr "Bericht over een nieuw element voor bijwerken"
+msgstr "Nieuw updatebericht"
+
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"Ontvangen signaal :\"%1% (%2%)\", om de consistentie van het systeem te "
+"verzekeren is het niet mogelijk om een actieve rpm-transactie te annuleren."
 
-#: zypp/target/TargetImpl.cc:2688
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
-msgstr "Uitvoeren van de transactie is mislukt vanwege de volgende problemen:"
+msgstr ""
+"Het uitvoeren van de overdracht is vanwege de volgende problemen mislukt:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM is mislukt: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
-msgstr "Importeren van publieke sleutel %1% is mislukt"
+msgstr "Het importeren van de publieke sleutel %1% is mislukt"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
-msgstr "Verwijderen van publieke sleutel %1% is mislukt"
+msgstr "Het verwijderen van de publieke sleutel %1% is mislukt"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
-msgstr "Header van pakket is niet ondertekend!"
+msgstr "De pakketkop is niet ondertekend!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
-msgstr "Inhoud van pakket is niet ondertekend!"
+msgstr "De pakketinhoud is niet ondertekend!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Configuratiebestanden gewijzigd voor %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4650,7 +4702,7 @@ msgstr ""
 "te bepalen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4660,7 +4712,7 @@ msgstr ""
 "Dit zijn de eerste 25 regels die verschillend zijn:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -4668,7 +4720,7 @@ msgstr ""
 "achterhalen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4682,47 +4734,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Aanvullende rpm-uitvoer"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "reservekopie %s aangemaakt"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
-msgstr "Ondertekening is OK"
+msgstr "De ondertekening is in orde"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Onbekend type ondertekening"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Ondertekening klopt niet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Ondertekening is OK, maar sleutel kan niet worden vertrouwd"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Handtekeningen van publieke sleutel zijn niet beschikbaar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Bestand bestaat niet of ondertekening kan niet gecontroleerd worden"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Bestand heeft geen ondertekening"
 
@@ -4849,72 +4901,72 @@ msgstr "Ongeldig scheidingsteken voor splitsen parametertoewijzing"
 msgid "Invalid parameter array join separator character"
 msgstr "Ongeldig scheidingsteken voor samenvoegen parametermatrix"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
-msgstr "Opdracht beëindigd met status %d."
+msgstr "De opdracht is beëindigd met status %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
-msgstr "Opdracht is gestopt door signaal %d (%s)."
+msgstr "De opdracht is afgebroken door signaal %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
-msgstr "Opdracht beëindigd met onbekende fout."
+msgstr "De opdracht is beëindigd met een onbekende foutmelding."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Ongeldige afsplits argumenten gegeven."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Pipe voor besturing maken lukt niet."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Kan geen chroot doen naar '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Kan geen chdir doen naar '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Kan geen chdir naar '%s' doen binnen chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Kan '%s' niet uitvoeren (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Kan geen fork (%s) uitvoeren."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Kan '%s' niet uitvoeren, chdir is mislukt (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "'%s' uitvoeren lukt niet, chroot is mislukt (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "'%s' uitvoeren lukt niet, exec is mislukt (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "'%s' uitvoeren lukt niet, onverwachte fout."
@@ -5068,6 +5120,10 @@ msgstr "Locatie '%s' is tijdelijk niet toegankelijk."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL-certificaatprobleem, controleer of de CA-cert OK is voor '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Geen vrije hulpbronnen om medium aan te koppelen."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5091,6 +5147,100 @@ msgstr ""
 "Fout bij downloaden (curl) voor '%s':\n"
 "Kan HTTP-respons niet ophalen\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ja"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nee"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "gereed"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "attentie"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "foutmelding"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Opmerking:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Waarschuwing:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Foutmelding:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Wilt u doorgaan?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Waarschuwing: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Bezig met ophalen van:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "bezig met starten"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "niet gevonden"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Geen hulp beschikbaar voor deze prompt."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "geen hulp beschikbaar voor deze optie"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "alle opties tonen"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ja"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nee"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Bezig met uitvoeren van %%posttrans-script ‘%1%’…"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "De %posttrans-scripts zijn uitgevoerd"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Pakket is niet ondertekend!"
 
index 3123b3e..786ab9a 100644 (file)
--- a/po/nn.po
+++ b/po/nn.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: @PACKAGE@\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2022-05-29 21:13+0000\n"
 "Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
 "Language-Team: Norwegian Nynorsk <https://l10n.opensuse.org/projects/libzypp/"
@@ -3705,52 +3705,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3758,43 +3758,43 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Byggjer mellomlager for pakkebrønnen «%s»"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3804,44 +3804,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Fjernar pakkebrønnen «%s»"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3911,7 +3911,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3939,25 +3939,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4017,7 +4027,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4182,7 +4192,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4190,393 +4200,426 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Denne kommandoen vil skada systemet!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Melding om ny oppdatering"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4584,13 +4627,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4601,47 +4644,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4768,72 +4811,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4983,6 +5026,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5002,6 +5049,94 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ja"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nei"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "fullført"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "feil"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Åtvaring: "
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Feil"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Vil du halda fram?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Åtvaring: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Hentar:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "startar"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Fann ikkje"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Det finst ikkje noko hjelp tilgjengeleg for denne meldinga."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "finst ikkje hjelp for denne meldinga"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "vis alle val"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ja"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nei"
+
 #~ msgid "%s conflicts with %s provided by %s"
 #~ msgstr "%s er i konflikt med %s frå %s"
 
index a421c92..bbb2bfd 100644 (file)
--- a/po/pa.po
+++ b/po/pa.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.pa\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2007-08-23 19:28+0530\n"
 "Last-Translator: A S Alam <aalam@users.sf.net>\n"
 "Language-Team: Panjabi <punjabi-l10n@lists.sf.net>\n"
@@ -3715,54 +3715,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "VM ਦਾ ਨਾਂ ਇੱਕ ਅੰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "VM ਦਾ ਨਾਂ ਇੱਕ ਅੰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "ਲਿਖਣ ਲਈ ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।"
@@ -3770,45 +3770,45 @@ msgstr "ਲਿਖਣ ਲਈ ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)"
 msgstr[1] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %m\n"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "%1 ਡਾਇਰੈਕਟਰੀ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ: %2"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਕੈਚੇ ਬਿਲਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।"
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "%s ਰਿਪੋਜ਼ਟਰੀ ਲਈ ਅੱਪਲੋਡ ਕੀਤਾ।"
@@ -3819,44 +3819,44 @@ msgstr "%s ਰਿਪੋਜ਼ਟਰੀ ਲਈ ਅੱਪਲੋਡ ਕੀਤਾ।
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਤੋਂ ਮੇਟਾ-ਡਾਟਾ ਪਾਰਸਿੰਗ ਦੌਰਾਨ ਗਲਤੀ:"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ਅਣਜਾਣ ਕਮਾਂਡ '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਸ਼ਾਮਲ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "ਗਲਤ ਐਕਸਪੋਰਟ ਫਾਇਲ ਨਾਂ ਹੈ।"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਹਟਾਈ ਜਾ ਰਹੀ ਹੈ।"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "ਡੈਸਕਟਾਪ ਆਈਟਮ '%s' ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3928,7 +3928,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3956,25 +3956,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "ਗਲਤ Url ਸਕੀਮ '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' ਲਈ ਪਰਮਾਣਿਕਤ ਲੋੜੀਦੀ ਹੈ"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4034,7 +4044,7 @@ msgid "No url in repository."
 msgstr "ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਕੋਈ URL ਨਹੀਂ ਹੈ।"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4152,7 +4162,7 @@ msgstr "ਆਮ ਤੌਰ ਉੱਤੇ ਇਹ ਲੋੜ ਅਣਡਿੱਠੀ ਕ
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4160,329 +4170,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "ਕੁਨੈਕਸ਼ਨ ਮੰਗ:"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "ਨਿਰਭਰਤਾ ਸਮੱਸਿਆਵਾਂ ਕਰਕੇ %s ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "%s ਕੋਈ ਨਹੀਂ ਦਿੰਦਾ ਹੈ"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "ਉਪਲੱਬਧ ਪਰੋਫਾਇਲ"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "ਮੰਗ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "ਇੰਸਟਾਲੇਸ਼ਨ ਹਦਾਇਤਾਂ ਮੁਤਾਬਕ ਅਧੂਰੀ ਛੱਡੀ ਗਈ ਹੈ।"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "ਚਲਾਓ"
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI ਚਲਾਉਣਾ ਫੇਲ੍ਹ: %s"
@@ -4490,73 +4525,81 @@ msgstr "DBI ਚਲਾਉਣਾ ਫੇਲ੍ਹ: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "ਕੁੰਜੀ ਇੰਕ੍ਰਿਪਸ਼ਨ ਦੌਰਾਨ ਗਲਤੀ ਹੈ।"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "ਫੇਲ੍ਹ"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s ਲਈ ਸੰਰਚਨਾ ਫਾਇਲਾਂ ਬਦਲੀਆਂ:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4564,13 +4607,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4581,48 +4624,48 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "ਹੋਰ rpm ਆਉਟਪੁੱਟ:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s ਦਾ ਬੈਕਅੱਪ ਬਣਿਆ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4749,73 +4792,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਚੱਲਦੀ ਕਮਾਂਡ"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "%s ਨਹੀਂ ਲੱਭਿਆ।"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4968,6 +5011,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4987,6 +5034,95 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "ਹਾਂ"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "ਨਹੀਂ"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "ਪੂਰਾ"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "ਗਲਤੀ"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "ਸਾਵਧਾਨ: "
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "ਗਲਤੀ"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "ਸਾਵਧਾਨ: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "ਨਹੀਂ ਲੱਭਿਆ"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ਹਾਂ"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ਨਹੀਂ"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਆਰਕੀਟੈਕਚਰ ਹੋਰ ਹੈ।"
index 898dd3f..20abf8d 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2019-03-14 18:32+0000\n"
 "Last-Translator: Ewelina Michalowska <ewelina.michalowska@stgambit.com>\n"
 "Language-Team: Polish <https://l10n.opensuse.org/projects/libzypp/master/pl/"
@@ -3708,52 +3708,52 @@ msgstr[2] "(wygasa w ciągu %d dni)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Wyszukiwanie identyfikatora %1% klucza gpg w pamięci podręcznej %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Wyszukiwanie identyfikatora %1% klucza gpg w repozytorium %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repozytorium %1% nie definiuje dodatkowych adresów URL 'gpgkey='."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nie można odczytać katalogu repozytorium '%1%': odmowa dostępu"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Odczyt katalogu '%s' nie powiódł się"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nie można odczytać pliku repozytorium '%1%': odmowa dostępu"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repozytorium nie może rozpoczynać się od kropki."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Alias usługi nie może rozpoczynać się od kropki."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nie można otworzyć pliku '%s' do zapisu."
@@ -3761,44 +3761,44 @@ msgstr "Nie można otworzyć pliku '%s' do zapisu."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Nieznana usługa '%1%': usuwanie osieroconego repozytorium usługi '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Pod podanym adresem URL nie znaleziono prawidłowych metadanych"
 msgstr[1] "Pod podanymi adresami URL nie znaleziono prawidłowych metadanych"
 msgstr[2] "Pod podanymi adresami URL nie znaleziono prawidłowych metadanych"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nie można utworzyć %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Nie można utworzyć katalogu pamięci podręcznej metadanych."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Budowanie pamięci podręcznej repozytorium '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Nie można utworzyć pamięci podręcznej w %s - brak uprawnień do zapisu."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Tworzenie pamięci podręcznej repozytorium nie powiodło się (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Nieobsługiwany typ repozytorium"
 
@@ -3808,44 +3808,44 @@ msgstr "Nieobsługiwany typ repozytorium"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Błąd podczas próby odczytu z '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Nieznany błąd podczas odczytu z '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Dodawanie repozytorium '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nieprawidłowa nazwa pliku repozytorium pod adresem '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Usuwanie repozytorium '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Nie można określić miejsca przechowywania repozytorium."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nie można usunąć '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Nie można określić, gdzie jest przechowywana usługa."
 
@@ -3926,7 +3926,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Nieznana opcja wsparcia. Brak opisu"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3957,13 +3957,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Nieprawidłowe wyrażenie regularne '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Wymagane uwierzytelnienie dla '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3971,7 +3981,7 @@ msgstr ""
 "Proszę odwiedzić SUSE Customer Center, aby sprawdzić, czy rejestracja jest "
 "ważna i czy nie wygasła."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3979,7 +3989,7 @@ msgstr ""
 "Proszę odwiedzić Centrum obsługi klienta firmy Novell, aby sprawdzić, czy "
 "rejestracja jest ważna i czy nie wygasła."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4043,7 +4053,7 @@ msgid "No url in repository."
 msgstr "Brak adresu URL w repozytorium."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4209,7 +4219,7 @@ msgstr "zainstaluj %s, ignorując niektóre z zależności"
 msgid "generally ignore of some dependencies"
 msgstr "zazwyczaj ignoruje pewne zależności"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4217,151 +4227,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "sprzeczne żądania"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "problem z kilkoma zależnościami"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "nieobsługiwane żądanie"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "usunięci dostawcy: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4369,243 +4379,276 @@ msgstr ""
 "\n"
 "dostawcy, których nie można zainstalować: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "dostawcy, których nie można zainstalować: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "To żądanie uszkodzi system!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignoruj ostrzeżenie o uszkodzeniu systemu"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Wykonywanie skryptu %%posttrans '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Wykonywanie skryptów %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Instalacja przerwana zgodnie z życzeniem."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " wykonano"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " wykonanie nie powiodło się"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s został już wykonany jako %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " nie wykonano w wyniku przerwania"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Błąd podczas wysyłania powiadomienia o aktualizacji."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nowy komunikat o aktualizacji"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Wystąpił błąd RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nie udało się zaimportować klucza publicznego z pliku %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Usunięcie klucza publicznego nie powiodło się %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Zmienione pliki konfiguracyjne dla %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm zapisał %s jako %s, ale nie można było określić różnicy"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4615,13 +4658,13 @@ msgstr ""
 "Oto pierwszych 25 linii różnicy:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm utworzył %s jako %s, ale nie można było określić różnicy"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4634,47 +4677,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Dodatkowe wyjście rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "utworzono zapasowy %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Podpis jest OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Nieznany rodzaj podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Nie można sprawdzić podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Podpis jest OK, ale klucz nie jest zaufany"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Klucz publiczny podpisów nie jest dostępny"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Plik nie istnieje lub nie można sprawdzić podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Plik jest niepodpisany"
 
@@ -4801,40 +4844,40 @@ msgstr "Nieprawidłowy znak parametru podziału mapy"
 msgid "Invalid parameter array join separator character"
 msgstr "Nieprawidłowy znak parametru połączenia tablicy"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Polecenie zakończone statusem %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Polecenie zakończone przez sygnał %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Polecenie zakończone nieznanym błędem."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Nie można wykonać polecenia chroot dla '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Nie można wykonać polecenia chdir dla elementu '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
@@ -4842,33 +4885,33 @@ msgstr ""
 "głównym chroot %s (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Nie można wykonać '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Nie można wykonać fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5023,6 +5066,10 @@ msgstr ""
 " Problem z certyfikatem SSL; proszę sprawdzić, czy certyfikat CA jest "
 "odpowiedni dla \"%s\"."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5042,6 +5089,99 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Tak"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nie"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "gotowe"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "błąd"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Informacja:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Ostrzeżenie:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Błąd:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Czy kontynuować?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Ostrzeżenie: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Pobieranie:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "uruchamianie"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "nie znaleziono"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Nie jest dostępna pomoc dla tej wskazówki."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "pomoc nie jest dostępna dla tej opcji"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "wyświetla wszystkie opcje"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "Tak"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "Nie"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Wykonywanie skryptu %%posttrans '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Wykonywanie skryptów %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Pakiet nie jest podpisany!"
 
index 33e61b4..6d9658b 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.pt\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2020-12-06 18:26+0000\n"
 "Last-Translator: Luís Tiago Favas <al62006@utad.eu>\n"
 "Language-Team: Portuguese <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -3935,54 +3935,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Falha na interpretação de %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "O nome da MV não pode iniciar com um dígito."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "O nome da MV não pode iniciar com um dígito."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Não é possível abrir ficheiro para escrita."
@@ -3990,45 +3990,45 @@ msgstr "Não é possível abrir ficheiro para escrita."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Não foi encontrada uma metadata válida no(s) URL(s) especificado(s)"
 msgstr[1] "Não foi encontrada uma metadata válida no(s) URL(s) especificado(s)"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Não é possível criar %s: %m\n"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "A limpar a cache dos metadados raw de '%s'."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "A construir a cache do repositório '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Falha na interpretação de %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Repositório activado"
@@ -4039,44 +4039,44 @@ msgstr "Repositório activado"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erro ao interpretar a metadata de '%s':"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Comando '%s' desconhecido"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "A Adicionar repositório '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ficheiro de exportação inválido."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "A remover o repositório '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Não é possível ejectar o suporte '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4148,7 +4148,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, fuzzy, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4178,25 +4178,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expressão regular inválida '%s': regcomp devolveu %d"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autenticação requerida para '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4258,7 +4268,7 @@ msgid "No url in repository."
 msgstr "Nenhum url no repositório."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4375,7 +4385,7 @@ msgstr "Ignorar de uma forma geral algumas dependências"
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4383,152 +4393,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "pedidos em conflito"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Não foi possível instalar %s devido a problemas de dependências"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "fornecedores apagados: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4536,173 +4546,198 @@ msgstr ""
 "\n"
 "fornecedores não instaláveis: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "fornecedores não instaláveis: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "A instalação foi interrompida conforme indicado."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "Executar"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "Falhou a Execução DBI: %s"
@@ -4710,72 +4745,80 @@ msgstr "Falhou a Execução DBI: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "falha no RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Falha ao importar a chave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Falha ao remover a chave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Ficheiros de configuração modificados para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "o rpm %s foi guardado como %s, mas foi impossível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4785,13 +4828,13 @@ msgstr ""
 "Tem as primeiras 25 linhas diferentes:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "o rpm %s foi criado como %s, mas foi impossível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4804,48 +4847,48 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Resultado adicional do rpm:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "cópia de segurança %s criada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4972,72 +5015,72 @@ msgstr "Parâmetro do caracter do separador de divisão do mapa inválido"
 msgid "Invalid parameter array join separator character"
 msgstr "Parâmetro do caracter do separador de junção da lista inválido"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Comando terminou com estado %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Comando foi morto pelo sinal %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Comando terminou com erro desconhecido."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Não é possível fazer chroot para '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Não foi possível fazer chdir a '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Não foi possível fazer chdir a  '%s' dentro de chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Não é possível executar '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Não é possível bifurcar (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5193,6 +5236,10 @@ msgstr ""
 " problema no certificado SSL, verifique se o certificado de CA é OK para "
 "'%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5212,6 +5259,93 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Sim"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Não"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "concluído"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "atenção"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "erro"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Nota:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Aviso:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Erro:"
+
+# internal key used: Ok
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Continuar?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Aviso: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "A obter:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "a iniciar"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "não encontrado"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Não existe ajuda disponível para esta mensagem."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "Não existe ajuda disponível para esta opção"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "mostrar todas as opções"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "sim"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "não"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s fornece %s, mas tem outra arquitectura."
index 7518a36..2a6f500 100644 (file)
@@ -13,8 +13,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-04-02 00:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-10-04 23:15+0000\n"
 "Last-Translator: Luiz Fernando Ranghetti <elchevive68@gmail.com>\n"
 "Language-Team: Portuguese (Brazil) <https://l10n.opensuse.org/projects/"
 "libzypp/master/pt_BR/>\n"
@@ -3717,53 +3717,53 @@ msgstr[1] "(expira em %d dias)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Procurando por ID da chave gpg 1% no cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Procurando por ID da chave gpg %1% no repositório %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repositório 1% não define URLs 'gpgkey' adicionais."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 "Não foi possível ler o diretório de repositório '%1%': Permissão negada"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Falha ao ler o diretório '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Não foi possível ler o arquivo de repositório '%1%': Permissão negada"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "O apelido do repositório não pode começar com ponto."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "O apelido do serviço não pode começar com ponto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Não foi possível abrir o arquivo '%s' para gravação."
@@ -3771,44 +3771,44 @@ msgstr "Não foi possível abrir o arquivo '%s' para gravação."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Serviço '%1%' desconhecido: removendo o repositório de serviço órfão '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Metadados válidos não encontrados na URL especificada"
 msgstr[1] "Metadados válidos não encontrados nas URLs especificadas"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Não foi possível criar %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Não foi possível criar o diretório do cache de metadados."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construindo o cache do repositório '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Não foi possível criar o cache em %s - sem permissão de gravação."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Falha ao armazenar .repo (%d) em cache."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Tipo de repositório não identificado"
 
@@ -3818,44 +3818,44 @@ msgstr "Tipo de repositório não identificado"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erro ao tentar ler de '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Erro desconhecido ao ler de '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Adicionando o repositório '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nome de arquivo de repositório inválido em '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Removendo o repositório '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Não foi possível descobrir onde o repositório está armazenado."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Não foi possível remover '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Não foi possível descobrir onde o serviço está armazenado."
 
@@ -3936,7 +3936,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Opção de suporte desconhecida. A descrição não está disponível"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3967,13 +3967,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expressão regular inválida '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autenticação necessária para '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Será feita nova tentativa..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Desistirá após %1% tentativas."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3981,7 +3991,7 @@ msgstr ""
 "Visite o SUSE Customer Center para verificar se seu registro é válido e não "
 "expirou."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3989,7 +3999,7 @@ msgstr ""
 "Visite o Novell Customer Center para verificar se seu registro é válido e "
 "não expirou."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4053,7 +4063,7 @@ msgid "No url in repository."
 msgstr "Nenhuma URL no repositório."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Mídia esperada %1%/%2% identificada pelo arquivo '%3%' com o conteúdo:"
@@ -4218,7 +4228,7 @@ msgstr "quebrar %s ao ignorar algumas das dependências"
 msgid "generally ignore of some dependencies"
 msgstr "geralmente ignorar algumas dependências"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4228,85 +4238,85 @@ msgstr ""
 "substituído"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "o %1% a ser instalado não pertence a um repositório distupgrade"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "o %1% instalado tem uma arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "o %1% a ser instalado tem uma arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema com o instalado %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "solicitações conflitantes"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "algum problema de dependência"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nada fornece o '%1%' solicitado"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Você habilitou todos os repositórios necessários?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "o pacote solicitado %1% não existe"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "solicitação não suportada"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' é fornecido pelo sistema e não pode ser apagado"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% não é instalável"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nada fornece '%1%' necessário para o %2% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "nada fornece '%1%' necessário para o %2% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "não pode instalar %1% e %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "o %1% instalado está em conflito com '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4314,14 +4324,14 @@ msgstr ""
 "o %1% instalado está em conflito com o '%2%' fornecido pelo a ser instalado "
 "%3%"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "o %1% a ser instalado está em conflito com '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4330,49 +4340,49 @@ msgstr ""
 "o %1% a ser instalado está em conflito com '%2%' fornecido pelo a ser "
 "instalado %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "o %1% instalado torna obsoleto '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "o %1% instalado torna obsoleto '%2%' fornecido pelo a ser instalado %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "o %1% a ser instalado torna obsoleto '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "o %1% a ser instalado torna obsoleto '%2%' fornecido pelo a ser instalado %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "o %1% instalado está em conflito com o '%2%' fornecido por ele mesmo"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "o %1% a ser instalado está em conflito com o '%2%' fornecido por ele mesmo"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "o %1% instalado requer '%2%', mas este requisito não pode ser fornecido"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4380,11 +4390,11 @@ msgid ""
 msgstr ""
 "o %1% a ser instalado requer '%2%', mas este requisito não pode ser fornecido"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "fornecedores removidos: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4392,17 +4402,17 @@ msgstr ""
 "\n"
 "fornecedores não instaláveis: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "fornecedores não instaláveis: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% ainda não está completamente integrado em %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4411,112 +4421,135 @@ msgstr ""
 "manutenção."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"A remoção do %1% instalado neste contexto também removerá (não substituirá) "
+"os pacotes PTF incluídos."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"O PTF deve ser removido chamando '%1%'. Isso atualizará os pacotes PTF "
+"incluídos em vez de removê-los."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "Normalmente, convém manter o PTF ou cancelar a ação."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "O %1% instalado bloqueia a ação desejada."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Normalmente, você deseja manter o PTF e optar por cancelar a ação."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "remova o bloqueio para permitir a remoção de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "não instale %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "manter %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "remova o bloqueio para permitir a instalação de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Esta solicitação travará o seu sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "igorar o aviso de um sistema travado"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "não peça para instalar um solucionável fornecendo %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "não peça para apagar todos os solucionáveis fornecendo %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "não instale a versão mais recente de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantenha %1% apesar da arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instale %1% apesar da arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantenha obsoleto %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "instale %1% do repositório excluído"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instale %1% apesar de ter sido recolhido"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "permitir instalar o PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instale %1%, embora esteja na lista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "rebaixamento de %1% para %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "mudança de arquitetura de %1% a %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4525,7 +4558,7 @@ msgstr ""
 "instalar %1% (com mudança de fornecedor)\n"
 "   %2% --> %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4534,107 +4567,123 @@ msgstr ""
 "instale% 1% do fornecedor% 2%\n"
 "   substituindo% 3% do fornecedor% 4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "substituição de %1% por %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "desinstalação de %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "Executando scripts de pós-transação"
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Executando o script %%posttrans '%1%'"
+msgid "Running %1% script"
+msgstr "Executando script %1%"
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Executando scripts %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "Saída do script %1%:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "A instalação foi cancelada conforme instruções."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " executado"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " falha na execução"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s já executado como %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " execução ignorada durante o cancelamento"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Erro ao enviar a notificação de mensagem de atualização."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nova mensagem de atualização"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"Sinal recebido :\"%1% (%2%)\", para garantir a consistência do sistema não é "
+"possível cancelar uma transação RPM em execução."
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "A execução da transação falhou devido aos seguintes problemas:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Falha no RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Falha ao importar chave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Falha ao remover chave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "O cabeçalho do pacote não está assinado!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "A carga útil do pacote não está assinada!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Arquivos de configuração alterados para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "o RPM salvou %s como %s, mas não foi possível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4644,13 +4693,13 @@ msgstr ""
 "Aqui estão as 25 primeiras linhas de diferença:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "o rpm criou %s como %s, mas não foi possível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4663,47 +4712,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Saída adicional do rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "backup %s criado"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "A assinatura está OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Tipo de assinatura desconhecido"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Assinatura não verificada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "A assinatura está OK, mas a chave não é confiável"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Chave pública das assinaturas não disponível"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "O arquivo não existe ou a assinatura não pode ser verificada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "O arquivo não está assinado"
 
@@ -4830,72 +4879,72 @@ msgstr "Caractere separador de divisão de mapa de parâmetros inválido"
 msgid "Invalid parameter array join separator character"
 msgstr "Caractere separador de integração de matriz de parâmetros inválido"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "O comando encerrou com status %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Comando eliminado pelo sinal %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "O comando encerrou com erro desconhecido."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Argumentos de geração inválidos fornecidos."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Incapaz de criar o tubo de controle."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Não foi possível executar o chroot em '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Não foi possível executar chdir para '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Não foi possível executar chdir para '%s' dentro do chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Não foi possível executar '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Não foi possível dividir (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Impossível executar '%s', chdir falhou (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Impossível executar '%s', chroot falhou (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Impossível executar '%s', exec falhou (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Impossível executar '%s', erro inesperado."
@@ -5052,6 +5101,10 @@ msgstr ""
 " Problema no certificado SSL. Verifique se o certificado CA está correto "
 "para '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Não há recursos livres disponíveis para anexar a mídia."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5075,6 +5128,101 @@ msgstr ""
 "Erro de download (curl) para '%s':\n"
 "Não foi possível obter a resposta HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Sim"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Não"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "concluído"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "atenção"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "erro"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Nota:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Aviso:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Erro:"
+
+# internal key used: Ok
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Continuar?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Aviso: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Baixando:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "iniciando"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "não encontrado"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Nenhuma ajuda disponível para este prompt."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "nenhuma ajuda disponível para esta opção"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "exibe todas as opções"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "sim"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "não"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Executando o script %%posttrans '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Executando scripts %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "O pacote não está assinado!"
 
index 9baef98..9088330 100644 (file)
--- a/po/ro.po
+++ b/po/ro.po
@@ -24,7 +24,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: OpenSUSE\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2012-11-19 14:59+0200\n"
 "Last-Translator: Lucian Oprea <oprea.luci@gmail.com>\n"
 "Language-Team: Romanian <LL@li.org>\n"
@@ -3728,52 +3728,52 @@ msgstr[2] "(expiră în 24h)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Citirea directorului '%s' a eșuat"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Aliasul sursei de instalare nu poate începe cu punct."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Aliasul serviciului nu poate începe cu punct."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nu se poate deschide fișierul '%s' pentru scriere."
@@ -3781,13 +3781,13 @@ msgstr "Nu se poate deschide fișierul '%s' pentru scriere."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
@@ -3795,31 +3795,31 @@ msgstr[0] "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide"
 msgstr[1] "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide"
 msgstr[2] "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nu se poate crea %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Nu se poate crea directorul pentru cache-ul de metadate."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construirea cache-ului sursei de instalare '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Nu se poate crea memoria cache la %s - lipsește dreptul de scriere."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Sursa de instalare (%d) nu a putut fi încărcată în cache."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Tip de sursă de instalare netratat"
 
@@ -3829,44 +3829,44 @@ msgstr "Tip de sursă de instalare netratat"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Eroare la încercarea de a citi din '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Eroare necunoscută la citirea de la '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Adaug sursa de instalare '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nume de fișier sursă de instalare invalid la '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Îndepărtez sursa de instalare '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Nu pot determina unde este stocată sursa de instalare."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nu pot șterge '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Nu pot determina unde este stocat serviciul."
 
@@ -3947,7 +3947,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Opțiune de suport necunoscută. Descrierea nu este disponibilă"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3977,19 +3977,29 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expresie regulată invalidă '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Pentru '%s' este necesară autentificarea"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3997,7 +4007,7 @@ msgstr ""
 "Vizitează Centru de Relații cu Clienții Novell pentru a verifica dacă "
 "înregistrarea este validă și încă valabilă."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4065,7 +4075,7 @@ msgid "No url in repository."
 msgstr "Nici un url în sursa de instalare."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4183,7 +4193,7 @@ msgstr "întrerupe pachetul %s ignorând o parte din dependențele lui"
 msgid "generally ignore of some dependencies"
 msgstr "în general se ignoră unele dependințe"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4191,152 +4201,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "cereri ce intră în conflict"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "o problemă de dependențe"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 #, fuzzy
 msgid "unsupported request"
 msgstr "nesuportat"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "pachete șterse: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4344,243 +4354,276 @@ msgstr ""
 "\n"
 "pachete care pot fi dezinstalate: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "furnizori dezinstalabili: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Această cerere vă va afecta sistemul!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignoră avertismentul privitor la stricarea sistemului"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Instalarea a fost anulată la cerere."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " executat"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " execuție eșuată"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, fuzzy, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%1 este deja decriptat!"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " execuție sărită în timpul anulării"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Eroare trimitere notificare mesaj de actualizare."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nou mesaj de actualizare"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM a eșuat:"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Importul cheii publice %1% a eșuat"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Îndepărtarea cheii publice %1% a eșuat"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Fișiere de configurare modificate pentru %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm a salvat %s ca %s, dar nu a putut determina diferențele"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4590,13 +4633,13 @@ msgstr ""
 "Acestea sunt primele 25 de linii diferite:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm a creat %s ca %s, dar nu a putut determina diferențele"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4609,50 +4652,50 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Ieșire rpm suplimentară"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "backup %s creat"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Fișierul semnătură %s nu a fost găsit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Fișierul semnătură %s nu a fost găsit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Fișierul semnătură %s nu a fost găsit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4779,72 +4822,72 @@ msgstr "Parametru de hartă invalid pentru separarea caracterelor"
 msgid "Invalid parameter array join separator character"
 msgstr "Parametru invalid caracter de separare uniune matrici"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Comandă finalizată cu starea %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Comanda a fost oprită de semnalul %d(%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Comandă finalizată cu eroare necunoscută."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Nu se poate face chroot la '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Nu se poate face chroot la '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Nu pot efectua chdir spre '/' în chroot (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Nu pot executa '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Nu pot crea un proces nou (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5001,6 +5044,10 @@ msgstr ""
 "Problemă de certificat SSL, verificați dacă certificatul autorității de "
 "certificare este OK pentru '%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5020,6 +5067,98 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Da"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nu"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "gata"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "eroare"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Avertisment:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Eroare"
+
+# continue button label
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Continuați?"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Avertisment:"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Se descarcă:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "pornesc"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Nu s-a găsit"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Niciun ajutor disponibil pentru acest dialog."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "niciun ajutor disponibil pentru această opțiune"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "da"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nu"
+
 #~ msgid "%s does not belong to a distupgrade repository"
 #~ msgstr "%s nu aparține de o sursă de instalare de actualizare distribuție"
 
index 63942ab..6f1767e 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.ru\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2022-03-16 00:12+0000\n"
 "Last-Translator: Sergey Mashkov <cy6ergn0m@gmail.com>\n"
 "Language-Team: Russian <https://l10n.opensuse.org/projects/libzypp/master/ru/"
@@ -3714,52 +3714,52 @@ msgstr[2] "(истекает через %d дней)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Поиск ID gpg-ключа %1% в кэше %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Поиск ID gpg-ключа %1% в репозитории %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Репозиторий %1% не определяет дополнительных URL вида «gpgkey=»."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Невозможно прочитать каталог репозитория \"%1%\": доступ запрещен"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Не удалось прочитать каталог \"%s\""
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Невозможно прочитать файл репозитория \"%1%\": доступ запрещен"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Псевдоним репозитория не может начинаться с точки."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Псевдоним сервис не может начинаться с точки."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Невозможно открыть файл \"%s\" для записи."
@@ -3767,7 +3767,7 @@ msgstr "Невозможно открыть файл \"%s\" для записи.
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
@@ -3775,38 +3775,38 @@ msgstr ""
 "нарушенными ассоциациями"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "По указанному URL-адресу не найдено допустимых метаданных"
 msgstr[1] "По указанным URL-адресам не найдено допустимых метаданных"
 msgstr[2] "По указанным URL адресам не найдено допустимых метаданных"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Не удалось создать %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Невозможно создать каталог кэша метаданных."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Сбор кэша репозитория \"%s\""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Не удалось создать кэш в %s — нет прав на запись."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Ошибка при кэшировании репозитория (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Необрабатываемый тип репозитория"
 
@@ -3816,44 +3816,44 @@ msgstr "Необрабатываемый тип репозитория"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Ошибка при попытке чтения из \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Неизвестная ошибка при чтении из \"%s\""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Добавление репозитория \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Недопустимое имя файла репозитория в \"%s\""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Удаление репозитория \"%s\""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Невозможно выяснить, где хранится репозиторий."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Не удается удалить \"%s\""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Невозможно определить, где хранится сервис."
 
@@ -3934,7 +3934,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Неизвестный вариант поддержки. Описание недоступно"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3964,13 +3964,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Недопустимое регулярное выражение \"%s\""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Необходима аутентификация для \"%s\""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3978,7 +3988,7 @@ msgstr ""
 "Убедитесь, что ваша регистрация действительна и срок ее действия не истек, в "
 "центре SUSE Customer Center."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3986,7 +3996,7 @@ msgstr ""
 "Посетите Novell Customer Center для проверки срока действия вашей "
 "регистрации."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4049,7 +4059,7 @@ msgid "No url in repository."
 msgstr "В репозитории нет URL-адреса."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4216,7 +4226,7 @@ msgstr "повредить %s, игнорируя некоторые из его
 msgid "generally ignore of some dependencies"
 msgstr "вообще игнорировать некоторые зависимости"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4226,143 +4236,143 @@ msgstr ""
 "заменён"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "установленный пакет %1% не принадлежит репозиторию обновления дистрибутива"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "установленный %1% имеет низшую архитектуру"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "будет установлен %1% с низшей архитектурой"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "проблема с установленным %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "конфликтующие запросы"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "проблема с некоторыми зависимостями"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "никто не предоставляет запрошенный '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Вы включили все необходимые репозитории?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "запрошенный пакет %1% не существует"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "запрос не поддерживается"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1' поставляется как часть системы и не может быть удалён"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% не может быть установлен"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "никто не предоставляет '%1' требуемый для установленного %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "никто не предоставляет '%1%' требуемый для установки %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "невозможно установить оба %1% и %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "установленный %1% конфликтует с '%2%' предоставленным %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "установленный %1% конфликтует с '%2%', требуемым для установки %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "устанавливаемый %1% конфликтует с '%2%' требуемым для установленного %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr "устанавливаемый %1% конфликтует с '%2%' требуемым для установки %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "установленный %1% заменяет '%2%', требуемый для установленного %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "установленный %1% заменяет '%2%' требуемый для установки %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "устанавливаемый %1% заменяет '%2%' требуемый для установленного %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "устанавливаемый %1% заменяет %2% требуемый для установленного %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "установленный %1% конфликтует с '%2%' предоставленным самим собой"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "устанавливаемый %1% конфликтует с '%2%', который поставляет сам"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "установленный %1% требует '%2%', но это требование не может быть выполнено"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4370,11 +4380,11 @@ msgid ""
 msgstr ""
 "устанавливаемый %1% требует '%2%', но это требование не может быть выполнено"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "удаленные поставщики: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4382,17 +4392,17 @@ msgstr ""
 "\n"
 "неустанавливаемые поставщики: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "поставщики, не подлежащие установке: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% ещё не полностью интегрирован в %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4400,112 +4410,131 @@ msgstr ""
 "Скорее всего вы захотите оставить PTF и решите не устанавливать исправления."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "Установленный %1% не позволяет выполнить желаемое действие."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Скорее всего вы хотите оставить PTF и решите отменить действие."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "снять блокировку чтобы разрешить удаление %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "не устанавливать %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "оставить %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "снять блокировку чтобы разрешить установку %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Этот запрос повредит вашу систему!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "игнорировать предупреждение о повреждении системы"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "не просить установить решение, которое предоставляет %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "не просить удалять все решения, предоставляющие %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "не устанавливать самую последнюю версию %1"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "оставить %1% не смотря на низшую архитектуру"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "установить %1% не смотря на низшую архитектуру"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "оставить устаревший %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "установить %1% из выключенного репозитория"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "установить %1%, хоть он и был отозван"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "разрешить установку PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "установить %1%, хоть он и в чёрном списке"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "понизить версию %1% до %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "изменить архитектуру %1% на %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4514,7 +4543,7 @@ msgstr ""
 "установить %1% (со сменой поставщика)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4523,107 +4552,121 @@ msgstr ""
 "установить %1% от поставщика %2%\n"
 "  заменяющий %3% от поставщика %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "замена %1% на %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "удаление %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Выполнение скрипта %%posttrans \"%1%\""
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Выполнение скриптов %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Установка прервана согласно указаниям."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " выполнено"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " сбой при выполнении"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s уже выполнен как %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " выполнение пропущено во время прерывания работы"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Ошибка при отправке сообщения об обновлении."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Новое сообщение об обновлении"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "Транзакция не удалась из-за следующих проблем:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Сбой RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Не удалось импортировать открытый ключ %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Не удалось удалить открытый ключ %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "Заголовок пакета не подписан!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "Содержимое пакета на подписано!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Измененные конфигурационные файлы для %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm сохранил %s как %s, но было невозможно определить различия"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4633,13 +4676,13 @@ msgstr ""
 "Первые 25 строк различий:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm создал %s как %s, но было невозможно определить различия"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4652,47 +4695,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Дополнительный вывод rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "создана резервная копия %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Подпись в порядке"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Неизвестный тип подписи"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Подпись не проверена"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Подпись в порядке, но ключ не является доверенным"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Открытый ключ подписей недоступен"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Файл не существует, или невозможно проверить подпись"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Файл не подписан"
 
@@ -4820,72 +4863,72 @@ msgstr "Недопустимый символ разделителя для ра
 msgid "Invalid parameter array join separator character"
 msgstr "Недопустимый символ разделителя для объединения массива параметров"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Команда завершилась с кодом %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Команда была прекращена сигналом %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Команда завершилась с неизвестной ошибкой."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Заданы неверные аргументы запуска."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Невозможно создать контролирующий канал."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Невозможно выполнить chroot в \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Невозможно сменить каталог на \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Невозможно сменить каталог на \"%s\" внутри среды chroot \"%s\" (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Невозможно выполнить exec \"%s\" (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Невозможно выполнить fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Невозможно выполнить '%s', chdir не удалась (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Невозможно выполнить '%s', chroot не удалась (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Невозможно выполнить '%s', exec не удался (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Невозможно выполнить '%s': неожиданная ошибка."
@@ -5040,6 +5083,10 @@ msgstr ""
 " Проблема с сертификатом SSL, проверьте, все ли в порядке с удостоверяющим "
 "центром сертификата \"%s\"."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5063,6 +5110,99 @@ msgstr ""
 "Ошибка скачивания (curl) для '%s':\n"
 "Не могу получить ответ по HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Да"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Нет"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "готово"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "внимание"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "ошибка"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Замечание:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Предупреждение:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Ошибка:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Продолжить?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Предупреждение: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Получение:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "запуск"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "не найдено"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Для этого режима справка недоступна."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "для этого параметра справка недоступна"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "выводит все параметры"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "да"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "нет"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Выполнение скрипта %%posttrans \"%1%\""
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Выполнение скриптов %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Пакет не подписан!"
 
index e4a005c..9bedb5b 100644 (file)
--- a/po/si.po
+++ b/po/si.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2005-07-29 15:37+0530\n"
 "Last-Translator: i18n@suse.de\n"
 "Language-Team: Sinhala <i18n@suse.de>\n"
@@ -3735,52 +3735,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -3788,43 +3788,43 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Couldn't open file: %s."
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3834,44 +3834,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Couldn't open file: %s."
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3941,7 +3941,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3969,25 +3969,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4048,7 +4058,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4165,7 +4175,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4173,322 +4183,347 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4496,71 +4531,79 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4568,13 +4611,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4585,47 +4628,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4752,72 +4795,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Couldn't open file: %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4967,6 +5010,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4986,6 +5033,91 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr ""
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr ""
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
index 01d94da..1014fa0 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -5,8 +5,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libzypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-14 17:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-09-21 19:15+0000\n"
 "Last-Translator: Ferdinand Galko <galko.ferdinand@gmail.com>\n"
 "Language-Team: Slovak <https://l10n.opensuse.org/projects/libzypp/master/sk/>"
 "\n"
@@ -3705,52 +3705,52 @@ msgstr[2] "(vyprší za %d dní)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Hľadanie ID gpg kľúča %1% vo vyrovnávacej pamäti %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Hľadanie ID gpg kľúča %1% v repozitári %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repozitár %1% nedefinuje dodatočné URL 'gpgkey='."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nie je možné čítať adresár repozitára '%1%': Prístup zamietnutý"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Zlyhalo čítanie adresára '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nie je možné čítať súbor repozitára '%1%': Prístup zamietnutý"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repozitára nemôže začínať bodkou."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Alias služby nemôže začínať bodkou."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nemôžem otvoriť súbor '%s' pre zápis."
@@ -3758,45 +3758,45 @@ msgstr "Nemôžem otvoriť súbor '%s' pre zápis."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Neznámá služba '%1%': Odstraňovanie osirelého repozitára služby '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Na stanovenej adrese URL sa nenašli platné metadáta"
 msgstr[1] "Na stanovených adresách URL sa nenašli platné metadáta"
 msgstr[2] "Na stanovených adresách URL sa nenašli platné metadáta"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nie je možné vytvoriť %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Nie je možné vytvoriť adresár vyrovnávacej pamäte metadát."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Vytváram vyrovnávaciu pamäť repozitára '%s'"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Nie je možné vytvoriť vyrovnávaciu pamäť v %s - žiadne práva na zapisovanie."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Zlyhalo ukladanie do vyrovnávacej pamäti pre repozitár (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Nepodporovaný typ repozitára"
 
@@ -3806,44 +3806,44 @@ msgstr "Nepodporovaný typ repozitára"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Chyba pri čítaní z '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Neznáma chyba čítania z '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Pridávam repozitár '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Neplatný názov súboru repozitára v '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Odstraňujem repozitár '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Nie je možné prísť na to, kde je uložený repozitár."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nie je možné vymazať '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Nie je možné prísť na to, kde je uložená služba."
 
@@ -3923,7 +3923,7 @@ msgstr "Pre poskytovanie podpory je potrebná ďalšia zákaznícka zmluva."
 msgid "Unknown support option. Description not available"
 msgstr "Neznáma voľba podpory. Popis nie je k dispozícii"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3953,13 +3953,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Neplatný regulárny výraz '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' vyžaduje autentifikáciu"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Skúste to znova..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Vzdanie sa po %1 % pokusoch."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3967,7 +3977,7 @@ msgstr ""
 "Navštívte SUSE Customer Center, aby ste skontrolovali, či je vaša "
 "registrácia platná a ešte nevypršala."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -3975,7 +3985,7 @@ msgstr ""
 "Navštívte Novell Customer Center, aby ste skontrolovali, či je vaša "
 "registrácia platná a ešte nevypršala."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4039,7 +4049,7 @@ msgid "No url in repository."
 msgstr "Pre tento repozitár nie je definovaná žiadna URL adresa."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Očakávané médium% 1%/%2% identifikované podľa súboru '%3%' s obsahom:"
@@ -4204,7 +4214,7 @@ msgstr "porušiť %s ignorovaním niektorých závislostí"
 msgid "generally ignore of some dependencies"
 msgstr "všeobecne ignorovať niektoré závislosti"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4214,88 +4224,88 @@ msgstr ""
 "byť nahradený"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "%1%, ktorý sa má inštalovať, nepatrí do repozitára zvýšenia verzie "
 "distribúcie"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "nainštalovaný %1% má nižšiu architektúru"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1%, ktorý sa má inštalovať, má nižšiu architektúru"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problém s nainštalovaným %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "protichodné požiadavky"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "problém so závislosťami"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nič neposkytuje požadovaný '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Máte povolené všetky požadované repozitáre?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "požadovaný balík %1% neexistuje"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "nepodporovaná požiadavka"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' poskytuje systém a nemôže sa vymazať"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% nie je inštalovateľný"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nič neposkytuje '%1%', ktorý je potrebný pre nainštalovaný %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "nič neposkytuje '%1%', ktorý je potrebný pre %2%, ktorý sa má inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "nie je možné nainštalovať obidva %1% aj %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje nainštalovaný %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4303,7 +4313,7 @@ msgstr ""
 "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje %3%, ktorý sa má "
 "inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4311,7 +4321,7 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje "
 "nainštalovaný %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4320,26 +4330,26 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje %3%, "
 "ktorý sa má inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "nainštalovaný %1% zastaráva '%2%', ktorý poskytuje nainštalovaný %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "nainštalovaný %1% zastaráva '%2%', ktorý poskytuje %3%, ktorý sa má "
 "inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "%1%, ktorý sa má inštalovať, zastaráva '%2%', ktorý poskytuje nainštalovaný "
 "%3%"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4347,25 +4357,25 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, zastaráva '%2%', ktorý poskytuje %3%, ktorý sa "
 "má inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje sám"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje sám"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "nainštalovaný %1% vyžaduje '%2%', ale túto požiadavku nie je možné splniť"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4374,11 +4384,11 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, vyžaduje '%2%', ale túto požiadavku nie je "
 "možné splniť"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "zmazaný poskytovatelia: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4386,17 +4396,17 @@ msgstr ""
 "\n"
 "neinštalovateľní poskytovatelia: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "neinštalovateľní poskytovatelia: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% ešte nie je úplne integrované do %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
@@ -4404,112 +4414,135 @@ msgstr ""
 "Zvyčajne chcete zachovať PTF a rozhodnete sa neinštalovať údržbové opravy."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"Odstránenie nainštalovaného %1% v tomto kontexte odstráni (nie nahradí!) aj "
+"zahrnuté PTF balíky."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"PTF by sa malo odstrániť volaním '%1%'. Tým sa aktualizujú zahrnuté PTF "
+"balíky namiesto ich odstránenia."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "Zvyčajne si chcete ponechať PTF alebo sa rozhodnúť zrušiť akciu."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "Nainštalované %1% blokuje požadovanú akciu."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "Zvyčajne chcete zachovať PTF a rozhodnete sa zrušiť akciu."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "odstrániť zámok pre umožnenie odstránenia %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "neinštalovať %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "ponechať %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "odstrániť zámok pre umožnenie inštalácie %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Tento požiadavka poruší váš systém!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorovať varovanie o porušení systému"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "nepožadovať inštaláciu riešenia, ktoré poskytuje %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "nepožadovať zmazanie všetkých riešení, ktoré poskytuje %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "neinštalovať najnovšiu verziu %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "ponechať %1% napriek nižšej architektúre"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "nainštalovať %1% napriek nižšej architektúre"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "ponechať zastaraný %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "inštalovať %1% z vylúčeného repozitára"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "inštalovať %1%, aj keď bol stiahnutý späť"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "umožniť inštaláciu PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "inštalovať %1%, aj keď je nežiadúci"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "znížiť verziu %1% na %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "zmena architektúry %1% na %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4518,7 +4551,7 @@ msgstr ""
 "inštalovať %1% (so zmenou dodávateľa)\n"
 "  %2% -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4527,107 +4560,123 @@ msgstr ""
 "inštalovať %1% od dodávateľa %2%\n"
 "  nahradenie %3% od dodávateľa %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "nahradenie %1% s %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "odinštalovanie %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "Spustenie skriptov po transakcii"
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Vykonávanie %%posttrans skriptu '%1%'"
+msgid "Running %1% script"
+msgstr "Spustenie skriptu %1%"
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Vykonávanie %p osttrans skriptov"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "Výstup skriptu %1%:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Inštalácia bola podľa príkazu zrušená."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " spustený"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " spustenie zlyhalo"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s už spustený ako %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " spustenie odložené kvôli prerušeniu programu"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Chyba zasielania oznámenia o aktualizačnej správe."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nová správa aktualizácie"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"Prijatý signál :\"%1% (%2%)\", na zabezpečenie konzistentnosti systému nie "
+"je možné zrušiť prebiehajúcu rpm transakciu."
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "Vykonanie transakcie zlyhalo z dôvodu nasledujúcich problémov:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM zlyhalo: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nepodarilo sa importovať verejný kľúč %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Nepodarilo zmazať verejný kľúč %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "Hlavička balíka nie je podpísaná!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "Príloha balíka nie je podpísaná!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Zmenené konfiguračné súbory pre '%s':"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "Balík rpm uložil %s ako %s, ale nebolo možné určiť rozdiel"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4637,13 +4686,13 @@ msgstr ""
 "Tu je prvých 25 riadkov rozdielov:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "Balík rpm vytvoril %s as %s, ale nebolo možné určiť rozdiel"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4656,47 +4705,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Ďalší výstup z rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "Bola vytvorená záloha %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Podpis je v poriadku"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Neznámy typ podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Podpis neoveruje"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Podpis je v poriadku, ale kľúč nie je dôveryhodný"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Verejný kľúč podpisov nie je k dispozícii"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Súbor neexistuje alebo podpis nie je možné overiť"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Súbor je nepodpísaný"
 
@@ -4824,72 +4873,72 @@ msgstr "Neplatný oddeľovací znak pre mapu parametrov"
 msgid "Invalid parameter array join separator character"
 msgstr "Neplatný oddeľovací znak pre spájanie poľa parametrov"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Stav príkazu po skončení je %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Príkaz bol zabitý signálom %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Príkaz skončil s neznámou chybou."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "Zadané nesprávne argumenty spawn."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "Nie je možné vytvoriť riadiacu rúru."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Nemôžem spraviť chroot do '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Nie je možné vykonať chroot pre '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Nie je možné vykonať chdir pre '%s' vo vnútri chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Nemôžem spustiť '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Nemôžem spraviť rozdelenie programu (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Nemožno vykonať '%s', chdir zlyhal (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Nemožno vykonať '%s', chroot zlyhal (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "Nemožno vykonať '%s', exec zlyhal (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "Nemožno vykonať '%s', neočakávaná chyba."
@@ -5045,6 +5094,10 @@ msgstr ""
 " problém s certifikátom SSL, skontrolujte či certifikát CA je v poriadku pre "
 "'%s'."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Na pripojenie média nie sú k dispozícii žiadne voľné zdroje."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5068,6 +5121,99 @@ msgstr ""
 "Chyba sťahovania (curl) pre '%s':\n"
 "Odpoveď HTTP sa nepodarilo načítať\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Áno"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nie"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "hotovo"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "pozor"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "chyba"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Poznámka:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Varovanie:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Chyba:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Pokračovať?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Pozor: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Sťahuje sa:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "štartovanie"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "nenájdené"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Pre túto výzvu nie je k dispozícii pomocník."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "pre túto voľbu nie je k dispozícii pomocník"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "ukazuje všetky voľby"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "áno"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nie"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Vykonávanie %%posttrans skriptu '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Vykonávanie %p osttrans skriptov"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Balík nie je podpísaný!"
 
index b23b118..4d5624b 100644 (file)
--- a/po/sl.po
+++ b/po/sl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2001-10-18 11:02+0200\n"
 "Last-Translator: Janez Krek <janez.krek@euroteh.si>\n"
 "Language-Team: Slovenian\n"
@@ -4184,52 +4184,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Napaka pri nalaganju modula \"%s\"."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Datoteke ni mogoče odpreti za pisanje."
@@ -4237,43 +4237,43 @@ msgstr "Datoteke ni mogoče odpreti za pisanje."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nameščam na:"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Neuspešen dostop do media za posodobitev gonilnika."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4283,44 +4283,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Napaka pri branju z disketne enote."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nepravilno ime naprave."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nameščam na:"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4391,7 +4391,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4419,25 +4419,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4499,7 +4509,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4617,7 +4627,7 @@ msgstr "ima nerešene zahteve..."
 msgid "generally ignore of some dependencies"
 msgstr "ima nerešene zahteve..."
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4625,325 +4635,350 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Nezadoščene odvisnosti:"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Samodejna namestitev"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "Prilagoditev %s ni bila uspešna."
@@ -4951,71 +4986,79 @@ msgstr "Prilagoditev %s ni bila uspešna."
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Shrani nastavivene datoteke"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5023,13 +5066,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5040,51 +5083,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Dodatne nastavitve skupine"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, fuzzy, c-format, boost-format
 msgid "created backup %s"
 msgstr "Ne Kreiraj Varnostnih Kopij"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "KScreensaver-ja ni možno najti."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "KScreensaver-ja ni možno najti."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "KScreensaver-ja ni možno najti."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -5212,73 +5255,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Ukaz, ki naj se izvede ob povezovanju"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Couldn't open file: %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5428,6 +5471,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5447,6 +5494,102 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Da"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ne"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "Indonezija"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Napaka"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Opozorilo"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Napaka"
+
+#: zypp-tui/output/Out.h:56
+#, fuzzy
+msgid "Continue?"
+msgstr "Nadaljuj"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Opozorilo"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Zagon..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Ni napak."
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+#, fuzzy
+msgid "yes"
+msgstr "Da"
+
+#: zypp-tui/output/promptoptions.cc:194
+#, fuzzy
+msgid "no"
+msgstr "priključen"
+
 #, fuzzy
 #~ msgid "Package is not signed!"
 #~ msgstr "Paketi za obnovitev"
index 3b654e6..293d750 100644 (file)
--- a/po/sr.po
+++ b/po/sr.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST2 (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2004-03-31 11:34+0200\n"
 "Last-Translator: Bojan Jovanovic <bojov@fon.bg.ac.yu>\n"
 "Language-Team: Serbian <i18n@suse.de>\n"
@@ -3825,52 +3825,52 @@ msgstr[2] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Не могу да отворим '%1'."
@@ -3878,44 +3878,44 @@ msgstr "Не могу да отворим '%1'."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Не могу да отворим '%1'."
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3925,44 +3925,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Не могу да отворим '%1'."
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -4035,7 +4035,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4063,25 +4063,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4142,7 +4152,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4260,7 +4270,7 @@ msgstr "ima neispunjene zahteve..."
 msgid "generally ignore of some dependencies"
 msgstr "ima neispunjene zahteve..."
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4268,325 +4278,350 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Proveravam međuzavisnost..."
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 #, fuzzy
 msgid "unsupported request"
 msgstr " - није подржано"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Automatska Instalacija"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4594,72 +4629,80 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #  progress stage
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Snimi konfiguracione fajlove"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4667,13 +4710,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4685,49 +4728,49 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "&Dodatne ipppd opcije"
 
 #  Proposal for backup during update
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, fuzzy, c-format, boost-format
 msgid "created backup %s"
 msgstr "Ne pravite sigurnosnu kopiju"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4855,73 +4898,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Наредба која се извршава при повезивању"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Couldn't open file: %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5071,6 +5114,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5090,6 +5137,106 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#  summary item: an option is turned on
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "&Da"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "&Ne"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "Indonezija"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Greška"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Упозорење"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Greška"
+
+# continue button label
+#: zypp-tui/output/Out.h:56
+#, fuzzy
+msgid "Continue?"
+msgstr "Настави"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Упозорење"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Покрећем..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "веза није успостављена"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#  summary item: an option is turned on
+#: zypp-tui/output/promptoptions.cc:194
+#, fuzzy
+msgid "yes"
+msgstr "&Da"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
 #  summary text heading
 #, fuzzy
 #~ msgid "Package is not signed!"
index 5645496..2c72bcb 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -13,8 +13,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.sv\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-05-31 18:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-10-18 18:15+0000\n"
 "Last-Translator: Luna  Jernberg <bittin@opensuse.org>\n"
 "Language-Team: Swedish <https://l10n.opensuse.org/projects/libzypp/master/sv/"
 ">\n"
@@ -3881,52 +3881,52 @@ msgstr[1] "(går ut om %d dagar)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Söker efter gpg-nyckel med ID %1% i cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Söker efter gpg-nyckel med ID %1% i lager %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Lagringsplatsen %1% definierar inte ytterligare 'gpgkey=' URL."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Kan inte läsa lagringsplatskatalog '%1%': Åtkomst nekad"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Det gick inte att läsa katalogen '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Kan inte läsa lagringsplatsfilen '%1%': Åtkomst nekad"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Aliaset för en lagringsplats kan inte inledas med en punkt."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Ett alias för en tjänst kan inte inledas med en punkt."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan inte skriva till filen '%s'."
@@ -3934,43 +3934,43 @@ msgstr "Kan inte skriva till filen '%s'."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Okänd tjänst '%1%': Tar bort övergiven lagringsplats '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Giltig metadata hittades inte på specificerad URL"
 msgstr[1] "Giltig metadata hittades inte på specificerade URL:er"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan inte skapa %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Kan inte att skapa cachekatalog för metadata."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Cache för lagringsplatsen '%s' byggs"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan inte att skapa cache på %s - ingen skrivrättighet."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Misslyckades att cachelagra lagringsplats (%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Kan inte hantera lagringsplatstypen"
 
@@ -3980,44 +3980,44 @@ msgstr "Kan inte hantera lagringsplatstypen"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Det gick inte att läsa från '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ett okänt fel uppstod vid läsning från '%s'"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Lägger till förrådet '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ogiltigt namn på lagringsplats '%s'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Lagringsplatsen '%s' tas bort"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Kan inte identifiera var lagringsplatsen finns."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan inte radera '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Det gick inte att identifiera var tjänsten är lagrad."
 
@@ -4096,7 +4096,7 @@ msgstr "Ytterligare ett kundavtal behövs för att kunna ge support."
 msgid "Unknown support option. Description not available"
 msgstr "Okänt supportalternativ. Beskrivning är inte tillgänglig"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4126,13 +4126,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ogiltigt reguljärt uttryck '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentisering krävs för '%s'"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "Kommer att försöka igen..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "Ger upp efter %1% försök."
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4140,7 +4150,7 @@ msgstr ""
 "Besök SUSE kundcenter för att se om din registrering är giltig och inte har "
 "slutat gälla."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4148,7 +4158,7 @@ msgstr ""
 "Besök Novells kundcenter och kontrollera att din registrering är giltig och "
 "fortfarande gäller."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4213,7 +4223,7 @@ msgid "No url in repository."
 msgstr "Det finns ingen URL i förrådet."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Förväntat medium %1%/%2% identifierat av filen '%3%' med innehåll:"
@@ -4378,160 +4388,177 @@ msgstr "bryt %s genom att ignorera vissa beroenden"
 msgid "generally ignore of some dependencies"
 msgstr "ignorera generellt några beroende"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
 "replaced"
 msgstr ""
+"det installerade %1% tillhör inte ett uppgraderingsförråd och måste ersättas"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
-msgstr ""
+msgstr "det som ska installeras %1% tillhör inte ett uppgraderingsförråd"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
-msgstr ""
+msgstr "det installerade %1% har sämre arkitektur"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
-msgstr ""
+msgstr "det som ska installeras %1% har sämre arkitektur"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problem med den installerade %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "begäranden i konflikt"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "vissa beroendeproblem"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "ingenting tillhandahåller den begärda '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Har du aktiverat alla nödvändiga förråd?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "det begärda paketet %1% finns inte"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "begäran stöds inte"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' tillhandahålls av systemet och kan inte raderas"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
-msgstr ""
+msgstr "%1% är inte installerbar"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
-msgstr ""
+msgstr "ingenting ger '%1%' som behövs av den installerade %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
-msgstr ""
+msgstr "ingenting ger '%1%' som behövs för att %2% ska installeras"
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "kan inte installera både %1% och %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "den installerade %1% står i konflikt med '%2%' från den installerade %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
+"den installerade %1% står i konflikt med '%2%' från %3% som ska installeras"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
+"den installerade %1% står i konflikt med '%2%' som tillhandahålls av den "
+"installerade %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
+"den installerade %1% står i konflikt med '%2%' från %3% tillhandahålls av "
+"%3% som ska installeras"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
-msgstr ""
+msgstr "det installerade %1% har föråldrat '%2%' från den installerade %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
+"det installerade %1% har föråldrat '%2%' som tillhandahålls av det som ska "
+"installeras %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
+"det som ska installeras %1% har föråldrat '%2%' från det installerade %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
+"det som ska installeras %1% har föråldrats '%2%' från det som ska "
+"installeras %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
+"Den installerade %1% står i konflikt med '%2%' som tillhandahålls av sig "
+"själv"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
+"Det som ska installeras %1% står i konflikt med '%2%' som tillhandahålls av "
+"sig själv"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
+"den installerade %1% kräver '%2%', men detta krav kan inte tillhandahållas"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
+"%1% som ska installeras kräver '%2%', men detta krav kan inte tillhandahållas"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "borttagna leverantörer: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4539,129 +4566,154 @@ msgstr ""
 "\n"
 "leverantörer som inte går att installera: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "leverantörer som inte går att installera: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% är ännu inte helt integrerad i %2%."
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
+"Vanligtvis vill du behålla PTF och välja att inte installera "
+"underhållspatcharna."
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+"Att ta bort det installerade %1% i detta sammanhang kommer att ta bort (inte "
+"ersätta!) De inkluderade PTF-paketen också."
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"PTF bör tas bort genom att kalla \"%1%\". Detta kommer att uppdatera de "
+"inkluderade PTF-paketen snarare än att ta bort dem."
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "Vanligtvis vill du behålla PTF eller välja att avbryta åtgärden."
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "Den installerade %1% blockerar önskad åtgärd."
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
-msgstr ""
+msgstr "Vanligtvis vill du behålla PTF och välja att avbryta åtgärden."
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "ta bort lås för att tillåta borttagning av %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "installera inte %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "behåll %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "ta bort lås för att tillåta installation av %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Denna begäran kommer att knäcka systemet!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ignorera varningen om ett trasigt system"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
-msgstr ""
+msgstr "be inte om att installera en lösning som ger %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
-msgstr ""
+msgstr "be inte om att ta bort alla lösningar som ger %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "installera inte senaste versionen av %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
-msgstr ""
+msgstr "behåll %1% trots den sämre arkitekturen"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
-msgstr ""
+msgstr "installera %1% trots den sämre arkitekturen"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "behåll föråldrad %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
-msgstr ""
+msgstr "installera %1% från exkluderat förråd"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
-msgstr ""
+msgstr "installera %1% fast den har blivit tillbakadragen"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
-msgstr ""
+msgstr "Tillåt installation av PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
-msgstr ""
+msgstr "installera %1% fast den har blivit svartlistad"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "nergradering av %1% till %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "arkitekturändring på %1% till %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4670,7 +4722,7 @@ msgstr ""
 "installera %1% (med leverantörsändring)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4679,108 +4731,124 @@ msgstr ""
 "installera %1% från leverantör %2%\n"
 "  ersätter %3% från leverantören %4%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "ersättning av %1% med %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "avinstallation av %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr "Kör efter transaktionsskript"
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Kör %%posttrans-skriptet '%1%'"
+msgid "Running %1% script"
+msgstr "Kör %1% skript"
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Kör %p 1osttrans-skript"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr "%1% skriptutdata:"
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Installationen har avbrutits enligt instruktionerna."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " körd"
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " körningen misslyckades"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s redan körd som %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " körningen hoppades över vid avbrottet"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Ett fel inträffade när ett uppdateringsmeddelande skickades."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Nytt uppdateringsmeddelande"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+"Mottagen signal:\"%1% (%2%)\", för att säkerställa systemets konsistens är "
+"det inte möjligt att avbryta en körande rpm-transaktion."
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "Det gick inte att utföra transaktionen på grund av följande problem:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM misslyckades: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Det gick inte att importera den offentliga nyckeln %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Det gick inte att ta bort den offentliga nyckeln %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
-msgstr ""
+msgstr "Pakethuvud är inte signerat!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
-msgstr ""
+msgstr "Paket payload är inte signerad!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Konfigurationsfiler har ändrats för %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "RPM sparade %s som %s, men det gick inte att avgöra skillnaden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4790,13 +4858,13 @@ msgstr ""
 "Här visas de första 25 raderna med skillnader:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "RPM skapade %s som %s, men det gick inte att avgöra skillnaden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4809,47 +4877,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Ytterligare RPM-utdata"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "skapade säkerhetskopian %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "Signaturen är OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Okänd signaturtyp"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Signaturen kan inte verifieras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signaturen är OK, men nyckeln är inte betrodd"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Signaturens offentliga nyckel är inte tillgänglig"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Filen finns inte eller signaturen kan inte kontrolleras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Filen är inte signerad"
 
@@ -4976,75 +5044,75 @@ msgstr "Ogiltigt avgränsningstecken för delning av parametermappning"
 msgid "Invalid parameter array join separator character"
 msgstr "Ogiltigt avgränsningstecken för koppling av parametermatris"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Kommandot avslutades med statusen %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Kommandot avbröts av signalen %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Kommandot avslutades med ett okänt fel."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
-msgstr ""
+msgstr "Ogiltigt spawn argument angivet."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
-msgstr ""
+msgstr "Kunde inte skapa kontrollrör."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Kan inte ändra roten (chroot) till '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Kan inte ändra katalogen (chdir) till '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Kan inte ändra katalogen (chdir) till '%s' i chroot '%s' (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Kan inte köra '%s' (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Kan inte dela upp (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "Kan inte köra '%s', chdir misslyckades (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "Kan inte köra '%s', chroot misslyckades (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
-msgstr ""
+msgstr "Kan inte köra '%s', köra misslyckades (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
-msgstr ""
+msgstr "Kan inte köra '%s', oväntat fel."
 
 #: zypp-media/mediaexception.cc:33
 #, c-format, boost-format
@@ -5195,6 +5263,10 @@ msgstr "Platsen '%s' är för tillfället oåtkomlig."
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL-certifikatsproblem, verifiera att CA-certifikatet för '%s' är OK."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "Inga fria resurser tillgängliga för att fästa medium."
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5215,6 +5287,102 @@ msgid ""
 "Download (curl) error for '%s':\n"
 "Unable to retrieve HTTP response\n"
 msgstr ""
+"Nerladdning (curl) fel för '%s':\n"
+"Kunde inte hämta HTTP-svar\n"
+
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ja"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nej"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "klar"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "uppmärksamhet"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "fel"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Notera:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Varning:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Fel:"
+
+# continue button label
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Fortsätt?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Varning: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Hämtar:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "startar"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "hittades inte"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Det finns ingen hjälp till meddelandet."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "det finns ingen hjälp till alternativet"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "visar alla alternativ"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ja"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "nej"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Kör %%posttrans-skriptet '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Kör %p 1osttrans-skript"
 
 #~ msgid "Package is not signed!"
 #~ msgstr "Paketet är inte signerat!"
index 5c898c3..8c76fab 100644 (file)
--- a/po/ta.po
+++ b/po/ta.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: NetworkManager-vpnc\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2005-06-26 01:20+0200\n"
 "Last-Translator: Priyavert Sharma <priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions <www.agreeya.com>\n"
@@ -3708,52 +3708,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "எழுதுவதற்கு கோப்பைத் திறக்க முடியவில்லை."
@@ -3761,44 +3761,44 @@ msgstr "எழுதுவதற்கு கோப்பைத் திற
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "டெஸ்க்டாப் பொருளை '%s' திறக்க முடியவில்லை"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "அடைவு %1 உருவாக்க முடியவில்லை: %2."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3808,44 +3808,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ஃப்ளாப்பி வட்டிலிருந்து படிப்பதில் பிழை"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "மூலங்கள் சேர்க்கப்படுகின்றன"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "செல்லாத ஏற்றுமதி கோப்புபெயர்."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "மூலங்கள் சேர்க்கப்படுகின்றன"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "டெஸ்க்டாப் பொருளை '%s' திறக்க முடியவில்லை"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3915,7 +3915,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3943,25 +3943,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "செல்லாத யூஆர்எல் திட்டம் '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4028,7 +4038,7 @@ msgid "No url in repository."
 msgstr "சேமிப்பிடத்தில் கோப்பு %1 காணப்படவில்லை."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4147,7 +4157,7 @@ msgstr "இத்தேவையை இங்கேயே புறக்கண
 msgid "generally ignore of some dependencies"
 msgstr "இத்தேவையை இங்கேயே புறக்கணிக்கவும்"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4155,329 +4165,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "இந்த இணைப்புக்கான கோரிக்கை: "
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "சார்புத்தன்மை பிரச்னைகள் காரணமாக %s ஐ நிறுவ இயலவில்லை"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "%s யாரும் அளிப்பதில்லை"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "கோரிக்கை ஏற்கனவே உள்ளது."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "குறிப்பிட்டுள்ளபடி நிறுவுதல் இடையில் நிறுத்தப்பட்டது."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "நிறைவேற்று"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4485,73 +4520,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "விசை என்கிரிப்ட் செய்யும்போது பிழை."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "தோல்வியுற்றது"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s:க்காக உள்ளமைத்தல் கோப்புகள் மாற்றப்பட்டுள்ளன"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "%s ஆக ஆர்பிஎம் சேமிக்கப்பட்டுள்ளது, ஆனால் வேறுபாட்டை நிர்ணயிக்க முடியவில்லை"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, fuzzy, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4561,13 +4604,13 @@ msgstr ""
 "வேறுபாடுகளின் முதல் 25 வரிகள் இங்குள்ளன:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "%s ஆக ஆர்பிஎம் உருவாf;கப்பட்டுள்ளது, ஆனால் வேறுபாட்டை நிர்ணயிக்க முடியவில்லை"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, fuzzy, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4580,51 +4623,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "கூடுதல் ஆர்பிஎம் அவுட்புட்:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s மறுபிரதி உருவாக்கப்பட்டது"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "உள்ளீடு காணப்படவில்லை."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "உள்ளீடு காணப்படவில்லை."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "உள்ளீடு காணப்படவில்லை."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4751,73 +4794,73 @@ msgstr "செல்லாத அளவீட்டு வரைவு பிள
 msgid "Invalid parameter array join separator character"
 msgstr "செல்லாத அளவீட்டு அடுக்கு இணைப்பை பிரிக்கும் வடிவம்"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "இணைக்கப்படும் பொழுது கட்டளையை செயல்படுத்து"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "%s கண்பிடிக்க முடியவில்லை."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "%s கண்பிடிக்க முடியவில்லை."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4968,6 +5011,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4987,6 +5034,96 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "ஆம்"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "இல்லை"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "­ó§¾¡É£º¢Â¡"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "பிழை"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "எச்சரிக்கை"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "பிழை"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "தொடரலாமா?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "எச்சரிக்கை"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "ஆரம்பிக்கிறது..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "காணப்படவில்லை "
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ஆம்"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "இல்லை"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது."
index a01094c..8b0ea7b 100644 (file)
--- a/po/th.po
+++ b/po/th.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2008-01-04 08:58+0100\n"
 "Last-Translator: i18n@suse.de\n"
 "Language-Team: Thai <i18n@suse.de>\n"
@@ -3827,53 +3827,53 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ไม่สามารถสร้างไดเรกทอรี '%1' ได้"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "คลังแพกเกจใช้งานไม่ได้"
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
@@ -3881,43 +3881,43 @@ msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "ไม่สามารถเปิดใช้งานบริการ '%1' ได้"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "ไม่สามารถสร้างไดเรกทอรี "
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, fuzzy, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "การเพิ่มคลังแพกเกจ %1 ล้มเหลว"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "ล้มเหลวในการคืนค่าส่วน MBR ของฮาร์ดดิสก์"
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "ชื่อของคลังแพกเกจใช้งานไม่ได้"
@@ -3928,44 +3928,44 @@ msgstr "ชื่อของคลังแพกเกจใช้งานไ
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ไม่รู้จักตัวเลือกสำหรับคำสั่ง '%1': %2"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "กำลังเพิ่มคลังแพกเกจ %1"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "ค่าสำหรับตัวเลือก '%1' ไม่ถูกต้อง: %2"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "กำลังตรวจคลังแพกเกจ "
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "ไม่สามารถเปิดใช้งานบริการ '%1' ได้"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 #, fuzzy
 msgid "Can't figure out where the service is stored."
 msgstr "ไม่สามารถลบบริการได้ เนื่องจากมันยังไม่ถูกติดตั้ง"
@@ -4038,7 +4038,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "ไม่มีรายละเอียด"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4066,25 +4066,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "รูปแบบการค้นหา (RegExp)"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4147,7 +4157,7 @@ msgid "No url in repository."
 msgstr "เลือกคลังแพกเกจ"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4266,7 +4276,7 @@ msgstr "การตรวจสอบการขึ้นอยู่แก่
 msgid "generally ignore of some dependencies"
 msgstr "การตรวจสอบการขึ้นอยู่แก่กันของระบบ ไม่พบปัญหา"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4274,316 +4284,341 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "การตรวจสอบการขึ้นอยู่แก่กันของระบบ ไม่พบปัญหา"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "อ่านค่าของผู้ให้บริการ"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "เขียนค่าของผู้ให้บริการ"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "เขียนค่าของผู้ให้บริการ"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "รุ่นนี้ถูกติดตั้งไว้บนระบบของคุณ"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
@@ -4591,11 +4626,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "การติดตั้งเสร็จสมบูรณ์เพียงบางส่วนเท่านั้น"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "การสร้างแฟ้มสำรองข้อมูลล้มเหลว"
@@ -4603,71 +4638,79 @@ msgstr "การสร้างแฟ้มสำรองข้อมูลล
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "จัดเก็บแฟ้มการปรับแต่งค่า"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4675,13 +4718,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4692,51 +4735,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "ข้อมูลเพิ่มเติม"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4864,72 +4907,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, fuzzy, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "หมดเวลาของคำสั่งหลังจาก %1 วินาที"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5079,6 +5122,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5098,6 +5145,94 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "ใช่"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "ไม่ใช่"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "เสร็จแล้ว"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "ผิดพลาด"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "แจ้งเตือน: "
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "ผิดพลาด"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "ทำต่อไปหรือไม่ ?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "แจ้งเตือน: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "กำลังรับข้อมูล:"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "กำลังเริ่ม"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "ไม่พบ"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "ไม่พบข้อความช่วยเหลือของส่วนนี้"
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "ไม่พบข้อความช่วยเหลือของตัวเลือกนี้"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ใช่"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ไม่ใช่"
+
 #, fuzzy
 #~ msgid "%s does not belong to a distupgrade repository"
 #~ msgstr "กำลังเรียกใช้คลังแพกเกจสำหรับปรับรุ่นให้ทันสมัย..."
index fbe776d..261226a 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2018-01-29 14:07+0000\n"
 "Last-Translator: Özgür Ateş Fırat <ozgursebahat@mail.ru>\n"
 "Language-Team: Turkish <https://l10n.opensuse.org/projects/libzypp/master/tr/"
@@ -4396,52 +4396,52 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "'%s' dosyası okunamadı"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Depo ismi noktayla başlayamaz."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Servis ismi noktayla başlayamaz."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "'%s' dosyası açılamıyor."
@@ -4449,42 +4449,42 @@ msgstr "'%s' dosyası açılamıyor."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s oluşturulamıyor"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Metadata önbellek klasörü oluşturulamadı."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "'%s' depo önbelleği oluşturuluyor"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "%s 'de önbellek oluşturulamıyor - yazma izni yok."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %d."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4494,44 +4494,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "'%s' okunmaya çalışılırken bir hata meydana geldi"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "'%s' depoya ekleniyor"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Geçersiz yetki '{0}'"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "'%s' deposu siliniyor"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Reponun nerede depolandığı belirlenemedi."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' silinemiyor"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Servesin nerede depolandığı belirlenemedi."
 
@@ -4602,7 +4602,7 @@ msgstr "Destek almak için ek kullanıcı sözleşmesi gerekmektedir."
 msgid "Unknown support option. Description not available"
 msgstr "Bilinmeyen destek seçeneği. Açıklama bulunamadı"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4632,19 +4632,29 @@ msgid "Invalid regular expression '%s'"
 msgstr "Geçersiz düzenli ifade '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' için kimlik doğrulama gerekmektedir"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4652,7 +4662,7 @@ msgstr ""
 "Kaydınızın geçerli olduğundan ve süresinin dolmadığından emin olmak için en "
 "yakın Novell Müşteri Merkezini ziyaret edin."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4714,7 +4724,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4831,7 +4841,7 @@ msgstr "şu çözülmemiş gereksinimlere sahip:"
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4839,153 +4849,153 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
 # clients/inst_sw_single.ycp:742
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Yetersiz bağımlılıklar:"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4993,247 +5003,280 @@ msgstr ""
 "\n"
 "Yüklenemez sağlayıcılar:"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "Yüklenemez sağlayıcılar:"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Bu istek sisteminizi çökertecek!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Yükleme yönlendirildiği şekilde iptal edildi"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr "uygulandı"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr "işletme hatası"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr "İptal etme sırasında uygulama es geçildi."
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 "Güncelleme bilgilendirmesi için mesaj gönderilirken bir hata meydana geldi."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 # clients/online_update_load.ycp:380
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "İndirme işlemi başarısız oldu:"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "%1% dosyasından genel anahtar alınamadı"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "'%1%' genel anahtarı silinemedi"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 # clients/sw_single.ycp:310
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Yapılandırma dosyalarını kaydet"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5241,13 +5284,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5258,48 +5301,48 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Ek rpm çıktısı"
 
 # clients/inst_sw_backup.ycp:260
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s yedeklemesi oluşturuldu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -5432,73 +5475,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr "Geçersiz dizi karakteri birleştirme parametresi"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Komut %d durumuyla çıkış yaptı."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Komut %d sinyali tarafından durduruldu (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Bağlanıken çalıştırılacak komut"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "'%s' e chroot yapılamıyor (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "'%s' yürütülemedi (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Ayrıştırılamadı (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5656,6 +5699,10 @@ msgstr ""
 "SSL sertifikası problemi, CA sertifikasının '%s' için geçerli olduğunu "
 "doğrulayın."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5675,6 +5722,96 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Evet"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Hayır"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "tamamlandı"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+#, fuzzy
+msgid "attention"
+msgstr "dikkat"
+
+# include/ui/common_messages.ycp:95
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "hata"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Not:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Uyarı:"
+
+# include/ui/common_messages.ycp:95
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Hata:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Devam edilsin mi?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Uyarı: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Alınıyor:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "başlatılıyor"
+
+# clients/nis_write.ycp:73
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "bulunamadı"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "Bu seçenek için yardım mevcut değil"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "tüm seçenekleri göster"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "evet"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "hayır"
+
 #, fuzzy
 #~ msgid "Package is not signed!"
 #~ msgstr "Geri yüklenecek paketler"
index 8c65626..d11b50a 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.uk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2021-03-11 21:56+0000\n"
 "Last-Translator: Lesath <4lesath@gmail.com>\n"
 "Language-Team: Ukrainian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -3896,52 +3896,52 @@ msgstr[2] "(закінчується через %d днів)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Пошук ID ключа для gpg %1% у кеші %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Пошук ID ключа для gpg %1% у сховищі %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Сховище %1% не визначає додаткові мережеві адреси для «gpgkey=»."
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Неможливо прочитати директорію сховища '%1%': Доступ заборонено"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Не вдалось прочитати директорію «%s»"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Неможливо прочитати файл сховища '%1%': Доступ заборонений"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "Псевдонім сховища не може починатися з точки."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "Псевдонім служби не може починатися з точки."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Неможливо відкрити файл «%s» для запису."
@@ -3949,44 +3949,44 @@ msgstr "Неможливо відкрити файл «%s» для запису.
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Невідома служба '%1%': видалення сховища служби '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "У вказаній адресі URL не знайдено чинних метаданих"
 msgstr[1] "У вказаних адресах URL не знайдено чинних метаданих"
 msgstr[2] "У вказаних адресах URL не знайдено чинних метаданих"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Неможливо створити %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Неможливо створити директорію кешу метаданих."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Створення кешу сховища «%s»"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Не вдалося створити кеш %s - немає прав на запис."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Не вдалось скешувати сховище(%d)."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Необроблений тип сховища"
 
@@ -3996,44 +3996,44 @@ msgstr "Необроблений тип сховища"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Помилка спроби читання з «%s»"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Невідома помилка читання з «%s»"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Додавання сховища «%s»"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Не чинна назва файла сховища «%s»"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Вилучення сховища «%s»"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Неможливо визначити, де знаходиться сховище."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Неможливо вилучити «%s»"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Неможливо визначити, де знаходиться служба."
 
@@ -4113,7 +4113,7 @@ msgstr "Для отримання підтримки потрібний дода
 msgid "Unknown support option. Description not available"
 msgstr "Невідомий параметр підтримки. Немає опису"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4143,13 +4143,23 @@ msgid "Invalid regular expression '%s'"
 msgstr "Недійсний формальний вираз «%s»"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Потрібна автентифікація для «%s»"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4157,14 +4167,14 @@ msgstr ""
 "Відвідайте Центр клієнтів SUSE, щоб перевірити, чи ваша реєстрація дійсна та "
 "чи не закінчився термін дії."
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 "Відвідайте центр покупця Novel для перевірки терміну дії вашої реєстрації."
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4227,7 +4237,7 @@ msgid "No url in repository."
 msgstr "В сховищі немає url."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4392,7 +4402,7 @@ msgstr "зламати %s, ігноруючи деякі залежності"
 msgid "generally ignore of some dependencies"
 msgstr "взагалі нехтувати деякими залежностями"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4401,151 +4411,151 @@ msgstr ""
 "встановлений %1% не належить до оновлюваного сховища та мусить бути замінений"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "%1% який було встановлено не належить до оновлюваного сховища"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "встановлений %1% має неповноцінну архітектуру"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1% який було встановлено має неповноцінну архітектуру"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "проблема з встановленим %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "конфлікт запитів"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "якась проблема залежностей"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "ніхто не надає запитуваний «%1%»"
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "Ви ввімкнули всі необхідні сховища?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "запитуваний пакунок %1% не існує"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "непідтримуваний запит"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "вилучені залежності: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4553,243 +4563,276 @@ msgstr ""
 "\n"
 "залежності без можливості встановлення: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "залежності без можливості встановлення: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Цей запит пошкодить вашу систему!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "ігнорувати попередження про пошкодження системи"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "встановити %1% хоч він і був відкладений"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "дозволити встановити PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "встановити %1% хоч він і був у чорному списку"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "Виконання сценарію %%posttrans '%1%'"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "Виконання сценаріїв %posttrans"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Встановлення перервано відповідно до вказівки."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " виконано"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " виконання зазнало невдачі"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s вже виконаний як %s)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " виконання пропущено під час переривання"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Помилка відсилання сповіщення про оновлення."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Нове повідомлення про оновлення"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Помилка RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Не вдалося імпортувати відкритий ключ %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Не вдалося вилучити відкрити ключ %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Змінено конфігураційні файли для %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm збережено %s як %s, але було неможливо виявити різницю"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4799,13 +4842,13 @@ msgstr ""
 "Ось перші 25 рядків розбіжностей:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm створила %s як %s, але було неможливо виявити різницю"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4818,47 +4861,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Додатковий вивід rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "створено резервну копію %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "З підписом усе гаразд"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "Невідомий тип підпису"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "Підпис не перевіряється"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "З підписом усе гаразд, але ключ - ненадійний"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "Публічний ключ підписів - недоступний"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "Файл не існує чи підпис не можна перевірити"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "Файл не підписаний"
 
@@ -4985,72 +5028,72 @@ msgstr "Недійсний символ розділення карти пара
 msgid "Invalid parameter array join separator character"
 msgstr "Недійсний символ сполучення масиву параметрів"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Команда завершила роботу зі станом %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Команду було вбито за сигналом %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Команда завершила роботу з невідомою помилкою."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Не вдалося створити chroot для «%s» (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Неможливо змінити директорію на «%s» (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Неможливо зробити chdir «%s» всередині chroot «%s» (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Не вдалося виконати «%s» (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Не вдалося відгалузити (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -5206,6 +5249,10 @@ msgstr ""
 " Проблема з сертифікатом SSL, перевірте чи все гаразд з сертифікатом CA для "
 "«%s»."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5229,6 +5276,101 @@ msgstr ""
 "Помилка (curl) завантаження «%s»:\n"
 "Не вдається отримати відповідь HTTP\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Так"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Ні"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "завершено"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "увага"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "помилка"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "Примітка:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "Увага:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "Помилка:"
+
+# continue button label
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Продовжити?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "Попередження: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "Отримання:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "запуск"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "не знайдено"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "Для цього запрошення немає довідки."
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "для цього параметра немає довідки"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "показати усі параметри"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "так"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "ні"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "Виконання сценарію %%posttrans '%1%'"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "Виконання сценаріїв %posttrans"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "Пакунок не підписаний!"
 
index 4a9ea1e..98c5517 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2016-08-25 08:06+0000\n"
 "Last-Translator: Hoàng Phạm <pnhoang96@gmail.com>\n"
 "Language-Team: Vietnamese <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -3708,52 +3708,52 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Không thể mở tập tin '%s' để ghi."
@@ -3761,42 +3761,42 @@ msgstr "Không thể mở tập tin '%s' để ghi."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Không thể tạo %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3806,44 +3806,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Lỗi khi đọc từ '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Đang thêm kho '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Đang xoá kho '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Không thể xác định nơi chứa kho phần mềm."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Không thể xoá '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3913,7 +3913,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3941,25 +3941,35 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4020,7 +4030,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4137,7 +4147,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4145,322 +4155,347 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Đã huỷ cài đặt theo yêu cầu."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4468,71 +4503,79 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Thông báo cập nhật mới"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "Lỗi RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4540,13 +4583,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4557,47 +4600,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4724,73 +4767,73 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Lệnh thực hiện khi kết nối"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Couldn't open file: %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4940,6 +4983,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4959,6 +5006,91 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr ""
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr ""
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
index d5cc4f5..e44beb9 100644 (file)
--- a/po/wa.po
+++ b/po/wa.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lcn memory\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2012-08-24 14:42+0200\n"
 "Last-Translator: Jean Cayron <jean.cayron@base.be>\n"
 "Language-Team: Walloon <linux-wa@walon.org>\n"
@@ -3730,52 +3730,52 @@ msgstr[1] "(espire divant 24 e)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Li léjhaedje do ridant « %s » a fwait berwete."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "On no metou di siervice ni s' pout cominçî avou on pont."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Dji n' sai nén drovi l' fitchî « %s » pol sicrire."
@@ -3783,44 +3783,44 @@ msgstr "Dji n' sai nén drovi l' fitchî « %s » pol sicrire."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Dji n' a trové nole meta-dnêye valåbe al/ås URL sipeciftî(s)"
 msgstr[1] "Dji n' a trové nole meta-dnêye valåbe al/ås URL sipeciftî(s)"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Dji n' sai ahiver %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "Dji n' sai ahiver l' ridant muchete des meta-dnêyes."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Dji basti l' muchete do depot « %s »"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Dji n' sai ahiver l' muchete a %s - pont d' droet di scrijhaedje."
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Li metaedje e muchete do depot (%d) a fwait berwete."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "Dji n' sai nén apougnî cisse sôre di depot la"
 
@@ -3830,44 +3830,44 @@ msgstr "Dji n' sai nén apougnî cisse sôre di depot la"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Åk n' a nén stî come dji sayive di lére a pårti di « %s »"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Åk di nén cnoxhou n' a nén stî come dji léjheu a pårti d' \"%s\""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Dji radjoute li depot « %s »"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "No do fitchî do depot so « %s » nén valåbe"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "Dji n' sai nén trover ewou ç' kel depot est wårdé."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Dji n' sai disfacer « %s »"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "Dji n' sai nén trover ewou ç' kel siervice est wårdé."
 
@@ -3941,7 +3941,7 @@ msgstr "I fåt èn ôte contrat cliyint pos awè on sopoirt."
 msgid "Unknown support option. Description not available"
 msgstr "Tchuze di sopoirt nén cnoxhowe. I gn a pont d' discrijhaedje"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3969,25 +3969,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Erîlêye ratourneure « %s » nén valåbe"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "I s' fåt otintifyî po « %s »"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4052,7 +4062,7 @@ msgid "No url in repository."
 msgstr "Pont d' url e depot"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4170,7 +4180,7 @@ msgstr "sketer %s e passant houte sacwantes di ses aloyances"
 msgid "generally ignore of some dependencies"
 msgstr "sketer %s e passant houte sacwantes di ses aloyances"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4178,152 +4188,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "dimandes d' afrontmints"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "gn des des problinmes d' aloyances"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 #, fuzzy
 msgid "unsupported request"
 msgstr "nén sopoirté"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "ahesseus disfacé : "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4331,244 +4341,277 @@ msgstr ""
 "\n"
 "ahesseus nén astalåves : "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "ahesseus nén astalåves : "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "Cisse dimande ci va scheter vosse sistinme !"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "passer houte l' adviertixhmint d' on sketé sistinme"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "L' astalaedje a stî abandné come dimandé."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " enondé"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " a fwait berwete a l' enondaedje"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " a passé l' enondaedje cwand il abandnéve"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "Åk n' a nén stî come dji meteu a djoû l' notifiaedje do messaedje."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "Novea messaedje di metaedje a djoû"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM a fwait berwete :"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "L' abagaedje del clé publike %1% a fwait berwete"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Li oistaedje del clé publike %1% a fwait berwete"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Les fitchîs d' apontiaedje po %s ont stî candjîs :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm a schapé %s come %s mins ça n' a nén stî possibe di trover l' diferince"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4578,14 +4621,14 @@ msgstr ""
 "Vos avoz droci les 25 prumirès royes di diferince :\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm a ahivé %s come %s mins ça n' a nén stî possibe di trover l' diferince"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4598,50 +4641,50 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "Ôtès rexhowes di rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "copeye di såvrité di %s ahivêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Sinateure di fitchî %s nén trovêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Sinateure di fitchî %s nén trovêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Sinateure di fitchî %s nén trovêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4768,72 +4811,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "Li comande a moussî foû avou l' sitatut %d."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "Li comande a stî touwêye på signå %d (%s)."
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "Li comande a moussî foû avou ene aroke nén cnoxhowe."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "Dji n' sai fé chroot a « %s » (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Dji n' sai fé chroot a « %s » (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "Dji n' sai fé chdir a « / » divins chroot (%s)."
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "Dji n' sai enonder « %s » (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Dji n' sai fé on fork (%s)."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4990,6 +5033,10 @@ msgstr ""
 " : rujhe di l' acertineure SSL, waitîz k' l' acert. di l' OA est boune po « "
 "%s »."
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5009,6 +5056,101 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Oyi"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Nonna"
+
+#
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "done"
+msgstr "Indonezeye"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "error"
+msgstr "Aroke"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Adviertixhmint"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Aroke"
+
+#: zypp-tui/output/Out.h:56
+#, fuzzy
+msgid "Continue?"
+msgstr "&Continouwer"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Adviertixhmint"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+#, fuzzy
+msgid "Retrieving:"
+msgstr "Oistaedje"
+
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Dj' enonde..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Rén trové"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "Oyi"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "Nonna"
+
 #~ msgid "%s does not belong to a distupgrade repository"
 #~ msgstr ""
 #~ "%s ni fwait nén pårteye d' on depot d' metaedje a djoû del distribucion"
index 85d3f69..c735857 100644 (file)
--- a/po/xh.po
+++ b/po/xh.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2006-11-03 12:03\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -3710,54 +3710,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Igama le-VM alikwazi kuqalisa ngomvo."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "Igama le-VM alikwazi kuqalisa ngomvo."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Ayikwazi kuvula ifayili ukuze kubhalwe."
@@ -3765,44 +3765,44 @@ msgstr "Ayikwazi kuvula ifayili ukuze kubhalwe."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ayikwazi kuvuleka into yolwazi olusesikrinini '%s'"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Akakwazi kudaleka uvimba weefayili %1: %2."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3812,44 +3812,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Imposiso xa kufundwa kwidiski ye-floppy."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Igama lefayili elithathwa ngaphandle elingasebenzisekiyo."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Ibuyisela oovimba"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ayikwazi kuvuleka into yolwazi olusesikrinini '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3920,7 +3920,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3948,25 +3948,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ulungiselelo olusebenzisekayo lwe-Url '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4033,7 +4043,7 @@ msgid "No url in repository."
 msgstr "Ifayili %1 ayifunyenwanga elugcinweni."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4152,7 +4162,7 @@ msgstr "Suhoya le mfuneko apha nje"
 msgid "generally ignore of some dependencies"
 msgstr "Suhoya le mfuneko apha nje"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4160,329 +4170,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Uqhagamshelo lucela uku:"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Ayikwazi kuhlohla%s ngenxa yeengxaki zoxhomekeko"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Akukho nanye ebonelela ngo%s "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Akukho baboneleli bahlohliweyo baka%s"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Akukho baboneleli bahlohliweyo baka%s"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "Isicelo sesikhona kakade."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Ukuhlohla kuye kwalahlwa njengoko bekuyalelwe."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "Phumeza"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4490,73 +4525,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Imposiso ngethuba loguqulelo oluntsonkothileyo lweqhosha."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "isilele"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Iifayili zobumbeko ezitshintshileyo zika%s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "i-rpm igcine %s njenge %s kodwa kwakungenzeki ukumisela umahluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4566,13 +4609,13 @@ msgstr ""
 "Nantsi imigca eyi-25 yokuqala yomahluko:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "i-rpm idalwe %s njenge %s kodwa kwakungenzeki ukumisela umahluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4585,51 +4628,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Isivelisi se-rpm Esongezelelweyo:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "idale ugcino olukhuselekileyo %s "
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Ukungenisa akufunyenwanga."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Ukungenisa akufunyenwanga."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Ukungenisa akufunyenwanga."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4762,73 +4805,73 @@ msgstr ""
 "Uphawu oluthatha isithuba somhlukanisi ohlanganisayo woludwe lomda "
 "wenkcazelo engasebenzisekiyo"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Umyalelo okhutshwa xa kudityaniswa"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Ayikwazi kufumana %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Ayikwazi kufumana %s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4979,6 +5022,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4998,6 +5045,98 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "Ewe"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "Hayi"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "igqibile"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "impazamo"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Isilumkiso"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Imposiso"
+
+# continue button label
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Qhubeka?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Isilumkiso"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Kuyaqaliswa..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Ayifunyanwanga"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "ewe"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "hayi"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha."
index df9ac80..1683689 100644 (file)
@@ -11,9 +11,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-15 15:12+0000\n"
-"Last-Translator: Marguerite Su <i@marguerite.su>\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-02-08 05:14+0000\n"
+"Last-Translator: Grace Yu <grace.yu@excel-gits.com>\n"
 "Language-Team: Chinese (China) <https://l10n.opensuse.org/projects/libzypp/"
 "master/zh_CN/>\n"
 "Language: zh_CN\n"
@@ -3709,52 +3709,52 @@ msgstr[0] "(%d 天后过期)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "正在缓存 %2% 中查找 GPG 密钥 ID %1%。"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "正在软件源 %2% 中查找 GPG 密钥 ID %1%。"
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "软件源 %1% 并未定义额外的 'gpgkey=' URL。"
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "无法读取源文件夹 '%1%':权限被拒"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "读取文件夹 '%s' 失败"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "无法读取源文件 '%1%':权限被拒"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "软件源别名不能以点开头。"
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "服务别名不能以点开头。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "无法打开 '%s' 文件进行写入。"
@@ -3762,42 +3762,42 @@ msgstr "无法打开 '%s' 文件进行写入。"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "未知服务 '%1%':正在移除孤立的服务软件源 '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "在指定 URL 未找到有效元数据"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "无法创建 %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "无法创建元数据缓存文件夹。"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "正在构建软件源 '%s' 的缓存"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "无法在 %s 创建缓存 - 无写入权限。"
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "缓存软件源 (%d) 失败。"
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "未处理的软件源类型"
 
@@ -3807,44 +3807,44 @@ msgstr "未处理的软件源类型"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "试图读取 '%s' 出错"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "读取 '%s' 遇到未知错误"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "正在添加软件源 '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s' 处的源文件名无效"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "正在移除软件源 '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "不确定软件源的存储位置。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "无法删除 '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "不确定服务的储存位置。"
 
@@ -3920,7 +3920,7 @@ msgstr "签署一份额外的客户合同后才能获得支持。"
 msgid "Unknown support option. Description not available"
 msgstr "未知支持选项。描述不可用"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3950,25 +3950,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "无效的正则表达式 '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' 需要认证"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "将重试..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "已尝试 %1% 次,将放弃。"
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr "访问 SUSE 客户中心检查您的注册是否有效且未过期。"
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr "访问 Novell 客户中心检查您的注册是否有效并尚未过期。"
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4028,7 +4038,7 @@ msgid "No url in repository."
 msgstr "软件源中没有 url。"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "由'%3%' 文件标识的预期介质 %1%/%2% 内容为:"
@@ -4193,7 +4203,7 @@ msgstr "通过忽略一些依赖关系来断开 %s"
 msgid "generally ignore of some dependencies"
 msgstr "通常忽略一些依赖关系"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4201,151 +4211,151 @@ msgid ""
 msgstr "安装的 %1% 不属于发行版升级源,必须替换"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "要安装的 %1% 不属于发行版升级源"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "安装的 %1% 的架构较低"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "要安装的 %1% 的架构较低"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "安装的 %1% 有问题"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "冲突的请求"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "一些依赖性问题"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "没有软件源能提供所请求的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "您是否启用了全部所需的软件源?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "请求的软件包 %1% 不存在"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "不支持的请求"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "\"%1%\" 由系统提供,无法擦除"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% 不可安装"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "没有软件源能提供安装的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "没有软件源能提供要安装的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "无法同时安装 %1% 和 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "安装的 %1% 与安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "安装的 %1% 与要安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "要安装的 %1% 与安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr "要安装的 %1% 与要安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "安装的 %1% 会淘汰安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "安装的 %1% 会淘汰要安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "要安装的 %1% 会淘汰安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "要安装的 %1% 会淘汰要安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "安装的 %1% 与其自身所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "要安装的 %1% 与其自身所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr "安装的 %1% 需要 \"%2%\",但无法满足此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr "要安装的 %1% 需要 \"%2%\",但无法满足此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "已删除提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4353,129 +4363,150 @@ msgstr ""
 "\n"
 "无法安装的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "无法安装的提供者: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% 尚未完全集成到 %2% 中。"
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr "通常情况下,您需要保留 PTF 并选择不安装维护补丁。"
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr "移除此环境中安装的 %1% 还会移除(而不是替换)包含的 PTF 软件包。"
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"应通过调用 \"%1%\" 来移除 PTF。这样将会更新包含的 PTF 软件包,而不会将其移"
+"除。"
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "通常,您需要保留 PTF 并选择取消该操作。"
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "已安装的 %1% 阻碍了期望进行的操作。"
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "通常来说您会想要保留该暂时性修复并选择取消该操作。"
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "移除锁定以允许移除 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "不安装 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "移除锁定以允许安装 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "此请求将破坏您的系统!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "忽略损坏系统的警告"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "不询问就安装提供 %1% 的一个解析项"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "不询问就删除提供 %1% 的所有解析项"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "不安装最新版本的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "即使架构较低,仍保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "即使架构较低,仍安装 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "保留淘汰的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "安装来自排除的软件源的 %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "尽管 %1% 已被维护团队撤回,仍予以安装"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "允许安装暂时性修复 %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "尽管 %1% 已列入黑名单,仍予以安装"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "将 %1% 降级到 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "架构从 %1% 变为 %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4484,7 +4515,7 @@ msgstr ""
 "安装 %1%(并更改厂商)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4493,107 +4524,121 @@ msgstr ""
 "由供应商 %2% 安装 %1% 代替\n"
 "由供应商 %4% 安装 %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "将 %1% 用 %2% 取代"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "卸载 %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "正在执行 %%posttrans 脚本“%1%”"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "正在执行 %p osttrans 脚本"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "安装已按指示中止。"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " 已执行"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " 执行失败"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s 早已作为 %s 执行了)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " 中止时跳过执行"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "发送更新消息通知出错。"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "新更新消息"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "由于以下问题执行操作失败:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM 失败: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "从文件 %1% 中导入公钥失败"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "移除公钥 %1% 失败"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr "软件包包头未签名!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr "软件包数据体未签名!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s 配置文件有变化:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已将 %s 另存为 %s,但是无法确定两者的差异"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4603,13 +4648,13 @@ msgstr ""
 "以下是前 25 行差异:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已将 %s 创建为 %s,但是无法确定两者的差异"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4622,47 +4667,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "额外的 RPM 输出"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "已创建备份 %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "签名正确"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "未知签名类型"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "无法校验签名"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "签名正确,但密钥是非受信的"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "签名公钥不可用"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "文件不存在或无法检查其签名"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "未签署文件"
 
@@ -4789,72 +4834,72 @@ msgstr "无效的参数映射分割的分隔符"
 msgid "Invalid parameter array join separator character"
 msgstr "无效的参数数组合并的分隔符"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "命令退出,状态 %d。"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "命令已被信号 %d (%s) 杀死。"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "命令退出,未知错误。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "子参数无效。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "无法创建控制管道。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "无法 chroot 到 '%s' (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "无法 chdir 到 '%s' (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "无法 chdir 到 %s,它在 chroot %s (%s) 中。"
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "无法执行 '%s' (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "无法派生 (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "无法执行 '%s',chdir 失败 (%s) 。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "无法执行 \"%s\",chroot 失败 (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "无法执行 '%s',执行失败 (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "无法执行 '%s',意外错误。"
@@ -5007,6 +5052,10 @@ msgstr "位置 '%s' 暂时无法访问。"
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL 证书问题,请校验 '%s' 的 CA 证书。"
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "没有可供挂接媒体的免费资源。"
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5030,6 +5079,101 @@ msgstr ""
 "下载 (curl) \"%s\" 时发生错误:\n"
 "无法检索 HTTP 响应\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "是"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "否"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "完毕"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "注意"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "错误"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "备注:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "警告:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "错误:"
+
+# internal key used: Ok
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "继续吗?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "警告: "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "正在检索:"
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "正在启动"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "未找到"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "此提示无可用帮助。"
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "此选项无可用帮助"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "显示全部选项"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "是"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "否"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "正在执行 %%posttrans 脚本“%1%”"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "正在执行 %p osttrans 脚本"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "未签署包!"
 
index abd661a..563a58b 100644 (file)
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
-"PO-Revision-Date: 2022-03-07 10:12+0000\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
+"PO-Revision-Date: 2023-02-08 09:14+0000\n"
 "Last-Translator: Grace Yu <grace.yu@excel-gits.com>\n"
 "Language-Team: Chinese (Taiwan) <https://l10n.opensuse.org/projects/libzypp/"
 "master/zh_TW/>\n"
@@ -3708,52 +3708,52 @@ msgstr[0] "(在 %d 天內過期)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "尋找快取 %2% 中的 gpg 金鑰 ID %1%。"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "尋找套件庫 %2% 中的 gpg 金鑰 ID %1%。"
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "套件庫 %1% 未定義額外的 'gpgkey=' URL。"
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "無法讀取套件庫目錄 '%1%'︰權限遭拒"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "無法讀取目錄 '%s'"
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "無法讀取套件庫檔案 '%1%'︰權限遭拒"
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr "套件庫別名不能以點開始。"
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr "服務的別名不能以點開始。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "無法開啟檔案 '%s' 來寫入。"
@@ -3761,42 +3761,42 @@ msgstr "無法開啟檔案 '%s' 來寫入。"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "未知的服務 '%1%':正在移除落單的服務儲存庫 '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "在指定的 URL 中找不到有效的中繼資訊"
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "無法建立 %s"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr "無法建立中繼資料快取目錄。"
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "正在建立套件庫 '%s' 的快取"
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "無法在 %s 建立快取 - 無寫入權限。"
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "快取套件庫失敗 (%d)。"
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr "無法處理的套件庫類型"
 
@@ -3806,44 +3806,44 @@ msgstr "無法處理的套件庫類型"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "嘗試自 '%s' 讀取時發生錯誤"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "由 '%s' 讀取時發生未知錯誤"
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "正在新增套件庫 '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s' 處的套件庫檔案名稱無效"
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "正在移除套件庫 '%s'"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr "無法找到套件庫儲存的位置。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "無法刪除 '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr "無法找到服務儲存的位置。"
 
@@ -3919,7 +3919,7 @@ msgstr "要取得支援,需要額外的使用者授權。"
 msgid "Unknown support option. Description not available"
 msgstr "未知的支援選項。 描述不適用"
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3949,25 +3949,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "無效的正規表示法 '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "%s 需要驗證"
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr "將重試..."
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr "已嘗試 %1% 次,即將放棄。"
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr "造訪 SUSE Customer Center 以檢查您的註冊是否有效以及是否過期。"
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr "請造訪 Novell Customer Center,檢查您的註冊是否有效且是否未過期。"
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4027,7 +4037,7 @@ msgid "No url in repository."
 msgstr "套件庫中沒有 url。"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "檔案 \"%3%\" 所識別的媒體 %1%/%2% 內容應為:"
@@ -4192,7 +4202,7 @@ msgstr "藉由忽略它的某些相依性以破壞 %s"
 msgid "generally ignore of some dependencies"
 msgstr "一般忽略某些相依性"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4200,151 +4210,151 @@ msgid ""
 msgstr "安裝的 %1% 不屬於版本升級套件庫,必須將其取代"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "要安裝的 %1% 不屬於版本升級套件庫"
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "安裝的 %1% 的架構較低"
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "要安裝的 %1% 的架構較低"
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "安裝的 %1% 有問題"
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr "衝突的要求"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr "一些相依性問題"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "沒有套件庫能提供所申請的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr "您是否啟用了全部所需的套件庫?"
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "申請的套件 %1% 不存在"
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr "不支援的要求"
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "\"%1%\" 由系統提供,無法去除"
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% 不可安裝"
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "沒有套件庫能提供安裝的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "沒有套件庫能提供要安裝的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "無法同時安裝 %1% 和 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "安裝的 %1% 與安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "安裝的 %1% 與要安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "要安裝的 %1% 與安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr "要安裝的 %1% 與要安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "安裝的 %1% 會汰換安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "安裝的 %1% 會汰換要安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "要安裝的 %1% 會汰換安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "要安裝的 %1% 會汰換要安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "安裝的 %1% 與其自身所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "要安裝的 %1% 與其自身所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr "安裝的 %1% 需要 \"%2%\",但無法符合此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr "要安裝的 %1% 需要 \"%2%\",但無法符合此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr "已刪除的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
@@ -4352,129 +4362,149 @@ msgstr ""
 "\n"
 "無法安裝的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr "無法安裝的提供者: "
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr "%1% 尚未完全整合到 %2% 中。"
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr "通常情況下,您需要保留 PTF 並選擇不安裝維護修補程式。"
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr "移除此網路位置中安裝的 %1% 還會移除 (而不是取代) 包含的 PTF 套件。"
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+"應透過呼叫 \"%1%\" 來移除 PTF。這樣將會更新包含的 PTF 套件,而不會將其移除。"
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr "通常,您需要保留 PTF 並選擇取消該動作。"
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr "安裝的 %1% 封鎖了所需的動作。"
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr "通常情況下,您需要保留 PTF 並選擇取消動作。"
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "移除鎖定以允許移除 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr "不安裝 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr "保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "移除鎖定以允許安裝 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr "此要求將會破壞您的系統!"
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr "忽略損毀系統的警告"
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "不詢問即安裝提供 %1% 的解決方案"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "不詢問即刪除提供 %1% 的所有解決方案"
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "不安裝最新版本的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "即使架構較低,仍保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "即使架構較低,仍安裝 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "保留汰換的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "安裝來自已排除套件庫的 %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "儘管 %1% 已收回,仍予以安裝"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr "允許安裝 PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "儘管 %1% 已列入黑名單,仍予以安裝"
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "將 %1% 降級到 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "架構從 %1% 變更為 %2%"
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4483,7 +4513,7 @@ msgstr ""
 "安裝 %1% (並變更廠商)\n"
 "  %2%  -->  %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
@@ -4492,107 +4522,121 @@ msgstr ""
 "安裝來自廠商 %2% 的 %1%\n"
 "  取代廠商 %4% 的 %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "以 %2% 取代 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "解除安裝 %1%"
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
-msgstr "正在執行 %%posttrans 程序檔「%1%」"
+msgid "Running %1% script"
+msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
-msgstr "正在執行 %p osttrans 程序檔"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
+msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "安裝已如指示中止。"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr " 已執行"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr " 執行失敗"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s 已作為 %s 執行)"
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr " 中止時跳過執行"
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr "發送更新訊息提醒失敗。"
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr "新的更新提醒"
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr "由於出現以下問題,執行交易失敗:"
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr "RPM 失敗: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "從檔案 %1% 輸入公用金鑰失敗"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "移除公用金鑰 %1% 失敗"
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
-msgstr ""
+msgstr "未簽署套件標頭!"
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
-msgstr ""
+msgstr "未簽署套件封包內容!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s 的已變更組態檔:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已將 %s 儲存為 %s,但看不出差異"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4602,13 +4646,13 @@ msgstr ""
 "這是前 25 行差異:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已將 %s 建立為 %s,但看不出差異"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4621,47 +4665,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr "其他 rpm 輸出"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "已建立備份 %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr "簽章驗證正確"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr "未知的簽章類型"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr "簽章無法驗證"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr "簽章驗證正確,然而金鑰是不被信任的"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr "簽章用的公開金鑰不存在"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr "檔案不存在或是簽章無法驗證"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr "檔案未簽章"
 
@@ -4788,72 +4832,72 @@ msgstr "無效的參數映射分割分隔符號字元"
 msgid "Invalid parameter array join separator character"
 msgstr "無效的參數陣列加入分隔符號字元"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr "指令跳出,狀態 %d。"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr "指令被信號 %d (%s) 中止。"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr "因未知錯誤指令跳出。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr "指定了無效的衍生引數。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr "無法建立控制管線。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr "無法 chroot 到 '%s' (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "無法切換目錄到 '%s' (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr "無法切換目錄到 '%s' (在 chroot '%s' 中) (%s)。"
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr "無法執行 '%s' (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "無法 fork (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr "無法執行 \"%s\",chdir 失敗 (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr "無法執行 \"%s\",chroot 失敗 (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr "無法執行 \"%s\",exec 失敗 (%s)。"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr "無法執行 \"%s\",發生非預期的錯誤。"
@@ -5006,6 +5050,10 @@ msgstr "位置 '%s' 暫時無法存取。"
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr " SSL 憑證問題,驗證 '%s' 的 CA 憑證是否正確。"
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr "沒有可供連接媒體的免費資源。"
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -5029,6 +5077,99 @@ msgstr ""
 "下載 (curl) \"%s\" 時發生錯誤:\n"
 "無法擷取 HTTP 回應\n"
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "是"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "否"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "完成"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr "注意"
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "錯誤"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr "注意:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr "警告:"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr "錯誤:"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "要繼續嗎?"
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr "警告︰ "
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr "正在取回︰"
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr "正在啟動"
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr "找不到"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr "此提示沒有可用說明。"
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr "此選項沒有說明訊息"
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr "顯示所有選項"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "是"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "否"
+
+#, boost-format
+#~ msgid "Executing %%posttrans script '%1%'"
+#~ msgstr "正在執行 %%posttrans 程序檔「%1%」"
+
+#, c-format, boost-format
+#~ msgid "Executing %posttrans scripts"
+#~ msgstr "正在執行 %p osttrans 程序檔"
+
 #~ msgid "Package is not signed!"
 #~ msgstr "套件未簽章!"
 
index 67d61e6..f801438 100644 (file)
--- a/po/zu.po
+++ b/po/zu.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: 2006-11-03 12:03\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -3710,54 +3710,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Igama le-VM alikwazi ukuqala ngenombolo."
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "Igama le-VM alikwazi ukuqala ngenombolo."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Ayikwazi ukuvula ifayela ukuze ibhale."
@@ -3765,44 +3765,44 @@ msgstr "Ayikwazi ukuvula ifayela ukuze ibhale."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ayikwazi ukuvula into esesendlalelweni (desktop) '%s'"
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Ayikwazi ukwakha i-directory '%1'. %2."
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3812,44 +3812,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Kwenzeke iphutha lapho ifunda iflophi diski."
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Igama lefayela yokuthekelisa engekho emthethweni."
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Ukubuyisela imithombo yokwaziswa"
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ayikwazi ukuvula into esesendlalelweni (desktop) '%s'"
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3920,7 +3920,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3948,25 +3948,35 @@ msgid "Invalid regular expression '%s'"
 msgstr "Uhlelo lwe-Url olungekho emthethweni '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid ""
 "Create attach point: Can't find a writable directory to create an attach "
 "point"
@@ -4035,7 +4045,7 @@ msgid "No url in repository."
 msgstr "Ifayela %1 ayitholakali enqolobaneni yamafayela."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4154,7 +4164,7 @@ msgstr "Sishaye indiva lesi sidingo lapha nje kuphela"
 msgid "generally ignore of some dependencies"
 msgstr "Sishaye indiva lesi sidingo lapha nje kuphela"
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4162,329 +4172,354 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Isicelo Sokuxhuma kwi-:"
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Ayikwazi ukufaka %s ngenxa yezinkinga zohlelo oluncike kwezinye"
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Akukho okunikeza %s"
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Abekho abanye abaphakeli abafakiwe be-%s"
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Abekho abanye abaphakeli abafakiwe be-%s"
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid ""
 "Typically you want to keep the PTF and choose to not install the maintenance "
 "patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid ""
+"Removing the installed %1% in this context will remove (not replace!) the "
+"included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid ""
+"The PTF should be removed by calling '%1%'. This will update the included "
+"PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "Isicelo sesikhona kakade."
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr "Ukufaka kuyekiwe njengoba kunikezwe isiqondiso."
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 #, fuzzy
 msgid " executed"
 msgstr "Qalisa"
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4492,73 +4527,81 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Kwenzeke iphutha ngesikhathi kufakwa amakhodi okuphepha."
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid ""
+"Received signal :\"%1% (%2%)\", to ensure the consistency of the system it "
+"is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 #, fuzzy
 msgid "RPM failed: "
 msgstr "ayiphumelelanga"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Amafayela okuhlela ashintshile e-%s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "I-rpm igcine %s njenge-%s kodwa bekungenakwenzeka ukubona umehluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4568,13 +4611,13 @@ msgstr ""
 "Nansi imigqa yokuqala engu-25 yomehluko:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "I-rpm yakhe %s njenge-%s kodwa bekungenakwenzeka ukubona umehluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4587,51 +4630,51 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Okunye okukhishiwe kwe-rpm:"
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "yakhe i-backup %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Into ayitholakali."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Into ayitholakali."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Into ayitholakali."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4759,73 +4802,73 @@ msgstr "Ibalazwe lepharamitha elinganembile lihlakaza uhlamvu oluhlukanisayo"
 msgid "Invalid parameter array join separator character"
 msgstr "Iqoqo lepharamitha elinganembile lihlanganisa uhlamvu oluhlukanisayo"
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 #, fuzzy
 msgid "Command exited with unknown error."
 msgstr "Ikhomandi ekhishwa lapho ixhumeka"
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, fuzzy, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr "Ayiyitholi i-%s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, fuzzy, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr "Ayiyitholi i-%s."
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4976,6 +5019,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4995,6 +5042,97 @@ msgid ""
 "Unable to retrieve HTTP response\n"
 msgstr ""
 
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr "&Yebo"
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr "&Cha"
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr "kwenziwe"
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr "iphutha"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+#, fuzzy
+msgid "Warning:"
+msgstr "Isexwayiso"
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+#, fuzzy
+msgid "Error:"
+msgstr "Iphutha"
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr "Qhubeka?"
+
+#: zypp-tui/output/OutNormal.cc:89
+#, fuzzy
+msgid "Warning: "
+msgstr "Isexwayiso"
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+# window title for kernel loading (see txt_load_kernel)
+#: zypp-tui/output/OutNormal.cc:260
+#, fuzzy
+msgid "starting"
+msgstr "Iyaqalisa..."
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+#, fuzzy
+msgid "not found"
+msgstr "Akutholakalanga"
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr "yebo"
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr "cha"
+
 #, fuzzy
 #~ msgid "%s has inferior architecture"
 #~ msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo."
index 1381570..1d3bc9d 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-14 15:21+0100\n"
+"POT-Creation-Date: 2023-09-21 11:50+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -3705,52 +3705,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:547
+#: zypp/RepoInfo.cc:548
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:575
+#: zypp/RepoInfo.cc:576
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:599
+#: zypp/RepoInfo.cc:600
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:313
+#: zypp/RepoManager.cc:320
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1565
+#: zypp/RepoManager.cc:328 zypp/RepoManager.cc:800 zypp/RepoManager.cc:1603
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:331
+#: zypp/RepoManager.cc:338
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:354
+#: zypp/RepoManager.cc:361
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:365
+#: zypp/RepoManager.cc:372
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1683 zypp/RepoManager.cc:1749
-#: zypp/RepoManager.cc:1827 zypp/RepoManager.cc:1892 zypp/RepoManager.cc:2023
+#: zypp/RepoManager.cc:755 zypp/RepoManager.cc:1721 zypp/RepoManager.cc:1787
+#: zypp/RepoManager.cc:1865 zypp/RepoManager.cc:1930 zypp/RepoManager.cc:2061
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3758,43 +3758,43 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:875
+#: zypp/RepoManager.cc:895
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1120
+#: zypp/RepoManager.cc:1152
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
+#: zypp/RepoManager.cc:1204 zypp/RepoManager.cc:1323 zypp/RepoManager.cc:1379
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1180
+#: zypp/RepoManager.cc:1212
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1327
+#: zypp/RepoManager.cc:1365
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1347
+#: zypp/RepoManager.cc:1385
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1408
+#: zypp/RepoManager.cc:1446
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1419
+#: zypp/RepoManager.cc:1457
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3804,44 +3804,44 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1456 zypp/RepoManager.cc:2518
+#: zypp/RepoManager.cc:1494 zypp/RepoManager.cc:2556
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1509 zypp/RepoManager.cc:2526
+#: zypp/RepoManager.cc:1547 zypp/RepoManager.cc:2564
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1647
+#: zypp/RepoManager.cc:1685
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1735
+#: zypp/RepoManager.cc:1773
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1776
+#: zypp/RepoManager.cc:1814
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1795 zypp/RepoManager.cc:1873
+#: zypp/RepoManager.cc:1833 zypp/RepoManager.cc:1911
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1809 zypp/RepoManager.cc:2011
+#: zypp/RepoManager.cc:1847 zypp/RepoManager.cc:2049
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1999 zypp/RepoManager.cc:2449
+#: zypp/RepoManager.cc:2037 zypp/RepoManager.cc:2487
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
@@ -3901,7 +3901,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:403
+#: zypp/ZYppFactory.cc:376
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -3929,21 +3929,31 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1430
-#: zypp/zyppng/media/medianetwork.cc:582
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1436
+#: zypp/media/MediaNetwork.cc:311
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:803 zypp-curl/ng/network/networkrequesterror.cc:127
+#. just report (NO_ERROR); no interactive request to the user
+#: zypp/media/MediaCurl.cc:770 zypp/media/MediaNetwork.cc:435
+msgid "Will try again..."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:773
+#, boost-format
+msgid "Giving up after %1% attempts."
+msgstr ""
+
+#: zypp/media/MediaCurl.cc:888 zypp-curl/ng/network/networkrequesterror.cc:127
 msgid "Visit the SUSE Customer Center to check whether your registration is valid and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:805 zypp-curl/ng/network/networkrequesterror.cc:129
+#: zypp/media/MediaCurl.cc:890 zypp-curl/ng/network/networkrequesterror.cc:129
 msgid "Visit the Novell Customer Center to check whether your registration is valid and has not expired."
 msgstr ""
 
-#: zypp/media/MediaHandler.cc:369
+#: zypp/media/MediaHandler.cc:338
 msgid "Create attach point: Can't find a writable directory to create an attach point"
 msgstr ""
 
@@ -3999,7 +4009,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:104
+#: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4116,389 +4126,416 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1089
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid "the installed %1% does not belong to a distupgrade repository and must be replaced"
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1091
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1095
+#: zypp/solver/detail/SATResolver.cc:1150
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1097
+#: zypp/solver/detail/SATResolver.cc:1152
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1100
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1103
+#: zypp/solver/detail/SATResolver.cc:1158
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1106
+#: zypp/solver/detail/SATResolver.cc:1161
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1109
+#: zypp/solver/detail/SATResolver.cc:1164
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1165
+#: zypp/solver/detail/SATResolver.cc:1169
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1113
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1117
+#: zypp/solver/detail/SATResolver.cc:1172
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1120
+#: zypp/solver/detail/SATResolver.cc:1175
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1123
+#: zypp/solver/detail/SATResolver.cc:1178
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1128
+#: zypp/solver/detail/SATResolver.cc:1183
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1130
+#: zypp/solver/detail/SATResolver.cc:1185
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1133
+#: zypp/solver/detail/SATResolver.cc:1188
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1138
+#: zypp/solver/detail/SATResolver.cc:1193
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1140
+#: zypp/solver/detail/SATResolver.cc:1195
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1144
+#: zypp/solver/detail/SATResolver.cc:1199
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1146
+#: zypp/solver/detail/SATResolver.cc:1201
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1153
+#: zypp/solver/detail/SATResolver.cc:1208
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1155
+#: zypp/solver/detail/SATResolver.cc:1210
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1159
+#: zypp/solver/detail/SATResolver.cc:1214
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1161
+#: zypp/solver/detail/SATResolver.cc:1216
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1166
+#: zypp/solver/detail/SATResolver.cc:1221
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1168
+#: zypp/solver/detail/SATResolver.cc:1223
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1200
+#: zypp/solver/detail/SATResolver.cc:1255
 #, boost-format
 msgid "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1202
+#: zypp/solver/detail/SATResolver.cc:1257
 #, boost-format
 msgid "the to be installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1204
+#: zypp/solver/detail/SATResolver.cc:1259
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1214
+#: zypp/solver/detail/SATResolver.cc:1269
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1216
+#: zypp/solver/detail/SATResolver.cc:1271
 msgid "not installable providers: "
 msgstr ""
 
 #. translator: %1% is the name of a PTF, %2% the name of a patch.
-#: zypp/solver/detail/SATResolver.cc:1253
+#: zypp/solver/detail/SATResolver.cc:1308
 #, boost-format
 msgid "%1% is not yet fully integrated into %2%."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1254
+#: zypp/solver/detail/SATResolver.cc:1309
 msgid "Typically you want to keep the PTF and choose to not install the maintenance patches."
 msgstr ""
 
 #. translator: %1% is the name of a PTF.
-#: zypp/solver/detail/SATResolver.cc:1259
+#: zypp/solver/detail/SATResolver.cc:1317
+#, boost-format
+msgid "Removing the installed %1% in this context will remove (not replace!) the included PTF-packages too."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1318
+#, boost-format
+msgid "The PTF should be removed by calling '%1%'. This will update the included PTF-packages rather than removing them."
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1319
+msgid "Typically you want to keep the PTF or choose to cancel the action."
+msgstr ""
+
+#. translator: %1% is the name of a PTF.
+#: zypp/solver/detail/SATResolver.cc:1324
 #, boost-format
 msgid "The installed %1% blocks the desired action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1260
+#: zypp/solver/detail/SATResolver.cc:1325
 msgid "Typically you want to keep the PTF and choose to cancel the action."
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1316
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1321
-#: zypp/solver/detail/SATResolver.cc:1359
+#: zypp/solver/detail/SATResolver.cc:1389
+#: zypp/solver/detail/SATResolver.cc:1427
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1338
-#: zypp/solver/detail/SATResolver.cc:1380
+#: zypp/solver/detail/SATResolver.cc:1406
+#: zypp/solver/detail/SATResolver.cc:1448
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1343
+#: zypp/solver/detail/SATResolver.cc:1411
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1394
-#: zypp/solver/detail/SATResolver.cc:1415
+#: zypp/solver/detail/SATResolver.cc:1462
+#: zypp/solver/detail/SATResolver.cc:1483
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1395
-#: zypp/solver/detail/SATResolver.cc:1416
+#: zypp/solver/detail/SATResolver.cc:1463
+#: zypp/solver/detail/SATResolver.cc:1484
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1400
+#: zypp/solver/detail/SATResolver.cc:1468
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1490
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1435
+#: zypp/solver/detail/SATResolver.cc:1503
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1456
+#: zypp/solver/detail/SATResolver.cc:1524
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1461
+#: zypp/solver/detail/SATResolver.cc:1529
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1470
+#: zypp/solver/detail/SATResolver.cc:1538
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1475
+#: zypp/solver/detail/SATResolver.cc:1543
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1489
+#: zypp/solver/detail/SATResolver.cc:1557
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1560
 #, boost-format
 msgid "allow installing the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1495
+#: zypp/solver/detail/SATResolver.cc:1563
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1515
+#: zypp/solver/detail/SATResolver.cc:1583
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1522
+#: zypp/solver/detail/SATResolver.cc:1590
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
 #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either.
-#: zypp/solver/detail/SATResolver.cc:1533
+#: zypp/solver/detail/SATResolver.cc:1601
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
 "  %2%  -->  %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1538
+#: zypp/solver/detail/SATResolver.cc:1606
 #, boost-format
 msgid ""
 "install %1% from vendor %2%\n"
 "  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1547
+#: zypp/solver/detail/SATResolver.cc:1615
 #, boost-format
 msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1558
+#: zypp/solver/detail/SATResolver.cc:1626
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/target/RpmPostTransCollector.cc:98
+#. Translator: progress bar label
+#: zypp/target/RpmPostTransCollector.cc:194
+msgid "Running post-transaction scripts"
+msgstr ""
+
+#. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:196
 #, boost-format
-msgid "Executing %%posttrans script '%1%'"
+msgid "Running %1% script"
 msgstr ""
 
-#. show a final message
-#: zypp/target/RpmPostTransCollector.cc:172
-#, c-format, boost-format
-msgid "Executing %posttrans scripts"
+#. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+#: zypp/target/RpmPostTransCollector.cc:198
+#, boost-format
+msgid "%1% script output:"
 msgstr ""
 
 #: zypp/target/TargetException.cc:27
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:452
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:441
+#: zypp/target/TargetImpl.cc:474
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:558
+#: zypp/target/TargetImpl.cc:591
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:568
+#: zypp/target/TargetImpl.cc:601
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:623 zypp/target/TargetImpl.cc:643
-#: zypp/target/TargetImpl.cc:671 zypp/target/TargetImpl.cc:708
-#: zypp/target/TargetImpl.cc:716
+#: zypp/target/TargetImpl.cc:656 zypp/target/TargetImpl.cc:676
+#: zypp/target/TargetImpl.cc:704 zypp/target/TargetImpl.cc:741
+#: zypp/target/TargetImpl.cc:749
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:767
+#: zypp/target/TargetImpl.cc:800
 msgid "New update message"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:2688
+#. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+#: zypp/target/TargetImpl.cc:2102
+#, boost-format
+msgid "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it is not possible to cancel a running rpm transaction."
+msgstr ""
+
+#: zypp/target/TargetImpl.cc:2739
 msgid "Executing the transaction failed because of the following problems:"
 msgstr ""
 
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1810
-#: zypp/target/rpm/RpmDb.cc:1969
+#: zypp/target/rpm/RpmDb.cc:468 zypp/target/rpm/RpmDb.cc:1829
+#: zypp/target/rpm/RpmDb.cc:1998
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:792
+#: zypp/target/rpm/RpmDb.cc:793
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:859
+#: zypp/target/rpm/RpmDb.cc:860
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1271
+#: zypp/target/rpm/RpmDb.cc:1272
 msgid "Package header is not signed!"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1273
+#: zypp/target/rpm/RpmDb.cc:1274
 msgid "Package payload is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1609
+#: zypp/target/rpm/RpmDb.cc:1611
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1791
+#: zypp/target/rpm/RpmDb.cc:1810
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1793
+#: zypp/target/rpm/RpmDb.cc:1812
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4506,13 +4543,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1796
+#: zypp/target/rpm/RpmDb.cc:1815
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1798
+#: zypp/target/rpm/RpmDb.cc:1817
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4523,47 +4560,47 @@ msgstr ""
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout)
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1826 zypp/target/rpm/RpmDb.cc:1985
+#: zypp/target/rpm/RpmDb.cc:1845 zypp/target/rpm/RpmDb.cc:2014
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2127
+#: zypp/target/rpm/RpmDb.cc:2212
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2148
+#: zypp/target/rpm/RpmDb.cc:2233
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2150
+#: zypp/target/rpm/RpmDb.cc:2235
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2152
+#: zypp/target/rpm/RpmDb.cc:2237
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2154
+#: zypp/target/rpm/RpmDb.cc:2239
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2156
+#: zypp/target/rpm/RpmDb.cc:2241
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2158
+#: zypp/target/rpm/RpmDb.cc:2243
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2160
+#: zypp/target/rpm/RpmDb.cc:2245
 msgid "File is unsigned"
 msgstr ""
 
@@ -4690,72 +4727,72 @@ msgstr ""
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:177
+#: zypp-core/zyppng/io/abstractspawnengine.cc:183
 #, c-format, boost-format
 msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:198
+#: zypp-core/zyppng/io/abstractspawnengine.cc:204
 #, c-format, boost-format
 msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/abstractspawnengine.cc:203
+#: zypp-core/zyppng/io/abstractspawnengine.cc:209
 msgid "Command exited with unknown error."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:150
-#: zypp-core/zyppng/io/forkspawnengine.cc:392
+#: zypp-core/zyppng/io/forkspawnengine.cc:243
+#: zypp-core/zyppng/io/forkspawnengine.cc:486
 msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:206
+#: zypp-core/zyppng/io/forkspawnengine.cc:299
 msgid "Unable to create control pipe."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:272
+#: zypp-core/zyppng/io/forkspawnengine.cc:366
 #, c-format, boost-format
 msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:282
+#: zypp-core/zyppng/io/forkspawnengine.cc:376
 #, c-format, boost-format
 msgid "Can't chdir to '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:283
+#: zypp-core/zyppng/io/forkspawnengine.cc:377
 #, c-format, boost-format
 msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
 
 #. don't want to get here
-#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#: zypp-core/zyppng/io/forkspawnengine.cc:406
 #, c-format, boost-format
 msgid "Can't exec '%s' (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:319
-#: zypp-core/zyppng/io/forkspawnengine.cc:473
+#: zypp-core/zyppng/io/forkspawnengine.cc:413
+#: zypp-core/zyppng/io/forkspawnengine.cc:567
 #, c-format, boost-format
 msgid "Can't fork (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:338
+#: zypp-core/zyppng/io/forkspawnengine.cc:432
 #, c-format, boost-format
 msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:341
+#: zypp-core/zyppng/io/forkspawnengine.cc:435
 #, c-format, boost-format
 msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:344
+#: zypp-core/zyppng/io/forkspawnengine.cc:438
 #, c-format, boost-format
 msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
-#: zypp-core/zyppng/io/forkspawnengine.cc:348
+#: zypp-core/zyppng/io/forkspawnengine.cc:442
 #, c-format, boost-format
 msgid "Can't exec '%s', unexpected error."
 msgstr ""
@@ -4905,6 +4942,10 @@ msgstr ""
 msgid " SSL certificate problem, verify that the CA cert is OK for '%s'."
 msgstr ""
 
+#: zypp-media/mediaexception.cc:220
+msgid "No free ressources available to attach medium."
+msgstr ""
+
 #: zypp-curl/auth/curlauthdata.cc:97
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
@@ -4923,3 +4964,88 @@ msgid ""
 "Download (curl) error for '%s':\n"
 "Unable to retrieve HTTP response\n"
 msgstr ""
+
+#: zypp-tui/Table.h:38
+msgid "Yes"
+msgstr ""
+
+#: zypp-tui/Table.h:38
+msgid "No"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ............[done]
+#. Translator: download progress bar result: ".............[done]"
+#: zypp-tui/output/Out.cc:130 zypp-tui/output/OutNormal.cc:342
+#: zypp-tui/output/OutNormal.cc:345
+msgid "done"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: .......[attention]
+#: zypp-tui/output/Out.cc:132
+msgid "attention"
+msgstr ""
+
+#. translator: Shown as result tag in a progress bar: ...........[error]
+#. Translator: download progress bar result: "............[error]"
+#: zypp-tui/output/Out.cc:134 zypp-tui/output/OutNormal.cc:339
+#: zypp-tui/output/OutNormal.cc:345
+msgid "error"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:50
+msgid "Note:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:52
+msgid "Warning:"
+msgstr ""
+
+#. translator: usually followed by a ' ' and some explanatory text
+#: zypp-tui/output/Out.h:54
+msgid "Error:"
+msgstr ""
+
+#: zypp-tui/output/Out.h:56
+msgid "Continue?"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:89
+msgid "Warning: "
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:253 zypp-tui/output/OutNormal.cc:287
+#: zypp-tui/output/OutNormal.cc:327
+msgid "Retrieving:"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:260
+msgid "starting"
+msgstr ""
+
+#. Translator: download progress bar result: "........[not found]"
+#: zypp-tui/output/OutNormal.cc:336 zypp-tui/output/OutNormal.cc:345
+msgid "not found"
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:422
+msgid "No help available for this prompt."
+msgstr ""
+
+#: zypp-tui/output/OutNormal.cc:439
+msgid "no help available for this option"
+msgstr ""
+
+#. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+#: zypp-tui/output/promptoptions.cc:85
+msgid "shows all options"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "yes"
+msgstr ""
+
+#: zypp-tui/output/promptoptions.cc:194
+msgid "no"
+msgstr ""
diff --git a/tests/media/metalink/metalink.dockerfile b/tests/media/metalink/metalink.dockerfile
new file mode 100644 (file)
index 0000000..2c75150
--- /dev/null
@@ -0,0 +1,38 @@
+FROM opensuse/leap:15.4
+ENV container docker
+
+ENV LANG en_US.UTF-8
+
+RUN zypper ar -f http://download.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.4 mc
+RUN zypper --gpg-auto-import-keys ref
+
+# install MirrorCache here to fetch all dependencies
+RUN zypper -vvv -n install MirrorCache \
+    vim postgresql postgresql-server curl sudo git-core wget tar m4 make \
+    perl-Digest-MD4 tidy perl-DateTime-HiRes \
+    perl-Inline-C gcc # dependencies for hashes calculation
+
+WORKDIR /opt/project
+ENV TZ UTC
+
+# let pg initialize data dir in cache to save some time on every run
+RUN sudo -u postgres /usr/share/postgresql/postgresql-script start && \
+     sudo -u postgres createuser mirrorcache && \
+     sudo -u postgres createdb mirrorcache && \
+     sudo -u postgres /usr/share/postgresql/postgresql-script stop
+
+COPY testfile /opt/project/testfile
+
+ENV MIRRORCACHE_ROOT=/opt/project \
+    MIRRORCACHE_PERMANENT_JOBS='' \
+    MIRRORCACHE_HASHES_QUEUE=default \
+    MIRRORCACHE_HASHES_COLLECT=1
+
+RUN echo 100 # change this number to invalidate docker cache
+
+RUN sudo -u postgres /usr/share/postgresql/postgresql-script start && \
+    sudo -u mirrorcache -E /usr/share/mirrorcache/script/mirrorcache minion job -e folder_sync -a '["/"]' && \
+    sudo -u mirrorcache -E /usr/share/mirrorcache/script/mirrorcache backstage run --oneshot && \
+    ( sudo -u mirrorcache -E /usr/share/mirrorcache/script/mirrorcache daemon & ) && \
+    sleep 5 && \
+    curl -is 127.0.0.1:3000/download/testfile.meta4
index d1aeec1..057bb40 100644 (file)
@@ -63,9 +63,11 @@ BOOST_AUTO_TEST_CASE(arch_test)
   BOOST_REQUIRE( ! Arch_x86_64.compatibleWith( Arch_noarch ) );
   BOOST_REQUIRE( ! Arch_x86_64.compatibleWith( Arch_i386 ) );
   BOOST_REQUIRE( Arch_x86_64.compatibleWith( Arch_x86_64 ) );
+  BOOST_REQUIRE( Arch_x86_64.compatibleWith( Arch_x86_64_v4 ) );
   //////////////////////////////////////////////////////////////////////
   //
   //////////////////////////////////////////////////////////////////////
+  BOOST_CHECK_EQUAL( Arch::baseArch( Arch_x86_64_v4 ), Arch_x86_64 );
   BOOST_CHECK_EQUAL( Arch::baseArch( Arch_x86_64 ), Arch_x86_64 );
   BOOST_CHECK_EQUAL( Arch::baseArch( Arch_i686 ), Arch_i386 );
   //////////////////////////////////////////////////////////////////////
index c1e60fb..de28a2c 100644 (file)
 
 using boost::unit_test::test_case;
 using namespace zypp;
+using namespace std::string_literals;
 
 void chksumtest( const std::string & type_r, const std::string & sum_r )
 {
   BOOST_CHECK_EQUAL( type_r, CheckSum( sum_r ).type() );       // autodetect type
   BOOST_CHECK_EQUAL( type_r, CheckSum( type_r, sum_r ).type() );
   BOOST_CHECK_EQUAL( sum_r, Digest::digest( type_r, "" ) );
-  for ( const std::string & t : { "md5", "sha1", "sha224", "sha256", "sha384", "sha512", } )
+  for ( const std::string & t : { "md5"s, "sha1"s, "sha224"s, "sha256"s, "sha384"s, "sha512"s, } )
   {
     if ( t != type_r )
     {
index ee0f795..b96cce7 100644 (file)
 #include <boost/test/unit_test.hpp>
 
 #include <zypp-core/ui/ProgressData>
-
+#include <zypp/ZYppCallbacks.h>
 using boost::unit_test::test_case;
+using std::cout;
+using std::endl;
 
 using namespace zypp;
 
@@ -56,4 +58,72 @@ BOOST_AUTO_TEST_CASE(progressdata_test)
 
 }
 
+// Check expected ProgressReport triggers:
+// none | (start progress)  progress*  (progress end)
+struct PReceive : public callback::ReceiveReport<ProgressReport>
+{
+  int frame = 0;  // 0 -start-> 1(progress) -finish-> 2
+  int pings = 0;  // count progress triggers
 
+  void reportbegin() override
+  {
+    // cout << "REPORT+++" << endl;
+    frame = pings = 0;
+  }
+
+  void start( const ProgressData & task ) override
+  {
+    // cout << "REPBEG " << task << " " << frame <<":"<< pings << endl;
+    BOOST_CHECK_EQUAL( frame, 0 );
+    BOOST_CHECK_EQUAL( pings, 0 );
+    frame = 1;
+    pings -= 1; // start must be followed by 1 progress
+  }
+
+  bool progress( const ProgressData & task ) override
+  {
+    // cout << "REP... " << task << " " << frame <<":"<< pings << endl;
+    BOOST_CHECK_EQUAL( frame, 1 );  // progress
+    pings += 1;
+    return true;
+  }
+
+  void finish( const ProgressData & task ) override
+  {
+    // cout << "REPEND " << task << " " << frame <<":"<< pings << endl;
+    BOOST_CHECK_EQUAL( frame, 1 );
+    frame = 2;
+    pings -= 1; // finish must be preceded by 1 progress
+  }
+
+  void reportend() override
+  {
+    // cout << "REPORT--- " << " " << frame <<":"<< pings << endl;
+    BOOST_CHECK( ( frame == 0 && pings == 0 ) || ( frame == 2 && pings >= 0 ) );
+  }
+};
+
+BOOST_AUTO_TEST_CASE(progress_report)
+{
+  PReceive preceive;
+  preceive.connect();
+  {
+    callback::SendReport<ProgressReport> report;
+    ProgressData ticks;
+    ticks.sendTo( ProgressReportAdaptor( report ) );
+    ticks.range( 5 );
+  }
+  BOOST_CHECK_EQUAL( preceive.frame, 0 ); // If no value was set no reports were sent.
+
+  {
+    callback::SendReport<ProgressReport> report;
+    ProgressData ticks;
+    ticks.sendTo( ProgressReportAdaptor( report ) );
+    ticks.range( 5 );
+    ticks.toMin();
+    ticks.set(3);
+    ticks.toMax();
+  }
+  BOOST_CHECK_EQUAL( preceive.frame, 2 ); // Values were set, so finish was sent.
+
+}
index 5974754..2620e88 100644 (file)
@@ -2,6 +2,7 @@
 #include "TestTools.h"
 #include <zypp/ExternalProgram.h>
 #include <zypp/TmpPath.h>
+#include <zypp-core/zyppng/base/Timer>
 
 #include <chrono>
 #include <thread>
@@ -210,3 +211,13 @@ BOOST_AUTO_TEST_CASE( CloseFDs )
   const auto exitCode = proc.close();
   BOOST_REQUIRE_EQUAL( exitCode, 0 );
 }
+
+BOOST_AUTO_TEST_CASE( WaitForExit )
+{
+  ExternalProgram proc( "bash -c 'sleep 2'", ExternalProgram::Normal_Stderr );
+  BOOST_CHECK( proc.running() );
+  auto start = zyppng::Timer::now();
+  BOOST_CHECK( !proc.waitForExit( 500 ) );
+  BOOST_REQUIRE_LT( zyppng::Timer::elapsedSince( start), 1000 );
+  BOOST_CHECK( proc.waitForExit() );
+}
index fb2f50e..1cc230b 100644 (file)
@@ -1,6 +1,7 @@
 ADD_TESTS(
   EventLoop
   IOBuffer
+  UnixSignalSource
 )
 
 ADD_SUBDIRECTORY( media )
diff --git a/tests/zyppng/UnixSignalSource_test.cc b/tests/zyppng/UnixSignalSource_test.cc
new file mode 100644 (file)
index 0000000..863df62
--- /dev/null
@@ -0,0 +1,141 @@
+#include <boost/test/unit_test.hpp>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/Timer>
+#include <zypp-core/zyppng/base/UnixSignalSource>
+
+#include <signal.h>
+
+BOOST_AUTO_TEST_CASE(signalCatcher)
+{
+  {
+    zyppng::EventLoopRef ev = zyppng::EventLoop::create();
+    zyppng::TimerRef secTimer  = zyppng::Timer::create();
+    secTimer->setSingleShot (true);
+    secTimer->sigExpired ().connect ([&]( auto &){
+      ev->quit ();
+    });
+
+    auto sigSource = ev->eventDispatcher ()->unixSignalSource ();
+
+    int receivedSig = -1;
+    sigSource->sigReceived ().connect ( [&]( int signum ) {
+      receivedSig = signum;
+      ev->quit ();
+    });
+
+    sigSource->addSignal ( SIGALRM );
+    sigSource->addSignal ( SIGINT );
+
+    // send alarm to our process
+    alarm(1);
+    secTimer->start ( 5000 );
+    ev->run();
+
+    BOOST_CHECK_EQUAL( receivedSig, SIGALRM );
+
+    sigSource->removeSignal ( SIGALRM );
+
+    sigset_t siset;
+    ::sigemptyset ( &siset );
+    ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+    BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 );
+    BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 );
+  }
+
+  //after cleaning the event loop the sigmask should be normal again
+  sigset_t siset;
+  ::sigemptyset ( &siset );
+  ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+  BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 );
+}
+
+
+BOOST_AUTO_TEST_CASE(signalCleanup)
+{
+
+  {
+    zyppng::EventLoopRef ev = zyppng::EventLoop::create();
+    auto sigSource = ev->eventDispatcher ()->unixSignalSource ();
+
+    {
+      sigset_t siset;
+      ::sigemptyset ( &siset );
+      ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 );
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 );
+    }
+
+    sigSource->addSignal ( SIGINT );
+    sigSource->addSignal ( SIGINT );
+    sigSource->addSignal ( SIGINT );
+
+    {
+      sigset_t siset;
+      ::sigemptyset ( &siset );
+      ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 );
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 );
+    }
+
+
+    sigSource->removeSignal ( SIGINT );
+    {
+      sigset_t siset;
+      ::sigemptyset ( &siset );
+      ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 );
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 );
+    }
+
+    sigSource->removeSignal ( SIGINT );
+    {
+      sigset_t siset;
+      ::sigemptyset ( &siset );
+      ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 );
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 );
+    }
+
+    sigSource->removeSignal ( SIGINT );
+    {
+      sigset_t siset;
+      ::sigemptyset ( &siset );
+      ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 );
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 );
+    }
+
+    sigSource->addSignal ( SIGALRM );
+    sigSource->addSignal ( SIGALRM );
+    sigSource->addSignal ( SIGINT );
+    sigSource->addSignal ( SIGINT );
+
+    {
+      sigset_t siset;
+      ::sigemptyset ( &siset );
+      ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 1 );
+      BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 );
+    }
+
+  }
+
+  {
+    sigset_t siset;
+    ::sigemptyset ( &siset );
+    ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset );
+
+    BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 );
+    BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 );
+  }
+
+}
index c89e04b..c55d72c 100644 (file)
@@ -266,8 +266,8 @@ std::vector< MirrorSet > generateMirr ()
   res.back().filename = "primary.xml.zck";
   res.back().dlTotal = 274638;
   res.back().expectSuccess = true;
-  res.back().expectedHandlerDownloads  = 2; // query if metalink avail + dl metalink
-  res.back().expectedFileDownloads  = 6; // Zck Head + 5 Chunks ( chunk size is at least 4K but is likely a few bytes bigger )
+  res.back().expectedHandlerDownloads  = 3; // query if metalink avail + dl metalink + dl zck head because request is reused
+  res.back().expectedFileDownloads  = 5; // 5 Chunks ( chunk size is at least 4K but is likely a few bytes bigger )
   res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DetectMetaLink, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlZChunkHead, zyppng::Download::DlZChunk, zyppng::Download::Finished};
   res.back().headerChecksum = zypp::CheckSum( zypp::Digest::sha256(), "90a1a1b99ba3b6c8ae9f14b0c8b8c43141c69ec3388bfa3b9915fbeea03926b7");
   res.back().headerSize     = 11717;
index d101b74..c110feb 100644 (file)
@@ -1,6 +1,7 @@
 #include <boost/test/unit_test.hpp>
 #include <boost/test/data/test_case.hpp>
 #include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/fs/PathInfo.h>
 #include <zypp-curl/parser/MetaLinkParser> // for hexstr2bytes
 #include <zypp-curl/ng/network/Request>
 #include <zypp-curl/ng/network/NetworkRequestDispatcher>
@@ -27,6 +28,8 @@
 
 #define BOOST_TEST_REQ_SUCCESS(REQ) \
   do { \
+  if ( REQ->hasError() ) \
+    BOOST_ERROR( REQ->error().toString() ); \
   BOOST_REQUIRE( !REQ->hasError() ); \
   BOOST_REQUIRE( !REQ->error().isError() ); \
   BOOST_REQUIRE_EQUAL( REQ->error().type(), zyppng::NetworkRequestError::NoError ); \
@@ -53,6 +56,11 @@ const char * err401 = "Status: 401 Unauthorized\r\n"
                      "\r\n"
                      "Sorry you are not authorized.";
 
+const char * resp204 = "Status: 204\r\n"
+                       "server: Apache\r\n"
+                       "content-type: text/html;charset=UTF-8\r\n"
+                       "date: Wed, 30 Nov 2022 14:31:22 GMT\r\n\r\n";
+
 bool withSSL[] = { true, false };
 
 BOOST_DATA_TEST_CASE(nwdispatcher_basic, bdata::make( withSSL ), withSSL)
@@ -126,8 +134,7 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
   web.addRequestHandler("get403", makeErrorResponder( "403 Forbidden" ) );
   web.addRequestHandler("get410", makeErrorResponder( "410 Gone" ) );
   web.addRequestHandler("get418", makeErrorResponder( "418 I'm a teapot" ) );
-  web.addRequestHandler("delayMe", []( WebServer::Request &req ) {
-  });
+  web.addRequestHandler("get204", WebServer::makeResponse( resp204 ) );
   BOOST_REQUIRE( web.start() );
 
   zyppng::TransferSettings set = web.transferSettings();
@@ -201,6 +208,12 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
   req418->transferSettings() = set;
   disp->enqueue( req418 );
 
+  weburl = zyppng::Url( web.url() );
+  weburl.setPathName("/handler/get204");
+  zyppng::NetworkRequest::Ptr get204 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
+  get204->transferSettings() = set;
+  disp->enqueue( get204 );
+
   disp->run();
   ev->run();
 
@@ -214,6 +227,7 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
   BOOST_TEST_REQ_ERR( req403, zyppng::NetworkRequestError::Forbidden );
   BOOST_TEST_REQ_ERR( req410, zyppng::NetworkRequestError::NotFound );
   BOOST_TEST_REQ_ERR( req418, zyppng::NetworkRequestError::ServerReturnedError );
+  BOOST_TEST_REQ_SUCCESS( get204 );
 }
 
 BOOST_DATA_TEST_CASE(nwdispatcher_http_download, bdata::make( withSSL ), withSSL )
@@ -550,3 +564,57 @@ BOOST_DATA_TEST_CASE(nwdispatcher_multipart_data_missing, bdata::make( withSSL )
   ev->run();
   BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::MissingData );
 }
+
+//Get many ranges from a file to force the server to return a range error
+BOOST_DATA_TEST_CASE(nwdispatcher_multipart_many_chunks_dl, bdata::make( withSSL ), withSSL )
+{
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+    ev->quit();
+  });
+
+  disp->run();
+
+  WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site").c_str(), 10001, withSSL );
+  BOOST_REQUIRE( web.start() );
+
+  auto weburl = web.url();
+  weburl.setPathName("/file-1.txt");
+
+  auto sourceFile = zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site/file-1.txt";
+
+  zyppng::TransferSettings set = web.transferSettings();
+  zypp::filesystem::TmpFile targetFile;
+
+  zypp::PathInfo pi( sourceFile );
+
+  // request every other chunk from the file
+  zypp::ByteCount seekInterval = pi.size () / 512;
+
+  auto reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
+  reqDLFile->transferSettings() = set;
+  reqDLFile->setUrl( weburl );
+
+  auto chunkLen = seekInterval / 2;
+  for ( zypp::ByteCount off = 0;( off + chunkLen )< pi.size(); off += seekInterval ) {
+    reqDLFile->addRequestRange(  off, chunkLen );
+  }
+
+  disp->enqueue( reqDLFile );
+  ev->run();
+  auto err = reqDLFile->error();
+  std::cerr << err.toString () << std::endl;
+  BOOST_TEST_REQ_SUCCESS( reqDLFile );
+
+  std::string downloaded = TestTools::readFile ( targetFile.path() );
+
+  BOOST_REQUIRE( !downloaded.empty() );
+
+  std::string sourceData = TestTools::readFile ( sourceFile );
+
+  for ( zypp::ByteCount off = 0;( off + chunkLen )< pi.size(); off += seekInterval ) {
+    BOOST_REQUIRE_EQUAL( std::string_view ( sourceData.data()+off , chunkLen ), std::string_view ( downloaded.data()+off , chunkLen ) );
+  }
+}
+
index db9966e..9601b38 100644 (file)
@@ -14,7 +14,7 @@
 #include <zypp-core/zyppng/rpc/zerocopystreams.h>
 #include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 
-#include <zypp-proto/tvm.pb.h>
+#include <zypp-proto/test/tvm.pb.h>
 #include <iostream>
 #include <fstream>
 
diff --git a/tools/CalculateReusableBlocks.cc b/tools/CalculateReusableBlocks.cc
new file mode 100644 (file)
index 0000000..dffcc3a
--- /dev/null
@@ -0,0 +1,86 @@
+#include <zypp-curl/parser/MediaBlockList>
+#include <zypp-curl/parser/MetaLinkParser>
+#include <zypp-curl/parser/ZsyncParser>
+#include <zypp-core/Pathname.h>
+#include <zypp-core/fs/PathInfo.h>
+#include <zypp-core/fs/TmpPath.h>
+#include <zypp-core/base/String.h>
+#include <iostream>
+#include <algorithm>
+
+int main ( int argc, char *argv[] )
+{
+  if ( argc < 3 ) {
+    std::cerr << "Usage: CalculateReusebleBlocks <metalinkfile> <deltafile>" << std::endl;
+    return 1;
+  }
+
+  constexpr auto checkFileAccessible = []( const zypp::Pathname &path ){
+    zypp::PathInfo pi( path );
+    return ( pi.isExist() && pi.isFile() && pi.userMayR() );
+  };
+
+  zypp::Pathname metaLink( zypp::str::asString(argv[1]) );
+  zypp::Pathname deltaFile( zypp::str::asString(argv[2]) );
+
+  if ( !checkFileAccessible(metaLink) ) {
+    std::cerr << "Metalink file at " << metaLink << " not accessible" << std::endl;
+    return 1;
+  }
+
+  if ( !checkFileAccessible(deltaFile) ) {
+    std::cerr << "Deltafile file at " << deltaFile << " not accessible" << std::endl;
+    return 1;
+  }
+
+  zypp::media::MediaBlockList blocks;
+  if ( zypp::str::hasSuffix( metaLink.asString(), "zsync") )  {
+      zypp::media::ZsyncParser parser;
+      try {
+        parser.parse( metaLink.asString() );
+        blocks = parser.getBlockList();
+      } catch (const zypp::Exception& e) {
+        std::cerr << "Failed to parse Metalink file: " << e << std::endl;
+        return 1;
+      } catch ( const std::exception &e ) {
+        std::cerr << "Failed to parse Metalink file: " << e.what() << std::endl;
+        return 1;
+      }
+  } else {
+    zypp::media::MetaLinkParser parser;
+    try {
+      parser.parse( metaLink );
+      blocks = parser.getBlockList();
+    } catch(const zypp::Exception& e) {
+      std::cerr << "Failed to parse Metalink file: " << e << std::endl;
+      return 1;
+    }
+  }
+
+  constexpr auto getDownloadSize = []( const zypp::media::MediaBlockList &blocks ){
+    size_t size = 0;
+    for ( size_t i = 0; i < blocks.numBlocks(); i++ ) {
+      size += blocks.getBlock(i).size;
+    }
+    return size;
+  };
+
+  zypp::filesystem::TmpFile file;
+  const auto numBlocksBefore = blocks.numBlocks();
+  const zypp::ByteCount sizeBefore = getDownloadSize(blocks);
+
+  std::cout << "Blocks parsed from Metalink file: " << numBlocksBefore << std::endl;
+  if ( numBlocksBefore ) {
+    zypp::AutoFILE f( fopen( "Out.test.gz", "w"));
+    if ( *f ) {
+      blocks.reuseBlocks( *f, deltaFile.asString() );
+    }
+  }
+
+  const size_t numBlocksAfter = blocks.numBlocks();
+  const zypp::ByteCount sizeAfter = getDownloadSize(blocks);
+
+  std::cout << "Finished, reused " << ( numBlocksBefore - numBlocksAfter ) << " of " << numBlocksBefore << " blocks." << std::endl;
+  std::cout << "Need to download " << sizeAfter << " of " << sizeBefore << std::endl;
+  return 0;
+}
diff --git a/tools/DownloadFiles.cc b/tools/DownloadFiles.cc
new file mode 100644 (file)
index 0000000..eaba1a9
--- /dev/null
@@ -0,0 +1,272 @@
+// A small tool to test the downloader backend in zypp
+// takes a yaml file as first argument that has a list of downloadable files and possible deltafiles to
+// use when requesting the file:
+// - url: "https://dlmirror.foo/file1"
+//   delta: "/path/to/delta1"
+// - url: "https://dlmirror.foo/file2"
+//   delta: "/path/to/file2"
+
+
+#include <zypp/MediaSetAccess.h>
+#include <zypp/ZYppCallbacks.h>
+#include <zypp-core/ManagedFile.h>
+#include <zypp-core/fs/TmpPath.h>
+#include <yaml-cpp/yaml.h>
+
+#include <boost/program_options.hpp>
+#include <iostream>
+
+namespace po = boost::program_options;
+
+struct DLEntry {
+  zypp::Url _url;
+  zypp::Pathname _deltaFile;
+  zypp::ByteCount _dlSize;
+};
+
+// #489, bsc#1215294: Stop using boost version 1 timer library
+// https://www.boost.org/doc/libs/1_83_0/libs/timer/doc/original_timer.html
+// A simple handcrafted substitute for <boost/progress.hpp> progress_display
+struct PCBar {
+  PCBar() {
+    std::cout << std::endl;
+    std::cout << "0%   10   20   30   40   50   60   70   80   90   100%" << std::endl;
+    std::cout << "|----|----|----|----|----|----|----|----|----|----|" << std::endl;
+  }
+  ~PCBar() {
+    std::cout << std::endl;
+  }
+  void set( int pcval_r ) {
+    if ( pcval_r <= 0 )
+      std::cout << "\033[2K\r" << std::flush;
+    else if ( pcval_r < 100 )
+      std::cout << "\033[2K\r" << std::string( 1+pcval_r/2, '*' ) << std::flush;
+    else
+      std::cout << "\033[2K\r" << std::string( 51, '*' ) << std::flush;
+  }
+};
+
+// progress for downloading a file
+struct DownloadProgressReportReceiver : public zypp::callback::ReceiveReport<zypp::media::DownloadProgressReport>
+{
+  DownloadProgressReportReceiver()
+  {
+    connect();
+  }
+
+  virtual void start( const zypp::Url & uri, zypp::Pathname localfile )
+  {
+    assert(!_display);
+    std::cout << "Starting download of: " << uri << " to " << localfile << std::endl;
+    _display = std::make_unique<PCBar>();
+  }
+
+  virtual bool progress(int value, const zypp::Url & uri, double drate_avg, double drate_now)
+  {
+    _display->set( value );
+    return true;
+  }
+
+  virtual DownloadProgressReport::Action
+  problem( const zypp::Url & uri, DownloadProgressReport::Error error, const std::string & description )
+  {
+    std::cerr << "Problem while downloading file " << description << std::endl;
+    return DownloadProgressReport::ABORT;
+  }
+
+  // used only to finish, errors will be reported in media change callback (libzypp 3.20.0)
+  virtual void finish( const zypp::Url & uri, Error error, const std::string & konreason )
+  {
+    _display.reset();
+    std::cout << std::endl;
+  }
+
+private:
+  std::unique_ptr<PCBar> _display;
+};
+
+
+
+int main ( int argc, char *argv[] )
+{
+  // force the use of the new downloader code
+  setenv("ZYPP_MEDIANETWORK", "1", 1);
+
+  auto appname = zypp::Pathname::basename( argv[0] );
+  po::positional_options_description p;
+  p.add("control-file", 1);
+
+  po::options_description visibleOptions("Allowed options");
+  visibleOptions.add_options()
+    ("help", "produce help message")
+    ("mediabackend" , po::value<std::string>()->default_value("legacy"), "Select the mediabackend to use, possible options: legacy, provider")
+    ("target-dir"   , po::value<std::string>()->default_value("."), "Directory where to download the files to." );
+
+  po::options_description positionalOpts;
+  positionalOpts.add_options ()
+    ("control-file" , po::value<std::string>(), "Control file to read the urls from" );
+
+  po::options_description cmdline_options;
+  cmdline_options.add(visibleOptions).add(positionalOpts);
+
+  const auto &usage = [&](){
+    std::cerr << "Usage: " << appname << " [OPTIONS] <control-file>" << std::endl;
+    std::cerr << visibleOptions << std::endl;
+  };
+
+  po::variables_map vm;
+
+  try {
+    po::store(po::command_line_parser(argc, argv).
+               options(cmdline_options).positional(p).run(), vm);
+    po::notify(vm);
+  } catch ( const po::error & e ) {
+    std::cerr << e.what () << std::endl;
+    usage();
+  }
+
+  if ( vm.count ("help") ) {
+    usage();
+    return 0;
+  }
+
+  if ( !vm.count("control-file") ) {
+    std::cerr << "Missing the required control-file argument.\n" << std::endl;
+    usage();
+    return 1;
+  }
+
+  const auto &cFInfo = zypp::PathInfo( vm["control-file"].as<std::string>());
+  if ( !cFInfo.isExist() || !cFInfo.userMayR() ) {
+    std::cerr << "Control file " << cFInfo.path () << " is not accessible" << std::endl;
+    usage();
+    return 1;
+  }
+
+  if ( !vm.count("mediabackend")
+       || ( vm["mediabackend"].as<std::string>() != "legacy" && vm["mediabackend"].as<std::string>() != "provider" ) ) {
+    std::cerr << "Invalid value given for mediabackend option: " << vm["mediabackend"].as<std::string>() <<".\n";
+    usage();
+    return 1;
+  }
+
+  if ( !vm.count("target-dir") ) {
+    std::cerr << "Targetdir not initialized, this is a bug.\n" << std::endl;
+    usage();
+    return 1;
+  }
+
+  const zypp::PathInfo targetDir( vm["target-dir"].as<std::string>() );
+  if ( !targetDir.isDir() || !targetDir.userMayRWX() ) {
+    std::cerr << "Target directory is not accessible." << std::endl;
+    usage();
+    return 1;
+  }
+
+  constexpr auto makeError = [] ( const std::string &str ) {
+    std::cerr << str << std::endl;
+    return 1;
+  };
+
+  std::vector<DLEntry> entries;
+
+  YAML::Node control;
+  try {
+    control = YAML::LoadFile( cFInfo.path().asString() );
+
+    if ( control.Type() != YAML::NodeType::Sequence )
+      return makeError("Root node must be of type Sequence.");
+
+    for ( const auto &dlFile : control ) {
+      const auto &url = dlFile["url"];
+      if ( !url ) {
+        return makeError("Each element in the control sequence needs a \"url\" field.");
+      }
+      if ( url.Type() != YAML::NodeType::Scalar )
+        return makeError("Field 'url' must be a scalar.");
+
+      zypp::Url dlUrl( url.as<std::string> () );
+      zypp::Pathname deltaFile;
+      zypp::ByteCount downloadSize;
+
+      const auto &delta = dlFile["delta"];
+      if ( delta ) {
+        if ( delta.Type() != YAML::NodeType::Scalar )
+          return makeError("Field 'delta' must be a scalar.");
+
+        deltaFile = zypp::Pathname( delta.as<std::string>() );
+      }
+
+      const auto &dlSize = dlFile["dlSize"];
+      if ( dlSize ) {
+        if ( dlSize.Type() != YAML::NodeType::Scalar )
+          return makeError("Field 'delta' must be a scalar.");
+
+        downloadSize = zypp::ByteCount( dlSize.as<long>() );
+      }
+
+
+      entries.push_back ( { std::move(dlUrl), std::move(deltaFile), std::move(downloadSize) } );
+    }
+  } catch ( YAML::Exception &e ) {
+    std::cerr << "YAML exception: " << e.what() << std::endl;
+    return 1;
+  } catch ( const std::exception &e )  {
+    std::cerr << "Error when parsing the control file: " << e.what() << std::endl;
+    return 1;
+  } catch ( ... )  {
+    std::cerr << "Unknown error when parsing the control file" << std::endl;
+    return 1;
+  }
+
+  std::vector< zypp::ManagedFile > files;
+
+  std::cout << "Using yaml: " << cFInfo.path() << "\n"
+            << "Downloading to: " << targetDir.path ().realpath ()<< "\n"
+            << "Using backend: " << vm["mediabackend"].as<std::string>() << "\n"
+            << "Nr of downloads: " << entries.size() << "\n" << std::endl;
+
+  if ( vm["mediabackend"].as<std::string>() == "provider" ) {
+    std::cerr << "The provider support is not yet implemented, please try again later." << std::endl;
+    return 1;
+  }
+
+
+  DownloadProgressReportReceiver receiver;
+
+  if ( entries.size() ) {
+    for ( const auto &e : entries ) {
+      try {
+
+        zypp::Url url(e._url);
+        zypp::Pathname path(url.getPathName());
+
+        url.setPathName ("/");
+        zypp::MediaSetAccess access(url);
+
+        zypp::ManagedFile locFile( targetDir.path().realpath() / path, zypp::filesystem::unlink );
+        zypp::filesystem::assert_dir( locFile->dirname() );
+
+        auto file = access.provideFile(
+          zypp::OnMediaLocation(path, 1)
+            .setOptional  ( false )
+            .setDeltafile ( e._deltaFile )
+            .setDownloadSize ( e._dlSize ) );
+
+        //prevent the file from being deleted when MediaSetAccess gets out of scope
+        if ( zypp::filesystem::hardlinkCopy(file, locFile) != 0 )
+          ZYPP_THROW( zypp::Exception("Can't copy file from " + file.asString() + " to " +  locFile->asString() ));
+
+        std::cout << "File downloaded: " << e._url << std::endl;
+        files.push_back ( locFile );
+
+      } catch ( const zypp::Exception &e ) {
+        std::cerr << "Failed to download file: " << e << std::endl;
+      }
+    }
+  }
+
+  //std::cout << "Done, press any key to continue" << std::endl;
+  //getchar();
+  return 0;
+}
index 8dda259..3b9e7e3 100644 (file)
@@ -110,9 +110,10 @@ int main( int argc, char * argv[] )
     message( "Use test system at " + mroot.asString() );
   }
   filesystem::assert_dir( mroot );
+  base::LogControl::instance().logfile( mroot/"ToolScanRepos.log" );
+  message( "Use logfile " + (mroot/"ToolScanRepos.log").asString() );
 
   message( "Use archiecture " + march.asString() );
-  base::LogControl::instance().logfile( mroot/"ToolScanRepos.log" );
   TestSetup test( mroot, march );
 
   int ret = 0;
index 153a4d5..dee1612 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-chksum C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
 )
@@ -13,7 +11,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index f0e316e..4229adb 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-copy C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
 )
@@ -13,7 +11,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index 098f352..3f0009f 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-dir C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   dirprovider.cc
@@ -15,7 +13,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index 4712694..de7b569 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-disc C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   discprovider.cc
@@ -15,7 +13,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index 9ac8304..9c6ba94 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-disk C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   diskprovider.cc
@@ -15,7 +13,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index 0da023d..3079b9c 100644 (file)
@@ -131,7 +131,7 @@ zyppng::worker::AttachResult DiskProvider::mountDevice ( const uint32_t id, cons
         );
     }
 
-    const std::string &device = zypp::Pathname(attachUrl.getQueryParam("device")).asString();
+    const std::string device = zypp::Pathname(attachUrl.getQueryParam("device")).asString();
     if ( device.empty() ) {
       return zyppng::worker::AttachResult::error(
         zyppng::ProvideMessage::Code::MountFailed
index d432f7b..b4476d5 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-http C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   networkprovider.cc
@@ -16,7 +14,6 @@ target_link_libraries( ${PROJECT_NAME} zypp-curl )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index 3be04e0..1e9fa85 100644 (file)
@@ -417,6 +417,7 @@ void NetworkProvider::itemFinished( NetworkProvideItemRef item )
     switch( error.type() ) {
       case zyppng::NetworkRequestError::NoError: { throw std::runtime_error("DownloadError info broken"); break;}
       case zyppng::NetworkRequestError::InternalError: { errCode = zyppng::ProvideMessage::Code::InternalError; break;}
+      case zyppng::NetworkRequestError::RangeFail: { errCode = zyppng::ProvideMessage::Code::InternalError; break;}
       case zyppng::NetworkRequestError::Cancelled: { errCode = zyppng::ProvideMessage::Code::Cancelled; break;}
       case zyppng::NetworkRequestError::PeerCertificateInvalid: { errCode = zyppng::ProvideMessage::Code::PeerCertificateInvalid; break;}
       case zyppng::NetworkRequestError::ConnectionFailed: { errCode = zyppng::ProvideMessage::Code::ConnectionFailed; break;}
@@ -442,6 +443,9 @@ void NetworkProvider::itemFinished( NetworkProvideItemRef item )
           extra.set ( "authhint", authHint );
         break;
       }
+      //@TODO add extra codes for handling these
+      case zyppng::NetworkRequestError::Http2Error:
+      case zyppng::NetworkRequestError::Http2StreamError:
       case zyppng::NetworkRequestError::ServerReturnedError: { errCode = zyppng::ProvideMessage::Code::InternalError; break; }
       case zyppng::NetworkRequestError::MissingData: { errCode = zyppng::ProvideMessage::Code::BadRequest; break; }
     }
index b82ce77..0e3f4ef 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-iso C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   isoprovider.cc
@@ -30,7 +28,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index aed5d46..4479ca8 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-nfs C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   nfsprovider.cc
@@ -15,7 +13,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index 24f3aa4..8d268bf 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-smb C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   smbprovider.cc
@@ -15,7 +13,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 IF ( INSTALL_NG_BINARIES )
   INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" )
index 0b394df..e70b108 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-media-tvm C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 SET( SOURCES
   main.cc
   testvmprovider.cc
@@ -15,7 +13,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-media )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 
 set_target_properties( ${PROJECT_NAME}
     PROPERTIES
index 6036c0e..a8b2d0c 100644 (file)
@@ -13,7 +13,7 @@
 #include <zypp-core/AutoDispose.h>
 #include <zypp-core/base/StringV.h>
 #include <zypp-media/ng/MediaVerifier>
-#include <zypp-proto/tvm.pb.h>
+#include <zypp-proto/test/tvm.pb.h>
 #include <zypp-core/zyppng/rpc/zerocopystreams.h>
 #include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 
index 36470e7..230bd8e 100644 (file)
@@ -3,8 +3,6 @@ PROJECT( zypp-rpm C CXX )
 set (CMAKE_CXX_STANDARD 17)
 SET (CMAKE_CXX_EXTENSIONS OFF)
 
-FIND_PACKAGE(Protobuf REQUIRED)
-
 FIND_PACKAGE(Rpm REQUIRED)
 IF ( NOT RPM_FOUND)
   MESSAGE( FATAL_ERROR " rpm-devel not found" )
@@ -36,7 +34,6 @@ add_executable( ${PROJECT_NAME} ${SOURCES} )
 target_link_libraries( ${PROJECT_NAME} zypp-core )
 target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
 target_link_libraries( ${PROJECT_NAME} util )
-target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
 target_link_libraries( ${PROJECT_NAME} ${RPM_LIBRARY} ${RPMIO_LIBRARY} )
 
 INSTALL( TARGETS ${PROJECT_NAME}       DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}" )
index ff1736f..2346078 100644 (file)
@@ -16,6 +16,7 @@ namespace zypprpm {
     RpmFinishedWithTransactionError, // we got explicit error problems from rpm
     RpmFinishedWithError,            // the transaction started but could not be finished)
     RpmOrderFailed,                  // running rpmtsorder failed
+    FailedToCreateLock,              // we were unable to create a lockfile
     OtherError = 255
   };
 }
index 5025e7c..f24c054 100644 (file)
@@ -1,13 +1,17 @@
-#include <zypp-proto/commit.pb.h>
+#include <zypp-proto/target/commit.pb.h>
 #include <zypp-core/zyppng/core/ByteArray>
 #include <zypp-core/zyppng/rpc/rpc.h>
 #include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 #include <zypp-core/AutoDispose.h>
 #include <zypp-core/Pathname.h>
 #include <zypp-core/fs/PathInfo.h>
+#include <zypp-core/ShutdownLock_p.h>
 #include <zypp-core/base/String.h>
 #include <zypp-core/base/StringV.h>
 
+#include <boost/interprocess/sync/file_lock.hpp>
+#include <mutex>
+
 // we do not link against libzypp, but these are pure header only files, if that changes
 // a copy should be created directly in the zypp-rpm project
 #include <zypp/target/rpm/librpm.h>
@@ -224,6 +228,46 @@ int main( int, char ** )
 
   }
 
+  // create or fill a pid file, if there is a existing one just take it over
+  // if we reach this place libzypp has its global lock and made sure there is
+  // no still running zypp-rpm instance. So no need to do anything complicated.
+  using namespace boost::interprocess;
+  struct s_lockinfo {
+    s_lockinfo() = default;
+    s_lockinfo( s_lockinfo && ) = default;
+    s_lockinfo( const s_lockinfo & ) = delete;
+    s_lockinfo &operator= ( s_lockinfo && ) = default;
+    s_lockinfo &operator= ( const s_lockinfo & ) = delete;
+
+    ~s_lockinfo() {
+      std::scoped_lock<file_lock> lock(fileLock);
+      clearerr( lockFile );
+      ftruncate( fileno (lockFile), 0 );
+      fflush( lockFile );
+    }
+
+    file_lock fileLock;
+    zypp::AutoFILE lockFile;
+  };
+  std::optional<s_lockinfo> lockinfo;
+  if ( !msg.lockfilepath ().empty () ) {
+    lockinfo.emplace();
+    zypp::Pathname lockFileName = zypp::Pathname( msg.lockfilepath() ) / "zypp-rpm.pid";
+    lockinfo->lockFile = std::fopen( lockFileName.c_str(), "w");
+    if ( lockinfo->lockFile == nullptr ) {
+      ZERR << "Failed to create zypp-rpm pidfile." << std::endl;
+      return FailedToCreateLock;
+    }
+
+    lockinfo->fileLock = file_lock ( lockFileName.c_str() );
+
+    std::scoped_lock<file_lock> lock(lockinfo->fileLock);
+    fprintf(lockinfo->lockFile, "%ld\n", (long)getpid() );
+    fflush( lockinfo->lockFile );
+  }
+
+  zypp::ShutdownLock lck("zypp-rpm", "Zypp commit running.");
+
   // we have all data ready now lets start installing
   // first we initialize the rpmdb
   int rc = ::rpmReadConfigFiles( NULL, NULL );
index ee00934..f6720b6 100644 (file)
@@ -283,6 +283,7 @@ namespace zypp
    * \endcode
    */
   using OnScopeExit = AutoDispose<void>;
+  using Deferred    = AutoDispose<void>;
 
   ///////////////////////////////////////////////////////////////////
 
index c35af08..900a53e 100644 (file)
@@ -33,6 +33,7 @@ SET( zypp_toplevel_SRCS
   ExternalProgram.cc
   onmedialocation.cc
   Pathname.cc
+  ShutdownLock.cc
   Url.cc
 )
 INSTALL(  FILES ${zypp_toplevel_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core" )
@@ -200,6 +201,7 @@ SET( zyppng_base_SRCS
   zyppng/base/timer.cc
   zyppng/base/threaddata.cc
   zyppng/base/socketnotifier.cc
+  zyppng/base/unixsignalsource.cpp
 )
 
 SET( zyppng_base_HEADERS
@@ -219,6 +221,7 @@ SET( zyppng_base_HEADERS
   zyppng/base/statemachine.h
   zyppng/base/Timer
   zyppng/base/timer.h
+  zyppng/base/unixsignalsource.h
   zyppng/base/zyppglobal.h
 )
 
index 0e84e53..6cd60be 100644 (file)
@@ -63,6 +63,7 @@ namespace zypp {
         const EVP_MD *md;
         unsigned char md_value[EVP_MAX_MD_SIZE];
         unsigned md_len;
+        zypp::ByteCount bytesHashed;
 
         bool finalized : 1;
         static bool openssl_digests_added;
@@ -120,6 +121,8 @@ namespace zypp {
         md_len = 0;
         ::memset(md_value, 0, sizeof(md_value));
 
+        bytesHashed = 0;
+
         mdctx.swap(tmp_mdctx);
       }
       return true;
@@ -169,6 +172,7 @@ namespace zypp {
       if(!EVP_DigestInit_ex(_dp->mdctx.get(), _dp->md, NULL))
         return false;
       _dp->finalized = false;
+      _dp->bytesHashed = 0;
       return true;
     }
 
@@ -265,6 +269,7 @@ namespace zypp {
       if(!EVP_DigestUpdate(_dp->mdctx.get(), reinterpret_cast<const unsigned char*>(bytes), len))
         return false;
 
+      _dp->bytesHashed += len;
       return true;
     }
 
@@ -287,6 +292,11 @@ namespace zypp {
       return true;
     }
 
+    ByteCount Digest::bytesHashed() const
+    {
+      return _dp->bytesHashed;
+    }
+
     std::string Digest::digest(const std::string& name, std::istream& is, size_t bufsize)
     {
       if(name.empty() || !is)
index 8d92db5..f2556a2 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <zypp-core/Pathname.h>
 #include <zypp-core/ByteArray.h>
+#include <zypp-core/ByteCount.h>
 
 namespace zypp {
 
@@ -96,6 +97,11 @@ namespace zypp {
          * */
         bool update(std::istream& is, size_t bufsize = 4096);
 
+        /**
+         * Returns the number of input bytes that have been added to the hash
+         */
+        zypp::ByteCount bytesHashed () const;
+
         /** \brief get hex string representation of the digest
          *
          * this function will finalize the digest computation. calls to update
index fd0d8b0..dafded4 100644 (file)
@@ -344,6 +344,15 @@ namespace zypp {
       }
     }
 
+    bool ExternalProgram::waitForExit(std::optional<uint64_t> timeout)
+    {
+      if ( !_backend ) {
+        // no backend means no running progress, return true
+        return true;
+      }
+      return _backend->waitForExit( timeout );
+    }
+
     int
     ExternalProgram::close()
     {
@@ -419,7 +428,10 @@ namespace zypp {
     {
       if ( _backend && _backend->isRunning() )
       {
-        ::kill( _backend->pid(), SIGKILL);
+        if ( ::kill( _backend->pid(), SIGKILL) == -1 ) {
+          ERR << "Failed to kill PID " << _backend->pid() << " with error: " << Errno() << std::endl;
+          return false;
+        }
         close();
       }
       return true;
@@ -429,7 +441,10 @@ namespace zypp {
     {
       if ( _backend && _backend->isRunning()  )
       {
-        ::kill( _backend->pid(), sig );
+        if ( ::kill( _backend->pid(), sig ) == -1 ) {
+          ERR << "Failed to kill PID " << _backend->pid() << " with error: " << Errno() << std::endl;
+          return false;
+        }
       }
       return true;
     }
index d10ce42..f77d4cb 100644 (file)
@@ -18,6 +18,7 @@
 #include <map>
 #include <string>
 #include <vector>
+#include <optional>
 
 #include <zypp-core/Globals.h>
 #include <zypp-core/base/ExternalDataSource.h>
@@ -150,6 +151,18 @@ namespace zypp {
 
       ~ExternalProgram();
 
+#ifdef __cpp_lib_optional // YAST/PK explicitly use c++11 until 15-SP3
+      /*!
+       * Wait a certain timeout for the programm to complete, if \a timeout
+       * is not set this will wait forever, 0 will check if the process is still
+       * running and return immediately with the result, any other value is the
+       * timeout in ms to wait.
+       *
+       * \returns true if the process has exited in time
+       */
+      bool waitForExit ( std::optional<uint64_t> timeout = {} );
+#endif
+
       /** Wait for the progamm to complete. */
       int close();
 
index aa582fe..902791d 100644 (file)
@@ -10,6 +10,7 @@
  *
 */
 #include <iostream>
+#include <climits>
 
 #include <zypp-core/base/String.h>
 #include <zypp-core/Pathname.h>
diff --git a/zypp-core/ShutdownLock.cc b/zypp-core/ShutdownLock.cc
new file mode 100644 (file)
index 0000000..78e4652
--- /dev/null
@@ -0,0 +1,43 @@
+#include "ShutdownLock_p.h"
+
+#include <zypp-core/base/LogTools.h>
+#include <zypp-core/ExternalProgram.h>
+#include <iostream>
+#include <signal.h>
+
+zypp::ShutdownLock::ShutdownLock(const std::string &who, const std::string &reason)
+{
+  try {
+    MIL << "Try to acquire an inhibitor lock..." << endl;
+    std::string whoStr = str::form("--who=%s", who.c_str());
+    std::string whyStr = str::form("--why=%s", reason.c_str());
+
+    const char* argv[] =
+    {
+      "/usr/bin/systemd-inhibit",
+      "--what=sleep:shutdown:idle",
+      whoStr.c_str(),
+      "--mode=block",
+      whyStr.c_str(),
+      "/usr/bin/cat",
+      NULL
+    };
+    _prog = shared_ptr<ExternalProgramWithSeperatePgid>( new ExternalProgramWithSeperatePgid( argv, ExternalProgram::Discard_Stderr ) );
+  } catch (...) {
+  }
+}
+
+zypp::ShutdownLock::~ShutdownLock()
+{
+  if (_prog) {
+    MIL << "Terminate inhibitor lock: pid " << _prog->getpid() << endl;
+    _prog->kill( SIGTERM );
+    if ( !_prog->waitForExit( 10 * 1000 ) ) {
+      // do a real kill if the app does not close in 10 seconds
+      WAR << "systemd-inhibit did not respond to SIGTERM, killing it" << std::endl;
+      _prog->kill();
+    } else {
+      _prog->close();
+    }
+  }
+}
similarity index 88%
rename from zypp/ShutdownLock_p.h
rename to zypp-core/ShutdownLock_p.h
index 4fc5a4c..a17d44c 100644 (file)
@@ -15,8 +15,8 @@
 
 #include <string>
 
-#include <zypp/APIConfig.h>
-#include <zypp/base/PtrTypes.h>
+#include <zypp-core/Globals.h>
+#include <zypp-core/base/PtrTypes.h>
 
 namespace zypp
 {
@@ -31,7 +31,7 @@ class ExternalProgramWithSeperatePgid;
 class ZYPP_LOCAL ShutdownLock
 {
 public:
-   ShutdownLock( const std::string &reason );
+  ShutdownLock( const std::string &who, const std::string &reason );
    ~ShutdownLock();
 
 private:
index 55e9995..ddc3827 100644 (file)
@@ -55,6 +55,10 @@ namespace zypp
     return ret;
   }
 
+  /** Convert TriBool to bool returning \a default_r if indeterminate.*/
+  inline bool tri2bool( const TriBool & val_r, bool default_r )
+  { return indeterminate(val_r) ? default_r : bool(val_r); }
+
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////
index 8c68d33..49a414e 100644 (file)
@@ -41,8 +41,8 @@ struct CleanerData
 
   void run ()
   {
-    // force the kernel to pick another thread to handle those signals
-    zyppng::blockSignalsForCurrentThread( { SIGTERM, SIGINT, SIGPIPE, } );
+    // force the kernel to pick another thread to handle signals
+    zyppng::blockAllSignalsForCurrentThread();
 
     zyppng::ThreadData::current().setName("Zypp-Cleaner");
 
index 1623629..c052230 100644 (file)
@@ -132,8 +132,8 @@ namespace zypp
 
     void workerMain () {
 
-      // force the kernel to pick another thread to handle those signals
-      zyppng::blockSignalsForCurrentThread( { SIGTERM, SIGINT, SIGPIPE, } );
+      // force the kernel to pick another thread to handle signals
+      zyppng::blockAllSignalsForCurrentThread();
 
       zyppng::ThreadData::current().setName("Zypp-Log");
 
index 56be8f0..ee163d4 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <zypp-core/base/Hash.h>
 #include <zypp-core/base/Logger.h>
+#include <zypp-core/base/String.h>
 #include <zypp-core/base/Iterator.h>
 #include <zypp-core/Globals.h>
 
@@ -433,7 +434,41 @@ namespace zypp
   detail::Dump<Tp> dump( const Tp & obj_r )
   { return detail::Dump<Tp>(obj_r); }
 
-
+  /** hexdump data on stream
+   * \code
+   * hexdump 0000000333 bytes (0x0000014d):
+   * 0000: 0c 00 01 49 03 00 17 41 04 af 7c 75 5e 4c 2d f7 ...I...A..|u^L-.
+   * 0010: c9 c9 75 bf a8 41 37 2a d0 03 2c ff 96 d2 43 89 ..u..A7*..,...C.
+   * 0020: ...
+   * \endcode
+   */
+  inline std::ostream & hexdumpOn( std::ostream & outs, const unsigned char *ptr, size_t size )
+  {
+    size_t i,c;
+    unsigned width = 0x10;
+    outs << str::form( "hexdump %10.10ld bytes (0x%8.8lx):\n", (long)size, (long)size );
+
+    for ( i = 0; i < size; i += width ) {
+      outs << str::form( "%4.4lx: ", (long)i );
+      /* show hex to the left */
+      for ( c = 0; c < width; ++c ) {
+        if ( i+c < size )
+          outs << str::form( "%02x ", ptr[i+c] );
+        else
+          outs << ("   ");
+      }
+      /* show data on the right */
+      for ( c = 0; (c < width) && (i+c < size); ++c ) {
+        char x = (ptr[i+c] >= 0x20 && ptr[i+c] < 0x7f) ? ptr[i+c] : '.';
+        outs << x;
+      }
+      outs << std::endl;
+    }
+    return outs;
+  }
+  /** \overload */
+  inline std::ostream & hexdumpOn( std::ostream & outs, const char *ptr, size_t size )
+  { return hexdumpOn( outs, (const unsigned char *)ptr, size ); }
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////
index 2868be7..cb321d2 100644 (file)
@@ -124,7 +124,7 @@ namespace zypp
     }
 
 #define L_ENV_CONSTR_FWD_DECLARE_FUNC(ENV) namespace zypp::log { bool has_env_constr_##ENV (); const char *empty_or_group_if_##ENV ( const char *group ); }
-#define L_ENV_CONSTR(ENV,GROUP,LEVEL) ZYPP_BASE_LOGGER_LOG( zypp::log::empty_or_group_if_##ENV( #GROUP ), LEVEL )
+#define L_ENV_CONSTR(ENV,GROUP,LEVEL) ZYPP_BASE_LOGGER_LOG( zypp::log::empty_or_group_if_##ENV( GROUP ), LEVEL )
 
 #define L_BASEFILE ( *__FILE__ == '/' ? strrchr( __FILE__, '/' ) + 1 : __FILE__ )
 
index f19797b..56b17d2 100644 (file)
@@ -128,7 +128,11 @@ namespace zypp
       return fncCall;
     }
 
+#if LEGACY(1722)
     unsigned detail::_splitRx( const std::string & line_r, const regex & rx_r, WordConsumer && fnc_r )
+    { return _splitRx( std::string_view(line_r), rx_r, std::move(fnc_r) ); }
+#endif
+    unsigned detail::_splitRx( std::string_view line_r, const regex & rx_r, WordConsumer && fnc_r )
     {
       // callback stats
       bool fncStop = false;
index cdb7098..33e309a 100644 (file)
@@ -14,6 +14,7 @@
 #include <string_view>
 #ifdef __cpp_lib_string_view
 
+#include <zypp/APIConfig.h>
 #include <zypp-core/base/String.h>
 #include <zypp-core/base/Regex.h>
 #include <zypp-core/base/Flags.h>
@@ -90,6 +91,14 @@ namespace zypp
     inline std::string_view trim( std::string_view str_r, TrimFlag trim_r )
     { return trim( std::move(str_r), blank, std::move(trim_r) ); }
 
+    /** Return whether \a str_r has prefix \a prefix_r. */
+    inline bool hasPrefix( std::string_view str_r, std::string_view prefix_r )
+    { return( ::strncmp( str_r.data(), prefix_r.data(), prefix_r.size() ) == 0 ); }
+
+    /** \overload Case insensitive */
+    inline bool hasPrefixCI( std::string_view str_r, std::string_view prefix_r  )
+    { return( ::strncasecmp( str_r.data(), prefix_r.data(), prefix_r.size()  ) == 0 ); }
+
     ///////////////////////////////////////////////////////////////////
     namespace detail
     {
@@ -171,8 +180,10 @@ namespace zypp
       unsigned _split( std::string_view line_r, std::string_view sep_r, Trim trim_r, WordConsumer && fnc_r );
 
       /** \ref splitRx working horse */
+      unsigned _splitRx( std::string_view line_r, const regex & rx_r, WordConsumer && fnc_r );
+#if LEGACY(1722)
       unsigned _splitRx( const std::string & line_r, const regex & rx_r, WordConsumer && fnc_r );
-
+#endif
     }  // namespace detail
     ///////////////////////////////////////////////////////////////////
 
@@ -197,7 +208,7 @@ namespace zypp
      * \returns the number of words reported.
      */
     template <typename Callable = detail::WordConsumer>
-    unsigned splitRx( const std::string & line_r, const regex & rx_r, Callable && fnc_r = Callable() )
+    unsigned splitRx( std::string_view line_r, const regex & rx_r, Callable && fnc_r = Callable() )
     { return detail::_splitRx( line_r, rx_r, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
 
 
index 4fd87b9..007e406 100644 (file)
@@ -28,9 +28,9 @@ namespace zypp
   //
   /** Helper to create and pass std::istream.
    * The provided std::istream may either be std::cin,
-   * sone (gziped) file or an aleady existig \c std::istream.
+   * some (gziped) file or an already existing \c std::istream.
    *
-   * An optional \c name arument may be passed to the ctor,
+   * An optional \c name argument may be passed to the ctor,
    * to identify the stream in log messages, even if it is
    * not a file.
    *
@@ -120,7 +120,7 @@ namespace zypp
 
     /** Set the size of the input stream.
      * You may set it to whatever vaule is appropriate. E.g.
-     * <tt>*=10</tt> to compensate gzip comression. or the
+     * <tt>*=10</tt> to compensate gzip compression. or the
      * number of items, lines, ... The value is not used here,
      * just provided.
     */
diff --git a/zypp-core/proto/CMakeLists.txt b/zypp-core/proto/CMakeLists.txt
deleted file mode 100644 (file)
index 4616ff8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-SET( zypp_core_PROTOBUF_SOURCES
-)
-
-protobuf_generate_cpp(ZYPPCORE_PROTO_SRCS ZYPPCORE_PROTO_HDRS ${zypp_core_PROTOBUF_SOURCES})
-
-
index 82dc68e..ce4e292 100644 (file)
@@ -32,19 +32,24 @@ namespace zypp
   //
   bool ProgressData::report()
   {
-    Date now = Date::now();
+    bool forceReport { _d->_state != RUN }; // bsc#1206949: force reporting the INIT||END states
+
+    static constexpr std::chrono::milliseconds minfequency { 1000 };
+    static constexpr std::chrono::milliseconds maxfequency { 100 };
+    Data::TimePoint now {  Data::TimePoint::clock::now() };
+    Data::TimePoint::duration elapsed { now - _d->_last_send };
+    if ( not forceReport && elapsed < maxfequency ) {
+      return true;     // skip report, continue per default
+    }
 
     // compute value and check whether to report it
     if ( hasRange() )
     {
       value_type newVal = _d->_val * 100 / ( _d->_max - _d->_min );
 
-      if ( newVal - _d->_last_val > 10
-           || now - _d->_last_send > 1
-           || ( _d->_last_val == 0 && newVal > 0 )
-           || ( newVal == 100 && _d->_last_val != 100 )
-           || ( newVal != 100 && _d->_last_val == 100 )
-           || _d->_state != RUN /*INIT||END*/ )
+      if ( elapsed > minfequency
+           || newVal != _d->_last_val
+           || forceReport )
       {
         _d->_last_val  = newVal;
         _d->_last_send = now;
@@ -54,7 +59,7 @@ namespace zypp
     }
     else
     {
-      if ( now - _d->_last_send > 1 || _d->_state != RUN /*INIT||END*/ )
+      if ( elapsed > minfequency || forceReport )
       {
         _d->_last_val  = _d->_val;
         _d->_last_send = now;
index 29a0da4..e58e102 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <iosfwd>
 #include <string>
+#include <chrono>
 
 #include <zypp/base/PtrTypes.h>
 #include <zypp/base/Function.h>
@@ -144,9 +145,11 @@ namespace zypp
       class Data
       {
         public:
+          using TimePoint = std::chrono::steady_clock::time_point;
+
           Data( value_type min_r, value_type max_r, value_type val_r )
           : _state( INIT ), _min( min_r ), _max( max_r ), _val( val_r )
-          , _last_val( 0 ), _last_send( 0 )
+          , _last_val( 0 )
           {}
 
         public:
@@ -158,7 +161,7 @@ namespace zypp
 
           ReceiverFnc _receiver;
           value_type  _last_val;
-          Date        _last_send;
+          TimePoint   _last_send;
 
         private:
           /** clone for RWCOW_pointer */
diff --git a/zypp-core/zyppng/base/UnixSignalSource b/zypp-core/zyppng/base/UnixSignalSource
new file mode 100644 (file)
index 0000000..21d71bb
--- /dev/null
@@ -0,0 +1 @@
+#include "unixsignalsource.h"
index 395e108..8bdc455 100644 (file)
@@ -25,9 +25,9 @@ namespace zyppng {
 
 class SocketNotifier;
 class Timer;
-class EventDispatcher;
-
 
+ZYPP_FWD_DECL_TYPE_WITH_REFS( EventDispatcher );
+ZYPP_FWD_DECL_TYPE_WITH_REFS( UnixSignalSource );
 class EventDispatcherPrivate;
 
 /*!
@@ -143,6 +143,12 @@ public:
    */
   bool untrackChildProcess ( int pid );
 
+  /*!
+   * Returns the currently active \ref UnixSignalSource for this EventDispatcher.
+   * It is required to keep the reference alive as long as signals need to be catched.
+   */
+  UnixSignalSourceRef unixSignalSource ();
+
 protected:
 
   /*!
index 5de8a8c..6ad634f 100644 (file)
@@ -5,6 +5,7 @@
 #include <zypp-core/base/Exception.h>
 #include <zypp-core/base/Logger.h>
 #include <zypp-core/AutoDispose.h>
+#include <zypp-core/zyppng/base/UnixSignalSource>
 
 namespace zyppng {
 
@@ -509,7 +510,7 @@ bool EventDispatcher::waitForFdEvent( const int fd, int events , int &revents ,
         if ( timeout == -1 )
           continue;
 
-        timeout -= g_timer_elapsed( *timer, NULL );
+        timeout -= g_timer_elapsed( *timer, nullptr );
         if ( timeout < 0 ) timeout = 0;
         if ( timeout <= 0 )
           return false;
@@ -552,6 +553,19 @@ bool EventDispatcher::untrackChildProcess(int pid)
   return true;
 }
 
+UnixSignalSourceRef EventDispatcher::unixSignalSource()
+{
+  Z_D();
+  // lazy init
+  UnixSignalSourceRef r;
+  if ( d->_signalSource.expired ()) {
+    d->_signalSource = r = UnixSignalSource::create();
+  } else {
+    r = d->_signalSource.lock ();
+  }
+  return r;
+}
+
 bool EventDispatcher::run_once()
 {
   return g_main_context_iteration( d_func()->_ctx, false );
index f836958..19b1d8f 100644 (file)
@@ -25,6 +25,8 @@ namespace zyppng {
   class EventDispatcher;
   class EventLoopPrivate;
 
+  ZYPP_FWD_DECL_TYPE_WITH_REFS(EventLoop);
+
   /*!
    * The EventDispatcher class implements the libzypp event loop.
    *
@@ -41,8 +43,8 @@ namespace zyppng {
     ZYPP_DECLARE_PRIVATE(EventLoop)
 
   public:
-    using Ptr = std::shared_ptr<EventLoop>;
-    using WeakPtr = std::shared_ptr<EventLoop>;
+    using Ptr = EventLoopRef;
+    using WeakPtr = EventLoopWeakRef;
 
     static Ptr create ();
     virtual ~EventLoop();
index 5d92c3d..f55f089 100644 (file)
 
 namespace zyppng {
 
+  bool blockAllSignalsForCurrentThread()
+  {
+    sigset_t set;
+    ::sigfillset(&set);
+    int res = ::pthread_sigmask(SIG_BLOCK, &set, NULL);
+    return ( res == 0 );
+  }
+
   bool blockSignalsForCurrentThread( const std::vector<int> &sigs )
   {
     sigset_t set;
@@ -80,4 +88,5 @@ namespace zyppng {
       .writeFd = zypp::AutoFD( pipeFds[1] )
     };
   }
+
 }
index 715b190..9ad2038 100644 (file)
@@ -10,6 +10,8 @@
 
 namespace zyppng {
 
+  ZYPP_FWD_DECL_TYPE_WITH_REFS ( UnixSignalSource );
+
 struct GUnixPollFD
 {
   GIOCondition reqEvents;
@@ -93,6 +95,7 @@ public:
   std::vector< std::shared_ptr<void> > _unrefLater;
   std::queue< EventDispatcher::IdleFunction > _idleFuncs;
   std::unordered_map<int, GlibWaitPIDData> _waitPIDs;
+  UnixSignalSourceWeakRef _signalSource;
 };
 
 }
index f1dfc8c..2cd41c7 100644 (file)
@@ -26,6 +26,8 @@ namespace zyppng {
     return res;
   }
 
+  bool blockAllSignalsForCurrentThread ( );
+
   bool blockSignalsForCurrentThread ( const std::vector<int> &sigs );
 
   bool trySocketConnection (int &sockFD, const SockAddr &addr, uint64_t timeout );
index ae858f3..726d713 100644 (file)
 #include <functional>
 
 namespace zyppng {
+
 class TimerPrivate;
 class EventDispatcher;
+ZYPP_FWD_DECL_TYPE_WITH_REFS (Timer);
 
 /*!
  * \brief The Timer class provides repetitive and single-shot timers.
diff --git a/zypp-core/zyppng/base/unixsignalsource.cpp b/zypp-core/zyppng/base/unixsignalsource.cpp
new file mode 100644 (file)
index 0000000..0686f33
--- /dev/null
@@ -0,0 +1,156 @@
+#include "unixsignalsource.h"
+#include "private/abstracteventsource_p.h"
+#include <zypp-core/AutoDispose.h>
+#include <zypp-core/base/Errno.h>
+#include <zypp-core/base/Logger.h>
+#include <unordered_map>
+
+#include <sys/signalfd.h>
+#include <signal.h>
+
+namespace zyppng {
+
+  class UnixSignalSourcePrivate : public AbstractEventSourcePrivate
+  {
+    ZYPP_DECLARE_PUBLIC(UnixSignalSource)
+  public:
+    UnixSignalSourcePrivate( UnixSignalSource &p ) : AbstractEventSourcePrivate(p) {
+      ::sigemptyset   ( &_orgSigMask );
+      pthread_sigmask (SIG_SETMASK, nullptr, &_orgSigMask);
+    }
+
+    sigset_t     _orgSigMask;
+    zypp::AutoFD _signalFd;
+    std::unordered_map<int, int> _signalRefCount;
+    Signal<void (int)> _sigReceived;
+  };
+
+  ZYPP_IMPL_PRIVATE (UnixSignalSource);
+
+  UnixSignalSource::UnixSignalSource() : AbstractEventSource( *(new UnixSignalSourcePrivate(*this)) )
+  {
+  }
+
+  UnixSignalSource::~UnixSignalSource()
+  {
+    Z_D();
+    // restore the original sigmask
+    pthread_sigmask (SIG_SETMASK, &d->_orgSigMask, nullptr);
+  }
+
+  UnixSignalSourceRef UnixSignalSource::create()
+  {
+    return UnixSignalSourceRef( new UnixSignalSource() );
+  }
+
+  bool UnixSignalSource::addSignal(int signum )
+  {
+    Z_D();
+
+    if ( d->_signalRefCount.count(signum) != 0 &&  d->_signalRefCount[signum] > 0 ) {
+      // we already handle this signal, just increase refcount
+      d->_signalRefCount[signum]++;
+    } else {
+
+      const auto &handleError = [&]() {
+        d->_signalRefCount.erase ( signum );
+        return false;
+      };
+
+      // add the signal to our map
+      d->_signalRefCount[signum] = 1;
+
+      sigset_t     sigMask;
+      sigemptyset (&sigMask );
+
+      // add all the signals we monitor to our set so we can update the signalfd correctly
+      for ( const auto &sig : d->_signalRefCount ) {
+        sigaddset(&sigMask, sig.first);
+      }
+
+      // signalfd signals should be blocked
+      // man page says: The set of blocked signals is the union of the current set and the set argument.
+      // so we should not accidentially delete other blocks done by the application
+      if (pthread_sigmask (SIG_BLOCK, &sigMask, NULL) == -1) {
+        return handleError();
+      }
+
+
+      // set or update our signal fd
+      zypp::AutoFD aFd = signalfd ( d->_signalFd, &sigMask, SFD_NONBLOCK | SFD_CLOEXEC );
+      if ( aFd == -1 ){
+        return handleError();
+      }
+
+      if ( d->_signalFd != aFd ) {
+        d->_signalFd = aFd;
+      } else {
+        aFd.resetDispose ();
+      }
+      updateFdWatch ( aFd, AbstractEventSource::Read );
+    }
+    return true;
+  }
+
+  bool UnixSignalSource::removeSignal(int signum )
+  {
+    Z_D();
+    if ( !d->_signalRefCount.count(signum) || d->_signalRefCount[signum] == 0 ) {
+      return true;
+    }
+    d->_signalRefCount[signum]--;
+
+    if ( d->_signalRefCount[signum] <= 0 ) {
+
+      d->_signalRefCount.erase(signum);
+
+      // remove the signal from our fd
+      sigset_t     sigMask;
+      sigemptyset ( &sigMask );
+      for ( const auto &sig : d->_signalRefCount ) {
+        sigaddset(&sigMask, sig.first);
+      }
+
+      auto res = signalfd ( d->_signalFd, &sigMask, SFD_NONBLOCK | SFD_CLOEXEC );
+      if ( res == -1 ) {
+        WAR << "Failed to update signalfd with errno: " << zypp::Errno() << std::endl;
+        return false;
+      }
+
+      // unblock the signal
+      sigemptyset ( &sigMask );
+      sigaddset(&sigMask, signum);
+      pthread_sigmask(SIG_UNBLOCK, &sigMask, NULL);
+    }
+
+    if ( d->_signalRefCount.size () == 0 ) {
+      removeFdWatch ( d->_signalFd );
+      d->_signalFd = -1;
+    }
+    return true;
+  }
+
+  SignalProxy<void (int)> UnixSignalSource::sigReceived()
+  {
+    return d_func()->_sigReceived;
+  }
+
+  void zyppng::UnixSignalSource::onFdReady( int fd, int events )
+  {
+    Z_D();
+    struct signalfd_siginfo sfd_si;
+    if ( read(fd, &sfd_si, sizeof(sfd_si)) == -1 ) {
+      WAR << "Failed to read from signalfd" << std::endl;
+      return;
+    }
+
+    if ( d->_signalRefCount.count ( sfd_si.ssi_signo ))
+      d->_sigReceived.emit( sfd_si.ssi_signo );
+    else
+      WAR << "Received unexpected UNIX signal on signalFD: " << sfd_si.ssi_signo << std::endl;
+  }
+
+  void zyppng::UnixSignalSource::onSignal( int signal )
+  {}
+
+} // namespace zyppng
diff --git a/zypp-core/zyppng/base/unixsignalsource.h b/zypp-core/zyppng/base/unixsignalsource.h
new file mode 100644 (file)
index 0000000..1aefea7
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef ZYPPNG_UNIXSIGNALSOURCE_H
+#define ZYPPNG_UNIXSIGNALSOURCE_H
+
+#include "abstracteventsource.h"
+
+namespace zyppng {
+
+  ZYPP_FWD_DECL_TYPE_WITH_REFS ( UnixSignalSource );
+  ZYPP_FWD_DECL_TYPE_WITH_REFS ( EventDispatcher );
+  class UnixSignalSourcePrivate;
+
+  class UnixSignalSource : public AbstractEventSource
+  {
+    ZYPP_DECLARE_PRIVATE (UnixSignalSource);
+  public:
+    ~UnixSignalSource() override;
+
+    bool addSignal( int signum );
+    bool removeSignal( int signum );
+
+    SignalProxy<void(int signum)> sigReceived();
+
+  protected:
+    // AbstractEventSource interface
+    void onFdReady(int fd, int events) override;
+    void onSignal(int signal) override;
+
+  private:
+    friend class EventDispatcher;
+    static UnixSignalSourceRef create ();
+    UnixSignalSource();
+
+  };
+} // namespace zyppng
+
+#endif // ZYPPNG_UNIXSIGNALSOURCE_H
index 0db39e9..b8882e0 100644 (file)
@@ -42,8 +42,12 @@ namespace str {
       typename T::size_type p = ret.find_first_not_of( " \t\r\n" );
       if ( p == T::npos )
       {
-        ret.clear();
-        return ret;
+        if constexpr ( std::is_same_v<std::string_view, StrType> )
+          return T();
+        else {
+          ret.clear();
+          return ret;
+        }
       }
       ret.remove_prefix( p );
     }
@@ -53,8 +57,12 @@ namespace str {
       typename T::size_type p = ret.find_last_not_of( " \t\r\n" );
       if ( p == T::npos )
       {
-        ret.clear();
-        return ret;
+        if constexpr ( std::is_same_v<std::string_view, StrType> )
+          return T();
+        else {
+          ret.clear();
+          return ret;
+        }
       }
       ret.remove_suffix( ret.size() - ( p+1 ) );
     }
index e7d3565..3b4dee1 100644 (file)
@@ -7,6 +7,7 @@
 #include <zypp-core/fs/PathInfo.h>
 #include <zypp-core/zyppng/core/String>
 #include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/Timer>
 #include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 #include <zypp-core/base/CleanerThread_p.h>
 #include <zypp-core/base/LogControl.h>
 #include <stdlib.h> // setenv
 #include <sys/prctl.h> // prctl(), PR_SET_PDEATHSIG
 
+#include <sys/syscall.h>
+#ifdef SYS_pidfd_open
+#include <poll.h>
+#endif
+
 #undef  ZYPP_BASE_LOGGER_LOGGROUP
 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::exec"
 
@@ -58,6 +64,75 @@ bool zyppng::AbstractDirectSpawnEngine::isRunning( bool wait )
   return false;
 }
 
+bool zyppng::AbstractDirectSpawnEngine::waitForExit( const std::optional<uint64_t> &timeout )
+{
+  if ( _pid < 0 ) return true;
+
+  // no timeout, wait forever
+  if ( !timeout.has_value () )
+    return !isRunning( true );
+
+  // busy loop polling in case pidfd is not available or fails, only called if we have a valid timout
+  const auto &fallbackPoll = [&]( uint64_t timeout ){
+    const auto start = Timer::now();
+    do {
+      if ( !isRunning(false) )
+        return true;
+      // give up the CPU, so we do not use 100% just to poll
+      std::this_thread::sleep_for( std::chrono::milliseconds(1) );
+    } while( Timer::elapsedSince ( start ) < timeout );
+
+    return !isRunning ( false );
+  };
+
+#ifdef SYS_pidfd_open
+    // we have pidfd support, but there is not yet a wrapper in glibc
+  const auto &zypp_pidfd_open = [](pid_t pid, unsigned int flags) -> int {
+    return syscall( SYS_pidfd_open, pid, flags );
+  };
+
+  zypp::AutoFD pidFd = zyppng::eintrSafeCall( zypp_pidfd_open, _pid, 0 );
+  if ( pidFd == -1 ) {
+    // fallback to manual polling
+    ERR << "pidfd_open failed, falling back to polling waidpid" << std::endl;
+    return fallbackPoll( *timeout );
+  }
+
+  struct pollfd pollfd;
+  pollfd.fd = pidFd;
+  pollfd.events = POLLIN;
+
+  // timeout always has a value set, we established that above
+  uint64_t tRemaining = *timeout;
+
+  const auto start = Timer::now();
+  do {
+    // posix using int as timeout, could in theory overflow so protect against it
+    int posixTimeout = tRemaining > INT_MAX ? INT_MAX : static_cast<int>(tRemaining);
+
+    int ready = poll(&pollfd, 1, posixTimeout );
+    tRemaining = *timeout - std::min<uint64_t>( Timer::elapsedSince( start ), *timeout );
+
+    if ( ready == -1 && errno != EINTR ) {
+      ERR << "Polling the pidfd failed with error: " << zypp::Errno() << std::endl;
+      if ( tRemaining > 0 ) {
+        ERR << "Falling back to manual polling for the remaining timeout." << std::endl;
+        return fallbackPoll( tRemaining );
+      }
+      break;
+    } else if ( pollfd.revents & POLLIN ) {
+      break;
+    }
+  } while( tRemaining > 0 );
+
+  // set exit status
+  return !isRunning ( false );
+#else
+  // we do not have pidfd support, need to busyloop on waitpid until timeout is over
+  return fallbackPoll( *timeout );
+#endif
+}
+
 void zyppng::AbstractDirectSpawnEngine::mapExtraFds ( int controlFd )
 {
   // we might have gotten other FDs to reuse, lets map them to STDERR_FILENO++
@@ -109,7 +184,7 @@ void zyppng::AbstractDirectSpawnEngine::mapExtraFds ( int controlFd )
   //If the rlimits are too high we need to use a different approach
   // in detecting how many fds we need to close, or otherwise we are too slow (bsc#1191324)
   if ( maxFds > 1024 && zypp::PathInfo( "/proc/self/fd" ).isExist() ) {
-    
+
     std::vector<int> fdsToClose;
     fdsToClose.reserve (256);
 
@@ -138,6 +213,24 @@ void zyppng::AbstractDirectSpawnEngine::mapExtraFds ( int controlFd )
   }
 }
 
+void zyppng::AbstractDirectSpawnEngine::resetSignals()
+{
+  // set all signal handers to their default
+  struct sigaction act;
+  memset (&act, 0, sizeof (struct sigaction));
+  act.sa_handler = SIG_DFL;
+  for ( int i = 1; i < NSIG; i++ ) {
+    // this might return -1 and set errno for unknown signals, but
+    // thats fine for us.
+    sigaction(i, &act, NULL);
+  }
+
+  // clear the sigmask
+  sigset_t     sigMask;
+  sigemptyset ( &sigMask );
+  pthread_sigmask ( SIG_SETMASK, &sigMask, nullptr );
+}
+
 bool zyppng::ForkSpawnEngine::start( const char * const *argv, int stdin_fd, int stdout_fd, int stderr_fd )
 {
   _pid = -1;
@@ -215,6 +308,7 @@ bool zyppng::ForkSpawnEngine::start( const char * const *argv, int stdin_fd, int
   {
 
     // child process
+    resetSignals();
     controlPipe->unrefRead();
 
     const auto &writeErrAndExit = [&]( int errCode, ChildErrType type ){
@@ -482,6 +576,7 @@ void zyppng::GlibSpawnEngine::glibSpawnCallback(void *data)
 {
   GLibForkData *d = reinterpret_cast<GLibForkData *>(data);
 
+  d->that->resetSignals();
   bool doChroot = !d->that->_chroot.empty();
 
   std::string execError;
index 76f4380..5f0327f 100644 (file)
@@ -5,6 +5,7 @@
 #include <vector>
 #include <map>
 #include <memory>
+#include <optional>
 
 #include <zypp/Pathname.h>
 
@@ -57,6 +58,7 @@ namespace zyppng {
      */
     virtual bool start ( const char *const *argv, int stdin_fd, int stdout_fd, int stderr_fd )  = 0;
 
+    virtual bool waitForExit ( const std::optional<uint64_t> &timeout = {} ) = 0;
     virtual bool isRunning ( bool wait = false ) = 0;
 
     /*!
index 3878500..d9f07da 100644 (file)
@@ -10,10 +10,13 @@ namespace zyppng {
   {
   public:
     ~AbstractDirectSpawnEngine();
-    virtual bool isRunning ( bool wait = false ) override;
+
+    bool isRunning ( bool wait = false ) override;
+    bool waitForExit ( const std::optional<uint64_t> &timeout = {} ) override;
 
   protected:
     void mapExtraFds( int controlFd = -1 );
+    void resetSignals();
   };
 
   /*!
index 0ab54cc..2f7781b 100644 (file)
@@ -36,6 +36,8 @@ namespace zyppng {
       _protocol( protocol )
     { }
 
+    static Socket::Ptr wrapSocket( int fd, int domain, int type, int protocol, Socket::SocketState state );
+
     bool initSocket () ;
     void setError ( Socket::SocketError error, std::string &&err, bool emit = true );
     bool handleConnectError ( int error );
index 74ef0ae..b59baeb 100644 (file)
@@ -413,6 +413,25 @@ namespace zyppng {
     return std::visit([]( const auto &s ) constexpr { return s.type(); }, _state );
   }
 
+  Socket::Ptr SocketPrivate::wrapSocket(int fd, int domain, int type, int protocol, Socket::SocketState state)
+  {
+    // from here on the Socket instance owns the fd, no need to manually close it
+    // in case of error
+    auto sptr = Socket::create( domain, type, protocol );
+    sptr->d_func()->_socket = fd;
+
+    // make sure the socket is non blocking
+    if ( !sptr->setBlocking( false ) ) {
+      DBG << "Failed to unblock socket." << std::endl;
+      return nullptr;
+    }
+
+    if( sptr->d_func()->transition( state ) )
+      return sptr;
+
+    return nullptr;
+  }
+
   ZYPP_IMPL_PRIVATE(Socket)
 
   Socket::Socket( int domain, int type, int protocol )
@@ -537,7 +556,7 @@ namespace zyppng {
       }
     }
 
-    return Socket::fromSocket( res, Socket::ConnectedState );
+    return SocketPrivate::wrapSocket( res, d->_domain, d->_type, d->_protocol, Socket::ConnectedState );
   }
 
   Socket::Ptr Socket::fromSocket( int fd, Socket::SocketState state )
@@ -553,7 +572,7 @@ namespace zyppng {
     }
 
     int protocol;
-    optlen = sizeof(domain);
+    optlen = sizeof(protocol);
     res = getsockopt( fd, SOL_SOCKET, SO_PROTOCOL, &protocol, &optlen );
     if ( res < 0 ) {
       DBG << "Error querying socket protocol: " << strerr_cxx() << std::endl;
@@ -562,7 +581,7 @@ namespace zyppng {
     }
 
     int type;
-    optlen = sizeof(domain);
+    optlen = sizeof(type);
     res = getsockopt( fd, SOL_SOCKET, SO_TYPE, &type, &optlen );
     if ( res < 0 ) {
       DBG << "Error querying socket type: " << strerr_cxx() << std::endl;
@@ -570,21 +589,7 @@ namespace zyppng {
       return nullptr;
     }
 
-    // from here on the Socket instance owns the fd, no need to manually close it
-    // in case of error
-    auto sptr = Socket::create( domain, type, protocol );
-    sptr->d_func()->_socket = fd;
-
-    // make sure the socket is non blocking
-    if ( !sptr->setBlocking( false ) ) {
-      DBG << "Failed to unblock socket." << std::endl;
-      return nullptr;
-    }
-
-    if( sptr->d_func()->transition( state ) )
-      return sptr;
-
-    return nullptr;
+    return SocketPrivate::wrapSocket( fd, domain, type, protocol, state );
   }
 
   bool Socket::setBlocking( const bool set )
index 6669e3e..b4714c5 100644 (file)
@@ -20,7 +20,7 @@
 #include <zypp-core/zyppng/base/Timer>
 #include <zypp-core/zyppng/io/IODevice>
 #include <zypp-core/zyppng/pipelines/expected.h>
-#include <zypp-proto/envelope.pb.h>
+#include <zypp-proto/core/envelope.pb.h>
 #include <zypp-core/zyppng/rpc/rpc.h>
 
 #include <deque>
@@ -141,7 +141,7 @@ namespace zyppng {
       static expected< T > parseMessage ( const RpcMessage &m ) {
         T p;
         if ( !p.ParseFromString( m.value() ) ) {
-          const auto &msg = zypp::str::Str() << "Failed to parse " << m.messagetypename() << " message.";
+          const std::string &msg = zypp::str::Str() << "Failed to parse " << m.messagetypename() << " message.";
           ERR << msg << std::endl ;
           return expected<T>::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException(msg) ) );
         }
@@ -151,7 +151,7 @@ namespace zyppng {
       template<class T>
       static expected< void > parseMessageInto ( const RpcMessage &m, T &target ) {
         if ( !target.ParseFromString( m.value() ) ) {
-          const auto &msg = zypp::str::Str() << "Failed to parse " << m.messagetypename() << " message.";
+          const std::string &msg = zypp::str::Str() << "Failed to parse " << m.messagetypename() << " message.";
           ERR << msg << std::endl ;
           return expected<void>::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException(msg) ) );
         }
index 6e5e4ce..b5d847d 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef ZYPP_NG_RPC_RPC_H_INCLUDED
 #define ZYPP_NG_RPC_RPC_H_INCLUDED
 
-#include <zypp-proto/envelope.pb.h>
+#include <zypp-proto/core/envelope.pb.h>
 
 namespace zyppng::rpc {
   /*!
index 5c9d872..acb164d 100644 (file)
@@ -131,14 +131,17 @@ SET( zypp_curl_parser_HEADERS
   parser/mediablocklist.h
   parser/MetaLinkParser
   parser/metalinkparser.h
+  parser/ZsyncParser
+  parser/zsyncparser.h
 )
 
 SET( zypp_curl_parser_private_HEADERS
 )
 
 SET( zypp_curl_parser_SRCS
-  parser/mediablocklist.cc
+  parser/mediablocklist.cc  
   parser/metalinkparser.cc
+  parser/zsyncparser.cc
 )
 
 INSTALL(  FILES ${zypp_curl_parser_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-curl/parser" )
@@ -170,3 +173,6 @@ add_dependencies( zypp-curl zypp-protobuf )
 TARGET_LINK_LIBRARIES( zypp-curl ${CURL_LIBRARIES} )
 TARGET_LINK_LIBRARIES( zypp-curl ${LIBPROXY_LIBRARIES} )
 TARGET_LINK_LIBRARIES( zypp-curl ${LIBXML2_LIBRARIES} )
+IF ( LIBPROXY_FOUND )
+  target_include_directories(zypp-curl PUBLIC ${LIBPROXY_INCLUDE_DIRS})
+ENDIF( LIBPROXY_FOUND )
index 75a7076..a1e936d 100644 (file)
 
 #include <zypp-core/fs/PathInfo.h>
 #include <zypp-core/Pathname.h>
-#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/LogTools.h>
 #include <zypp-core/base/String.h>
+#include <zypp-core/base/StringV.h>
 #include <zypp-curl/ProxyInfo>
 #include <zypp-curl/auth/CurlAuthData>
 #include <zypp-media/MediaException>
 #include <list>
 #include <string>
 
+#define  TRANSFER_TIMEOUT_MAX   60 * 60
+
 using std::endl;
 using namespace zypp;
 
@@ -30,24 +33,26 @@ namespace zypp
 {
   namespace env
   {
-    namespace
+    const long & ZYPP_MEDIA_CURL_DEBUG()
     {
-      inline int getZYPP_MEDIA_CURL_IPRESOLVE()
-      {
+      static const long ret = [](){
+        const char * env = getenv("ZYPP_MEDIA_CURL_DEBUG");
+        return env && *env ? str::strtonum<ulong>( env ) : 0;
+      }();
+      return ret;
+    }
+
+    int ZYPP_MEDIA_CURL_IPRESOLVE()
+    {
+      static int _v = [](){
         int ret = 0;
-        if ( const char * envp = getenv( "ZYPP_MEDIA_CURL_IPRESOLVE" ) )
-        {
+        if ( const char * envp = getenv( "ZYPP_MEDIA_CURL_IPRESOLVE" ) ) {
           WAR << "env set: $ZYPP_MEDIA_CURL_IPRESOLVE='" << envp << "'" << std::endl;
           if (      strcmp( envp, "4" ) == 0 ) ret = 4;
           else if ( strcmp( envp, "6" ) == 0 ) ret = 6;
         }
-          return ret;
-      }
-    } //namespace
-
-    int ZYPP_MEDIA_CURL_IPRESOLVE()
-    {
-      static int _v = getZYPP_MEDIA_CURL_IPRESOLVE();
+        return ret;
+      }();
       return _v;
     }
   } // namespace env
@@ -60,45 +65,75 @@ void globalInitCurlOnce()
 {
   // function-level static <=> std::call_once
   static bool once __attribute__ ((__unused__)) = ( [] {
+    MIL << "global_init libcurl: " << curl_version_info(CURLVERSION_NOW)->version << endl;
     if ( curl_global_init( CURL_GLOBAL_ALL ) != 0 )
       WAR << "curl global init failed" << std::endl;
   } (), true );
 }
 
-int log_curl(CURL *, curl_infotype info,
-  char *ptr, size_t len, void *max_lvl)
+int log_curl( CURL * curl, curl_infotype info, char * ptr, size_t len, void * max_lvl )
 {
   if ( max_lvl == nullptr )
     return 0;
 
   long maxlvl = *((long *)max_lvl);
-
-  char pfx = ' ';
+  const char * pfx = "";
+  bool isContent = true;  // otherwise it's data
   switch( info )
   {
-    case CURLINFO_TEXT:       if ( maxlvl < 1 ) return 0; pfx = '*'; break;
-    case CURLINFO_HEADER_IN:  if ( maxlvl < 2 ) return 0; pfx = '<'; break;
-    case CURLINFO_HEADER_OUT: if ( maxlvl < 2 ) return 0; pfx = '>'; break;
+    case CURLINFO_TEXT:         if ( maxlvl < 1 ) return 0; pfx = "*"; break;
+    case CURLINFO_HEADER_IN:    if ( maxlvl < 2 ) return 0; pfx = "<"; break;
+    case CURLINFO_HEADER_OUT:   if ( maxlvl < 2 ) return 0; pfx = ">"; break;
+    case CURLINFO_SSL_DATA_IN:  if ( maxlvl < 3 ) return 0; isContent = false; pfx = "<[SSL]"; break;
+    case CURLINFO_SSL_DATA_OUT: if ( maxlvl < 3 ) return 0; isContent = false; pfx = ">[SSL]"; break;
+    case CURLINFO_DATA_IN:      if ( maxlvl < 3 ) return 0; isContent = false; pfx = "<[DTA]"; break;
+    case CURLINFO_DATA_OUT:     if ( maxlvl < 3 ) return 0; isContent = false; pfx = ">[DTA]"; break;
+
     default:
       return 0;
   }
 
-  std::vector<std::string> lines;
-  str::split( std::string(ptr,len), std::back_inserter(lines), "\r\n" );
-  for( const auto & line : lines )
-  {
-    if ( str::startsWith( line, "Authorization:" ) ) {
-      std::string::size_type pos { line.find( " ", 15 ) }; // Authorization: <type> <credentials>
-      if ( pos == std::string::npos )
-        pos = 15;
-      DBG << pfx << " " << line.substr( 0, pos ) << " <credentials removed>" << std::endl;
+  // We'd like to keep all log messages within function `log_curl`
+  // because this tag to grep for is known and communicate to users.
+  if ( isContent ) {
+    std::vector<std::string_view> lines;  // don't want log from within the lambda
+    strv::split( std::string_view( ptr, len ), "\n", [&lines]( std::string_view line, unsigned, bool last ) {
+      if ( last ) return; // empty word after final \n
+      line = strv::rtrim( line, "\r" );
+      lines.push_back( line );
+    });
+    for ( const auto & line : lines ) {
+      if ( str::hasPrefix( line, "Authorization:" ) ) {
+        std::string_view::size_type pos { line.find( " ", 15 ) }; // Authorization: <type> <credentials>
+        if ( pos == std::string::npos )
+          pos = 15;
+        DBG << curl << " " << pfx << " " << line.substr( 0, pos ) << " <credentials removed>" << endl;
+      }
+      else
+        DBG << curl << " " << pfx << " " << line << endl;
     }
+  } else {
+    if ( maxlvl < 4 )
+      DBG << curl << " " << pfx << " " << len << " byte" << endl;
     else
-      DBG << pfx << " " << line << std::endl;
+      hexdumpOn( DBG << curl << " " << pfx << " ", ptr, len );
   }
   return 0;
 }
 
+void setupZYPP_MEDIA_CURL_DEBUG( CURL *curl )
+{
+  if ( not curl ) {
+    INT << "Got a NULL curl handle" << endl;
+    return;
+  }
+  if ( env::ZYPP_MEDIA_CURL_DEBUG() > 0 ) {
+    curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L );
+    curl_easy_setopt( curl, CURLOPT_DEBUGFUNCTION, log_curl );
+    curl_easy_setopt( curl, CURLOPT_DEBUGDATA, &env::ZYPP_MEDIA_CURL_DEBUG() );
+  }
+}
+
 size_t log_redirects_curl( char *ptr, size_t size, size_t nmemb, void *userdata)
 {
   //INT << "got header: " << std::string(ptr, ptr + size*nmemb) << endl;
@@ -355,10 +390,11 @@ Url clearQueryString(const Url &url)
 }
 
 // bsc#933839: propagate proxy settings passed in the repo URL
+// boo#1127591: propagate ssl settings passed in the repo URL
 zypp::Url propagateQueryParams( zypp::Url url_r, const zypp::Url & template_r )
 {
   using namespace std::literals::string_literals;
-  for ( const std::string &param : { "proxy"s, "proxyport"s, "proxyuser"s, "proxypass"s} )
+  for ( const std::string &param : { "proxy"s, "proxyport"s, "proxyuser"s, "proxypass"s, "ssl_capath"s, "ssl_verify"s } )
   {
     const std::string & value( template_r.getQueryParam( param ) );
     if ( ! value.empty() )
index a98e7aa..8bfe8a3 100644 (file)
@@ -24,6 +24,9 @@ namespace zyppng {
 
   using TransferSettings = zypp::media::TransferSettings;
 
+  ZYPP_FWD_DECL_TYPE_WITH_REFS( Downloader );
+  ZYPP_FWD_DECL_TYPE_WITH_REFS( Download );
+
 
   /**
    * @brief The Downloader class
@@ -37,8 +40,8 @@ namespace zyppng {
     ZYPP_DECLARE_PRIVATE( Downloader )
   public:
 
-    using Ptr = std::shared_ptr<Downloader>;
-    using WeakPtr = std::shared_ptr<Downloader>;
+    using Ptr = DownloaderRef;
+    using WeakPtr = DownloaderWeakRef;
 
     Downloader();
     Downloader( std::shared_ptr<MirrorControl> mc );
@@ -126,8 +129,8 @@ namespace zyppng {
 
   public:
 
-    using Ptr = std::shared_ptr<Download>;
-    using WeakPtr = std::shared_ptr<Download>;
+    using Ptr = DownloadRef;
+    using WeakPtr = DownloadWeakRef;
 
     /*!
      * The states of the internal state machine. Each of them represents a different
index affae10..32b8418 100644 (file)
@@ -30,7 +30,7 @@ namespace zyppng {
     bool _metalink_enabled   = true;  //< should the download try to use metalinks
     zypp::ByteCount _headerSize;     //< Optional file header size for things like zchunk
     std::optional<zypp::CheckSum> _headerChecksum; //< Optional file header checksum
-    zypp::ByteCount _preferred_chunk_size = zypp::ByteCount( 4096, zypp::ByteCount::K );
+    zypp::ByteCount _preferred_chunk_size = 0;
   };
 
   ZYPP_IMPL_PRIVATE( DownloadSpec )
index 25ded18..4fd7d06 100644 (file)
@@ -81,6 +81,8 @@ namespace zyppng {
     /*!
      * Sets the prefered amount of bytes the downloader tries to request from a single server per metalink chunk request.
      * If the metalink description has smaller chunks those are coalesced to match the preferred size.
+     *
+     * Setting this to 0 tells the \ref Downloader instance to automatically calculate the chunk size. This is also the default.
      */
     DownloadSpec &setPreferredChunkSize ( const zypp::ByteCount &bc );
     zypp::ByteCount preferredChunkSize() const;
index 269e0d3..fb258ae 100644 (file)
@@ -57,7 +57,11 @@ namespace zyppng {
 
   void MirrorControl::Mirror::transferUnref()
   {
-    bool stillLoaded = ( runningTransfers - 1 ) >= maxConnections();
+    const auto newCount = runningTransfers - 1;
+    if ( newCount < 0 )
+      return;
+
+    bool stillLoaded = ( newCount ) >= maxConnections();
     runningTransfers--;
     if ( !stillLoaded )
       _parent._sigNewMirrorsReady.emit();
@@ -296,4 +300,3 @@ namespace zyppng {
 #endif
 
 }
-
index 1fbf547..a05c974 100644 (file)
@@ -57,6 +57,10 @@ NetworkRequestDispatcherPrivate::NetworkRequestDispatcherPrivate(  NetworkReques
   curl_multi_setopt( _multi, CURLMOPT_SOCKETFUNCTION, NetworkRequestDispatcherPrivate::static_socket_callback );
   curl_multi_setopt( _multi, CURLMOPT_SOCKETDATA, reinterpret_cast<void *>( this ) );
 
+  // disabled explicit pipelining since it breaks our tests on releases < 15.2
+  // we could consider enabling it starting with a specific CURL version
+  // curl_multi_setopt( _multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX|CURLPIPE_HTTP1 );
+
   _timer->setSingleShot( true );
   _timer->connect( &Timer::sigExpired, *this, &NetworkRequestDispatcherPrivate::multiTimerTimout );
 }
@@ -130,7 +134,7 @@ int NetworkRequestDispatcherPrivate::socketCallback(CURL *easy, curl_socket_t s,
       return 0;
     } else {
       //a broken handle without anything assigned, also should never happen but make sure and clean it up
-      WAR_MEDIA << "Cleaning up unassigned  easy handle" << std::endl;
+      WAR << "Cleaning up unassigned  easy handle" << std::endl;
       curl_multi_remove_handle( _multi, easy );
       curl_easy_cleanup( easy );
       return 0;
@@ -207,24 +211,48 @@ void NetworkRequestDispatcherPrivate::handleMultiSocketAction(curl_socket_t nati
 
       void *privatePtr = nullptr;
       if ( curl_easy_getinfo( easy, CURLINFO_PRIVATE, &privatePtr ) != CURLE_OK ) {
-        WAR_MEDIA << "Unable to get CURLINFO_PRIVATE" << std::endl;
+        WAR << "Unable to get CURLINFO_PRIVATE" << std::endl;
         continue;
       }
 
       if ( !privatePtr ) {
         //broken easy handle not associated, should never happen but clean it up
-        WAR_MEDIA << "Cleaning up unassigned  easy handle" << std::endl;
+        WAR << "Cleaning up unassigned  easy handle" << std::endl;
         curl_multi_remove_handle( _multi, easy );
         curl_easy_cleanup( easy );
         continue;
       }
 
       NetworkRequestPrivate *request = reinterpret_cast<NetworkRequestPrivate *>( privatePtr );
-
-      //trigger notification about file downloaded
-      NetworkRequestError e = NetworkRequestErrorPrivate::fromCurlError( *request->z_func(), res, request->errorMessage() );
-      setFinished( *request->z_func(), e );
-
+      request->dequeueNotify();
+
+      if ( request->hasMoreWork() && ( res == CURLE_OK || request->canRecover() ) ) {
+        std::string errBuf = "Broken easy handle in request";
+        if ( !request->_easyHandle ) {
+          NetworkRequestError e = NetworkRequestErrorPrivate::customError ( NetworkRequestError::InternalError, std::move(errBuf) );
+          setFinished( *request->z_func(), e );
+          continue;
+        }
+
+        // remove the handle from multi to change options
+        curl_multi_remove_handle( _multi, request->_easyHandle );
+
+        errBuf = "Failed to reinitialize the request";
+        if ( !request->prepareToContinue ( errBuf ) ) {
+          NetworkRequestError e = NetworkRequestErrorPrivate::customError ( NetworkRequestError::InternalError, std::move(errBuf) );
+          setFinished( *request->z_func(), e );
+        } else {
+          // add the request back to the multi handle, it is not done
+          if ( !addRequestToMultiHandle( *request->z_func() ) )
+            continue;
+
+          request->aboutToStart( );
+        }
+      } else {
+        //trigger notification about file downloaded
+        NetworkRequestError e = NetworkRequestErrorPrivate::fromCurlError( *request->z_func(), res, request->errorMessage() );
+        setFinished( *request->z_func(), e );
+      }
       //attention request could be deleted from here on
     }
   }
@@ -294,6 +322,16 @@ void NetworkRequestDispatcherPrivate::setFinished( NetworkRequest &req, NetworkR
   dequeuePending();
 }
 
+bool NetworkRequestDispatcherPrivate::addRequestToMultiHandle(NetworkRequest &req)
+{
+  CURLMcode rc = curl_multi_add_handle( _multi, req.d_func()->_easyHandle );
+  if ( rc != 0 ) {
+    setFinished( req, NetworkRequestErrorPrivate::fromCurlMError( rc ) );
+    return false;
+  }
+  return true;
+}
+
 void NetworkRequestDispatcherPrivate::dequeuePending()
 {
   if ( !_isRunning || _locked )
@@ -313,11 +351,8 @@ void NetworkRequestDispatcherPrivate::dequeuePending()
       continue;
     }
 
-    CURLMcode rc = curl_multi_add_handle( _multi, req->d_func()->_easyHandle );
-    if ( rc != 0 ) {
-      setFinished( *req, NetworkRequestErrorPrivate::fromCurlMError( rc ) );
+    if ( !addRequestToMultiHandle( *req ) )
       continue;
-    }
 
     req->d_func()->aboutToStart();
     _sigDownloadStarted.emit( *z_func(), *req );
@@ -365,6 +400,11 @@ void NetworkRequestDispatcher::setMaximumConcurrentConnections( const int maxCon
   d_func()->_maxConnections = maxConn;
 }
 
+int NetworkRequestDispatcher::maximumConcurrentConnections () const
+{
+  return d_func()->_maxConnections;
+}
+
 void NetworkRequestDispatcher::enqueue(const std::shared_ptr<NetworkRequest> &req )
 {
   if ( !req )
@@ -372,12 +412,12 @@ void NetworkRequestDispatcher::enqueue(const std::shared_ptr<NetworkRequest> &re
   Z_D();
 
   if ( std::find( d->_runningDownloads.begin(), d->_runningDownloads.end(), req ) != d->_runningDownloads.end() )  {
-    WAR_MEDIA << "Ignoring request to enqueue download " << req->url().asString() << " request is already running " << std::endl;
+    WAR << "Ignoring request to enqueue download " << req->url().asString() << " request is already running " << std::endl;
     return;
   }
 
   if ( std::find( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), req ) != d->_pendingDownloads.end() ) {
-    WAR_MEDIA << "Ignoring request to enqueue download " << req->url().asString() << " request is already enqueued " << std::endl;
+    WAR << "Ignoring request to enqueue download " << req->url().asString() << " request is already enqueued " << std::endl;
     return;
   }
 
index b8231be..eeedd87 100644 (file)
@@ -96,6 +96,11 @@ namespace zyppng {
        */
       void setMaximumConcurrentConnections ( const int maxConn );
 
+      /**
+       * returns the maximum number of allowed concurrent connections
+       */
+      int maximumConcurrentConnections () const;
+
       /*!
        * Enqueues a new \a request and puts it into the waiting queue. If the dispatcher
        * is already running and has free capacatly the request might be started right away
index 5b85c05..ea9550f 100644 (file)
@@ -169,10 +169,14 @@ NetworkRequestError NetworkRequestErrorPrivate::fromCurlError(NetworkRequest &re
       case CURLE_FTP_CANT_GET_HOST:
         c = NetworkRequestError::ConnectionFailed;
         break;
-      case CURLE_WRITE_ERROR:
+      case CURLE_WRITE_ERROR: {
+        // this error code also handles the cases when a callback returned a error.
         c = NetworkRequestError::InternalError;
         break;
+      }
       case CURLE_PARTIAL_FILE:
+        c = NetworkRequestError::ServerReturnedError;
+        break;
       case CURLE_OPERATION_TIMEDOUT:
         c = NetworkRequestError::Timeout;
         break;
@@ -182,9 +186,14 @@ NetworkRequestError NetworkRequestErrorPrivate::fromCurlError(NetworkRequest &re
       case CURLE_PEER_FAILED_VERIFICATION:
         c = NetworkRequestError::PeerCertificateInvalid;
         break;
+      case CURLE_HTTP2:
+        c = NetworkRequestError::Http2Error;
+        break;
+      case CURLE_HTTP2_STREAM:
+        c = NetworkRequestError::Http2StreamError;
+        break;
       default:
         c = NetworkRequestError::ServerReturnedError;
-        err = "Curl error " + zypp::str::numstring( nativeCode );
         break;
     }
   }
@@ -192,6 +201,8 @@ NetworkRequestError NetworkRequestErrorPrivate::fromCurlError(NetworkRequest &re
   if ( err.empty() )
     err = typeToString( c );
 
+  err += " Curl error (" + zypp::str::numstring( nativeCode ) + ")";
+
   return NetworkRequestError( *new NetworkRequestErrorPrivate(c, std::move(err), std::move(extraInfo)) );
 }
 
@@ -276,6 +287,12 @@ std::string NetworkRequestErrorPrivate::typeToString( NetworkRequestError::Type
       return "Server returned an error for the given request.";
     case NetworkRequestError::MissingData:
       return "Server did not send all requested ranges.";
+    case NetworkRequestError::RangeFail:
+      return "Invalid data from server, multipart was requested but there was no range status code.";
+    case NetworkRequestError::Http2Error:
+      return "Server returned a HTTP/2 error.";
+    case NetworkRequestError::Http2StreamError:
+      return "Server returned a HTTP/2 stream error.";
   }
   return std::string();
 }
index 66f3881..0eb027c 100644 (file)
@@ -40,7 +40,10 @@ class NetworkRequestErrorPrivate;
       Unauthorized,        //<< No auth data given but authorization required
       AuthFailed,          //<< Auth data was given, but authorization failed
       ServerReturnedError, //<< A error was returned by the server that is not explicitly handled
-      MissingData          //<< The download was a multirange download and we did not get all data that was requested, if that is returned some ranges might have been downloaded successful
+      MissingData,         //<< The download was a multirange download and we did not get all data that was requested, if that is returned some ranges might have been downloaded successful
+      RangeFail,           //<< The download was a multirange download but the server decided to return the full file.
+      Http2Error,          //<< Special error code for HTTP2 related errors
+      Http2StreamError,    //<< Special error code for HTTP2 stream related errors
     };
 
     NetworkRequestError ();
index 407841c..6f9b95b 100644 (file)
@@ -60,7 +60,7 @@ namespace zyppng {
     Transition< DetectMetalinkState, &DetectMetalinkState::sigFinished,   DlNormalFileState,   &DetectMetalinkState::toSimpleDownloadGuard >,
 
     Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigFinished,    FinishedState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToFinished >,
-    Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigGotMetalink, PrepareMultiState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToPrepareMulti >,
+    Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigGotMetadata, PrepareMultiState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToPrepareMulti >,
     Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigFailed,      FinishedState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToFinished >,
 
     Transition< PrepareMultiState, &PrepareMultiState::sigFinished,   DlMetalinkState,  &PrepareMultiState::toMetalinkDownloadGuard , &PrepareMultiState::transitionToMetalinkDl >,
index 358e011..d4ec777 100644 (file)
@@ -51,6 +51,7 @@ namespace zyppng {
       std::string chksumtype;
       std::optional<UByteArray> chksumVec;
       std::optional<size_t> chksumCompareLen; //< initialized if only the first few bytes of the checksum should be considered
+      std::optional<size_t> chksumPad; //< initialized if the hashed blocks for a digest need to be padded if a block is smaller ( e.g. last block in a zsync file )
 
       int _retryCount = 0;  //< how many times was this request restarted
       NetworkRequestError _failedWithErr; //< what was the error this request failed with
index 273d138..734f202 100644 (file)
@@ -62,7 +62,7 @@ namespace zyppng {
 
     auto err = setupMirror( mirror, url, set );
     if ( err.isError() ) {
-      WAR_MEDIA << "Setting up mirror " << mirror.second->mirrorUrl << " failed with error: " << err.toString() << "(" << err.nativeErrorString() << "), falling back to original URL." << std::endl;
+      WAR << "Setting up mirror " << mirror.second->mirrorUrl << " failed with error: " << err.toString() << "(" << err.nativeErrorString() << "), falling back to original URL." << std::endl;
       failedToPrepare();
     }
     startWithMirror( mirror.second, url, set );
@@ -167,7 +167,7 @@ namespace zyppng {
   {
     auto &sm = stateMachine();
     const off_t expFSize = sm._spec.expectedFileSize();
-    if ( expFSize  > 0 && expFSize < dlnow ) {
+    if ( expFSize  > 0 && expFSize < req.downloadedByteCount() ) {
       sm._requestDispatcher->cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
       return;
     }
@@ -195,7 +195,11 @@ namespace zyppng {
         sm._requestDispatcher->enqueue( _request );
         return;
       }
-      MIL_MEDIA << "Downloading on " << stateMachine()._spec.url() << " failed with error "<< err.toString() << " " << err.nativeErrorString() << std::endl;
+
+      MIL << req.nativeHandle() << " " << "Downloading on " << stateMachine()._spec.url() << " failed with error "<< err.toString() << " " << err.nativeErrorString() << std::endl;
+      if ( req.lastRedirectInfo ().size () )
+        MIL << req.nativeHandle() << " Last redirection target was: " << req.lastRedirectInfo () << std::endl;
+
       return failed( NetworkRequestError(err) );
     }
 
index d24bb8d..9c34bb5 100644 (file)
@@ -17,7 +17,7 @@
 namespace zyppng {
 
   DetectMetalinkState::DetectMetalinkState(DownloadPrivate &parent) : SimpleState( parent ){
-    MIL_MEDIA << "Creating DetectMetalinkState" << std::endl;
+    MIL << "Entering DetectMetalinkState for url: " << parent._spec.url() << std::endl;
   }
 
   void DetectMetalinkState::enter()
@@ -63,7 +63,10 @@ namespace zyppng {
   {
     auto lck = stateMachine().z_func()->shared_from_this();
     if ( req.hasError() ) {
-      WAR << "Detecing if metalink is possible for url " << req.url() << " failed with error " << err.toString() << " falling back to download without metalink." << std::endl;
+      WAR << req.nativeHandle() << " " << "Detecing if metalink is possible for url " << req.url() << " failed with error " << err.toString() << " falling back to download without metalink." << std::endl;
+      if ( req.lastRedirectInfo ().size () )
+        WAR << req.nativeHandle() << " Last redirection target was: " << req.lastRedirectInfo () << std::endl;
+
       _error = err;
       _gotMetalink = false;
       return _sigFinished.emit();
@@ -71,7 +74,7 @@ namespace zyppng {
 
     std::string cType = req.contentType();
     _gotMetalink = ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 );
-    MIL << "Metalink detection result on url " << req.url() << " is " << _gotMetalink << std::endl;
+    MIL << req.nativeHandle() << " " << "Metalink detection result on url " << req.url() << " is " << _gotMetalink << std::endl;
     _sigFinished.emit();
   }
 
index 9c42a18..1dcb3c0 100644 (file)
@@ -17,7 +17,7 @@ namespace zyppng {
     : SimpleState( parent )
     , _error( std::move(error) )
   {
-    MIL_MEDIA << "About to enter FinishedState for url " << parent._spec.url() << std::endl;
+    MIL << "About to enter FinishedState for url " << parent._spec.url() << std::endl;
   }
 
 }
index efd4383..a764688 100644 (file)
@@ -17,9 +17,9 @@
 
 namespace zyppng {
 
-  void InitialState::enter(){ MIL << "Entering initial state"  << std::endl; }
+  void InitialState::enter(){ MIL_MEDIA << "Entering initial state"  << std::endl; }
 
-  void InitialState::exit(){  MIL << "Leaving initial state"  << std::endl;  }
+  void InitialState::exit(){  MIL_MEDIA << "Leaving initial state"  << std::endl;  }
 
   void InitialState::initiate()
   {
index 34abaf3..2053b00 100644 (file)
@@ -24,7 +24,7 @@ namespace zyppng {
     : RangeDownloaderBaseState( std::move(mirrors), parent )
     , _blockList( std::move(blockList) )
   {
-    MIL_MEDIA << "About to enter DlMetalinkState for url " << parent._spec.url() << std::endl;
+    MIL << "About to enter DlMetalinkState for url " << parent._spec.url() << std::endl;
   }
 
   void DlMetalinkState::enter()
@@ -32,6 +32,8 @@ namespace zyppng {
     auto &sm = stateMachine();
     const auto &spec = sm._spec;
 
+    _fileSize = sm._spec.expectedFileSize();
+
     //first we try to reuse blocks from the deltafile , if we have one
     if ( !spec.deltaFile().empty() ) {
       zypp::PathInfo dFileInfo ( spec.deltaFile() );
@@ -47,7 +49,11 @@ namespace zyppng {
         } catch ( ... ) { }
 
         fclose( f );
+      } else {
+        DBG << "Delta XFER: Delta file: " << spec.deltaFile() << " does not exist or is not readable." << std::endl;
       }
+    } else {
+      DBG << "Delta XFER: No delta file given, can not reuse blocks." << std::endl;
     }
 
     // setup the base downloader
@@ -74,16 +80,40 @@ namespace zyppng {
       _fileSize = fLen;
     }
 
+    const auto maxConns = sm._requestDispatcher->maximumConcurrentConnections();
+    if ( sm._spec.preferredChunkSize() == 0 ) {
+      const auto autoBlkSize = makeBlksize( _fileSize );
+      if ( maxConns == -1 ) {
+        _preferredChunkSize = autoBlkSize;
+      } else {
+        _preferredChunkSize = _fileSize / maxConns;
+        if ( _preferredChunkSize < autoBlkSize )
+          _preferredChunkSize = autoBlkSize;
+        else if ( _preferredChunkSize > zypp::ByteCount( 100, zypp::ByteCount::M ) )
+          _preferredChunkSize = zypp::ByteCount( 100, zypp::ByteCount::M );
+      }
+    } else {
+      // spec chunk size overrules the automatic one
+      _preferredChunkSize = sm._spec.preferredChunkSize();
+    }
+
+    MIL << "Downloading " << sm._spec.url() << " with " << _preferredChunkSize << " chunk size over " << maxConns << std::endl;
+
     // remember how many bytes we need to download
     size_t bytesToDl = 0;
+    // do we need to pad the digest when calculating the checksum for blocks
+    const auto &chksumPad  = _blockList.checksumPad ();
     for ( size_t i = 0; i < _blockList.numBlocks(); i++ ) {
       const auto &mediaBlock = _blockList.getBlock( i );
+      const auto &blockSum   = _blockList.getChecksum ( i );
       _ranges.push_back(
         Block{
           .start = mediaBlock.off,
           .len   = mediaBlock.size,
           .chksumtype = _blockList.getChecksumType(),
-          .chksumVec  = _blockList.getChecksum ( i )
+          .chksumVec  = blockSum,
+          .chksumCompareLen = blockSum.size( ),
+          .chksumPad = chksumPad > 0 ? chksumPad : std::optional<size_t>()
         } );
 
       bytesToDl += mediaBlock.size;
index 9112732..79860fa 100644 (file)
@@ -20,15 +20,20 @@ namespace zyppng {
 
     constexpr auto minMetalinkProbeSize = 256; //< The maximum probe size we download before we decide we really got no metalink file
 
-    bool looks_like_metalink_data( const std::vector<char> &data )
+    MetaDataType looks_like_meta_data( const std::vector<char> &data )
     {
       if ( data.empty() )
-        return false;
+        return MetaDataType::None;
 
       const char *p = data.data();
       while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
         p++;
 
+      // If we have a zsync file, it has to start with zsync:
+      if ( !strncasecmp( p, "zsync:", 6 ) ) {
+        return MetaDataType::Zsync;
+      }
+
       if (!strncasecmp(p, "<?xml", 5))
       {
         while (*p && *p != '>')
@@ -39,48 +44,52 @@ namespace zyppng {
           p++;
       }
       bool ret = !strncasecmp( p, "<metalink", 9 ) ? true : false;
-      return ret;
+      if ( ret )
+        return MetaDataType::MetaLink;
+
+      return MetaDataType::None;
     }
 
-    bool looks_like_metalink_file( const zypp::Pathname &file )
+    MetaDataType looks_like_meta_file( const zypp::Pathname &file )
     {
       std::unique_ptr<FILE, decltype(&fclose)> fd( fopen( file.c_str(), "r" ), &fclose );
       if ( !fd )
-        return false;
-      return looks_like_metalink_data( zyppng::peek_data_fd( fd.get(), 0, minMetalinkProbeSize ) );
+        return MetaDataType::None;
+      return looks_like_meta_data( zyppng::peek_data_fd( fd.get(), 0, minMetalinkProbeSize )  );
     }
   }
 
   DlMetaLinkInfoState::DlMetaLinkInfoState(DownloadPrivate &parent)
     : BasicDownloaderStateBase( parent )
   {
-    MIL_MEDIA << "Downloading metalink on " << parent._spec.url() << std::endl;
+    MIL << "Downloading metalink/zsync on " << parent._spec.url() << std::endl;
   }
 
   DlMetaLinkInfoState::DlMetaLinkInfoState(std::shared_ptr<Request> &&prevRequest, DownloadPrivate &parent)
     : BasicDownloaderStateBase( std::move(prevRequest), parent )
   {
-    MIL_MEDIA << "Downloading metalink on " << parent._spec.url() << std::endl;
+    MIL << "Downloading metalink/zsync on " << parent._spec.url() << std::endl;
   }
 
   std::shared_ptr<FinishedState> DlMetaLinkInfoState::transitionToFinished()
   {
-    MIL_MEDIA << "Downloading on " << stateMachine()._spec.url() << " transition to final state. " << std::endl;
+    MIL << "Downloading on " << stateMachine()._spec.url() << " transition to final state. " << std::endl;
     return std::make_shared<FinishedState>( std::move(_error), stateMachine() );
   }
 
   std::shared_ptr<PrepareMultiState> DlMetaLinkInfoState::transitionToPrepareMulti()
   {
     _request->disconnectSignals();
-    auto nState = std::make_shared<PrepareMultiState>( std::move( _request ), stateMachine() );
+    auto prepareMode = ( _detectedMetaType == MetaDataType::MetaLink ? PrepareMultiState::Metalink : PrepareMultiState::Zsync );
+    auto nState = std::make_shared<PrepareMultiState>( std::move( _request ), prepareMode, stateMachine() );
     _request = nullptr;
     return nState;
   }
 
   bool DlMetaLinkInfoState::initializeRequest(std::shared_ptr<Request> &r )
   {
-    MIL << "Requesting Metalink info from server!" << std::endl;
-    r->transferSettings().addHeader("Accept: */*, application/metalink+xml, application/metalink4+xml");
+    MIL << "Requesting Metadata info from server!" << std::endl;
+    r->transferSettings().addHeader("Accept: */*, application/x-zsync, application/metalink+xml, application/metalink4+xml");
     return BasicDownloaderStateBase::initializeRequest(r);
   }
 
@@ -88,53 +97,66 @@ namespace zyppng {
   {
     // some proxies do not store the content type, so also look at the file to find
     // out if we received a metalink (bnc#649925)
-    if ( !_isMetalink )
-      _isMetalink = looks_like_metalink_file( _request->targetFilePath() );
-    if ( !_isMetalink ) {
+    if ( _detectedMetaType == MetaDataType::None )
+      _detectedMetaType = looks_like_meta_file( _request->targetFilePath() );
+    if ( _detectedMetaType == MetaDataType::None ) {
       // Move to finished state
-      MIL << "Downloading on " << stateMachine()._spec.url() << " was successful, no metalink data. " << std::endl;
+      MIL << "Downloading on " << stateMachine()._spec.url() << " was successful, no metalink/zsync data. " << std::endl;
       return BasicDownloaderStateBase::gotFinished();
     }
 
     auto &sm = stateMachine();
     if ( sm._stopOnMetalink ) {
-      MIL << "Stopping after receiving MetaLink data as requested" << std::endl;
+      MIL << "Stopping after receiving MetaData as requested" << std::endl;
       sm._stoppedOnMetalink = true;
       return BasicDownloaderStateBase::gotFinished();
     }
 
     // Move to Prepare Multi state
-    MIL << "Downloading on " << sm._spec.url() << " returned a Metalink " << std::endl;
-    _sigGotMetalink.emit();
+    if ( _detectedMetaType == MetaDataType::Zsync )
+      MIL << "Downloading on " << sm._spec.url() << " returned a Zsync file " << std::endl;
+    else
+      MIL << "Downloading on " << sm._spec.url() << " returned a Metalink file" << std::endl;
+    _sigGotMetadata.emit();
   }
 
   void DlMetaLinkInfoState::handleRequestProgress(NetworkRequest &req, off_t dltotal, off_t dlnow)
   {
     auto &sm = stateMachine();
 
-    if ( !_isMetalink && dlnow < minMetalinkProbeSize ) {
+    if ( _detectedMetaType == MetaDataType::None && dlnow < minMetalinkProbeSize ) {
       // can't tell yet, ...
       return sm._sigAlive.emit( *sm.z_func(), dlnow );
     }
 
-    if ( !_isMetalink ) {
+    if ( _detectedMetaType == MetaDataType::None ) {
       std::string cType = req.contentType();
-      _isMetalink = ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 );
+      if ( cType.find("application/x-zsync") == 0 )
+        _detectedMetaType = MetaDataType::Zsync;
+      else if ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 )
+        _detectedMetaType = MetaDataType::MetaLink;
     }
 
-    if ( !_isMetalink ) {
-      _isMetalink = looks_like_metalink_data( req.peekData( 0, minMetalinkProbeSize ) );
+    if ( _detectedMetaType == MetaDataType::None ) {
+      _detectedMetaType = looks_like_meta_data( req.peekData( 0, minMetalinkProbeSize ) );
     }
 
-    if ( _isMetalink ) {
+    if ( _detectedMetaType != MetaDataType::None ) {
       // this is a metalink file change the expected filesize
-      if ( zypp::ByteCount( 2, zypp::ByteCount::MB) < static_cast<zypp::ByteCount::SizeType>( dlnow ) ) {
-        WAR << "Metalink file exceeds 2MB in filesize, aborting."<<std::endl;
+      if ( zypp::ByteCount( 2, zypp::ByteCount::MB) < req.downloadedByteCount() ) {
+        WAR << "Metadata file exceeds 2MB in filesize, aborting."<<std::endl;
         sm._requestDispatcher->cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
         return;
       }
+
+      return sm._sigAlive.emit( *sm.z_func(), dlnow );
+
     } else {
       // still no metalink, we assume a normal download, not perfect though
+      if ( !_fallbackMilWritten ) {
+        _fallbackMilWritten = true;
+        MIL << "No Metalink file detected after " << minMetalinkProbeSize << ", falling back to normal progress updates" << std::endl;
+      }
       return BasicDownloaderStateBase::handleRequestProgress( req, dltotal, dlnow );
     }
   }
index 6687d4e..61c6676 100644 (file)
@@ -23,6 +23,12 @@ namespace zyppng {
   struct FinishedState;
   struct PrepareMultiState;
 
+  enum class MetaDataType {
+    None  = 0,
+    Zsync,
+    MetaLink
+  };
+
   /*!
      * State to download the actual metalink file, we can however not be 100% sure that we actually
      * will get a metalink file, so we need to check the content type or in bad cases the
@@ -37,8 +43,8 @@ namespace zyppng {
     SignalProxy< void () > sigFinished() {
       return _sigFinished;
     }
-    SignalProxy< void () > sigGotMetalink() {
-      return _sigGotMetalink;
+    SignalProxy< void () > sigGotMetadata() {
+      return _sigGotMetadata;
     }
     SignalProxy< void () > sigFailed() {
       return _sigFailed;
@@ -51,10 +57,13 @@ namespace zyppng {
     virtual void gotFinished () override;
 
   protected:
-    bool _isMetalink = false;
-    Signal< void () > _sigGotMetalink;
+    MetaDataType _detectedMetaType = MetaDataType::None;
+    Signal< void () > _sigGotMetadata;
 
     virtual void handleRequestProgress ( NetworkRequest &req, off_t dltotal, off_t dlnow ) override;
+
+  private:
+    bool _fallbackMilWritten = false; //< Flag to know if we already logged that we fall back to the normal progress
   };
 
 }
index c769164..9a29168 100644 (file)
@@ -17,13 +17,13 @@ namespace zyppng {
 
   DlNormalFileState::DlNormalFileState( DownloadPrivate &parent ) : BasicDownloaderStateBase( parent )
   {
-    MIL_MEDIA << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl;
+    MIL << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl;
   }
 
 
   DlNormalFileState::DlNormalFileState( std::shared_ptr<Request> &&oldReq, DownloadPrivate &parent ) : BasicDownloaderStateBase( std::move(oldReq), parent )
   {
-    MIL_MEDIA << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl;
+    MIL << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl;
   }
 
   std::shared_ptr<FinishedState> DlNormalFileState::transitionToFinished()
index 6094765..0ebf05c 100644 (file)
@@ -11,6 +11,7 @@
 #include <zypp-curl/ng/network/private/mediadebug_p.h>
 #include <zypp-curl/ng/network/private/networkrequesterror_p.h>
 #include <zypp-curl/private/curlhelper_p.h>
+#include <zypp-curl/parser/ZsyncParser>
 #include <zypp-core/fs/PathInfo.h>
 
 #include "preparemulti_p.h"
 
 namespace zyppng {
 
-  PrepareMultiState::PrepareMultiState( std::shared_ptr<Request> oldReq, DownloadPrivate &parent ) : SimpleState( parent )
+  PrepareMultiState::PrepareMultiState( std::shared_ptr<Request> oldReq, Mode m, DownloadPrivate &parent )
+    : SimpleState( parent )
+    , _mode(m)
+    , _oldRequest( oldReq )
   {
-    MIL_MEDIA << "About to enter PrepareMultiState" << std::endl;
+    MIL << "About to enter PrepareMultiState for URL: " << parent._spec.url() << std::endl;
   }
 
   void PrepareMultiState::enter( )
@@ -34,9 +38,9 @@ namespace zyppng {
     const auto &targetPath = spec.targetPath();
 #if ENABLE_ZCHUNK_COMPRESSION
     _haveZckData = (isZchunkFile( spec.deltaFile() )  && spec.headerSize() > 0);
-    DBG_MEDIA << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=" << _haveZckData << std::endl;
+    MIL << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=" << _haveZckData << std::endl;
 #else
-    DBG_MEDIA << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=false" << std::endl;
+    MIL << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=false" << std::endl;
 #endif
 
 
@@ -46,52 +50,79 @@ namespace zyppng {
     std::vector<zypp::media::MetalinkMirror> mirrs;
 
     try {
-      zypp::media::MetaLinkParser parser;
-      parser.parse( targetPath );
 
-      // we only care about the metalink chunks if we have no zchunk data
-#if ENABLE_ZCHUNK_COMPRESSION
-      if ( !_haveZckData ) {
-#else
-      if ( true ) {
-#endif
-        auto bl = parser.getBlockList();
-        if ( !bl.haveBlocks() )
-          MIL_MEDIA << "Got no blocks for URL " << spec.url() << " but got filesize? " << bl.getFilesize() << std::endl;
-        if ( bl.haveBlocks() || bl.haveFilesize() )
-          _blockList = std::move(bl);
-      }
+      const auto &parseMetadata = [&]( auto &&parser ) {
+        using T = std::decay_t<decltype (parser)>;
+        constexpr auto metalinkMode = std::is_same< T, zypp::media::MetaLinkParser>();
+
+        parser.parse( targetPath );
+
+        // we only care about the metalink chunks if we have no zchunk data
+  #if ENABLE_ZCHUNK_COMPRESSION
+        if ( !_haveZckData ) {
+  #else
+        if ( true ) {
+  #endif
+          auto bl = parser.getBlockList();
+          if ( !bl.haveBlocks() )
+            MIL << "Got no blocks for URL " << spec.url() << " but got filesize? " << bl.getFilesize() << std::endl;
+          if ( bl.haveBlocks() || bl.haveFilesize() )
+            _blockList = std::move(bl);
+        }
+
+        //migrate some settings from the base url to the mirror
+        if constexpr ( !metalinkMode ) {
+          const auto &urlList = parser.getUrls();
+          std::for_each( urlList.begin(), urlList.end(), [&]( const auto &url ) {
+            mirrs.push_back( { 0, -1, url } );
+          });
+        } else {
+          mirrs = parser.getMirrors();
+        }
 
-      //migrate some settings from the base url to the mirror
-      mirrs = parser.getMirrors();
-      for ( auto urliter = mirrs.begin(); urliter != mirrs.end(); ++urliter ) {
-        try {
-          const std::string scheme = urliter->url.getScheme();
-          if (scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp") {
-            if ( !sm._requestDispatcher->supportsProtocol( urliter->url )) {
-              urliter = mirrs.erase( urliter );
-              continue;
+        for ( auto urliter = mirrs.begin(); urliter != mirrs.end(); ++urliter ) {
+          try {
+            const std::string scheme = urliter->url.getScheme();
+            if (scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp") {
+              if ( !sm._requestDispatcher->supportsProtocol( urliter->url )) {
+                urliter = mirrs.erase( urliter );
+                continue;
+              }
+              urliter->url = ::internal::propagateQueryParams( urliter->url, url );
+              _mirrors.push_back( urliter->url );
             }
-            urliter->url = ::internal::propagateQueryParams( urliter->url, url );
-            _mirrors.push_back( urliter->url );
           }
+          catch (...) {  }
         }
-        catch (...) {  }
-      }
 
-      if ( mirrs.empty() ) {
-        mirrs.push_back( { 0, -1, url } );
-        _mirrors.push_back( url );
-      }
+        if ( mirrs.empty() ) {
+          mirrs.push_back( { 0, -1, url } );
+          _mirrors.push_back( url );
+        }
+      };
 
+      switch( _mode ) {
+        case Zsync: {
+          parseMetadata( zypp::media::ZsyncParser() );
+          break;
+        }
+        case Metalink: {
+          parseMetadata( zypp::media::MetaLinkParser() );
+          break;
+        }
+      }
     } catch ( const zypp::Exception &ex ) {
-      _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, zypp::str::Format("Failed to parse metalink information.(%1%)" ) % ex.asUserString() );
+      std::string err = zypp::str::Format("Failed to parse metalink information.(%1%)" ) % ex.asUserString();
+      WAR << err << std::endl;
+      _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(err) );
       _sigFailed.emit();
       return;
     }
 
     if ( mirrs.size() == 0 ) {
-      _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, zypp::str::Format("Invalid metalink information.( No mirrors in metalink file)" ) );
+      std::string err =  zypp::str::Format("Invalid metalink information.( No mirrors in metalink file)" );
+      WAR << err << std::endl;
+      _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(err) );
       _sigFailed.emit();
       return;
     }
@@ -137,15 +168,17 @@ namespace zyppng {
       } else {
         //we generate a blocklist on the fly based on the filesize
 
-        MIL_MEDIA << "Generate blocklist, since there was none in the metalink file." << url  << std::endl;
+        MIL << "Generate blocklist, since there was none in the metalink file." << url  << std::endl;
 
         off_t currOff = 0;
         off_t filesize = _blockList.getFilesize();
+        const auto prefSize = std::max<zypp::ByteCount>(  sm._spec.preferredChunkSize(), zypp::ByteCount(4, zypp::ByteCount::K) );
+
         while ( currOff <  filesize )  {
 
           auto blksize = filesize - currOff ;
-          if ( blksize > sm._spec.preferredChunkSize() )
-            blksize = sm._spec.preferredChunkSize();
+          if ( blksize > prefSize )
+            blksize = prefSize;
 
           _blockList.addBlock( currOff, blksize );
           currOff += blksize;
@@ -160,7 +193,7 @@ namespace zyppng {
 
   std::shared_ptr<DlNormalFileState> PrepareMultiState::fallbackToNormalTransition()
   {
-    MIL_MEDIA << "No blocklist and no filesize, falling back to normal download for URL " << stateMachine()._spec.url() << std::endl;
+    MIL << "No blocklist and no filesize, falling back to normal download for URL " << stateMachine()._spec.url() << std::endl;
     std::shared_ptr<DlNormalFileState> ptr;
     if ( _oldRequest ) {
       ptr = std::make_shared<DlNormalFileState>( std::move(_oldRequest), stateMachine() );
index c20ab4e..3735507 100644 (file)
@@ -38,7 +38,12 @@ namespace zyppng {
 
     using Request = DownloadPrivateBase::Request;
 
-    PrepareMultiState ( std::shared_ptr<Request> oldReq, DownloadPrivate &parent );
+    enum Mode {
+      Zsync,
+      Metalink
+    };
+
+    PrepareMultiState ( std::shared_ptr<Request> oldReq, Mode m, DownloadPrivate &parent );
 
     void enter ();
     void exit ();
@@ -77,6 +82,7 @@ namespace zyppng {
 #if ENABLE_ZCHUNK_COMPRESSION
     bool _haveZckData = false; //< do we have zck data ready
 #endif
+    Mode _mode; //< wether we should expect a metalink or zsync file
     std::shared_ptr<Request> _oldRequest; //< exising request of previous states, that the next states might reuse
     NetworkRequestError _error;
     Signal< void () > _sigFinished;
index 4255e27..72802c0 100644 (file)
@@ -62,12 +62,12 @@ namespace zyppng {
       return;
     }
 
-    MIL_MEDIA << "Request finished "<<std::endl;
+    MIL  << req.nativeHandle() << " " << "Request finished successfully."<<std::endl;
     const auto &rngs = reqLocked->requestedRanges();
-    std::for_each( rngs.begin(), rngs.end(), []( const auto &b ){ DBG << "-> Block " << b.start << " finished." << std::endl; } );
+    std::for_each( rngs.begin(), rngs.end(), [&req]( const auto &b ){ DBG_MEDIA  << req.nativeHandle() << " " << "-> Block " << b.start << " finished." << std::endl; } );
 
     auto restartReqWithBlock = [ this ]( std::shared_ptr<Request> &req, std::vector<Block> &&blocks ) {
-      MIL_MEDIA << "Reusing Request to download blocks:"<<std::endl;
+      MIL  << req->nativeHandle() << " " << "Reusing Request to download blocks:"<<std::endl;
       if ( !addBlockRanges( req, std::move( blocks ) ) )
         return false;
 
@@ -78,7 +78,7 @@ namespace zyppng {
 
     //check if we already have enqueued all blocks if not reuse the request
     if ( _ranges.size() ) {
-      MIL_MEDIA << "Reusing to download blocks: "<<std::endl;
+      MIL  << req.nativeHandle() << " " << "Reusing to download blocks: "<<std::endl;
       if ( !restartReqWithBlock( reqLocked, getNextBlocks( reqLocked->url().getScheme() ) ) ) {
         return setFailed( "Failed to restart request with new blocks." );
       }
@@ -89,7 +89,7 @@ namespace zyppng {
       if ( !_failedRanges.empty() ) {
 
         auto fblks = getNextFailedBlocks( reqLocked->url().getScheme() );
-        MIL_MEDIA << "Reusing to download failed blocks: "<<std::endl;
+        MIL  << req.nativeHandle() << " " << "Reusing to download failed blocks: "<<std::endl;
         if ( !restartReqWithBlock( reqLocked, std::move(fblks) ) ) {
           return setFailed( "Failed to restart request with previously failed blocks." );
         }
@@ -117,7 +117,9 @@ namespace zyppng {
     } else {
 
       //if a error happens during a multi download we try to use another mirror to download the failed block
-      MIL << "Request failed " << req->extendedErrorString() << "(" << req->url() << ")" << std::endl;
+      MIL << req->nativeHandle() << " " << "Request failed " << req->extendedErrorString() << "(" << req->url() << ")" << std::endl;
+      if ( req->lastRedirectInfo ().size () )
+        MIL << req->nativeHandle() << " Last redirection target was: " << req->lastRedirectInfo () << std::endl;
 
       NetworkRequestError dummyErr;
 
@@ -126,7 +128,8 @@ namespace zyppng {
         std::transform( fRanges.begin(), fRanges.end(), std::back_inserter(_failedRanges), [ &req ]( const auto &r ){
           Block b = std::any_cast<Block>(r.userData);;
           b._failedWithErr = req->error();
-          DBG_MEDIA << "Adding failed block to failed blocklist: " << b.start << " " << b.len << " (" << req->error().toString() << " [" << req->error().nativeErrorString()<< "])" << std::endl;
+          if ( zypp::env::ZYPP_MEDIA_CURL_DEBUG() > 3 )
+            DBG_MEDIA << "Adding failed block to failed blocklist: " << b.start << " " << b.len << " (" << req->error().toString() << " [" << req->error().nativeErrorString()<< "])" << std::endl;
           return b;
         });
 
@@ -244,7 +247,7 @@ namespace zyppng {
     // note: this sets the activity timeout, not the download timeout
     req->transferSettings().setTimeout( 2 );
 
-    DBG_MEDIA << "Creating Request to download blocks:"<<std::endl;
+    MIL << "Creating Request to download blocks via mirror: "  << myUrl << std::endl;
     if ( !addBlockRanges( req, std::move(blocks) ) ) {
       setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Failed to add blocks to request." ) );
       return;
@@ -317,10 +320,13 @@ namespace zyppng {
           return false;
         }
 
-        DBG_MEDIA << "Starting block " << block.start << " with checksum " << zypp::Digest::digestVectorToString( *block.chksumVec ) << "." << std::endl;
-        req->addRequestRange( block.start, block.len, dig, *block.chksumVec, std::any( block ), block.chksumCompareLen );
+        if ( zypp::env::ZYPP_MEDIA_CURL_DEBUG() > 3 )
+          DBG_MEDIA << "Starting block " << block.start << " with checksum " << zypp::Digest::digestVectorToString( *block.chksumVec ) << "." << std::endl;
+        req->addRequestRange( block.start, block.len, dig, *block.chksumVec, std::any( block ), block.chksumCompareLen, block.chksumPad );
       } else {
-        DBG_MEDIA << "Starting block " << block.start << " without checksum." << std::endl;
+
+        if ( zypp::env::ZYPP_MEDIA_CURL_DEBUG() > 3 )
+          DBG_MEDIA << "Starting block " << block.start << " without checksum." << std::endl;
         req->addRequestRange( block.start, block.len, {}, {}, std::any( block ) );
       }
     }
@@ -361,7 +367,7 @@ namespace zyppng {
   std::vector<RangeDownloaderBaseState::Block> RangeDownloaderBaseState::getNextBlocks( const std::string &urlScheme )
   {
     std::vector<Block> blocks;
-    const auto prefSize = static_cast<size_t>( stateMachine()._spec.preferredChunkSize() );
+    const auto prefSize = std::max<zypp::ByteCount>( _preferredChunkSize, zypp::ByteCount(4, zypp::ByteCount::K) );
     size_t accumulatedSize = 0;
 
     bool canDoRandomBlocks = ( zypp::str::hasPrefixCI( urlScheme, "http") );
@@ -388,7 +394,7 @@ namespace zyppng {
 
   std::vector<RangeDownloaderBaseState::Block> RangeDownloaderBaseState::getNextFailedBlocks( const std::string &urlScheme )
   {
-    const auto prefSize = static_cast<size_t>( stateMachine()._spec.preferredChunkSize() );
+    const auto prefSize = std::max<zypp::ByteCount>( _preferredChunkSize, zypp::ByteCount(4, zypp::ByteCount::K) );
     // sort the failed requests by block number, this should make sure get them in offset order as well
     _failedRanges.sort( []( const auto &a , const auto &b ){ return a.start < b.start; } );
 
@@ -422,4 +428,14 @@ namespace zyppng {
     return fblks;
   }
 
+  zypp::ByteCount RangeDownloaderBaseState::makeBlksize ( size_t filesize )
+  {
+    // this case should never happen because we never start a multi download if we do not know the filesize beforehand
+    if ( filesize == 0 )  return 4 * 1024 * 1024;
+    else if ( filesize < 4*1024*1024 ) return filesize;
+    else if ( filesize < 8*1024*1024 ) return 4*1024*1024;
+    else if ( filesize < 16*1024*1024 ) return 8*1024*1024;
+    else if ( filesize < 256*1024*1024 ) return 10*1024*1024;
+    return 4*1024*1024;
+  }
 }
index 65cfcea..cf59bde 100644 (file)
@@ -54,11 +54,14 @@ namespace zyppng {
     void mirrorReceived(MirrorControl::MirrorPick mirror) override;
     void failedToPrepare() override;
 
+    static zypp::ByteCount makeBlksize ( size_t filesize );
+
   protected:
     NetworkRequestError _error;
     bool _inEnsureDownloadsRunning = false; //< Flag to prevent multiple entry to ensureDownloadsRunning
 
     size_t             _fileSize = 0; //< The expected filesize, this is used to make sure we do not write after the end offset of the expected file size
+    zypp::ByteCount    _preferredChunkSize = 0; //< The preferred chunk size we want to download per request
     std::list<Block>   _ranges;
 
     //keep a list with failed blocks in case we run out of mirrors,
index 6b2231b..46f8479 100644 (file)
@@ -43,14 +43,14 @@ namespace zyppng {
     : BasicDownloaderStateBase( std::move(oldReq), parent )
   {
     _fileMirrors = std::move(mirrors);
-    MIL_MEDIA << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl;
+    MIL << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl;
   }
 
   DLZckHeadState::DLZckHeadState( std::vector<Url> &&mirrors, DownloadPrivate &parent )
     : BasicDownloaderStateBase( parent )
   {
     _fileMirrors = std::move(mirrors);
-    MIL_MEDIA << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl;
+    MIL << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl;
   }
 
 
@@ -60,7 +60,7 @@ namespace zyppng {
 
     const auto &s = stateMachine()._spec;
     if ( s.headerSize() == 0 ) {
-      ERR_MEDIA << "Downloading the zck header was requested, but headersize is zero." << std::endl;
+      ERR << "Downloading the zck header was requested, but headersize is zero." << std::endl;
       return false;
     }
 
@@ -102,7 +102,8 @@ namespace zyppng {
 
   void DLZckState::enter()
   {
-    const auto &spec = stateMachine()._spec;
+    auto &sm = stateMachine();
+    const auto &spec = sm._spec;
 
     // setup the base downloader
     _error = {};
@@ -158,6 +159,23 @@ namespace zyppng {
       _fileSize = fLen;
     }
 
+    const auto maxConns = sm._requestDispatcher->maximumConcurrentConnections();
+    if ( sm._spec.preferredChunkSize() == 0 ) {
+      const auto autoBlkSize = makeBlksize( _fileSize );
+      if ( maxConns == -1 ) {
+        _preferredChunkSize = autoBlkSize;
+      } else {
+        _preferredChunkSize = _fileSize / maxConns;
+        if ( _preferredChunkSize < autoBlkSize )
+          _preferredChunkSize = autoBlkSize;
+        else if ( _preferredChunkSize > zypp::ByteCount( 100, zypp::ByteCount::M ) )
+          _preferredChunkSize = zypp::ByteCount( 100, zypp::ByteCount::M );
+      }
+    } else {
+      // spec chunk size overrules the automatic one
+      _preferredChunkSize = sm._spec.preferredChunkSize();
+    }
+
     if( srcHashType != targetHashType )
       return setFailed ( zypp::str::Format( "ERROR: Chunk hash types don't match. Source Hash: %1% vs Target Hash: %2%")
                         % zck_hash_name_from_type ( srcHashType )
index 1baf8c0..00fe2c6 100644 (file)
@@ -64,6 +64,7 @@ private:
   int  socketCallback(CURL *easy, curl_socket_t s, int what, void * );
 
   void cancelAll ( NetworkRequestError result );
+  bool addRequestToMultiHandle ( NetworkRequest &req );
   void setFinished( NetworkRequest &req , NetworkRequestError result );
 
   void onSocketActivated  ( const SocketNotifier &listener, int events );
index bb88751..41d9fc3 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <boost/optional.hpp>
 #include <variant>
-#include <boost/utility/string_view.hpp>
 
 namespace zyppng {
 
@@ -45,22 +44,64 @@ namespace zyppng {
     NetworkRequestPrivate(Url &&url, zypp::Pathname &&targetFile, NetworkRequest::FileMode fMode, NetworkRequest &p );
     virtual ~NetworkRequestPrivate();
 
-    bool initialize(std::string &errBuf );
-    void aboutToStart ();
+    bool initialize( std::string &errBuf );
+
+    bool setupHandle ( std::string &errBuf );
+
+    bool assertOutputFile ();
+
+    /*!
+     * \internal
+     * Called by the dispatcher if we report a error. If this function returns
+     * true we are qeued again and reinitialize is called
+     */
+    bool canRecover () const;
+
+    /*!
+     * Prepares the request before it is queued again
+     * currently this is used only for range batching but could be used to
+     * recover from other types of errors too
+     */
+    bool prepareToContinue ( std::string &errBuf  );
+
+    /*!
+     * Add the next batch of range descriptions to the curl handle
+     */
+    bool prepareNextRangeBatch( std::string &errBuf );
+
+    /*!
+     * \internal
+     * This will return true if the download needs to be queued again to
+     * continue downloading more stuff.
+     */
+    bool hasMoreWork() const;
+
+    /*!
+     * \internal
+     * Prepares the request to be started, or restarted for a range batch request.
+     */
+    void aboutToStart ( );
+
+    /*!
+     * \internal
+     * Tells the request it was just removed from the curl multi handle and is about
+     * to be finalized. This function is called before \ref hasPendingRanges and \ref setResult
+     */
+    void dequeueNotify();
+
     void setResult ( NetworkRequestError &&err );
     void reset ();
     void resetActivityTimer ();
     void onActivityTimeout (Timer &);
     bool checkIfRangeChkSumIsValid(const NetworkRequest::Range &rng);
     void validateRange ( NetworkRequest::Range &rng );
-    bool parseContentRangeHeader (const boost::string_view &line, size_t &start , size_t &len);
-    bool parseContentTypeMultiRangeHeader ( const boost::string_view &line, std::string &boundary );
+    bool parseContentRangeHeader (const std::string_view &line, size_t &start , size_t &len);
+    bool parseContentTypeMultiRangeHeader ( const std::string_view &line, std::string &boundary );
 
     std::string errorMessage () const;
 
 
     std::array<char, CURL_ERROR_SIZE+1> _errorBuf; //provide a buffer for a nicely formatted error for CURL
-    std::optional<std::string> _originalError; // if this is initialized we manually set a error that caused the error stored in _errorBuf
 
     template<typename T>
     void setCurlOption ( CURLoption opt, T data )
@@ -81,7 +122,6 @@ namespace zyppng {
     NetworkRequest::FileMode            _fMode = NetworkRequest::WriteExclusive;
     NetworkRequest::Priority            _priority = NetworkRequest::Normal;
 
-    long _curlDebug = 0L;
     std::string _lastRedirect; ///< to log/report redirections
     const std::string _currentCookieFile = "/var/lib/YaST2/cookies";
 
@@ -100,13 +140,39 @@ namespace zyppng {
 
     std::unique_ptr< curl_slist, decltype (&curl_slist_free_all) > _headers;
 
+    // when requesting ranges from the server, we need to make sure not to request
+    // too many at the same time. Instead we batch our requests and reuse the open
+    // connection until we have the full file.
+    // However different server have different maximum nr of ranges, so we start with
+    // a high number and decrease until we find a rangecount that works
+    constexpr static int _rangeAttempt[] = {
+      255,
+      127,
+      63,
+      15,
+      5
+    };
+
+    struct pending_t;
+    struct running_t;
+    struct prepareNextRangeBatch_t;
+
     struct pending_t {
       pending_t(){}
       bool _requireStatusPartial  = false;
     };
 
+    struct prepareNextRangeBatch_t
+    {
+      prepareNextRangeBatch_t( running_t &&prevState );
+      zypp::AutoFILE _outFile;     //the file we are writing to
+      off_t _downloaded       = 0; //downloaded bytes
+      int   _rangeAttemptIdx  = 0; // which range attempt index are we currently using
+    };
+
     struct running_t  {
       running_t( pending_t &&prevState );
+      running_t( prepareNextRangeBatch_t &&prevState );
 
       Timer::Ptr _activityTimer = Timer::create();
 
@@ -121,10 +187,14 @@ namespace zyppng {
 
       // handle the case when cancel() is called from a slot to the progress signal
       bool _isInCallback          = false;
+
+      // used to handle cancel() when emitting the progress signal, or when we explicitely trigger
+      // a error during callbacks.
       std::optional<NetworkRequestError> _cachedResult;
 
       off_t _lastProgressNow = -1; // last value returned from CURL, lets only send signals if we get actual updates
       off_t _downloaded = 0; //downloaded bytes
+      int   _rangeAttemptIdx = 0; // which range attempt index are we currently using
       zypp::ByteCount _contentLenght; // the content length as reported by the server
 
       //multirange support for HTTP requests (https://tools.ietf.org/html/rfc7233)
@@ -138,7 +208,7 @@ namespace zyppng {
       NetworkRequestError _result; // the overall result of the download
     };
 
-    std::variant< pending_t, running_t, finished_t > _runningMode = pending_t();
+    std::variant< pending_t, running_t, prepareNextRangeBatch_t, finished_t > _runningMode = pending_t();
   };
 
   std::vector<char> peek_data_fd ( FILE *fd, off_t offset, size_t count );
index 805781f..79dbef3 100644 (file)
 #include <zypp-core/zyppng/base/EventDispatcher>
 #include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 #include <zypp-core/zyppng/core/String>
+#include <zypp-core/fs/PathInfo.h>
 #include <zypp-curl/private/curlhelper_p.h>
 #include <zypp-curl/CurlConfig>
 #include <zypp-curl/auth/CurlAuthData>
 #include <zypp-media/MediaConfig>
 #include <zypp-core/base/String.h>
+#include <zypp-core/base/StringV.h>
 #include <zypp-core/Pathname.h>
 #include <curl/curl.h>
 #include <stdio.h>
@@ -70,24 +72,37 @@ namespace zyppng {
     return data;
   }
 
-  NetworkRequest::Range NetworkRequest::Range::make(size_t start, size_t len, zyppng::NetworkRequest::DigestPtr &&digest, zyppng::NetworkRequest::CheckSumBytes &&expectedChkSum, std::any &&userData, std::optional<size_t> digestCompareLen )
+  NetworkRequest::Range NetworkRequest::Range::make(size_t start, size_t len, zyppng::NetworkRequest::DigestPtr &&digest, zyppng::NetworkRequest::CheckSumBytes &&expectedChkSum, std::any &&userData, std::optional<size_t> digestCompareLen, std::optional<size_t> dataBlockPadding )
   {
     return NetworkRequest::Range {
-      start,
-      len,
-      0,
-      std::move( digest ),
-      std::move( expectedChkSum ),
-      std::move( digestCompareLen ),
-      false,
-      std::move( userData )
+      .start = start,
+      .len   = len,
+      .bytesWritten = 0,
+      ._digest   = std::move( digest ),
+      ._checksum = std::move( expectedChkSum ),
+      ._relevantDigestLen = std::move( digestCompareLen ),
+      ._chksumPad  = std::move( dataBlockPadding ),
+      .userData = std::move( userData ),
+      ._rangeState = State::Pending
     };
   }
 
+  NetworkRequestPrivate::prepareNextRangeBatch_t::prepareNextRangeBatch_t(running_t &&prevState)
+    : _outFile( std::move(prevState._outFile) )
+    , _downloaded( prevState._downloaded )
+    , _rangeAttemptIdx( prevState._rangeAttemptIdx )
+  { }
+
   NetworkRequestPrivate::running_t::running_t( pending_t &&prevState )
     : _requireStatusPartial( prevState._requireStatusPartial )
-  {
-  }
+  { }
+
+  NetworkRequestPrivate::running_t::running_t( prepareNextRangeBatch_t &&prevState )
+    : _outFile( std::move(prevState._outFile) )
+    , _requireStatusPartial( true )
+    , _downloaded( prevState._downloaded )
+    , _rangeAttemptIdx( prevState._rangeAttemptIdx )
+  { }
 
   NetworkRequestPrivate::NetworkRequestPrivate(Url &&url, zypp::Pathname &&targetFile, NetworkRequest::FileMode fMode , NetworkRequest &p)
     : BasePrivate(p)
@@ -116,9 +131,12 @@ namespace zyppng {
       curl_easy_reset( _easyHandle );
     else
       _easyHandle = curl_easy_init();
+    return setupHandle ( errBuf );
+  }
 
-    _originalError.reset();
-    _errorBuf.fill( '\0' );
+  bool NetworkRequestPrivate::setupHandle( std::string &errBuf )
+  {
+    ::internal::setupZYPP_MEDIA_CURL_DEBUG( _easyHandle );
     curl_easy_setopt( _easyHandle, CURLOPT_ERRORBUFFER, this->_errorBuf.data() );
 
     const std::string urlScheme = _url.getScheme();
@@ -157,83 +175,21 @@ namespace zyppng {
       }
 
       if( !( _options & NetworkRequest::ConnectionTest ) && !( _options & NetworkRequest::HeadRequest ) ){
-        std::string rangeDesc;
-
         if ( _requestedRanges.size() ) {
-
-          if ( _requestedRanges.size() > 1 && _protocolMode != ProtocolMode::HTTP ) {
-            errBuf = "Using more than one range is not supported with protocols other than HTTP/HTTPS";
+          if ( ! prepareNextRangeBatch ( errBuf ))
             return false;
-          }
-
-          // check if we have one big range convering the whole file
-          if ( _requestedRanges.size() == 1 && _requestedRanges.front().start == 0 && _requestedRanges.front().len == 0 ) {
-            std::get<pending_t>( _runningMode )._requireStatusPartial = false;
-
-          } else {
-            std::sort( _requestedRanges.begin(), _requestedRanges.end(), []( const auto &elem1, const auto &elem2 ){
-              return ( elem1.start < elem2.start );
-            });
-
-            std::get<pending_t>( _runningMode )._requireStatusPartial = true;
-
-            // helper function to build up the request string for the range
-            auto addRangeString = [ &rangeDesc ]( const std::pair<size_t, size_t> &range ) {
-              std::string rangeD = zypp::str::form("%llu-", static_cast<unsigned long long>( range.first ) );
-              if( range.second > 0 )
-                rangeD.append( zypp::str::form( "%llu", static_cast<unsigned long long>( range.second ) ) );
-
-              if ( rangeDesc.size() )
-                rangeDesc.append(",").append( rangeD );
-              else
-                rangeDesc = std::move( rangeD );
-            };
-
-            std::optional<std::pair<size_t, size_t>> currentZippedRange;
-            bool closedRange = true;
-            for ( auto &range : _requestedRanges ) {
-
-              //reset the download results
-              range._valid = false;
-              range.bytesWritten = 0;
-
-              //when we have a open range in the list of ranges we will get from start of range to end of file,
-              //all following ranges would never be marked as valid, so we have to fail early
-              if ( !closedRange ) {
-                errBuf = "It is not supported to request more ranges after a open range.";
-                return false;
-              }
-
-              const auto rangeEnd = range.len > 0 ? range.start + range.len - 1 : 0;
-              closedRange = (rangeEnd > 0);
-
-              // we try to compress the requested ranges into as big chunks as possible for the request,
-              // when receiving we still track the original ranges so we can collect and test their checksums
-              if ( !currentZippedRange ) {
-                currentZippedRange = std::make_pair( range.start, rangeEnd );
-              } else {
-                //range is directly consecutive to the previous range
-                if ( currentZippedRange->second + 1 == range.start ) {
-                  currentZippedRange->second = rangeEnd;
-                } else {
-                  //this range does not directly follow the previous one, we build the string and start a new one
-                  addRangeString( *currentZippedRange );
-                  currentZippedRange = std::make_pair( range.start, rangeEnd );
-                }
-              }
-            }
-
-            // add the last range too
-            if ( currentZippedRange )
-              addRangeString( *currentZippedRange );
-
-            setCurlOption( CURLOPT_RANGE, rangeDesc.c_str() );
-          }
         } else {
-          std::get<pending_t>( _runningMode )._requireStatusPartial = false;
+          std::visit( [&]( auto &arg ){
+            using T = std::decay_t<decltype(arg)>;
+            if constexpr ( std::is_same_v<T, pending_t> ) {
+              arg._requireStatusPartial = false;
+            } else {
+              DBG << _easyHandle << " " << "NetworkRequestPrivate::setupHandle called in unexpected state" << std::endl;
+            }
+          }, _runningMode );
           _requestedRanges.push_back( NetworkRequest::Range() );
+          _requestedRanges.back()._rangeState = NetworkRequest::State::Running;
         }
-
       }
 
       //make a local copy of the settings, so headers are not added multiple times
@@ -255,20 +211,6 @@ namespace zyppng {
 
       locSet.addHeader("Pragma:");
 
-      locSet.setTimeout( zypp::MediaConfig::instance().download_transfer_timeout() );
-      locSet.setConnectTimeout( CONNECT_TIMEOUT );
-
-      {
-        char *ptr = getenv("ZYPP_MEDIA_CURL_DEBUG");
-        _curlDebug = (ptr && *ptr) ? zypp::str::strtonum<long>( ptr) : 0L;
-        if( _curlDebug > 0)
-        {
-          setCurlOption( CURLOPT_VERBOSE, 1L);
-          setCurlOption( CURLOPT_DEBUGFUNCTION, ::internal::log_curl);
-          setCurlOption( CURLOPT_DEBUGDATA, &_curlDebug);
-        }
-      }
-
       /** Force IPv4/v6 */
       switch ( zypp::env::ZYPP_MEDIA_CURL_IPRESOLVE() )
       {
@@ -351,7 +293,7 @@ namespace zyppng {
         long auth = zypp::media::CurlAuthData::auth_type_str2long(use_auth);
         if( auth != CURLAUTH_NONE)
         {
-          DBG << "Enabling HTTP authentication methods: " << use_auth
+          DBG << _easyHandle << " "  << "Enabling HTTP authentication methods: " << use_auth
               << " (CURLOPT_HTTPAUTH=" << auth << ")" << std::endl;
           setCurlOption(CURLOPT_HTTPAUTH, auth);
         }
@@ -359,7 +301,7 @@ namespace zyppng {
 
       if ( locSet.proxyEnabled() && ! locSet.proxy().empty() )
       {
-        DBG << "Proxy: '" << locSet.proxy() << "'" << std::endl;
+        DBG << _easyHandle << " " << "Proxy: '" << locSet.proxy() << "'" << std::endl;
         setCurlOption(CURLOPT_PROXY, locSet.proxy().c_str());
         setCurlOption(CURLOPT_PROXYAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST|CURLAUTH_NTLM );
 
@@ -377,16 +319,16 @@ namespace zyppng {
           zypp::media::CurlConfig curlconf;
           zypp::media::CurlConfig::parseConfig(curlconf); // parse ~/.curlrc
           if ( curlconf.proxyuserpwd.empty() )
-            DBG << "Proxy: ~/.curlrc does not contain the proxy-user option" << std::endl;
+            DBG << _easyHandle << " "  << "Proxy: ~/.curlrc does not contain the proxy-user option" << std::endl;
           else
           {
             proxyuserpwd = curlconf.proxyuserpwd;
-            DBG << "Proxy: using proxy-user from ~/.curlrc" << std::endl;
+            DBG << _easyHandle << " " << "Proxy: using proxy-user from ~/.curlrc" << std::endl;
           }
         }
         else
         {
-          DBG << "Proxy: using provided proxy-user '" << _settings.proxyUsername() << "'" << std::endl;
+          DBG << _easyHandle << " "  << _easyHandle << " "  << "Proxy: using provided proxy-user '" << _settings.proxyUsername() << "'" << std::endl;
         }
 
         if ( ! proxyuserpwd.empty() )
@@ -399,16 +341,12 @@ namespace zyppng {
       {
         // Explicitly disabled in URL (see fillSettingsFromUrl()).
         // This should also prevent libcurl from looking into the environment.
-        DBG << "Proxy: explicitly NOPROXY" << std::endl;
+        DBG << _easyHandle << " "  << "Proxy: explicitly NOPROXY" << std::endl;
         setCurlOption(CURLOPT_NOPROXY, "*");
       }
 
 #endif
-      else
-      {
-        DBG << "Proxy: not explicitly set" << std::endl;
-        DBG_MEDIA << "Proxy: libcurl may look into the environment" << std::endl;
-      }
+      // else: Proxy: not explicitly set; libcurl may look into the environment
 
       /** Speed limits */
       if ( locSet.minDownloadSpeed() != 0 )
@@ -423,10 +361,11 @@ namespace zyppng {
         setCurlOption(CURLOPT_MAX_RECV_SPEED_LARGE, locSet.maxDownloadSpeed());
 #endif
 
+      zypp::filesystem::assert_file_mode( _currentCookieFile, 0600 );
       if ( zypp::str::strToBool( _url.getQueryParam( "cookies" ), true ) )
         setCurlOption( CURLOPT_COOKIEFILE, _currentCookieFile.c_str() );
       else
-        MIL << "No cookies requested" << std::endl;
+        MIL << _easyHandle << " " << "No cookies requested" << std::endl;
       setCurlOption(CURLOPT_COOKIEJAR, _currentCookieFile.c_str() );
 
 #if CURLVERSION_AT_LEAST(7,18,0)
@@ -434,7 +373,8 @@ namespace zyppng {
       setCurlOption(CURLOPT_PROXY_TRANSFER_MODE, 1L );
 #endif
 
-      // append settings custom headers to curl
+      // Append settings custom headers to curl.
+      // TransferSettings assert strings are trimmed (HTTP/2 RFC 9113)
       for ( const auto &header : locSet.headers() ) {
         if ( !z_func()->addRequestHeader( header.c_str() ) )
           ZYPP_THROW(zypp::media::MediaCurlInitException(_url));
@@ -452,18 +392,229 @@ namespace zyppng {
     return false;
   }
 
-  void NetworkRequestPrivate::aboutToStart()
+  bool NetworkRequestPrivate::assertOutputFile()
+  {
+    auto rmode = std::get_if<NetworkRequestPrivate::running_t>( &_runningMode );
+    if ( !rmode ) {
+      DBG << _easyHandle << "Can only create output file in running mode" << std::endl;
+      return false;
+    }
+    // if we have no open file create or open it
+    if ( !rmode->_outFile ) {
+      std::string openMode = "w+b";
+      if ( _fMode == NetworkRequest::WriteShared )
+        openMode = "r+b";
+
+      rmode->_outFile = fopen( _targetFile.asString().c_str() , openMode.c_str() );
+
+      //if the file does not exist create a new one
+      if ( !rmode->_outFile && _fMode == NetworkRequest::WriteShared ) {
+        rmode->_outFile = fopen( _targetFile.asString().c_str() , "w+b" );
+      }
+
+      if ( !rmode->_outFile ) {
+        rmode->_cachedResult = NetworkRequestErrorPrivate::customError(  NetworkRequestError::InternalError
+          ,zypp::str::Format("Unable to open target file (%1%). Errno: (%2%:%3%)") % _targetFile.asString() % errno % strerr_cxx() );
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  bool NetworkRequestPrivate::canRecover() const
+  {
+    // We can recover from RangeFail errors if we have more batch sizes to try
+    auto rmode = std::get_if<NetworkRequestPrivate::running_t>( &_runningMode );
+    if ( rmode->_cachedResult && rmode->_cachedResult->type() == NetworkRequestError::RangeFail )
+      return ( rmode->_rangeAttemptIdx + 1 < sizeof( _rangeAttempt ) ) && hasMoreWork();
+    return false;
+  }
+
+  bool NetworkRequestPrivate::prepareToContinue( std::string &errBuf )
+  {
+    auto rmode = std::get_if<NetworkRequestPrivate::running_t>( &_runningMode );
+
+    if ( hasMoreWork() ) {
+      // go to the next range batch level if we are restarted due to a failed range request
+      if ( rmode->_cachedResult && rmode->_cachedResult->type() == NetworkRequestError::RangeFail ) {
+        if ( rmode->_rangeAttemptIdx + 1 >= sizeof( _rangeAttempt ) ) {
+          errBuf = "No more range batch sizes available";
+          return false;
+        }
+        rmode->_rangeAttemptIdx++;
+      }
+
+      _runningMode = prepareNextRangeBatch_t( std::move(std::get<running_t>( _runningMode )) );
+
+      // we reset the handle to default values. We do this to not run into
+      // "transfer closed with outstanding read data remaining" error CURL sometimes returns when
+      // we cancel a connection because of a range error to request a smaller batch.
+      // The error will still happen but much less frequently than without resetting the handle.
+      //
+      // Note: Even creating a new handle will NOT fix the issue
+      curl_easy_reset( _easyHandle );
+      if ( !setupHandle (errBuf) )
+        return false;
+      return true;
+    }
+    errBuf = "Request has no more work";
+    return false;
+
+  }
+
+  bool NetworkRequestPrivate::prepareNextRangeBatch(std::string &errBuf)
   {
-    _runningMode = running_t( std::move(std::get<pending_t>( _runningMode )) );
+    if ( _requestedRanges.size() == 0 ) {
+      errBuf = "Calling the prepareNextRangeBatch function without a range to download is not supported.";
+      return false;
+    }
+
+    std::string rangeDesc;
+    uint rangesAdded = 0;
+    if ( _requestedRanges.size() > 1 && _protocolMode != ProtocolMode::HTTP ) {
+      errBuf = "Using more than one range is not supported with protocols other than HTTP/HTTPS";
+      return false;
+    }
+
+    // check if we have one big range convering the whole file
+    if ( _requestedRanges.size() == 1 && _requestedRanges.front().start == 0 && _requestedRanges.front().len == 0 ) {
+      if ( !std::holds_alternative<pending_t>( _runningMode ) ) {
+        errBuf = zypp::str::Str() << "Unexpected state when calling prepareNextRangeBatch " << _runningMode.index ();
+        return false;
+      }
+
+      _requestedRanges[0]._rangeState = NetworkRequest::Running;
+      std::get<pending_t>( _runningMode )._requireStatusPartial = false;
+
+    } else {
+      std::sort( _requestedRanges.begin(), _requestedRanges.end(), []( const auto &elem1, const auto &elem2 ){
+        return ( elem1.start < elem2.start );
+      });
+
+      if ( std::holds_alternative<pending_t>( _runningMode ) )
+        std::get<pending_t>( _runningMode )._requireStatusPartial = true;
+
+      auto maxRanges = _rangeAttempt[0];
+      if ( std::holds_alternative<prepareNextRangeBatch_t>( _runningMode ) )
+        maxRanges = _rangeAttempt[std::get<prepareNextRangeBatch_t>( _runningMode )._rangeAttemptIdx];
+
+      // helper function to build up the request string for the range
+      auto addRangeString = [ &rangeDesc, &rangesAdded ]( const std::pair<size_t, size_t> &range ) {
+        std::string rangeD = zypp::str::form("%llu-", static_cast<unsigned long long>( range.first ) );
+        if( range.second > 0 )
+          rangeD.append( zypp::str::form( "%llu", static_cast<unsigned long long>( range.second ) ) );
+
+        if ( rangeDesc.size() )
+          rangeDesc.append(",").append( rangeD );
+        else
+          rangeDesc = std::move( rangeD );
+
+        rangesAdded++;
+      };
+
+      std::optional<std::pair<size_t, size_t>> currentZippedRange;
+      bool closedRange = true;
+      for ( auto &range : _requestedRanges ) {
+
+        if ( range._rangeState != NetworkRequest::Pending )
+          continue;
+
+        //reset the download results
+        range.bytesWritten = 0;
+
+        //when we have a open range in the list of ranges we will get from start of range to end of file,
+        //all following ranges would never be marked as valid, so we have to fail early
+        if ( !closedRange ) {
+          errBuf = "It is not supported to request more ranges after a open range.";
+          return false;
+        }
+
+        const auto rangeEnd = range.len > 0 ? range.start + range.len - 1 : 0;
+        closedRange = (rangeEnd > 0);
+
+        // remember this range was already requested
+        range._rangeState  = NetworkRequest::Running;
+        range.bytesWritten = 0;
+        if ( range._digest )
+          range._digest->reset();
+
+        // we try to compress the requested ranges into as big chunks as possible for the request,
+        // when receiving we still track the original ranges so we can collect and test their checksums
+        if ( !currentZippedRange ) {
+          currentZippedRange = std::make_pair( range.start, rangeEnd );
+        } else {
+          //range is directly consecutive to the previous range
+          if ( currentZippedRange->second + 1 == range.start ) {
+            currentZippedRange->second = rangeEnd;
+          } else {
+            //this range does not directly follow the previous one, we build the string and start a new one
+            addRangeString( *currentZippedRange );
+            currentZippedRange = std::make_pair( range.start, rangeEnd );
+          }
+        }
+
+        if ( rangesAdded >= maxRanges ) {
+          MIL << _easyHandle << " " << "Reached max nr of ranges (" << maxRanges << "), batching the request to not break the server" << std::endl;
+          break;
+        }
+      }
+
+      // add the last range too
+      if ( currentZippedRange )
+        addRangeString( *currentZippedRange );
+
+      MIL << _easyHandle << " " << "Requesting Ranges: " << rangeDesc << std::endl;
+
+      setCurlOption( CURLOPT_RANGE, rangeDesc.c_str() );
+    }
+
+    return true;
+  }
+
+  bool NetworkRequestPrivate::hasMoreWork() const
+  {
+    // check if we have ranges that have never been requested
+    return std::any_of( _requestedRanges.begin(), _requestedRanges.end(), []( const auto &range ){ return range._rangeState == NetworkRequest::Pending; });
+  }
+
+  void NetworkRequestPrivate::aboutToStart( )
+  {
+    bool isRangeContinuation = std::holds_alternative<prepareNextRangeBatch_t>( _runningMode );
+    if ( isRangeContinuation ) {
+      MIL << _easyHandle << " " << "Continuing a previously started range batch." << std::endl;
+      _runningMode = running_t( std::move(std::get<prepareNextRangeBatch_t>( _runningMode )) );
+    } else {
+      auto mode = running_t( std::move(std::get<pending_t>( _runningMode )) );
+      if ( _requestedRanges.size() == 1 && _requestedRanges.front().start == 0 && _requestedRanges.front().len == 0 )
+        mode._currentRange = 0;
+
+      _runningMode = std::move(mode);
+    }
 
     auto &m = std::get<running_t>( _runningMode );
 
     if ( m._activityTimer ) {
+      DBG_MEDIA << _easyHandle << " Setting activity timeout to: " << _settings.timeout() << std::endl;
       m._activityTimer->connect( &Timer::sigExpired, *this, &NetworkRequestPrivate::onActivityTimeout );
       m._activityTimer->start( static_cast<uint64_t>( _settings.timeout() * 1000 ) );
     }
 
-    _sigStarted.emit( *z_func() );
+    if ( !isRangeContinuation )
+      _sigStarted.emit( *z_func() );
+  }
+
+  void NetworkRequestPrivate::dequeueNotify()
+  {
+    if ( std::holds_alternative<running_t>(_runningMode) ) {
+      auto &rmode = std::get<running_t>( _runningMode );
+      // if we still have a current range set it valid by checking the checksum
+      if ( rmode._currentRange >= 0 ) {
+        auto &currR = _requestedRanges[rmode._currentRange];
+        rmode._currentRange = -1;
+        validateRange( currR );
+      }
+    }
   }
 
   void NetworkRequestPrivate::setResult( NetworkRequestError &&err )
@@ -480,19 +631,11 @@ namespace zyppng {
       resState._contentLenght = rmode._contentLenght;
 
       if ( resState._result.type() == NetworkRequestError::NoError && !(_options & NetworkRequest::HeadRequest) && !(_options & NetworkRequest::ConnectionTest) ) {
-
-        // check if the current range is a open range, if it is set it valid by checking the checksum
-        if ( rmode._currentRange >= 0 ) {
-          auto &currR = _requestedRanges[rmode._currentRange];
-          rmode._currentRange = -1;
-          validateRange( currR );
-        }
-
         //we have a successful download lets see if we got everything we needed
         for ( const auto &r : _requestedRanges ) {
-          if ( !r._valid ) {
+          if ( r._rangeState != NetworkRequest::Finished ) {
             if ( r.len > 0 && r.bytesWritten != r.len )
-              resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::MissingData, (zypp::str::Format("Did not receive all requested data from the server.") ) );
+              resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::MissingData, (zypp::str::Format("Did not receive all requested data from the server ( off: %1%, req: %2%, recv: %3% ).") % r.start % r.len % r.bytesWritten ) );
             else if ( r._digest && r._checksum.size() && ! checkIfRangeChkSumIsValid(r) )  {
               resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::InvalidChecksum, (zypp::str::Format("Invalid checksum %1%, expected checksum %2%") % r._digest->digest() % zypp::Digest::digestVectorToString( r._checksum ) ) );
             } else {
@@ -513,13 +656,18 @@ namespace zyppng {
   {
     _protocolMode = ProtocolMode::Default;
     _headers.reset( nullptr );
-    _originalError.reset();
     _errorBuf.fill( 0 );
     _runningMode = pending_t();
+    std::for_each( _requestedRanges.begin (), _requestedRanges.end(), []( auto &range ) {
+        range._rangeState = NetworkRequest::Pending;
+    });
   }
 
-  void NetworkRequestPrivate::onActivityTimeout( Timer & )
+  void NetworkRequestPrivate::onActivityTimeout( Timer &t )
   {
+    auto &m = std::get<running_t>( _runningMode );
+
+    MIL_MEDIA << _easyHandle << " Request timeout interval: " << t.interval()<< " remaining: " << t.remaining() <<  std::endl;
     std::map<std::string, boost::any> extraInfo;
     extraInfo.insert( {"requestUrl", _url } );
     extraInfo.insert( {"filepath", _targetFile } );
@@ -529,32 +677,45 @@ namespace zyppng {
   bool NetworkRequestPrivate::checkIfRangeChkSumIsValid ( const NetworkRequest::Range &rng )
   {
     if ( rng._digest && rng._checksum.size() ) {
+      auto bytesHashed = rng._digest->bytesHashed ();
+      if ( rng._chksumPad && *rng._chksumPad > bytesHashed ) {
+        MIL_MEDIA << _easyHandle << " " << "Padding the digest to required block size" << std::endl;
+        zypp::ByteArray padding( *rng._chksumPad - bytesHashed, '\0' );
+        rng._digest->update( padding.data(), padding.size() );
+      }
       auto digVec = rng._digest->digestVector();
       if ( rng._relevantDigestLen ) {
         digVec.resize( *rng._relevantDigestLen );
       }
       return ( digVec == rng._checksum );
     }
-    return false;
+
+    // no checksum required
+    return true;
   }
 
   void NetworkRequestPrivate::validateRange( NetworkRequest::Range &rng )
   {
     if ( rng._digest && rng._checksum.size() ) {
-      rng._valid = checkIfRangeChkSumIsValid(rng);
+      if ( ( rng.len == 0 || rng.bytesWritten == rng.len ) && checkIfRangeChkSumIsValid(rng) )
+        rng._rangeState = NetworkRequest::Finished;
+      else
+        rng._rangeState = NetworkRequest::Error;
     } else {
-      rng._valid = rng.len == 0 ? true : rng.bytesWritten == rng.len;
+      if ( rng.len == 0 ? true : rng.bytesWritten == rng.len )
+        rng._rangeState = NetworkRequest::Finished;
+      else
+        rng._rangeState = NetworkRequest::Error;
     }
   }
 
-  bool NetworkRequestPrivate::parseContentRangeHeader(const boost::string_view &line, size_t &start, size_t &len )
-  {
-    static const zypp::str::regex regex("^Content-Range:[[:space:]]+bytes[[:space:]]+([0-9]+)-([0-9]+)\\/([0-9]+)$");
+  bool NetworkRequestPrivate::parseContentRangeHeader(const std::string_view &line, size_t &start, size_t &len )
+  {                                     //content-range: bytes 10485760-19147879/19147880
+    static const zypp::str::regex regex("^Content-Range:[[:space:]]+bytes[[:space:]]+([0-9]+)-([0-9]+)\\/([0-9]+)$", zypp::str::regex::rxdefault | zypp::str::regex::icase );
 
     zypp::str::smatch what;
-    if( !zypp::str::regex_match( line.to_string(), what, regex ) || what.size() != 4 ) {
-      DBG << "Invalid Content-Range Header format: '" << line.to_string() << std::endl;
-      _originalError = "Invalid Content-Range header format.";
+    if( !zypp::str::regex_match( std::string(line), what, regex ) || what.size() != 4 ) {
+      DBG << _easyHandle << " " << "Invalid Content-Range Header format: '" << std::string(line) << std::endl;
       return false;
     }
 
@@ -565,12 +726,12 @@ namespace zyppng {
     return true;
   }
 
-  bool NetworkRequestPrivate::parseContentTypeMultiRangeHeader(const boost::string_view &line, std::string &boundary)
+  bool NetworkRequestPrivate::parseContentTypeMultiRangeHeader(const std::string_view &line, std::string &boundary)
   {
-    static const zypp::str::regex regex("^Content-Type:[[:space:]]+multipart\\/byteranges;[[:space:]]+boundary=(.*)$");
+    static const zypp::str::regex regex("^Content-Type:[[:space:]]+multipart\\/byteranges;[[:space:]]+boundary=(.*)$", zypp::str::regex::rxdefault | zypp::str::regex::icase );
 
     zypp::str::smatch what;
-    if( zypp::str::regex_match( line.to_string(), what, regex )  ) {
+    if( zypp::str::regex_match( std::string(line), what, regex )  ) {
       if ( what.size() >= 2 ) {
         boundary = what[1];
         return true;
@@ -581,9 +742,6 @@ namespace zyppng {
 
   std::string NetworkRequestPrivate::errorMessage() const
   {
-    if ( _originalError )
-      return *_originalError;
-
     return std::string( _errorBuf.data() );
   }
 
@@ -603,7 +761,7 @@ namespace zyppng {
     NetworkRequestPrivate *that = reinterpret_cast<NetworkRequestPrivate *>( clientp );
 
     if ( !std::holds_alternative<running_t>(that->_runningMode) ){
-      DBG_MEDIA << "Curl progress callback was called in invalid state "<< that->z_func()->state() << std::endl;
+      DBG << that->_easyHandle << " " << "Curl progress callback was called in invalid state "<< that->z_func()->state() << std::endl;
       return -1;
     }
 
@@ -632,54 +790,74 @@ namespace zyppng {
 
     if ( _protocolMode == ProtocolMode::HTTP ) {
 
-      boost::string_view hdr( ptr, size*nmemb );
+      std::string_view hdr( ptr, size*nmemb );
 
       hdr.remove_prefix( std::min( hdr.find_first_not_of(" \t\r\n"), hdr.size() ) );
       const auto lastNonWhitespace = hdr.find_last_not_of(" \t\r\n");
       if ( lastNonWhitespace != hdr.npos )
         hdr.remove_suffix( hdr.size() - (lastNonWhitespace + 1) );
       else
-        hdr.clear();
-
-      DBG_MEDIA << "Received header: " << hdr << std::endl;
+        hdr = std::string_view();
 
       auto &rmode = std::get<running_t>( _runningMode );
-      if ( hdr.starts_with("HTTP/") ) {
+      if ( !hdr.size() ) {
+        return ( size * nmemb );
+      }
+      if ( zypp::strv::hasPrefixCI( hdr, "HTTP/" ) ) {
 
         long statuscode = 0;
         (void)curl_easy_getinfo( _easyHandle, CURLINFO_RESPONSE_CODE, &statuscode);
 
-        // ignore other status codes, maybe we are redirected etc.
-        if ( statuscode >= 200 && statuscode <= 299 ) {
-          if ( rmode._requireStatusPartial && statuscode != 206 ) {
-            _originalError = "Expected range status code 206, but got none.";
-            return 0;
+        const auto &doRangeFail = [&](){
+          WAR << _easyHandle << " " << "Range FAIL, trying with a smaller batch" << std::endl;
+          rmode._cachedResult = NetworkRequestErrorPrivate::customError(  NetworkRequestError::RangeFail,  "Expected range status code 206, but got none." );
+
+          // reset all ranges we requested to pending, we never got the data for them
+          std::for_each( _requestedRanges.begin (), _requestedRanges.end(), []( auto &range ) {
+            if ( range._rangeState == NetworkRequest::Running )
+              range._rangeState = NetworkRequest::Pending;
+          });
+          return 0;
+        };
+
+        // if we have a status 204 we need to create a empty file
+        if( statuscode == 204 && !( _options & NetworkRequest::ConnectionTest ) && !( _options & NetworkRequest::HeadRequest ) )
+          assertOutputFile();
+
+        if ( rmode._requireStatusPartial ) {
+          // ignore other status codes, maybe we are redirected etc.
+          if ( ( statuscode >= 200 && statuscode <= 299 && statuscode != 206 )
+                || statuscode == 416 ) {
+              return doRangeFail();
           }
         }
-      } else if ( hdr.starts_with( "Location:" ) ) {
-        _lastRedirect = hdr.substr( 9 ).to_string();
-        DBG << "redirecting to " << _lastRedirect << std::endl;
 
-      } else if ( hdr.starts_with("Content-Type:") ) {
+      } else if ( zypp::strv::hasPrefixCI( hdr, "Location:" ) ) {
+        _lastRedirect = hdr.substr( 9 );
+        DBG << _easyHandle << " " << "redirecting to " << _lastRedirect << std::endl;
+
+      } else if ( zypp::strv::hasPrefixCI( hdr, "Content-Type:") ) {
         std::string sep;
         if ( parseContentTypeMultiRangeHeader( hdr, sep ) ) {
           rmode._gotMultiRangeHeader = true;
           rmode._seperatorString = "--"+sep;
         }
-      } else if ( hdr.starts_with("Content-Range:") ) {
+      } else if ( zypp::strv::hasPrefixCI( hdr, "Content-Range:") ) {
         NetworkRequest::Range r;
-        if ( !parseContentRangeHeader( hdr, r.start, r.len) )
+        if ( !parseContentRangeHeader( hdr, r.start, r.len) ) {
+          rmode._cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Invalid Content-Range header format." );
           return 0;
-        DBG_MEDIA << "Got content range :" << r.start << " len " << r.len << std::endl;
+        }
+        DBG << _easyHandle << " " << "Got content range :" << r.start << " len " << r.len << std::endl;
         rmode._gotContentRangeHeader = true;
         rmode._currentSrvRange = r;
 
-      } else if ( hdr.starts_with("Content-Length:") )  {
+      } else if ( zypp::strv::hasPrefixCI( hdr, "Content-Length:") )  {
         auto lenStr = str::trim( hdr.substr( 15 ), zypp::str::TRIM );
         auto str = std::string ( lenStr.data(), lenStr.length() );
         auto len = zypp::str::strtonum<typename zypp::ByteCount::SizeType>( str.data() );
         if ( len > 0 ) {
-          DBG_MEDIA << "Got Content-Length Header: " << len << std::endl;
+          DBG << _easyHandle << " " << "Got Content-Length Header: " << len << std::endl;
           rmode._contentLenght = zypp::ByteCount(len, zypp::ByteCount::B);
         }
       }
@@ -708,33 +886,19 @@ namespace zyppng {
     auto writeDataToFile = [ this, &rmode ]( off_t offset, const char *data, size_t len ) -> off_t {
 
       if ( rmode._currentRange < 0 ) {
-        DBG_MEDIA << "Current range is zero in write request" << std::endl;
+        DBG << _easyHandle << " " << "Current range is zero in write request" << std::endl;
         return 0;
       }
 
       // if we have no open file create or open it
-      if ( !rmode._outFile ) {
-        std::string openMode = "w+b";
-        if ( _fMode == NetworkRequest::WriteShared )
-          openMode = "r+b";
-
-        rmode._outFile = fopen( _targetFile.asString().c_str() , openMode.c_str() );
-
-        //if the file does not exist create a new one
-        if ( !rmode._outFile && _fMode == NetworkRequest::WriteShared ) {
-          rmode._outFile = fopen( _targetFile.asString().c_str() , "w+b" );
-        }
-
-        if ( !rmode._outFile ) {
-          _originalError = zypp::str::Format("Unable to open target file (%1%). Errno: (%2%:%3%)") % _targetFile.asString() % errno % strerr_cxx();
-          return 0;
-        }
-      }
+      if ( !assertOutputFile() )
+        return 0;
 
       // seek to the given offset
       if ( offset >= 0 ) {
         if ( fseek( rmode._outFile, offset, SEEK_SET ) != 0 ) {
-          _originalError = "Unable to set output file pointer.";
+          rmode._cachedResult = NetworkRequestErrorPrivate::customError(  NetworkRequestError::InternalError,
+            "Unable to set output file pointer." );
           return 0;
         }
       }
@@ -744,7 +908,7 @@ namespace zyppng {
 
       //make sure we do not write after the expected file size
       if ( _expectedFileSize && _expectedFileSize <= static_cast<zypp::ByteCount::SizeType>(rng.start + rng.bytesWritten + bytesToWrite) ) {
-        _originalError = "Downloaded data exceeds expected length.";
+        rmode._cachedResult = NetworkRequestErrorPrivate::customError(  NetworkRequestError::InternalError, "Downloaded data exceeds expected length." );
         return 0;
       }
 
@@ -795,13 +959,15 @@ namespace zyppng {
 
           if ( rmode._requireStatusPartial ) {
             //we got a invalid response, the status code pointed to being partial but we got no range definition
-            _originalError = "Invalid data from server, range respone was announced but there was no range definiton.";
+            rmode._cachedResult = NetworkRequestErrorPrivate::customError(  NetworkRequestError::ServerReturnedError,
+              "Invalid data from server, range respone was announced but there was no range definiton." );
             return 0;
           }
 
           //we always download a range even if it is not explicitly requested
           if ( _requestedRanges.empty() ) {
             _requestedRanges.push_back( NetworkRequest::Range() );
+            _requestedRanges.back()._rangeState = NetworkRequest::State::Running;
           }
 
           rmode._currentRange = 0;
@@ -823,7 +989,7 @@ namespace zyppng {
           const auto &currR = _requestedRanges[i];
 
           // do not allow double ranges
-          if ( currR._valid )
+          if ( currR._rangeState == NetworkRequest::Finished || currR._rangeState == NetworkRequest::Error )
             continue;
 
           // check if the range was already written
@@ -849,7 +1015,8 @@ namespace zyppng {
           }
         }
         if ( !foundRange ) {
-          _originalError = "Unable to find a matching range for data returned by the server.";
+          rmode._cachedResult = NetworkRequestErrorPrivate::customError(  NetworkRequestError::InternalError
+            , "Unable to find a matching range for data returned by the server." );
           return 0;
         }
 
@@ -886,7 +1053,7 @@ namespace zyppng {
         if ( rmode._currentSrvRange )
           continue;
 
-        boost::string_view incoming( ptr + bytesWrittenSoFar, max - bytesWrittenSoFar );
+        std::string_view incoming( ptr + bytesWrittenSoFar, max - bytesWrittenSoFar );
         auto hdrEnd = incoming.find("\r\n\r\n");
         if ( hdrEnd == incoming.npos ) {
           //no header end in the data yet, push to buffer and return
@@ -898,23 +1065,23 @@ namespace zyppng {
         rmode._rangePrefaceBuffer.insert( rmode._rangePrefaceBuffer.end(), incoming.begin(), incoming.begin() + ( hdrEnd + 4 )  );
         bytesWrittenSoFar += ( hdrEnd + 4 ); //header data plus header end
 
-        boost::string_view data( rmode._rangePrefaceBuffer.data(), rmode._rangePrefaceBuffer.size() );
+        std::string_view data( rmode._rangePrefaceBuffer.data(), rmode._rangePrefaceBuffer.size() );
         auto sepStrIndex = data.find( rmode._seperatorString );
         if ( sepStrIndex == data.npos ) {
-          _originalError = "Invalid multirange header format, seperator string missing.";
+          rmode._cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError,
+            "Invalid multirange header format, seperator string missing." );
           return 0;
         }
 
         auto startOfHeader = sepStrIndex + rmode._seperatorString.length();
-
-        std::vector<boost::string_view> lines;
-        str::split( data.substr( startOfHeader ), std::back_inserter(lines), "\r\n", zypp::str::TRIM );
+        std::vector<std::string_view> lines;
+        zypp::strv::split( data.substr( startOfHeader ), "\r\n", zypp::strv::Trim::trim, [&]( std::string_view strv ) { lines.push_back(strv); } );
         for ( const auto &hdrLine : lines ) {
-          if ( hdrLine.starts_with("Content-Range:") ) {
+          if ( zypp::strv::hasPrefixCI(hdrLine, "Content-Range:") ) {
             NetworkRequest::Range r;
             //if we can not parse the header the message must be broken
             if(! parseContentRangeHeader( hdrLine, r.start, r.len ) ) {
-              WAR << "Broken header for Network Request to " << _url << std::endl;
+              rmode._cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Invalid Content-Range header format." );
               return 0;
             }
             rmode._currentSrvRange = r;
@@ -971,13 +1138,13 @@ namespace zyppng {
     return d_func()->_options;
   }
 
-  void NetworkRequest::addRequestRange( size_t start, size_t len, DigestPtr digest, CheckSumBytes expectedChkSum , std::any userData, std::optional<size_t> digestCompareLen  )
+  void NetworkRequest::addRequestRange( size_t start, size_t len, DigestPtr digest, CheckSumBytes expectedChkSum , std::any userData, std::optional<size_t> digestCompareLen, std::optional<size_t> chksumpad  )
   {
     Z_D();
     if ( state() == Running )
       return;
 
-    d->_requestedRanges.push_back( Range::make( start, len, std::move(digest), std::move( expectedChkSum ), std::move( userData ), digestCompareLen ) );
+    d->_requestedRanges.push_back( Range::make( start, len, std::move(digest), std::move( expectedChkSum ), std::move( userData ), digestCompareLen, chksumpad ) );
   }
 
   void NetworkRequest::addRequestRange( const NetworkRequest::Range &range )
@@ -986,7 +1153,12 @@ namespace zyppng {
     if ( state() == Running )
       return;
 
-     d->_requestedRanges.push_back( range );
+    d->_requestedRanges.push_back( range );
+    auto &rng = d->_requestedRanges.back();
+    rng._rangeState = NetworkRequest::Pending;
+    rng.bytesWritten = 0;
+    if ( rng._digest )
+      rng._digest->reset();
   }
 
   void NetworkRequest::resetRequestRanges()
@@ -1007,7 +1179,7 @@ namespace zyppng {
 
     std::vector<Range> failed;
     for ( const auto &r : d->_requestedRanges ) {
-      if ( !r._valid )
+      if ( r._rangeState != NetworkRequest::Finished )
         failed.push_back( r );
     }
     return failed;
@@ -1060,6 +1232,9 @@ namespace zyppng {
   {
     Z_D();
 
+    if ( !std::holds_alternative<NetworkRequestPrivate::running_t>( d->_runningMode) )
+      return {};
+
     const auto &rmode = std::get<NetworkRequestPrivate::running_t>( d->_runningMode );
     return peek_data_fd( rmode._outFile, offset, count );
   }
@@ -1114,9 +1289,9 @@ namespace zyppng {
 
   zypp::ByteCount NetworkRequest::reportedByteCount() const
   {
-    return std::visit([](auto&& arg) -> zypp::ByteCount {
+    return std::visit([](auto& arg) -> zypp::ByteCount {
       using T = std::decay_t<decltype(arg)>;
-      if constexpr (std::is_same_v<T, NetworkRequestPrivate::pending_t>)
+      if constexpr (std::is_same_v<T, NetworkRequestPrivate::pending_t> || std::is_same_v<T, NetworkRequestPrivate::prepareNextRangeBatch_t> )
         return zypp::ByteCount(0);
       else if constexpr (std::is_same_v<T, NetworkRequestPrivate::running_t>
                          || std::is_same_v<T, NetworkRequestPrivate::finished_t>)
@@ -1128,11 +1303,12 @@ namespace zyppng {
 
   zypp::ByteCount NetworkRequest::downloadedByteCount() const
   {
-    return std::visit([](auto&& arg) -> zypp::ByteCount {
+    return std::visit([](auto& arg) -> zypp::ByteCount {
       using T = std::decay_t<decltype(arg)>;
       if constexpr (std::is_same_v<T, NetworkRequestPrivate::pending_t>)
         return zypp::ByteCount();
       else if constexpr (std::is_same_v<T, NetworkRequestPrivate::running_t>
+                          || std::is_same_v<T, NetworkRequestPrivate::prepareNextRangeBatch_t>
                           || std::is_same_v<T, NetworkRequestPrivate::finished_t>)
         return arg._downloaded;
       else
@@ -1147,11 +1323,11 @@ namespace zyppng {
 
   NetworkRequest::State NetworkRequest::state() const
   {
-    return std::visit([this](auto&& arg) {
+    return std::visit([this](auto& arg) {
       using T = std::decay_t<decltype(arg)>;
       if constexpr (std::is_same_v<T, NetworkRequestPrivate::pending_t>)
         return Pending;
-      else if constexpr (std::is_same_v<T, NetworkRequestPrivate::running_t>)
+      else if constexpr (std::is_same_v<T, NetworkRequestPrivate::running_t> || std::is_same_v<T, NetworkRequestPrivate::prepareNextRangeBatch_t> )
         return Running;
       else if constexpr (std::is_same_v<T, NetworkRequestPrivate::finished_t>) {
         if ( std::get<NetworkRequestPrivate::finished_t>( d_func()->_runningMode )._result.isError() )
@@ -1218,4 +1394,5 @@ namespace zyppng {
   {
     return d_func()->_sigFinished;
   }
+
 }
index 29daa70..edd0505 100644 (file)
@@ -85,10 +85,12 @@ namespace zyppng {
       */
       CheckSumBytes _checksum;
       std::optional<size_t> _relevantDigestLen; //< If this is initialized , it defines how many bytes of the resulting checkum are compared
-      bool _valid = false;
+      std::optional<size_t> _chksumPad;   //< If initialized we need to pad the digest with zeros before calculating the final checksum
       std::any userData; //< Custom data the user can associate with the Range
 
-      static Range make ( size_t start, size_t len = 0, DigestPtr &&digest = nullptr, CheckSumBytes &&expectedChkSum = CheckSumBytes(), std::any &&userData = std::any(), std::optional<size_t> digestCompareLen = {} );
+      State _rangeState = State::Pending; //< Flag to know if this range has been already requested and if the request was successful
+
+      static Range make ( size_t start, size_t len = 0, DigestPtr &&digest = nullptr, CheckSumBytes &&expectedChkSum = CheckSumBytes(), std::any &&userData = std::any(), std::optional<size_t> digestCompareLen = {}, std::optional<size_t> _dataBlockPadding = {} );
     };
 
     struct Timings {
@@ -143,7 +145,7 @@ namespace zyppng {
      * Adds a new range to the requested range list, the ranges can not overlap
      * \note This will not change a running download
      */
-    void addRequestRange ( size_t start, size_t len = 0, DigestPtr digest = nullptr, CheckSumBytes expectedChkSum = CheckSumBytes(), std::any userData = std::any(), std::optional<size_t> digestCompareLen = {}  );
+    void addRequestRange ( size_t start, size_t len = 0, DigestPtr digest = nullptr, CheckSumBytes expectedChkSum = CheckSumBytes(), std::any userData = std::any(), std::optional<size_t> digestCompareLen = {}, std::optional<size_t> chksumpad = {}  );
 
     void addRequestRange ( const Range &range );
 
@@ -223,6 +225,8 @@ namespace zyppng {
     /**
      * Returns the number of bytes that are reported from the backend as the full download size, those can
      * be 0 even when the download is already running.
+     * \note When downloading ranges, the reported byte count could be reported just partially due to
+     *       range batching.
      */
     zypp::ByteCount reportedByteCount() const;
 
diff --git a/zypp-curl/parser/ZsyncParser b/zypp-curl/parser/ZsyncParser
new file mode 100644 (file)
index 0000000..f6461d4
--- /dev/null
@@ -0,0 +1 @@
+#include "zsyncparser.h"
index 86e450c..53f4fbf 100644 (file)
@@ -6,9 +6,97 @@
 |                         /_____||_| |_| |_|                           |
 |                                                                      |
 \---------------------------------------------------------------------*/
-/** \file zypp-curl/parser/mediablocklist.cc
- *
- */
+/**
+  \file zypp-curl/parser/mediablocklist.cc
+
+  This file implements the delta file block reuse algorithm. If the available hashes use rolling checksum style
+  hashes, we use the zsync algorithm to search for blocks that are available.
+
+  The basic idea of zsync is that on the server side a metadata file is generated, this file contains a list of checksums
+  for each block in the target file ( the file we want to download ) as well as some other important informations
+  like the size of the blocks, file checksum and mirrors. The client ( we ) then can use a delta file, basically
+  a older version of the file we want to download, to find reusable blocks identified by their checksum.
+
+  A simple approach would be now to calculate all checksums in the delta file for each block, but that does not take into
+  account that the blocks we want to reuse have moved in the file, e.g. a new set bytes of data was put in the beginning
+  of the file, shifting all blocks to a new offset most likely not as a multiple of blocksize or worse not even a power of 2.
+  Think a block is 2k but the data inserted is only 200 bytes, offsetting all blocks for 200bytes, in that case the simple approach could not reuse a single block
+  of data because it can't find them.
+
+  To work around this problem the code calculates the checksums on every possible byte offset of the delta file. To speed this process
+  up when finding a block we skip forward to the end of the block. If there is a match at x, its very unlikely to find another match starting
+  inside the boundaries of the current block ( between x and x + blocksize - 1 ), except if the file has a lot of redundancy.
+
+  This process naturally can take very long if there are no, or just a few matching blocks in the two files. To speed this up
+  a multi step checksum process is used. First we calculate a very cheap to calculate weak checksum for each block based on
+  the Adler-32 checksum:
+
+  \f[
+    a(k,l) = (\sum_{i=k}^l X_i) \bmod M
+  \f]
+  \f[
+    \begin{align}
+    b(k,l) &= (\sum_{i=k}^l (l-i+1)X_i) \bmod M \\
+           &= (\sum_{i=k}^l a(k,i) ) \bmod M
+    \end{align}
+  \f]
+  \f[
+    s(k,l) = a(k,l) + 2^{16} b(k,l)
+  \f]
+
+  where \f$s(k, l)\f$ is the rolling checksum of the bytes \f$X_k \ldots X_l\f$. For simplicity and speed, we use \f$M = 2^{16}\f$.
+
+  The important property of this checksum is that successive values can be computed very efficiently using recurrence relations:
+  \f[
+    a(k+1,l+1) = (a(k,l) - X_k + X_{l+1}) \bmod M
+  \f]
+  \f[
+    b(k+1,l+1) = (b(k,l) - (l-k+1) X_k + a(k+1,l+1)) \bmod M
+  \f]
+
+  To understand why we can use recurrence relations its important to look at the formulas written out
+  for a simple example, we will ignore the modulo operation for simplicity:
+
+  For the \a a formula is simple to see that we just need to subtract the value of the byte moving out of the block and add the
+  value of the new byte coming in at the end
+  \f[
+    \begin{align}
+    a(0,2) &= X_0 + X_1 + X_2  \\
+    a(1,3) &= a(0,2) - X_0 + X_3  \\
+           &= X_0 + X_1 + X_2 - X_0 + X_3  \\
+           &= X_1 + X_2 + X_3
+    \end{align}
+  \f]
+
+  The \a b part is a bit more complex, writing the formula out also shows us why \a b can be expressed as: \f$b=(\sum_{i=k}^l a(k,i) ) \bmod M\f$:
+  \f[
+    \begin{align}
+    b(0,2) &= 3X_0 + 2X_1 + X_2 \\
+           &= X_0 + X_0 +X_0 + X_1 + X_1 + X_2 \\
+           &= X0 + X0 + X1 + X0 +X1 +X2 \\
+           &= a(0,0) + a(0,1) + a(0,2) = (\sum_{i=k}^l a(k,i) )
+    \end{align}
+  \f]
+  \f[
+    \begin{align}
+    b(1,3) &= b(0,2) - (2-0+1)X_0 + a(1,3) \\
+           &= b(0,2) - 3X_0 + a(1,3) \\
+           &= 3X_0 + 2X_1 + X_2 - 3X_0 + X_1 + X_2 + X_3 \\
+           &= 3X_1 + 2X_2 + X_3
+    \end{align}
+  \f]
+
+  This shows us that we can very quickly calculate the new checksum of a block at offset \a i+1 based on the checksum of the block at offset \a i.
+
+  If the weak checksum matches, a stronger MD4 checksum is calculated for the same block to make sure we really got the block we wanted. If the strong checksum
+  matches as well the block is written to the target file and removed from the list of blocks we still need to find. The read offset then jumps to the end
+  of the current bock: \a offset+blocksize and continues the process from there.
+
+  Zsync additionally can require that always a sequence of 2 neighboring blocks need to match before they are considered a match. This depends on the filesize and is specified in the zsync metadata file.
+  According to the zsync docs this greatly lowers the probability of a false match and allows to send smaller checksums for the blocks, minimizing the data we need to download in the meta datafile.
+
+  More in depth docs can be found at http://zsync.moria.org.uk/paper and https://rsync.samba.org/tech_report
+*/
 
 #include "mediablocklist.h"
 
 
 #include <zypp-core/base/Logger.h>
 #include <zypp-core/base/String.h>
+#include <zypp-core/AutoDispose.h>
+#include <zypp-core/base/Exception.h>
 
 using namespace zypp::base;
 
 namespace zypp {
   namespace media {
 
+    namespace {
+
+      struct rsum {
+        unsigned short a = 0;
+        unsigned short b = 0;
+      } __attribute__((packed));
+
+      /* rcksum_calc_rsum_block(data, data_len)
+      * Calculate the rsum for a single block of data. */
+      rsum rcksum_calc_rsum_block(const unsigned char *data, size_t len) {
+        unsigned short a = 0;
+        unsigned short b = 0;
+
+        while (len) {
+            unsigned char c = *data++;
+            a += c;
+            b += len * c;
+            len--;
+        }
+        return rsum{ a, b };
+      }
+
+      // update the rsum by removing the old and adding the new char
+      #define UPDATE_RSUM(a, b, oldc, newc, bshift) do { (a) += ((unsigned char)(newc)) - ((unsigned char)(oldc)); (b) += (a) - ((oldc) << (bshift)); } while (0)
+
+      /**
+       * Zsync uses a different rsum length based on the blocksize, since we always calculate the big
+       * checksum we need to cut off the bits we are not interested in
+       */
+      void inline truncateRsum ( unsigned int &rs, const int rsumlen )
+      {
+        switch(rsumlen)
+        {
+        case 3:
+          rs &= 0xffffff;
+          break;
+        case 2:
+          rs &= 0xffff;
+          break;
+        case 1:
+          rs &= 0xff;
+          break;
+        default:
+          break;
+        }
+      }
+
+    }
+
 MediaBlockList::MediaBlockList(off_t size)
-{
-  filesize = size;
-  haveblocks = false;
-  chksumlen = 0;
-  chksumpad = 0;
-  rsumlen = 0;
-  rsumpad = 0;
-}
+: filesize(size),
+  haveblocks(false),
+  chksumlen(0),
+  chksumpad(0),
+  rsumlen(0),
+  rsumseq(0),
+  rsumpad(0)
+}
 
 size_t
 MediaBlockList::addBlock(off_t off, size_t size)
@@ -120,6 +259,12 @@ MediaBlockList::setRsum(size_t blkno, int rsl, unsigned int rs, size_t rspad)
   rsums.push_back(rs);
 }
 
+void
+MediaBlockList::setRsumSequence( uint seq )
+{
+  rsumseq = seq;
+}
+
 bool
 MediaBlockList::createDigest(Digest &digest) const
 {
@@ -151,6 +296,7 @@ MediaBlockList::updateRsum(unsigned int rs, const char* bytes, size_t len) const
 {
   if (!len)
     return rs;
+
   unsigned short s, m;
   s = (rs >> 16) & 65535;
   m = rs & 65535;
@@ -179,17 +325,7 @@ MediaBlockList::verifyRsum(size_t blkno, unsigned int rs) const
       m += s * (rsumpad - size);
       rs = (s & 65535) << 16 | (m & 65535);
     }
-  switch(rsumlen)
-    {
-    case 3:
-      rs &= 0xffffff;
-    case 2:
-      rs &= 0xffff;
-    case 1:
-      rs &= 0xff;
-    default:
-      break;
-    }
+  truncateRsum( rs, rsumlen );
   return rs == rsums[blkno];
 }
 
@@ -229,6 +365,11 @@ std::string MediaBlockList::getChecksumType() const
   return chksumtype;
 }
 
+size_t MediaBlockList::checksumPad() const
+{
+  return chksumpad;
+}
+
 // specialized version of checkChecksum that can deal with a "rotated" buffer
 bool
 MediaBlockList::checkChecksumRotated(size_t blkno, const unsigned char *buf, size_t bufl, size_t start) const
@@ -295,14 +436,350 @@ fetchnext(FILE *fp, unsigned char *bp, size_t blksize, size_t pushback, unsigned
   return blksize - l;
 }
 
+void MediaBlockList::reuseBlocks(FILE *wfp, std::string filename)
+{
 
-void
-MediaBlockList::reuseBlocks(FILE *wfp, std::string filename)
+  zypp::AutoFILE fp;
+
+  if ( !chksumlen ) {
+    DBG << "Delta XFER: Can not reuse blocks because we have no chksumlen" << std::endl;
+    return;
+  }
+
+  if ( (fp = fopen(filename.c_str(), "r")) == 0 ) {
+    DBG << "Delta XFER: Can not reuse blocks, unable to open file "<< filename << std::endl;
+    return;
+  }
+
+  size_t nblks = blocks.size();
+  std::vector<bool> found( nblks + 1 );
+  if (rsumlen && !rsums.empty()) {
+
+      const auto rsumAMask = rsumlen < 3 ? 0 : rsumlen == 3 ? 0xff : 0xffff;
+
+      // we are building a array of rsum structs to directly access a and b parts of the checksum
+      // we make the array bigger so that the code calculating the rsum hashes does not need to care
+      // about the array size
+      // @TODO move that to the function adding new rsums when removing the old code
+      auto zsyncRsumsData = std::make_unique<rsum[]>( rsums.size() + rsumseq );
+      auto zsyncRsums = zsyncRsumsData.get();
+      for ( std::size_t i = 0; i < rsums.size(); i++ ) {
+        const auto &rs = rsums[i];
+        unsigned short s, m;
+        s = (rs >> 16) & 65535;
+        m = rs & 65535;
+        zsyncRsums[i] = rsum{ s, m };
+      }
+
+      // we use the same code as zsync to calc the hash
+      const auto & calc_rhash = [&]( const rsum* e ) -> unsigned {
+        unsigned h = e[0].b;
+        if ( this->rsumseq > 1 ) {
+          for ( uint i = 1; i < rsumseq; i++ ) {
+            h ^= e[i].b << 3;
+          }
+        } else {
+          h ^= ( e[0].a & rsumAMask ) << 3;
+        }
+        return h;
+      };
+
+      size_t blksize = blocks[0].size;
+      if (nblks == 1 && rsumpad && rsumpad > blksize)
+        blksize = rsumpad;
+
+      // create hash of checksums
+      // build the hashtable
+      uint rsumHashMask;
+      {
+        int i = 16;
+
+        /* Try hash size of 2^i; step down the value of i until we find a good size */
+        while ((2 << (i - 1)) > nblks && i > 4)
+          i--;
+
+        /* Allocate hash based on rsum */
+        rsumHashMask = (2 << i) - 1;
+      }
+
+      // a array indexed via hash with lists of blocks resulting in the same rsum hash
+      auto rsumHashTableData = std::make_unique<std::vector<size_t>[]>( rsumHashMask + 1 );
+      auto rsumHashTable = rsumHashTableData.get();
+
+      // Now fill in the hash tables.
+      for ( size_t id = 0; id < nblks; id++) {
+        const auto hash = calc_rhash( &zsyncRsums[id] );
+        auto &hashList = rsumHashTable[ hash & rsumHashMask ];
+        hashList.push_back(id);
+      }
+
+      // we read in 16 sequences at once to speed up processing
+      constexpr auto BLOCKCNT = 16;
+
+      // we allocate the buffer so that we always have the data to verify 16 blocks, if we need to do
+      // sequence matching we grow the buffer accordingly
+      const auto readBufSize = blksize * rsumseq * BLOCKCNT;
+
+      // buffer thats going to hold our cached data
+      auto readBufData = std::make_unique<unsigned char[]>( readBufSize );
+      memset(readBufData.get(), 0, blksize);
+
+      // avoid using .get() all the time
+      auto readBuf = readBufData.get();
+
+      // our running checksums for the blocks we need to match in sequence
+      auto seqRsumsData = std::make_unique<rsum[]> ( rsumseq );
+      auto seqRsums = seqRsumsData.get();
+
+      // use byteshift instead of multiplication if the blksize is a power of 2
+      // a value is a power of 2 if  ( N & N-1 ) == 0
+      int bshift = 0; // how many bytes do we need to shift
+      if ((blksize & (blksize - 1)) == 0)
+        for (bshift = 0; size_t(1 << bshift) != blksize; bshift++)
+          ;
+
+      bool init = true;
+      // when we are in a run of matches, we remember which block ID would need to match next in order
+      // to continue writing
+      std::optional<size_t> nextReqMatchInSequence;
+      off_t dataOffset = 0; //< Our current read offset in the buffer
+      off_t dataLen = 0;    //< The length of our read buffer
+
+      // helper lambda that follows a list of hashmap entries and tries to write those that match
+      const auto &tryWriteMatchingBlocks  = [&]( const std::vector<size_t> &list, const u_char *currBuf, uint reqMatches ){
+        // the number of blocks we have transferred to the target file
+        int targetBlocksWritten = 0;
+
+        // reset the next match hint
+        nextReqMatchInSequence.reset();
+
+        for ( const auto blkno : list ) {
+
+          if ( found[blkno] )
+              continue;
+
+          const auto blockRsum = &zsyncRsums[blkno];
+
+          uint weakMatches = 0;
+
+          // first check only the current block, we maybe can skip checking the others
+          // if we are in a run of matches
+          if ( (seqRsums[0].a & rsumAMask) != blockRsum[0].a ||
+               seqRsums[0].b != blockRsum[0].b )
+            continue;
+
+          weakMatches++;
+
+          for ( uint i = 1; i < reqMatches; i++ ) {
+            if ( (seqRsums[i].a & rsumAMask) != blockRsum[i].a ||
+                 seqRsums[i].b != blockRsum[i].b )
+              break;
+            weakMatches++;
+          }
+
+          if ( weakMatches < reqMatches )
+            continue;
+
+          // we have a weak match, now we need to calc the checksums for the blocks
+          uint realMatches = 0;
+          for( uint i = 0; i < reqMatches; i++ ) {
+            if ( !checkChecksum(blkno + i, currBuf + ( i * blksize ), blksize ) ) {
+              break;
+            }
+            realMatches++;
+          }
+
+          // check if we have the amount of matches we need ( only 1 if we are in a block sequence )
+          if( realMatches < reqMatches )
+            continue;
+
+          // we found blocks that match , write them to target but keep searching the hashmap
+          // in case we have redundancies
+          const auto nextPossibleMatch = blkno + realMatches;
+          if ( !found[nextPossibleMatch] )
+            nextReqMatchInSequence = nextPossibleMatch; // remember that we are currently in a run of matches, next iteration we just need to look at one block
+
+          for( uint i = 0; i < realMatches; i++ ) {
+            writeBlock( blkno + i, wfp, currBuf + ( i * blksize ), blksize, 0, found );
+            targetBlocksWritten++;
+          }
+        }
+        return targetBlocksWritten;
+      };
+
+      if (!rsumseq)
+        rsumseq = nblks > 1 && chksumlen < 16 ? 2 : 1;
+
+      const off_t seqMatchLen = ( blksize * rsumseq ); //< how many bytes do we need to match when searching a block
+
+      while (! feof(fp) ) {
+          if ( init ) {
+            // fill the buffer for the first time
+            dataLen = fread( readBuf, 1, readBufSize, fp );
+            init = false;
+          } else {
+            // move the remaining data to the begin and read from the file to fill up the buffer again
+            const auto remainLen = dataLen-dataOffset;
+            if ( remainLen )
+              memmove( readBuf, readBuf+dataOffset, remainLen );
+
+            dataLen = fread( readBuf+remainLen, 1, readBufSize-remainLen, fp );
+            dataLen += remainLen;
+            dataOffset = 0;
+          }
+
+          // if we hit eof, pad with zeros
+          if ( feof(fp) ) {
+            memset( readBuf + dataLen, 0, readBufSize - dataLen );
+            dataLen = readBufSize;
+          }
+
+          if ( dataLen < seqMatchLen )
+            return;
+
+          // intialize our first set of checksums
+          for( uint i = 0; i < rsumseq; i++ )
+            seqRsums[i] = rcksum_calc_rsum_block( readBuf + ( i * blksize ), blksize );
+
+          //read over the buffer we have allocated so far
+          while ( true ) {
+
+            if ( dataOffset + seqMatchLen > dataLen )
+              break;
+
+            u_char *currBuf = readBuf + dataOffset;
+
+            // the number of deltafile blocks we have matched, e.g. how much blocks
+            // can we skip forward
+            uint deltaBlocksMatched = 0;
+
+            if ( nextReqMatchInSequence.has_value() ) {
+              if ( tryWriteMatchingBlocks( { *nextReqMatchInSequence }, currBuf, 1 ) > 0 )
+                deltaBlocksMatched = 1;
+
+            } else {
+              const auto hash = calc_rhash( seqRsums );
+
+              // reference to the list of blocks that share our calculated hash
+              auto &blockListForHash = rsumHashTable[ hash & rsumHashMask ];
+              if ( blockListForHash.size() ) {
+                if ( tryWriteMatchingBlocks( blockListForHash, currBuf, rsumseq ) > 0 )
+                  deltaBlocksMatched = rsumseq;
+              }
+            }
+
+            if ( deltaBlocksMatched > 0 ) {
+              // we jump forward in the buffer to after what we matched
+              dataOffset += ( deltaBlocksMatched * blksize );
+
+              if ( dataOffset + seqMatchLen > dataLen )
+                break;
+
+              if ( deltaBlocksMatched < rsumseq ) {
+                //@TODO move the rsums we already have
+              }
+
+              for( uint i = 0; i < rsumseq; i++ )
+                seqRsums[i] = rcksum_calc_rsum_block( readBuf + dataOffset + ( i * blksize ), blksize );
+
+
+            } else {
+              // we found nothing advance the window by one byte and update the rsums
+              dataOffset++;
+              if ( dataOffset + seqMatchLen > dataLen )
+                break;
+              for ( uint i = 0; i < rsumseq; i++ ) {
+                const auto blkOff = ( i*blksize );
+                u_char oldC = (currBuf + blkOff)[0];
+                u_char newC = (currBuf + blkOff)[blksize];
+                UPDATE_RSUM( seqRsums[i].a, seqRsums[i].b, oldC, newC, bshift );
+              }
+            }
+          }
+        }
+    }
+  else if (chksumlen >= 16)
+    {
+      // dummy variant, just check the checksums
+      size_t bufl = 4096;
+      off_t off = 0;
+      auto buf = std::make_unique<unsigned char[]>( bufl );
+      for (size_t blkno = 0; blkno < blocks.size(); ++blkno)
+        {
+          if (off > blocks[blkno].off)
+            continue;
+          size_t blksize = blocks[blkno].size;
+          if (blksize > bufl)
+            {
+              bufl = blksize;
+              buf = std::make_unique<unsigned char[]>( bufl );
+            }
+          size_t skip = blocks[blkno].off - off;
+          while (skip)
+            {
+              size_t l = skip > bufl ? bufl : skip;
+              if (fread(buf.get(), l, 1, fp) != 1)
+                break;
+              skip -= l;
+              off += l;
+            }
+          if (fread(buf.get(), blksize, 1, fp) != 1)
+            break;
+          if (checkChecksum(blkno, buf.get(), blksize))
+            writeBlock(blkno, wfp, buf.get(), blksize, 0, found);
+          off += blksize;
+        }
+    }
+  if (!found[nblks]) {
+    DBG << "Delta XFER: No reusable blocks found for " << filename << std::endl;
+    return;
+  }
+  // now throw out all of the blocks we found
+  std::vector<MediaBlock> nblocks;
+  std::vector<unsigned char> nchksums;
+  std::vector<unsigned int> nrsums;
+
+  size_t originalSize = 0;
+  size_t newSize      = 0;
+  for (size_t blkno = 0; blkno < blocks.size(); ++blkno)
+    {
+      const auto &blk = blocks[blkno];
+      originalSize += blk.size;
+      if (!found[blkno])
+        {
+          // still need it
+          nblocks.push_back(blk);
+          newSize += blk.size;
+          if (chksumlen && (blkno + 1) * chksumlen <= chksums.size())
+            {
+              nchksums.resize(nblocks.size() * chksumlen);
+              memcpy(&nchksums[(nblocks.size() - 1) * chksumlen], &chksums[blkno * chksumlen], chksumlen);
+            }
+          if (rsumlen && (blkno + 1) <= rsums.size())
+            nrsums.push_back(rsums[blkno]);
+        }
+    }
+  DBG << "Delta XFER: Found blocks to reuse, " << blocks.size() << " vs " << nblocks.size() << ", resused blocks: " << blocks.size() - nblocks.size() << "\n"
+      << "Old transfer size: " << originalSize << " new size: " << newSize << std::endl;
+  blocks = nblocks;
+  chksums = nchksums;
+  rsums = nrsums;
+}
+
+void MediaBlockList::reuseBlocksOld(FILE *wfp, std::string filename)
 {
-  FILE *fp;
 
-  if (!chksumlen || (fp = fopen(filename.c_str(), "r")) == 0)
+  zypp::AutoFILE fp;
+
+  if ( !chksumlen ) {
+    DBG << "Delta XFER: Can not reuse blocks because we have no chksumlen" << std::endl;
+    return;
+  }
+
+  if ( (fp = fopen(filename.c_str(), "r")) == 0 ) {
+    DBG << "Delta XFER: Can not reuse blocks, unable to open file "<< filename << std::endl;
     return;
+  }
   size_t nblks = blocks.size();
   std::vector<bool> found;
   found.resize(nblks + 1);
@@ -311,15 +788,27 @@ MediaBlockList::reuseBlocks(FILE *wfp, std::string filename)
       size_t blksize = blocks[0].size;
       if (nblks == 1 && rsumpad && rsumpad > blksize)
         blksize = rsumpad;
+
       // create hash of checksums
+
+      // calculate the size of the hashtable by setting
+      // all bits to 1 up the to currently set MSB
+      // if we have 00010010 we end up with 00011111
       unsigned int hm = rsums.size() * 2;
-      while (hm & (hm - 1))
+      while (hm & (hm - 1))  {
         hm &= hm - 1;
+      }
       hm = hm * 2 - 1;
+
+      // we want at least a size if 0011 1111 1111 1111
       if (hm < 16383)
         hm = 16383;
-      unsigned int *ht = new unsigned int[hm + 1];
-      memset(ht, 0, (hm + 1) * sizeof(unsigned int));
+
+      // simple hashtable of checksums
+      auto rsumHashTable = std::make_unique<unsigned int[]>( hm+1 );
+      memset(rsumHashTable.get(), 0, (hm + 1) * sizeof(unsigned int));
+
+      // insert each rsum into the hash table
       for (unsigned int i = 0; i < rsums.size(); i++)
         {
           if (blocks[i].size != blksize && (i != nblks - 1 || rsumpad != blksize))
@@ -327,29 +816,53 @@ MediaBlockList::reuseBlocks(FILE *wfp, std::string filename)
           unsigned int r = rsums[i];
           unsigned int h = r & hm;
           unsigned int hh = 7;
-          while (ht[h])
+          while (rsumHashTable[h])
             h = (h + hh++) & hm;
-          ht[h] = i + 1;
+          rsumHashTable[h] = i + 1;
         }
 
-      unsigned char *buf = new unsigned char[blksize];
-      unsigned char *buf2 = new unsigned char[blksize];
+      // read in block by block to find matches
+      // the read buffer "buf" works like a ring buffer, means that once we are done with reading a full block
+      // and didn't find a match we start again at buf[0] , filling the buffer up again, rotating until we find
+      // a matching block. Once we find a matching block all we need to do is check if the current offset "i"
+      // is at the end of the buffer, then we can simply write the full buffer out, or if its somewhere in between
+      // then the begin of our block is buf[i+1, bufsize-1] and the end buf[0,i]
+      auto ringBuf = std::make_unique<unsigned char[]>( blksize );
+
+      // we use a second buffer to read in the next block if we are required to match more than one block at the same time.
+      auto buf2 = std::make_unique<unsigned char[]>( blksize );
+
+      // when we are required to match more than one block, it is read into buf2 advancing the file pointer,
+      // to make sure that we do not loose those bytes in case the match fails we remember their count and
+      // start in buf2, in the next loop those will be consumed before reading from the file again
       size_t pushback = 0;
       unsigned char *pushbackp = 0;
-      int bshift = 0;
+
+      // use byteshift instead of multiplication if the blksize is a power of 2
+      // a value is a power of 2 if  ( N & N-1 ) == 0
+      int bshift = 0; // how many bytes do we need to shift
       if ((blksize & (blksize - 1)) == 0)
         for (bshift = 0; size_t(1 << bshift) != blksize; bshift++)
           ;
+
+      // a and b are the LS and MS bytes of the checksum, calculated a rolling style Adler32 checksum
+      //
+      // a(k,l) = (\sum_{i=k}^l X_i) \bmod M
       unsigned short a, b;
       a = b = 0;
-      memset(buf, 0, blksize);
+      memset(ringBuf.get(), 0, blksize);
       bool eof = 0;
       bool init = 1;
-      int sql = nblks > 1 && chksumlen < 16 ? 2 : 1;
+
+      if (!rsumseq)
+        rsumseq = nblks > 1 && chksumlen < 16 ? 2 : 1;
+
       while (!eof)
         {
           for (size_t i = 0; i < blksize; i++)
             {
+              // get the next character from the file
+              // or if there are pushback chars use those
               int c;
               if (eof)
                 c = 0;
@@ -366,95 +879,123 @@ MediaBlockList::reuseBlocks(FILE *wfp, std::string filename)
                     {
                       eof = true;
                       c = 0;
-                      if (!i || sql == 2)
+                      if (!i || rsumseq == 2)
                         break;
                     }
                 }
-              int oc = buf[i];
-              buf[i] = c;
+
+              // calculate the rsum on the fly using recurrence relations, see https://rsync.samba.org/tech_report/node3.html
+              // basically we subtract the checksum value of a byte the leaves the current block window and add the new incoming one
+              // using this trick we do not need to calculate the full block checksum
+              // the least significant part of the checksum ( lower 8 bits ) is simply the sum of all chars in the block , modulo 2^16
+              // zsync uses only a 16bit type to calculate the sums and as far as i can see does not do the modulo per block as the formula
+              // says it should, we might need to do the same
+              int oc = ringBuf[i];
+              ringBuf[i] = c;
+
               a += c - oc;
+
+              // this is calculates the most significant part of the checksum, bshift should be always set since blocksize
+              // should always be a power of 2
               if (bshift)
-                b += a - (oc << bshift);
+                b += a - ( oc << bshift );
               else
-                b += a - oc * blksize;
+                // This seems to make no sense it does not even factor in the character itself
+                b += 2 * blksize;
+
               if (init)
                 {
+                  // continue reading bytes until we have the full block in our buffer
                   if (size_t(i) != blksize - 1)
                     continue;
                   init = 0;
                 }
-              unsigned int r;
-              if (rsumlen == 1)
-                r = ((unsigned int)b & 255);
-              else if (rsumlen == 2)
-                r = ((unsigned int)b & 65535);
-              else if (rsumlen == 3)
-                r = ((unsigned int)a & 255) << 16 | ((unsigned int)b & 65535);
-              else
-                r = ((unsigned int)a & 65535) << 16 | ((unsigned int)b & 65535);
+
+              unsigned int r = ((unsigned int)a & 65535) << 16 | ((unsigned int)b & 65535);
+              truncateRsum(r, rsumlen);
+
               unsigned int h = r & hm;
               unsigned int hh = 7;
-              for (; ht[h]; h = (h + hh++) & hm)
+
+              // go through our hashmap to find all the matching rsums
+              for (; rsumHashTable[h]; h = (h + hh++) & hm)
                 {
-                  size_t blkno = ht[h] - 1;
+                  size_t blkno = rsumHashTable[h] - 1;
+
+                  // does the current block match?
                   if (rsums[blkno] != r)
                     continue;
                   if (found[blkno])
                     continue;
-                  if (sql == 2)
+
+                  // if we need to always match 2 blocks in sequence, get the next block
+                  // and check its checksum
+                  if (rsumseq == 2)
                     {
                       if (eof || blkno + 1 >= nblks)
                         continue;
-                      pushback = fetchnext(fp, buf2, blksize, pushback, pushbackp);
-                      pushbackp = buf2;
+                      pushback = fetchnext(fp, buf2.get(), blksize, pushback, pushbackp);
+                      pushbackp = buf2.get();
                       if (!pushback)
                         continue;
-                      if (!checkRsum(blkno + 1, buf2, blksize))
+
+                      if (!checkRsum(blkno + 1, buf2.get(), blksize))
                         continue;
                     }
-                  if (!checkChecksumRotated(blkno, buf, blksize, i + 1))
+
+                  // here we have matched all blocks that we need, do the heavy checksum
+                  if (!checkChecksumRotated(blkno, ringBuf.get(), blksize, i + 1))
                     continue;
-                  if (sql == 2 && !checkChecksum(blkno + 1, buf2, blksize))
+
+                  // heavy checksum for second block
+                  if (rsumseq == 2 && !checkChecksum(blkno + 1, buf2.get(), blksize))
                     continue;
-                  writeBlock(blkno, wfp, buf, blksize, i + 1, found);
-                  if (sql == 2)
+
+                  // write the first and second blocks if applicable
+                  writeBlock(blkno, wfp, ringBuf.get(), blksize, i + 1, found);
+                  if (rsumseq == 2)
                     {
-                      writeBlock(blkno + 1, wfp, buf2, blksize, 0, found);
+                      writeBlock(blkno + 1, wfp, buf2.get(), blksize, 0, found);
                       pushback = 0;
                       blkno++;
                     }
+
+                  // try to continue as long as we still match blocks
                   while (!eof)
                     {
                       blkno++;
-                      pushback = fetchnext(fp, buf2, blksize, pushback, pushbackp);
-                      pushbackp = buf2;
+                      pushback = fetchnext(fp, buf2.get(), blksize, pushback, pushbackp);
+                      pushbackp = buf2.get();
                       if (!pushback)
                         break;
-                      if (!checkRsum(blkno, buf2, blksize))
+
+                      if (!checkRsum(blkno, buf2.get(), blksize))
                         break;
-                      if (!checkChecksum(blkno, buf2, blksize))
+
+                      if (!checkChecksum(blkno, buf2.get(), blksize))
                         break;
-                      writeBlock(blkno, wfp, buf2, blksize, 0, found);
+
+                      writeBlock(blkno, wfp, buf2.get(), blksize, 0, found);
                       pushback = 0;
                     }
-                  init = false;
-                  memset(buf, 0, blksize);
+
+                  // if we get to this part we found at least a block, skip over the current block and start reading
+                  // in a full block
+                  init = true;
+                  memset(ringBuf.get(), 0, blksize);
                   a = b = 0;
                   i = size_t(-1);      // start with 0 on next iteration
                   break;
                 }
             }
         }
-      delete[] buf2;
-      delete[] buf;
-      delete[] ht;
     }
   else if (chksumlen >= 16)
     {
       // dummy variant, just check the checksums
       size_t bufl = 4096;
       off_t off = 0;
-      unsigned char *buf = new unsigned char[bufl];
+      auto buf = std::make_unique<unsigned char[]>( bufl );
       for (size_t blkno = 0; blkno < blocks.size(); ++blkno)
         {
           if (off > blocks[blkno].off)
@@ -462,39 +1003,45 @@ MediaBlockList::reuseBlocks(FILE *wfp, std::string filename)
           size_t blksize = blocks[blkno].size;
           if (blksize > bufl)
             {
-              delete[] buf;
               bufl = blksize;
-              buf = new unsigned char[bufl];
+              buf = std::make_unique<unsigned char[]>( bufl );
             }
           size_t skip = blocks[blkno].off - off;
           while (skip)
             {
               size_t l = skip > bufl ? bufl : skip;
-              if (fread(buf, l, 1, fp) != 1)
+              if (fread(buf.get(), l, 1, fp) != 1)
                 break;
               skip -= l;
               off += l;
             }
-          if (fread(buf, blksize, 1, fp) != 1)
+          if (fread(buf.get(), blksize, 1, fp) != 1)
             break;
-          if (checkChecksum(blkno, buf, blksize))
-            writeBlock(blkno, wfp, buf, blksize, 0, found);
+          if (checkChecksum(blkno, buf.get(), blksize))
+            writeBlock(blkno, wfp, buf.get(), blksize, 0, found);
           off += blksize;
         }
     }
-  if (!found[nblks])
+  if (!found[nblks]) {
+    DBG << "Delta XFER: No reusable blocks found for " << filename << std::endl;
     return;
+  }
   // now throw out all of the blocks we found
   std::vector<MediaBlock> nblocks;
   std::vector<unsigned char> nchksums;
   std::vector<unsigned int> nrsums;
 
+  size_t originalSize = 0;
+  size_t newSize      = 0;
   for (size_t blkno = 0; blkno < blocks.size(); ++blkno)
     {
+      const auto &blk = blocks[blkno];
+      originalSize += blk.size;
       if (!found[blkno])
         {
           // still need it
-          nblocks.push_back(blocks[blkno]);
+          nblocks.push_back(blk);
+          newSize += blk.size;
           if (chksumlen && (blkno + 1) * chksumlen <= chksums.size())
             {
               nchksums.resize(nblocks.size() * chksumlen);
@@ -504,6 +1051,8 @@ MediaBlockList::reuseBlocks(FILE *wfp, std::string filename)
             nrsums.push_back(rsums[blkno]);
         }
     }
+  DBG << "Delta XFER: Found blocks to reuse, " << blocks.size() << " vs " << nblocks.size() << ", resused blocks: " << blocks.size() - nblocks.size() << "\n"
+      << "Old transfer size: " << originalSize << " new size: " << newSize << std::endl;
   blocks = nblocks;
   chksums = nchksums;
   rsums = nrsums;
@@ -552,4 +1101,3 @@ MediaBlockList::asString() const
 
   } // namespace media
 } // namespace zypp
-
index 7b5c7d0..f0de8c4 100644 (file)
@@ -54,7 +54,7 @@ public:
   /**
    * return the offset/size of a block with number blkno
    **/
-  inline MediaBlock getBlock(size_t blkno) const {
+  inline const MediaBlock &getBlock(size_t blkno) const {
     return blocks[blkno];
   }
   /**
@@ -97,6 +97,7 @@ public:
   bool checkChecksum(size_t blkno, const unsigned char *buf, size_t bufl) const;
   UByteArray getChecksum( size_t blkno ) const;
   std::string getChecksumType( ) const;
+  size_t checksumPad() const;
   bool createDigest(Digest &digest) const;
   bool verifyDigest(size_t blkno, Digest &digest) const;
   inline bool haveChecksum(size_t blkno) const {
@@ -107,6 +108,12 @@ public:
    * set / verify the (weak) rolling checksum over a single block
    **/
   void setRsum(size_t blkno, int rsl, unsigned int rs, size_t rspad=0);
+
+  /**
+   * how many blocks in sequence need to have the correct checksums to be
+   * considered a match
+   */
+  void setRsumSequence( uint seq );
   bool checkRsum(size_t blkno, const unsigned char *buf, size_t bufl) const;
   unsigned int updateRsum(unsigned int rs, const char *bytes, size_t len) const;
   bool verifyRsum(size_t blkno, unsigned int rs) const;
@@ -118,6 +125,7 @@ public:
    * scan a file for blocks from our blocklist. if we find a suitable block,
    * it is removed from the list
    **/
+  void reuseBlocksOld(FILE *wfp, std::string filename);
   void reuseBlocks(FILE *wfp, std::string filename);
 
   /**
@@ -141,8 +149,8 @@ private:
   size_t chksumpad;
   std::vector<unsigned char> chksums;
 
-  std::string rsumtype;
   int rsumlen;
+  uint rsumseq; // < how many consecutive matches are required
   size_t rsumpad;
   std::vector<unsigned int> rsums;
 };
@@ -154,4 +162,3 @@ inline std::ostream & operator<<(std::ostream &str, const MediaBlockList &bl)
 } // namespace zypp
 
 #endif // ZYPP_CURL_PARSER_MEDIABLOCKLIST_H
-
index 814c541..26119f5 100644 (file)
 
 using namespace zypp::base;
 
+namespace zypp::env
+{
+  /** Hack to circumvent the currently poor --root support. */
+  inline bool ZYPP_METALINK_DEBUG()
+  {
+    static bool val = [](){
+      const char * env = getenv("ZYPP_METALINK_DEBUG");
+      return( env && zypp::str::strToBool( env, true ) );
+    }();
+    return val;
+  }
+}
+
 namespace zypp::media {
   enum ParserState {
     STATE_START,
@@ -414,9 +427,7 @@ MetaLinkParser::~MetaLinkParser()
 void
 MetaLinkParser::parse(const Pathname &filename)
 {
-  MIL << "Begin parse " << filename << std::endl;
   parse(InputStream(filename));
-  MIL << "End parse " << filename << std::endl;
 }
 
 void
@@ -431,6 +442,11 @@ MetaLinkParser::parse(const InputStream &is)
       parseBytes(buf, is.stream().gcount());
     }
   parseEnd();
+  MIL << "Parsed " << pd->urls.size() << " mirrors from " << is.path() << std::endl;
+  if ( env::ZYPP_METALINK_DEBUG() ) {
+    for ( const auto &mirr : pd->urls )
+      DBG << "- " << mirr.priority << " " << mirr.url << std::endl;
+  }
 }
 
 void
similarity index 64%
rename from zypp/media/ZsyncParser.cc
rename to zypp-curl/parser/zsyncparser.cc
index 39e761f..1202823 100644 (file)
@@ -10,8 +10,8 @@
  *
  */
 
-#include <zypp/media/ZsyncParser.h>
-#include <zypp/base/Logger.h>
+#include "zsyncparser.h"
+#include <zypp-core/base/Logger.h>
 
 #include <sys/types.h>
 #include <stdio.h>
 using std::endl;
 using namespace zypp::base;
 
+namespace zypp::env
+{
+  /** Hack to circumvent the currently poor --root support. */
+  inline bool ZYPP_METALINK_DEBUG()
+  {
+    static bool val = [](){
+      const char * env = getenv("ZYPP_METALINK_DEBUG");
+      return( env && zypp::str::strToBool( env, true ) );
+    }();
+    return val;
+  }
+}
+
 namespace zypp {
   namespace media {
 
@@ -61,7 +74,7 @@ hexstr2bytes(unsigned char *buf, const char *str, int buflen)
 }
 
 void
-ZsyncParser::parse(std::string filename)
+ZsyncParser::parse( const Pathname &filename )
 {
   char buf[4096];
 
@@ -100,6 +113,9 @@ ZsyncParser::parse(std::string filename)
     {
       if (csl < 3 || csl > 16 || rsl < 1 || rsl > 4 || sql < 1 || sql > 2)
         ZYPP_THROW(Exception("Parse Error: illegal hash lengths"));
+
+      bl.setRsumSequence( sql );
+
       size_t nblks = (filesize + blksize - 1) / blksize;
       size_t i;
       off_t off = 0;
@@ -115,14 +131,56 @@ ZsyncParser::parse(std::string filename)
           size_t blkno = bl.addBlock(off, size);
           unsigned char rp[16];
           rp[0] = rp[1] = rp[2] = rp[3] = 0;
-          is.read((char *)rp + 4 - rsl, rsl);
+          try {
+            is.read((char *)rp + 4 - rsl, rsl);
+          } catch ( const std::exception &e ) {
+            if ( !is.good() ) {
+              if (is.bad())
+                throw zypp::Exception( "I/O error while reading" );
+              else if (is.eof())
+                throw zypp::Exception( "End of file reached unexpectedly" );
+              else if (is.fail())
+                throw zypp::Exception( "Non-integer data encountered" );
+              else
+                throw zypp::Exception( "Unknown IO err" );
+            }
+          }
+
           bl.setRsum(blkno, rsl, rp[0] << 24 | rp[1] << 16 | rp[2] << 8 | rp[3], blksize);
-          is.read((char *)rp, csl);
+          try {
+            is.read((char *)rp, csl);
+          } catch ( const std::exception &e ) {
+            if ( !is.good() ) {
+              if (is.bad())
+                throw zypp::Exception( "I/O error while reading" );
+              else if (is.eof())
+                throw zypp::Exception( "End of file reached unexpectedly" );
+              else if (is.fail())
+                throw zypp::Exception( "Non-integer data encountered" );
+              else
+                throw zypp::Exception( "Unknown IO err" );
+            }
+          }
+          if ( !is.good() ) {
+            if (is.bad())
+              throw zypp::Exception( "I/O error while reading" );
+            else if (is.eof())
+              throw zypp::Exception( "End of file reached unexpectedly" );
+            else if (is.fail())
+              throw zypp::Exception( "Non-integer data encountered" );
+            else
+              throw zypp::Exception( "Unknown IO err" );
+          }
           bl.setChecksum(blkno, "MD4", csl, rp, blksize);
           off += size;
         }
     }
   is.close();
+  MIL << "Parsed " << urls.size() << " mirrors from " << filename << std::endl;
+  if ( env::ZYPP_METALINK_DEBUG() ) {
+    for ( const auto &url : urls )
+      DBG << "- " <<  url << std::endl;
+  }
 }
 
 std::vector<Url>
@@ -143,4 +201,3 @@ ZsyncParser::getBlockList()
 
   } // namespace media
 } // namespace zypp
-
similarity index 80%
rename from zypp/media/ZsyncParser.h
rename to zypp-curl/parser/zsyncparser.h
index 3463dc6..a5679f3 100644 (file)
@@ -6,18 +6,18 @@
 |                         /_____||_| |_| |_|                           |
 |                                                                      |
 \---------------------------------------------------------------------*/
-/** \file zypp/media/ZsyncParser.h
+/** \file zypp-curl/parser/zsyncparser.h
  *
 */
-#ifndef ZYPP_MEDIA_ZSYNCPARSER_H
-#define ZYPP_MEDIA_ZSYNCPARSER_H
+#ifndef ZYPP_CURL_PARSER_ZSYNCPARSER_H
+#define ZYPP_CURL_PARSER_ZSYNCPARSER_H
 
 #include <string>
 
-#include <zypp/base/Exception.h>
-#include <zypp/base/NonCopyable.h>
+#include <zypp-core/base/Exception.h>
+#include <zypp-core/base/NonCopyable.h>
 #include <zypp-curl/parser/MediaBlockList>
-#include <zypp/Url.h>
+#include <zypp-core/Url.h>
 
 namespace zypp {
   namespace media {
@@ -30,7 +30,7 @@ public:
    * parse a file consisting of zlink data
    * \throws Exception
    **/
-  void parse(std::string filename);
+  void parse( const Pathname &filename );
   /**
    * return the download urls from the parsed metalink data
    **/
@@ -53,4 +53,4 @@ private:
   } // namespace media
 } // namespace zypp
 
-#endif // ZYPP_MEDIA_ZSYNCPARSER_H
+#endif // ZYPP_CURL_PARSER_ZSYNCPARSER_H
index 9a9c016..b16456f 100644 (file)
 #include <zypp-core/Url.h>
 #include <zypp-curl/TransferSettings>
 
-#define  CONNECT_TIMEOUT        60
-#define  TRANSFER_TIMEOUT_MAX   60 * 60
-#define  DETECT_DIR_INDEX       0
-
 #define EXPLICITLY_NO_PROXY "_none_"
 
 #undef CURLVERSION_AT_LEAST
@@ -31,14 +27,11 @@ namespace zypp
 {
   namespace env
   {
-    /** Long number for setting CURLOPT_DEBUGDATA */
-    inline long ZYPP_MEDIA_CURL_DEBUG()
-    {
-      long ret = 0L;
-      if ( char *ptr = ::getenv("ZYPP_MEDIA_CURL_DEBUG"); ptr && *ptr )
-        str::strtonum( ptr, ret );
-      return ret;
-    }
+    /** \c const long& for setting CURLOPT_DEBUGDATA
+     * Returns a reference to a static variable, so it's
+     * safe to pass it's address to CURLOPT_DEBUGDATA.
+     */
+    const long & ZYPP_MEDIA_CURL_DEBUG();
 
     /** 4/6 to force IPv4/v6 */
     int ZYPP_MEDIA_CURL_IPRESOLVE();
@@ -49,7 +42,8 @@ namespace zypp
 namespace internal {
 
 void globalInitCurlOnce();
-int  log_curl(CURL *curl, curl_infotype info,  char *ptr, size_t len, void *max_lvl);
+/** Setup CURLOPT_VERBOSE and CURLOPT_DEBUGFUNCTION according to env::ZYPP_MEDIA_CURL_DEBUG. */
+void setupZYPP_MEDIA_CURL_DEBUG( CURL *curl );
 size_t log_redirects_curl( char *ptr, size_t size, size_t nmemb, void *userdata);
 
 
index 1ef538b..aaeec58 100644 (file)
@@ -37,7 +37,7 @@ namespace zypp
     public:
       Impl() : _useproxy( false ),
         _timeout( MediaConfig::instance().download_transfer_timeout() ),
-        _connect_timeout( 60 ),
+        _connect_timeout( MediaConfig::instance().download_connect_timeout() ),
         _maxConcurrentConnections( MediaConfig::instance().download_max_concurrent_connections() ),
         _minDownloadSpeed(MediaConfig::instance().download_min_download_speed()),
         _maxDownloadSpeed(MediaConfig::instance().download_max_download_speed()),
@@ -65,6 +65,17 @@ namespace zypp
       { return new Impl( *this ); }
 
     public:
+      void safeAddHeader( std::string val_r ) {
+        // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space.
+        // Trim and discard empty header.
+        val_r = str::trim( std::move(val_r) );
+        if ( not val_r.empty() )
+          _headers.push_back( std::move(val_r) );
+        else
+          WAR << "Discard empty header" << endl;
+      }
+
+    public:
       std::vector<std::string> _headers;
       std::string _useragent;
       std::string _username;
@@ -103,10 +114,9 @@ namespace zypp
 
 
     void TransferSettings::addHeader( const std::string & val_r )
-    { if ( ! val_r.empty() ) _impl->_headers.push_back(val_r); }
-
+    { _impl->safeAddHeader( val_r ); }
     void TransferSettings::addHeader( std::string && val_r )
-    { if ( ! val_r.empty() ) _impl->_headers.push_back(std::move(val_r)); }
+    { _impl->safeAddHeader( std::move(val_r) ); }
 
     const TransferSettings::Headers &TransferSettings::headers() const
     {
@@ -114,11 +124,11 @@ namespace zypp
       return _impl->_headers;
     }
 
-    void TransferSettings::setUserAgentString( const std::string &val_r )
-    { _impl->_useragent = val_r; }
+    void TransferSettings::setUserAgentString( const std::string &val_r )
+    { _impl->_useragent = str::trim( val_r ); }  // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space
 
     void TransferSettings::setUserAgentString( std::string && val_r )
-    { _impl->_useragent = std::move(val_r); }
+    { _impl->_useragent = str::trim( std::move(val_r) ); }  // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space
 
     const std::string &TransferSettings::userAgentString() const
     { return _impl->_useragent; }
index be05450..3e6f7e0 100644 (file)
@@ -23,9 +23,13 @@ namespace zypp
   namespace media
   {
 
-    /**
-     * Holds transfer setting
-     */
+    ///////////////////////////////////////////////////////////////////
+    /// \brief Holds transfer setting
+    ///
+    /// \note bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a
+    /// space. The class asserts \ref headers and \ref userAgentString
+    /// return trimmed strings. Strings are trimmed when set. Empty
+    //  strings are discarded.
     class TransferSettings
     {
     public:
@@ -37,18 +41,18 @@ namespace zypp
       /** reset the settings to the defaults */
       void reset();
 
-      /** add a header, on the form "Foo: Bar" */
+      /** add a header, on the form "Foo: Bar" (trims)*/
       void addHeader( std::string && val_r );
       void addHeader( const std::string & val_r );
 
-      /** returns a list of all added headers */
+      /** returns a list of all added headers (trimmed) */
       const Headers &headers() const;
 
-      /** sets the user agent ie: "Mozilla v3" */
+      /** sets the user agent ie: "Mozilla v3" (trims) */
       void setUserAgentString( std::string && val_r );
-      void setUserAgentString( const std::string &val_r );
+      void setUserAgentString( const std::string &val_r );
 
-      /** user agent string */
+      /** user agent string (trimmed)*/
       const std::string &userAgentString() const;
 
 
index bf0c473..589c73f 100644 (file)
@@ -25,6 +25,7 @@ namespace zypp {
       , download_max_download_speed    ( 0 )
       , download_max_silent_tries      ( 5 )
       , download_transfer_timeout      ( 180 )
+      , download_connect_timeout        ( 60 )
     { }
 
     Pathname credentials_global_dir_path;
@@ -35,6 +36,8 @@ namespace zypp {
     int download_max_download_speed;
     int download_max_silent_tries;
     int download_transfer_timeout;
+    int download_connect_timeout;
+
   };
 
   MediaConfig::MediaConfig() : d_ptr( new MediaConfigPrivate() )
@@ -73,6 +76,12 @@ namespace zypp {
         str::strtonum(value, d->download_max_silent_tries);
         return true;
 
+      } else if ( entry == "download.connect_timeout" ) {
+        str::strtonum(value, d->download_connect_timeout);
+        if ( d->download_connect_timeout < 0 )
+          d->download_connect_timeout = 0;
+        return true;
+
       } else if ( entry == "download.transfer_timeout" ) {
         str::strtonum(value, d->download_transfer_timeout);
         if ( d->download_transfer_timeout < 0 )                d->download_transfer_timeout = 0;
@@ -112,6 +121,9 @@ namespace zypp {
   long MediaConfig::download_transfer_timeout() const
   { return d_func()->download_transfer_timeout; }
 
+  long MediaConfig::download_connect_timeout() const
+  { return d_func()->download_connect_timeout; }
+
   ZYPP_IMPL_PRIVATE(MediaConfig)
 }
 
index ed8bc90..8e0de5e 100644 (file)
@@ -85,6 +85,11 @@ namespace zypp {
      */
     long download_transfer_timeout() const;
 
+    /*!
+     * Maximum time in seconds that you allow the connection phase to the server to take.
+     */
+    long download_connect_timeout() const;
+
   private:
     MediaConfig();
     std::unique_ptr<MediaConfigPrivate> d_ptr;
index 11f35fd..50f2dea 100644 (file)
@@ -22,8 +22,8 @@
 #include <zypp-media/ng/Provide>
 #include <zypp-media/ng/ProvideItem>
 #include <zypp-media/ng/ProvideSpec>
-#include <zypp-proto/envelope.pb.h>
-#include <zypp-proto/provider.pb.h>
+#include <zypp-proto/core/envelope.pb.h>
+#include <zypp-proto/media/provider.pb.h>
 #include <zypp-core/zyppng/base/private/base_p.h>
 #include <zypp-core/zyppng/base/Timer>
 #include <zypp-core/ManagedFile.h>
index 0138144..f6adad6 100644 (file)
@@ -22,7 +22,7 @@
 #include <zypp-media/ng/HeaderValueMap>
 #include <variant>
 #include <functional>
-#include <zypp-proto/provider.pb.h>
+#include <zypp-proto/media/provider.pb.h>
 
 namespace zypp::proto {
   class ProvideMessage;
index 907381e..7d34419 100644 (file)
@@ -16,7 +16,7 @@
 
 #include "providefwd_p.h"
 #include <zypp-media/ng/Provide>
-#include <zypp-proto/provider.pb.h>
+#include <zypp-proto/media/provider.pb.h>
 #include <zypp-core/zyppng/io/Process>
 #include <zypp-core/ByteCount.h>
 
index 5227f5d..43dd5d5 100644 (file)
@@ -16,7 +16,7 @@
 #include <zypp-core/zyppng/io/AsyncDataSource>
 #include <zypp-core/zyppng/rpc/MessageStream>
 #include <zypp-core/zyppng/pipelines/Expected>
-#include <zypp-proto/provider.pb.h>
+#include <zypp-proto/media/provider.pb.h>
 #include <zypp-media/ng/provide-configvars.h>
 #include <zypp-media/ng/private/providemessage_p.h>
 #include <zypp-media/ng/HeaderValueMap>
index f7a6a74..98f164b 100644 (file)
@@ -1,27 +1,9 @@
-SET( zypp_core_PROTOBUF_SOURCES
-    core/envelope.proto
-)
-
-SET( zypp_media_PROTOBUF_SOURCES
-  media/provider.proto
-)
-
-SET( zypp_target_PROTOBUF_SOURCES
-    target/commit.proto
+ADD_LIBRARY( zypp-protobuf STATIC
+  core/envelope.proto media/provider.proto target/commit.proto test/tvm.proto
 )
 
-SET( zypp_test_PROTOBUF_SOURCES
-    test/tvm.proto
-)
+protobuf_generate( TARGET zypp-protobuf )
 
-protobuf_generate_cpp( ZYPPCORE_PROTO_SRCS ZYPPCORE_PROTO_HDRS ${zypp_core_PROTOBUF_SOURCES} )
-protobuf_generate_cpp( ZYPPMEDIA_PROTO_SRCS ZYPPMEDIA_PROTO_HDRS ${zypp_media_PROTOBUF_SOURCES} )
-protobuf_generate_cpp( ZYPPTARGET_PROTO_SRCS ZYPPTARGET_PROTO_HDRS ${zypp_target_PROTOBUF_SOURCES} )
-protobuf_generate_cpp( ZYPPTEST_PROTO_SRCS ZYPPTEST_PROTO_HDRS ${zypp_test_PROTOBUF_SOURCES} )
+target_include_directories ( zypp-protobuf PRIVATE ${CMAKE_CURRENT_BINARY_DIR} )
 
-ADD_LIBRARY( zypp-protobuf STATIC
-  ${ZYPPCORE_PROTO_SRCS} ${ZYPPCORE_PROTO_HDRS}
-  ${ZYPPMEDIA_PROTO_SRCS} ${ZYPPMEDIA_PROTO_HDRS}
-  ${ZYPPTARGET_PROTO_HDRS} ${ZYPPTARGET_PROTO_SRCS}
-  ${ZYPPTEST_PROTO_HDRS} ${ZYPPTEST_PROTO_SRCS}
-)
+target_link_libraries( zypp-protobuf PUBLIC protobuf::libprotobuf-lite )
index ceea34c..e2f0018 100644 (file)
@@ -29,6 +29,7 @@ message Commit {
   string arch = 2;
   string root = 3;
   string dbPath = 4;
+  string lockFilePath = 7;
   bool   ignoreArch = 5;
   repeated TransactionStep steps = 6;
 }
diff --git a/zypp-tui/Application b/zypp-tui/Application
new file mode 100644 (file)
index 0000000..fa42be4
--- /dev/null
@@ -0,0 +1 @@
+#include "application.h"
diff --git a/zypp-tui/CMakeLists.txt b/zypp-tui/CMakeLists.txt
new file mode 100644 (file)
index 0000000..eb94fa6
--- /dev/null
@@ -0,0 +1,80 @@
+# Collect all files that may contain translatable texts
+FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" )
+SET( POT_FILE_DEPENDS_ZYPP_TUI ${POT_FILE_DEPENDS} PARENT_SCOPE )
+
+INCLUDE_DIRECTORIES ( ${LIBZYPP_SOURCE_DIR} )
+
+ADD_DEFINITIONS( -DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL )
+
+FIND_PACKAGE( Readline REQUIRED )
+
+SET( zypp_tui_toplevel_headers
+  Application
+  application.h
+  Config
+  config.h
+  Table.h
+)
+INSTALL(  FILES ${zypp_tui_toplevel_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-tui" )
+
+SET( zypp_tui_output_headers
+  output/AliveCursor.h
+  output/Out.h
+  output/OutNormal.h
+  output/PromptOptions
+  output/promptoptions.h
+  output/Utf8.h
+)
+INSTALL(  FILES ${zypp_tui_output_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-tui/output" )
+
+SET( zypp_tui_utils_headers
+  utils/ansi.h
+  utils/colors.h
+  utils/console.h
+  utils/richtext.h
+  utils/text.h
+)
+INSTALL(  FILES ${zypp_tui_utils_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-tui/utils" )
+
+
+SET( zypp_tui_headers
+  ${zypp_tui_toplevel_headers}
+  ${zypp_tui_output_headers}
+  ${zypp_tui_utils_headers}
+)
+
+SET( zypp_tui_SRCS
+  application.cc
+  config.cc
+  Table.cc
+  output/Out.cc
+  output/OutNormal.cc
+  output/promptoptions.cc
+  utils/colors.cc
+  utils/console.cc
+  utils/richtext.cc
+  utils/text.cc
+)
+
+SET ( zypp_HEADERS
+  ${zypp_tui_headers}
+)
+
+SET ( zypp_SRCS
+  ${zypp_tui_SRCS}
+)
+
+ADD_LIBRARY( zypp-tui ${zypp_SRCS} ${zypp_HEADERS} )
+add_dependencies( zypp-tui zypp-core )
+
+set_target_properties( zypp-tui PROPERTIES COMPILE_FLAGS "-ffat-lto-objects")
+
+
+target_link_libraries( zypp-tui ${READLINE_LIBRARY})
+target_include_directories( zypp-tui PUBLIC ${READLINE_INCLUDE_DIR})
+# target_compile_options( zypp-tui PUBLIC ${READLINE_CFLAGS_OTHER})
+
+INSTALL(TARGETS zypp-tui ARCHIVE DESTINATION ${LIB_INSTALL_DIR} )
+
+# utils/text.* utils/console.* utils/colors.* utils/ansi.h output/Utf8.h output/AliveCursor.h utils/richtext.* output/Out.* output/OutNormal.* Table.*
+# -> move config for colors to zypp-tui
diff --git a/zypp-tui/Config b/zypp-tui/Config
new file mode 100644 (file)
index 0000000..1ac2545
--- /dev/null
@@ -0,0 +1 @@
+#include "config.h"
diff --git a/zypp-tui/Table.cc b/zypp-tui/Table.cc
new file mode 100644 (file)
index 0000000..bd25725
--- /dev/null
@@ -0,0 +1,465 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <iostream>
+#include <cstring>
+#include <cstdlib>
+
+#include <zypp/base/LogTools.h>
+#include <zypp/base/String.h>
+#include <zypp/base/DtorReset.h>
+
+#include <zypp-tui/Application>
+#include <zypp-tui/utils/colors.h>
+#include <zypp-tui/utils/console.h>
+#include <zypp-tui/utils/text.h>
+
+#include "Table.h"
+
+// libzypp logger settings
+#undef  ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypper"
+
+namespace ztui {
+
+TableLineStyle Table::defaultStyle = Ascii;
+
+static const char * lines[][3] = {
+  { "|", "-", "+"},            ///< Ascii
+  // utf 8
+  { "\xE2\x94\x82", "\xE2\x94\x80", "\xE2\x94\xBC" },  ///< light
+  { "\xE2\x94\x83", "\xE2\x94\x81", "\xE2\x95\x8B" },  ///< heavy
+  { "\xE2\x95\x91", "\xE2\x95\x90", "\xE2\x95\xAC" },  ///< double
+  { "\xE2\x94\x86", "\xE2\x94\x84", "\xE2\x94\xBC" },  ///< light 3
+  { "\xE2\x94\x87", "\xE2\x94\x85", "\xE2\x94\x8B" },  ///< heavy 3
+  { "\xE2\x94\x82", "\xE2\x94\x81", "\xE2\x94\xBF" },  ///< v light, h heavy
+  { "\xE2\x94\x82", "\xE2\x95\x90", "\xE2\x95\xAA" },  ///< v light, h double
+  { "\xE2\x94\x83", "\xE2\x94\x80", "\xE2\x95\x82" },  ///< v heavy, h light
+  { "\xE2\x95\x91", "\xE2\x94\x80", "\xE2\x95\xAB" },  ///< v double, h light
+  { ":", "-", "+" },                                   ///< colon separated values
+};
+
+
+namespace {
+  /// Compare wchar_t case sensitive.
+  inline int wccmp( const wchar_t & l, const wchar_t & r )
+  { return l == r ? 0 : l < r ? -1 : 1; }
+
+  /// Compare wchar_t case insensitive.
+  inline int wccasecmp( const wchar_t & l, const wchar_t & r )
+  { return ::wcsncasecmp( &l, &r, 1 ); }
+
+  /// Whether wchar_t is a Zero digit.
+  inline bool isZero( const wchar_t & ch )
+  { return ch == L'0'; }
+
+  /// Whether wchar_t is a digit.
+  inline bool isDigit( const wchar_t & ch )
+  { return ::iswdigit( ch ); }
+
+  /// Whether both wchar_t are digits.
+  inline bool bothDigits( const wchar_t & l, const wchar_t & r )
+  { return isDigit( l ) && isDigit( r ); }
+
+  /// Whether both wchar_t are no digits.
+  inline bool bothNotDigits( const wchar_t & l, const wchar_t & r )
+  { return not ( isDigit( l ) || isDigit( r ) ); }
+
+  /// Whether both are at the end of the string.
+  inline bool bothAtEnd( const mbs::MbsIteratorNoSGR & lit, const mbs::MbsIteratorNoSGR & rit )
+  { return lit.atEnd() && rit.atEnd(); }
+
+  /// Whether there are one or more trailing Zeros.
+  inline bool skipTrailingZeros( mbs::MbsIteratorNoSGR & it )
+  {
+    if ( isZero( *it ) ) {
+      do { ++it; } while ( isZero( *it ) );
+      return it.atEnd();
+    }
+    return false;
+  }
+
+  /// compare like numbers: longer digit sequence wins, otherwise first difference
+  inline int wcnumcmpValue( mbs::MbsIteratorNoSGR & lit, mbs::MbsIteratorNoSGR & rit )
+  {
+    // PRE: no leading Zeros
+    // POST: if 0(equal) is returned, all digis were skipped
+    int diff = 0;
+    for ( ;; ++lit, ++rit ) {
+      if ( isDigit( *lit ) ) {
+        if ( isDigit( *rit ) ) {
+          if ( not diff && *lit != *rit )
+            diff = *lit < *rit ? -1 : 1;
+        }
+        else
+          return 1;     // DIG !DIG
+      }
+      else {
+        if ( isDigit( *rit ) )
+          return -1;    // !DIG DIG
+        else
+          return diff;  // !DIG !DIG
+      }
+    }
+  }
+} // namespace
+
+int TableRow::Less::defaultStrComp( bool ci_r, const std::string & lhs, const std::string & rhs )
+{
+  auto wcharcmp = &wccmp; // always start with case sensitive compare
+  int nbias = 0;          // remember the 1st difference (in case num compare equal)
+  int cbias = 0;          // remember the 1st difference (in case ci compare equal)
+  int cmp = 0;
+  mbs::MbsIteratorNoSGR lit { lhs };
+  mbs::MbsIteratorNoSGR rit { rhs };
+  while ( true ) {
+
+    // Endgame: tricky: trailing Zeros are ignored, but count as nbias if there is none.
+    if ( lit.atEnd() ) {
+      if ( skipTrailingZeros( rit ) && not nbias ) return -1;
+      return rit.atEnd() ? (nbias ? nbias : cbias) : -1;
+    }
+    if ( rit.atEnd() ) {
+      if ( skipTrailingZeros( lit ) && not nbias ) return 1;
+      return lit.atEnd() ? (nbias ? nbias : cbias) : 1;
+    }
+
+    // num <> num?
+    if ( bothDigits( *lit, *rit ) ) {
+      if ( isZero( *lit ) || isZero( *rit ) ) {
+        int lead = 0; // the more leasing zeros a number has, the less: 001 01 1
+        while ( isZero( *lit ) ) { ++lit; --lead; }
+        while ( isZero( *rit ) ) { ++rit; ++lead; }
+        if ( not nbias && lead )
+          nbias = bothAtEnd( lit, rit ) ? -lead : lead;  // the less trailing zeros, the less: a a0 a00
+      }
+      if ( (cmp = wcnumcmpValue( lit, rit )) )
+        return cmp;
+      continue; // already skipped all digits
+    }
+    else {
+      if ( (cmp = wcharcmp( *lit, *rit )) ) {
+        if ( not cbias ) cbias = cmp; // remember the 1st difference (by wccmp)
+        if ( ci_r ) {
+          if ( (cmp = wccasecmp( *lit, *rit )) )
+            return cmp;
+          wcharcmp = &wccasecmp;
+          ci_r = false;
+        }
+        else
+          return cmp;
+      }
+    }
+    ++lit; ++rit;
+  }
+}
+
+TableRow & TableRow::add( std::string s )
+{
+  if ( _translateColumns )
+    _translatedColumns.push_back( _(s.c_str()) );
+  _columns.push_back( std::move(s) );
+  return *this;
+}
+
+TableRow & TableRow::addDetail( std::string s )
+{
+  _details.push_back( std::move(s) );
+  return *this;
+}
+
+// 1st implementation: no width calculation, just tabs
+std::ostream & TableRow::dumbDumpTo( std::ostream & stream ) const
+{
+  bool seen_first = false;
+  for ( container::const_iterator i = _columns.begin(); i != _columns.end(); ++i )
+  {
+    if ( seen_first )
+      stream << '\t';
+    seen_first = true;
+
+    stream << *i;
+  }
+  return stream << std::endl;
+}
+
+std::ostream & TableRow::dumpDetails( std::ostream & stream, const Table & parent ) const
+{
+  mbs::MbsWriteWrapped mww( stream, 4, parent._screen_width );
+  for ( const std::string & text : _details )
+  {
+    mww.writePar( text );
+  }
+  mww.gotoParBegin();
+  return stream;
+}
+
+std::ostream & TableRow::dumpTo( std::ostream & stream, const Table & parent ) const
+{
+  const char * vline = parent._style == none ? "" : lines[parent._style][0];
+
+  unsigned ssize = 0; // string size in columns
+  bool seen_first = false;
+
+  stream.setf( std::ios::left, std::ios::adjustfield );
+  stream << std::string( parent._margin, ' ' );
+  // current position at currently printed line
+  int curpos = parent._margin;
+  // On a table with 2 edition columns highlight the editions
+  // except for the common prefix.
+  std::string::size_type editionSep( std::string::npos );
+
+  container::const_iterator i = _columns.begin (), e = _columns.end ();
+  const unsigned lastCol = _columns.size() - 1;
+  for ( unsigned c = 0; i != e ; ++i, ++c )
+  {
+    const std::string & s( *i );
+
+    if ( seen_first )
+    {
+      bool do_wrap = parent._do_wrap                           // user requested wrapping
+                  && parent._width > parent._screen_width      // table is wider than screen
+                  && ( curpos + (int)parent._max_width[c] + (parent._style == none ? 2 : 3) > parent._screen_width     // the next table column would exceed the screen size
+                    || parent._force_break_after == (int)(c - 1) );    // or the user wishes to first break after the previous column
+
+      if ( do_wrap )
+      {
+        // start printing the next table columns to new line,
+        // indent by 2 console columns
+        stream << std::endl << std::string( parent._margin + 2, ' ' );
+        curpos = parent._margin + 2; // indent == 2
+      }
+      else
+        // vertical line, padded with spaces
+        stream << ' ' << vline << ' ';
+      stream.width( 0 );
+    }
+    else
+      seen_first = true;
+
+    // stream.width (widths[c]); // that does not work with multibyte chars
+    ssize = mbs_width( s );
+    if ( ssize > parent._max_width[c] )
+    {
+      unsigned cutby = parent._max_width[c] - 2;
+      std::string cutstr = mbs_substr_by_width( s, 0, cutby );
+      stream << ( _ctxt << cutstr ) << std::string(cutby - mbs_width( cutstr ), ' ') << "->";
+    }
+    else
+    {
+      if ( !parent._inHeader && parent.header().hasStyle( c, table::CStyle::Edition ) && Application::instance().config().do_colors )
+      {
+        const std::set<unsigned> & editionColumns { parent.header().editionColumns() };
+        // Edition column
+        if ( editionColumns.size() == 2 )
+        {
+          // 2 Edition columns - highlight difference
+          if ( editionSep == std::string::npos )
+          {
+            editionSep = zypp::str::commonPrefix( _columns[*editionColumns.begin()],
+                                            _columns[*(++editionColumns.begin())] );
+          }
+
+          if ( editionSep == 0 )
+          {
+            stream << ( ColorContext::CHANGE << s );
+          }
+          else if ( editionSep == s.size() )
+          {
+            stream << ( _ctxt << s );
+          }
+          else
+          {
+            stream << ( _ctxt << s.substr( 0, editionSep ) ) << ( ColorContext::CHANGE << s.substr( editionSep ) );
+          }
+        }
+        else
+        {
+          // highlight edition-release separator
+          editionSep = s.find( '-' );
+          if ( editionSep != std::string::npos )
+          {
+            stream << ( _ctxt << s.substr( 0, editionSep ) << ( ColorContext::HIGHLIGHT << "-" ) << s.substr( editionSep+1 ) );
+          }
+          else // no release part
+          {
+            stream << ( _ctxt << s );
+          }
+        }
+      }
+      else     // no special style
+      {
+        stream << ( _ctxt << s );
+      }
+      stream.width( c == lastCol ? 0 : parent._max_width[c] - ssize );
+    }
+    stream << "";
+    curpos += parent._max_width[c] + (parent._style == none ? 2 : 3);
+  }
+  stream << std::endl;
+
+  if ( !_details.empty() )
+  {
+    dumpDetails( stream, parent );
+  }
+  return stream;
+}
+
+// ----------------------( Table )---------------------------------------------
+
+Table::Table()
+  : _has_header( false )
+  , _max_col( 0 )
+  , _max_width( 1, 0 )
+  , _width( 0 )
+  , _style( defaultStyle )
+  , _screen_width( get_screen_width() )
+  , _margin( 0 )
+  , _force_break_after( -1 )
+  , _do_wrap( false )
+  , _inHeader( false )
+{}
+
+Table & Table::add( TableRow tr )
+{
+  _rows.push_back( std::move(tr) );
+  return *this;
+}
+
+Table & Table::setHeader( TableHeader tr )
+{
+  _header = std::move(tr);
+  _has_header = !_header.empty();
+  return *this;
+}
+
+void Table::allowAbbrev( unsigned column)
+{
+  if ( column >= _abbrev_col.size() )
+  {
+    _abbrev_col.reserve( column + 1 );
+    _abbrev_col.insert( _abbrev_col.end(), column - _abbrev_col.size() + 1, false );
+  }
+  _abbrev_col[column] = true;
+}
+
+void Table::updateColWidths( const TableRow & tr ) const
+{
+  // how much columns spearators add to the width of the table
+  int sepwidth = _style == none ? 2 : 3;
+  // initialize the width to -sepwidth (the first column does not have a line
+  // on the left)
+  _width = -sepwidth;
+
+  // ensure that _max_width[col] exists
+  const auto &columns = tr.columns();
+  if ( _max_width.size() < columns.size() )
+  {
+    _max_width.resize( columns.size(), 0 );
+    _max_col = _max_width.size()-1;
+  }
+
+  unsigned c = 0;
+  for ( const auto & col : columns )
+  {
+    unsigned &max = _max_width[c++];
+    unsigned cur = mbs_width( col );
+
+    if ( max < cur )
+      max = cur;
+
+    _width += max + sepwidth;
+  }
+  _width += _margin * 2;
+}
+
+void Table::dumpRule( std::ostream &stream ) const
+{
+  const char * hline = _style != none ? lines[_style][1] : " ";
+  const char * cross = _style != none ? lines[_style][2] : " ";
+
+  bool seen_first = false;
+
+  stream.width( 0 );
+  stream << std::string(_margin, ' ' );
+  for ( unsigned c = 0; c <= _max_col; ++c )
+  {
+    if ( seen_first )
+      stream << hline << cross << hline;
+    seen_first = true;
+    // FIXME: could use fill character if hline were a (wide) character
+    for ( unsigned i = 0; i < _max_width[c]; ++i )
+      stream << hline;
+  }
+  stream << std::endl;
+}
+
+std::ostream & Table::dumpTo( std::ostream & stream ) const
+{
+  // compute column sizes
+  if ( _has_header )
+    updateColWidths( _header );
+  for ( const auto & row : _rows )
+    updateColWidths( row );
+
+  // reset column widths for columns that can be abbreviated
+  //! \todo allow abbrev of multiple columns?
+  unsigned c = 0;
+  for ( std::vector<bool>::const_iterator it = _abbrev_col.begin(); it != _abbrev_col.end() && c <= _max_col; ++it, ++c )
+  {
+    if ( *it && _width > _screen_width &&
+         // don't resize the column to less than 3, or if the resulting table
+         // would still exceed the screen width (bnc #534795)
+         _max_width[c] > 3 &&
+         _width - _screen_width < ((int) _max_width[c]) - 3 )
+    {
+      _max_width[c] -= _width - _screen_width;
+      break;
+    }
+  }
+
+  if ( _has_header )
+  {
+    zypp::DtorReset inHeader( _inHeader, false );
+    _inHeader = true;
+    _header.dumpTo( stream, *this );
+    dumpRule (stream);
+  }
+
+  for ( const auto & row : _rows )
+    row.dumpTo( stream, *this );
+
+  return stream;
+}
+
+void Table::wrap( int force_break_after )
+{
+  if ( force_break_after >= 0 )
+    _force_break_after = force_break_after;
+  _do_wrap = true;
+}
+
+void Table::lineStyle( TableLineStyle st )
+{
+  if ( st < TLS_End )
+    _style = st;
+}
+
+void Table::margin( unsigned margin )
+{
+  if ( margin < (unsigned)(_screen_width/2) )
+    _margin = margin;
+  else
+    ERR << "margin of " << margin << " is greater than half of the screen" << std::endl;
+}
+
+// Local Variables:
+// c-basic-offset: 2
+// End:
+}
diff --git a/zypp-tui/Table.h b/zypp-tui/Table.h
new file mode 100644 (file)
index 0000000..73cf06e
--- /dev/null
@@ -0,0 +1,646 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_TABULE_H
+#define ZYPP_TUI_TABULE_H
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <iosfwd>
+#include <set>
+#include <list>
+#include <vector>
+
+#include <boost/any.hpp>
+
+#include <zypp/base/String.h>
+#include <zypp/base/Exception.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp/sat/Solvable.h>
+#include <zypp/ui/Selectable.h>
+
+#include <zypp-tui/utils/ansi.h>
+#include <zypp-tui/utils/colors.h>
+
+namespace ztui {
+
+inline const char * asYesNo( bool val_r ) { return val_r ? _("Yes") : _("No"); }
+
+/** Custom sort index type for table rows representing solvables (like detailed search results). */
+typedef std::pair<zypp::sat::Solvable, zypp::ui::Selectable::picklist_size_type> SolvableCSI;
+
+///////////////////////////////////////////////////////////////////
+// Custom sort index helpers
+namespace csidetail
+{
+  /** Default comparator for custom sort indices (std::compare semantic). */
+  template <typename T>
+  inline int simpleAnyTypeComp ( const boost::any &l_r, const boost::any &r_r )
+  {
+    T l = boost::any_cast<T>(l_r);
+    T r = boost::any_cast<T>(r_r);
+    return ( l < r ? -1 : l > r ?  1 : 0 );
+  }
+
+  template <>
+  inline int simpleAnyTypeComp<SolvableCSI> ( const boost::any &l_r, const boost::any &r_r )
+  {
+    SolvableCSI l = boost::any_cast<SolvableCSI>(l_r);
+    SolvableCSI r = boost::any_cast<SolvableCSI>(r_r);
+
+    if ( l.first == r.first )
+      return 0;        // quick check Solvable Id
+
+    int cmp = l.first.name().compare( r.first.name() );
+    if ( cmp )
+      return cmp;
+
+    cmp = l.first.kind().compare( r.first.kind() );
+    if ( cmp )
+      return cmp;
+
+    if ( l.second == r.second )
+      return 0;
+    return ( l.second < r.second ? -1 : 1 );   // `>`! best version up
+  }
+} // namespace csidetail
+///////////////////////////////////////////////////////////////////
+
+//! table drawing style
+enum TableLineStyle {
+  Ascii                = 0,    ///< | - +
+  Light,
+  Heavy,
+  Double,
+  Light3,
+  Heavy3,
+  LightHeavy,
+  LightDouble,
+  HeavyLight,
+  DoubleLight,
+  Colon,
+  none,
+  TLS_End,             ///< sentinel
+};
+
+class Table;
+
+///////////////////////////////////////////////////////////////////
+// Conditional Table column helpers.
+namespace ctcdetail
+{
+  /// Remember either \a _if or \a _else function.
+  template<class Tif_,class Telse_>
+  struct ColumnIf
+  {
+    ColumnIf( bool condition_r, std::function<Tif_()> if_r,  std::function<Telse_()> else_r )
+    { if ( condition_r ) _if = std::move(if_r); else _else = std::move(else_r); }
+    std::function<Tif_()> _if;
+    std::function<Telse_()> _else;
+  };
+  /// Specialization both functions return the same type
+  template<class Tif_>
+  struct ColumnIf<Tif_,Tif_>
+  {
+    ColumnIf( bool condition_r, std::function<Tif_()> if_r,  std::function<Tif_()> else_r )
+    : _ifelse { condition_r ? std::move(if_r) : std::move(else_r) }
+    {}
+    ColumnIf( bool condition_r, std::function<Tif_()> && if_r )
+    { if ( condition_r ) _ifelse = std::move(if_r); }
+    std::function<Tif_()> _ifelse;
+  };
+}
+///////////////////////////////////////////////////////////////////
+/// Conditional Table column factory.
+///
+/// Creates an conditional \ref TableRow or \ref TableHeader entry,
+/// depending on the value of \a condition_r. The columns content,
+/// if needed, is determined calling the function object matching the
+/// condition.
+///
+/// An empty function object will cause the column to be hidden and no
+/// content will be retrieved (see overloaded operator<<(TableRow &,..)).
+///
+/// \code
+///   TableRow()
+///     << "first"
+///     << ColumnIf( condition, [](){ return "second"; }, [](){ return "one but last"; } )
+///     << "last";
+/// \endcode
+template<class Tif_, class Telse_>
+auto ColumnIf( bool condition_r, Tif_ && if_r, Telse_ && else_r ) -> ctcdetail::ColumnIf<decltype(if_r()),decltype(else_r())>
+{ return { condition_r, std::forward<Tif_>(if_r), std::forward<Telse_>(else_r) }; }
+/** \overload no column on 'else' */
+template<class Tif_>
+auto ColumnIf( bool condition_r, Tif_ && if_r ) -> ctcdetail::ColumnIf<decltype(if_r()),decltype(if_r())>
+{ return { condition_r, std::forward<Tif_>(if_r) }; }
+
+
+namespace table
+{
+  /// Table column styles
+  ///
+  /// \see \ref Column style setter below.
+  /// \code
+  /// th << table::Column( N_("Name"), CStyle::SortCi );
+  /// \endcode
+  enum class CStyle
+  {
+    Default = 0,
+    Edition,      ///< Editions with v-r setparator highlighted
+    SortCi,       ///< String values to be sorted case insensitive
+  };
+}
+
+
+class TableRow
+{
+private:
+  std::ostream & dumpDetails( std::ostream & stream, const Table & parent ) const;
+
+public:
+  struct Less; ///< Binary predicate for sorting.
+
+  TableRow()
+  : _ctxt( ColorContext::DEFAULT )
+  {}
+
+  explicit TableRow( unsigned c )
+  : _ctxt( ColorContext::DEFAULT )
+  { _columns.reserve(c); }
+
+  explicit TableRow( ColorContext ctxt_r )
+  : _ctxt( ctxt_r )
+  {}
+
+  TableRow( unsigned c, ColorContext ctxt_r  )
+  : _ctxt( ctxt_r )
+  { _columns.reserve(c); }
+
+  TableRow & add( std::string s );
+
+  template<class Tp_>
+  TableRow & add( const Tp_ & val_r )
+  { return add( zypp::str::asString( val_r ) ); }
+
+
+  TableRow & addDetail( std::string s );
+
+  template<class Tp_>
+  TableRow & addDetail( const Tp_ & val_r )
+  { return addDetail( zypp::str::asString( val_r ) ); }
+
+
+  bool empty() const
+  { return _columns.empty(); }
+
+  // return number of columns
+  unsigned size() const
+  { return _columns.size(); }
+
+  unsigned cols() const
+  { return size(); }
+
+  //! tab separated output
+  std::ostream & dumbDumpTo( std::ostream & stream ) const;
+  //! output with \a parent table attributes
+  std::ostream & dumpTo( std::ostream & stream, const Table & parent ) const;
+
+  typedef std::vector<std::string> container;
+
+  const boost::any &userData() const
+  { return _userData; }
+
+  void userData( const boost::any &n_r )
+  { _userData = n_r; }
+
+  // BinaryPredicate
+
+  const container & columns() const
+  { return _translateColumns ? _translatedColumns : _columns; }
+
+  container & columns()
+  { return _translateColumns ? _translatedColumns : _columns; }
+
+  const container & columnsNoTr() const
+  { return _columns; }
+
+  container & columnsNoTr()
+  { return _columns; }
+
+protected:
+  bool      _translateColumns = false;
+private:
+  container _columns;
+  container _translatedColumns;
+  container _details;
+  ColorContext _ctxt;
+  boost::any _userData;        ///< user defined sort index, e.g. if string values don't work due to coloring
+};
+
+/** \relates TableRow Add colummn. */
+template<class Tp_>
+TableRow & operator<<( TableRow & tr, Tp_ && val )
+{ return tr.add( zypp::asString( std::forward<Tp_>(val) ) ); }
+/** \overload preserving TableRow rvalue reference. */
+template<class Tp_>
+TableRow && operator<<( TableRow && tr, Tp_ && val )
+{ return std::move( tr << std::forward<Tp_>(val) ); }
+
+/** \overload universal refernce for conditional Table columns */
+template<class Tif_, class Telse_> TableRow & operator<<( TableRow & tr, const ctcdetail::ColumnIf<Tif_,Telse_> & val )
+{ if ( val._if ) tr.add( val._if() ); else if ( val._else ) tr.add( val._else() ); return tr; }
+/** \overload universal refernce for conditional Table columns */
+template<class Tif_, class Telse_> TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf<Tif_,Telse_> & val )
+{ if ( val._if ) tr.add( val._if() ); else if ( val._else ) tr.add( val._else() ); return tr; }
+/** \overload universal refernce for conditional Table columns */
+template<class Tif_, class Telse_> TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf<Tif_,Telse_> && val )
+{ if ( val._if ) tr.add( val._if() ); else if ( val._else ) tr.add( val._else() ); return tr; }
+
+/** \overload universal refernce for conditional Table columns (specialized) */
+template<class Tif_> TableRow & operator<<( TableRow & tr, const ctcdetail::ColumnIf<Tif_,Tif_> & val )
+{ if ( val._ifelse ) tr.add( val._ifelse() ); return tr; }
+/** \overload universal refernce for conditional Table columns (specialized) */
+template<class Tif_> TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf<Tif_,Tif_> & val )
+{ if ( val._ifelse ) tr.add( val._ifelse() ); return tr; }
+/** \overload universal refernce for conditional Table columns (specialized) */
+template<class Tif_> TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf<Tif_,Tif_> && val )
+{ if ( val._ifelse ) tr.add( val._ifelse() ); return tr; }
+
+
+class TableHeader : public TableRow
+{
+public:
+  using CStyle = table::CStyle;
+  //! Constructor. Reserve place for c columns.
+  TableHeader (unsigned c = 0): TableRow (c) { _translateColumns = true; }
+
+  bool hasStyle( unsigned c, CStyle s ) const
+  { return _cstyle.count(c) && _cstyle.at(c) == s; }
+
+  CStyle style( unsigned c ) const
+  { return _cstyle.count(c) ? _cstyle.at(c) : CStyle::Default; }
+
+  void style( unsigned c, CStyle s )
+  { _cstyle[c] = s; }
+
+
+  std::set<unsigned> editionColumns() const
+  {
+    std::set<unsigned> ret;
+    for ( const auto & [c,s] : _cstyle ) {
+      if ( s == CStyle::Edition )
+        ret.insert( c );
+    }
+    return ret;
+  }
+
+private:
+  std::map<unsigned,CStyle> _cstyle;  ///< Column style and sort hints are remembered here
+};
+
+/** \relates TableHeader  Add column. */
+template<class Tp_>
+TableHeader & operator<<( TableHeader & th, Tp_ && val )
+{ static_cast<TableRow&>(th) << std::forward<Tp_>(val); return th; }
+/** \overload preserving TableHeader rvalue reference. */
+template<class Tp_>
+TableHeader && operator<<( TableHeader && th, Tp_ && val )
+{ return std::move( th << std::forward<Tp_>(val) ); }
+
+
+struct TableRow::Less
+{
+  using SortParam = std::tuple<unsigned,bool>;  ///< column and sortCI
+
+  Less( const TableHeader & header_r, std::list<unsigned> by_columns_r )
+  {
+    for ( unsigned curr_column : by_columns_r ) {
+      _by_columns.push_back( SortParam( curr_column, header_r.hasStyle( curr_column, table::CStyle::SortCi ) ) );
+    }
+  }
+
+  bool operator()( const TableRow & a_r, const TableRow & b_r ) const
+  {
+    int c = 0;
+    for ( const SortParam &sortParam : _by_columns ) {
+      if ( (c = compCol( sortParam, a_r, b_r )) )
+        return c < 0;
+    }
+    return false;
+  }
+
+private:
+  int compCol( const SortParam & sortParam_r, const TableRow & a_r, const TableRow & b_r ) const
+  {
+    const auto & [ byColumn, sortCI ] { sortParam_r };
+    bool noL = byColumn >= a_r._columns.size();
+    bool noR = byColumn >= b_r._columns.size();
+
+    if ( noL || noR ) {
+      if ( noL && noR ) {
+        using csidetail::simpleAnyTypeComp;
+
+        const boost::any &lUserData = a_r.userData();
+        const boost::any &rUserData = b_r.userData();
+
+        if ( lUserData.empty() && !rUserData.empty() )
+          return -1;
+
+        else if ( !lUserData.empty() && rUserData.empty() )
+          return 1;
+
+        else if ( lUserData.empty() && rUserData.empty() )
+          return 0;
+
+        else if ( lUserData.type() != rUserData.type() ) {
+          ZYPP_THROW( zypp::Exception( zypp::str::form("Incompatible user types") ) );
+
+        } else if ( lUserData.type() == typeid(SolvableCSI) ) {
+          return simpleAnyTypeComp<SolvableCSI> ( lUserData, rUserData );
+
+        } else if ( lUserData.type() == typeid(std::string) ) {
+          return simpleAnyTypeComp<std::string>( lUserData, rUserData );
+
+        } else if ( lUserData.type() == typeid(unsigned) ) {
+          return simpleAnyTypeComp<unsigned>( lUserData, rUserData );
+
+        } else if ( lUserData.type() == typeid(int) ) {
+          return simpleAnyTypeComp<int>( lUserData, rUserData );
+
+        }
+        ZYPP_THROW( zypp::Exception( zypp::str::form("Unsupported user types") ) );
+      } else
+        return ( noL && ! noR ? -1 : ! noL && noR ?  1 : 0);
+    }
+    return defaultStrComp( sortCI, a_r._columns[byColumn], b_r._columns[byColumn] );
+  }
+
+  /** Natural('sort -V' like) [case insensitive] compare ignoring ANSI SGR chars. */
+  static int defaultStrComp( bool ci_r, const std::string & lhs, const std::string & rhs );
+
+private:
+  std::list<SortParam> _by_columns;
+};
+
+/** \todo nice idea but poor interface */
+class Table
+{
+public:
+  typedef std::list<TableRow> container;
+
+  static TableLineStyle defaultStyle;
+
+  Table & add( TableRow tr );
+
+  Table & setHeader( TableHeader tr );
+
+
+  std::ostream & dumpTo( std::ostream & stream ) const;
+  bool empty() const { return _rows.empty(); }
+
+
+  /** Unsorted - pseudo sort column indicating not to sort. */
+  static constexpr unsigned Unsorted           = unsigned(-1);
+  /** UserData - sort column using a custom sort index. */
+  static constexpr unsigned UserData           = unsigned(-2);
+
+  /** Get the default sort column or \ref Unsorted (default) */
+  unsigned defaultSortColumn() const           { return _defaultSortColumn; }
+
+  /** Set a \ref defaultSortColumn */
+  void defaultSortColumn( unsigned byColumn_r )        { _defaultSortColumn = byColumn_r; }
+
+  /** Sort by \ref defaultSortColumn */
+  void sort()                                  { sort( unsigned(_defaultSortColumn ) ); }
+
+  /** Sort by \a byColumn_r */
+  void sort( unsigned byColumn_r )                     { if ( byColumn_r != Unsorted ) _rows.sort( TableRow::Less( header(), { byColumn_r } ) ); }
+  void sort( const std::list<unsigned> & byColumns_r ) { if ( byColumns_r.size() ) _rows.sort( TableRow::Less( header(), byColumns_r ) ); }
+  void sort( std::list<unsigned> && byColumns_r )      { if ( byColumns_r.size() ) _rows.sort( TableRow::Less( header(), std::move(byColumns_r) ) ); }
+
+  /** Custom sort */
+  template<class TCompare, std::enable_if_t<!std::is_integral<TCompare>::value, int> = 0>
+  void sort( TCompare && less_r )              { _rows.sort( std::forward<TCompare>(less_r) ); }
+
+  void lineStyle( TableLineStyle st );
+  void wrap( int force_break_after = -1 );
+  void allowAbbrev( unsigned column );
+  void margin( unsigned margin );
+
+  const TableHeader & header() const
+  { return _header; }
+  const container & rows() const
+  { return _rows; }
+  container & rows()
+  { return _rows; }
+
+  Table();
+
+private:
+  void dumpRule( std::ostream & stream ) const;
+  void updateColWidths( const TableRow & tr ) const;
+
+  bool _has_header;
+  TableHeader _header;
+  container _rows;
+
+  //! maximum column index seen in this table
+  mutable unsigned _max_col;
+  //! maximum width of respective columns
+  mutable std::vector<unsigned> _max_width;
+  //! table width (columns)
+  mutable int _width;
+  //! table line drawing style
+  TableLineStyle _style;
+  //! amount of space we have to print this table
+  int _screen_width;
+  //! whether to abbreviate the respective column if needed
+  std::vector<bool> _abbrev_col;
+  //! left/right margin in number of spaces
+  unsigned _margin;
+  //! if _do_wrap is set, first break the table at this column;
+  //! If negative, wrap as needed.
+  int _force_break_after;
+  //! Whether to wrap the table if it exceeds _screen_width
+  bool _do_wrap;
+
+  zypp::DefaultIntegral<unsigned,Unsorted> _defaultSortColumn;
+
+  mutable bool _inHeader;
+
+  friend class TableRow;
+};
+
+namespace table
+{
+  /// Table column style setter.
+  ///
+  /// \see \ref CStyle colum styles.
+  /// \code
+  /// th << table::Column( N_("Name"), CStyle::SortCi );
+  /// \endcode
+  struct Column
+  {
+    Column( std::string header_r, CStyle style_r = CStyle::Default )
+    : _header( std::move(header_r) )
+    , _style( style_r )
+    {}
+    std::string _header;
+    CStyle      _style;
+  };
+  /** \relates table::Column set \ref TableHeader style. */
+  inline TableHeader & operator<<( TableHeader & th, Column && obj )
+  { th.style( th.cols(), obj._style ); return th << std::move(obj._header); }
+  /** \relates table::Column set \ref TableHeader style.*/
+  inline TableHeader && operator<<( TableHeader && th, Column && obj )
+  { return std::move( th << std::move(obj) ); }
+}
+
+
+inline Table & operator<<( Table & table, TableRow tr )
+{ return table.add( std::move(tr) ); }
+
+inline Table & operator<<( Table & table, TableHeader tr )
+{ return table.setHeader( std::move(tr) ); }
+
+
+inline std::ostream & operator<<( std::ostream & stream, const Table & table )
+{ return table.dumpTo( stream ); }
+
+
+///////////////////////////////////////////////////////////////////
+/// \class PropertyTable
+/// \brief Aligned key/value with multiline support
+/// Key       : value 1
+/// LongKey   : value 2
+/// Multiline :
+///     line 1
+///     line 2
+/// Next Key  : value 3
+///
+///////////////////////////////////////////////////////////////////
+class PropertyTable
+{
+public:
+  PropertyTable()
+  { _table.lineStyle( ztui::Colon ); }
+
+  static const char * emptyListTag() { return "---"; }
+
+public:
+  ///////////////////////////////////////////////////////////////////
+  // Key / Value
+  template <class KeyType>
+  PropertyTable & add( const KeyType & key_r )
+  { _table << ( TableRow() << key_r << "" ); return *this; }
+
+  template <class KeyType, class ValueType>
+  PropertyTable & add( const KeyType & key_r, const ValueType & val_r )
+  { _table << ( TableRow() << key_r << val_r ); return *this; }
+
+  template <class KeyType>
+  PropertyTable & add( const KeyType & key_r, bool val_r )
+  { _table << ( TableRow() << key_r << asYesNo( val_r ) ); return *this; }
+
+  ///////////////////////////////////////////////////////////////////
+  // Key / Value in details (e.g. Description:)
+  template <class ValueType>
+  PropertyTable & addDetail( const ValueType & val_r )
+  { last().addDetail( val_r ); return *this; }
+
+  template <class KeyType, class ValueType>
+  PropertyTable & addDetail( const KeyType & key_r, const ValueType & val_r )
+  { _table << ( TableRow() << key_r << "" ).addDetail( val_r ); return *this; }
+
+  ///////////////////////////////////////////////////////////////////
+  // Key / Container<Value>
+  template <class KeyType, class Iterator_ >
+  PropertyTable & add( const KeyType & key_r, Iterator_ begin_r, Iterator_ end_r, bool forceDetails_r = false  )
+  {
+    TableRow r;
+    r << key_r;
+    if ( begin_r != end_r )
+    {
+      unsigned cnt = 1;
+      Iterator_ first = begin_r++;
+      if ( begin_r == end_r && ! forceDetails_r )
+        r << *first;                           // only one value
+      else
+      {
+        r.addDetail( *first );                 // list all in details
+        while ( begin_r != end_r )
+        {
+          ++cnt;
+          r.addDetail( *(begin_r++) );
+        }
+        r << "["+zypp::str::numstring(cnt)+"]";        // size as value
+      }
+   }
+    else
+    { r << emptyListTag(); }                           // dummy to get the ":" if empty
+    _table << r;
+    return *this;
+  }
+
+  template <class KeyType, class ContainerType>
+  PropertyTable & lst( const KeyType & key_r, const ContainerType & lst_r, bool forceDetails_r = false )
+  { return add( key_r, lst_r.begin(), lst_r.end(), forceDetails_r ); }
+
+  template <class KeyType, class ValueType>
+  PropertyTable & add( const KeyType & key_r, const std::set<ValueType> & lst_r, bool forceDetails_r = false  )
+  { return lst( key_r, lst_r, forceDetails_r );  }
+  template <class KeyType, class ValueType>
+  PropertyTable & add( const KeyType & key_r, const std::list<ValueType> & lst_r, bool forceDetails_r = false  )
+  { return lst( key_r, lst_r, forceDetails_r );  }
+  template <class KeyType, class ValueType>
+  PropertyTable & add( const KeyType & key_r, const std::vector<ValueType> & lst_r, bool forceDetails_r = false  )
+  { return lst( key_r, lst_r, forceDetails_r ); }
+
+  ///////////////////////////////////////////////////////////////////
+  // misc
+  PropertyTable & paint( ansi::Color color_r, bool cond_r = true )
+  {
+    if ( cond_r )
+    {
+      // FIXME re-coloring like this works only once
+      std::string & lastval( _table.rows().back().columns().back() );
+      lastval = ColorString( lastval, color_r ).str();
+    }
+    return *this;
+  }
+
+  TableRow & last()
+  { return _table.rows().back(); }
+
+  std::string & lastKey()
+  { return last().columns()[0]; }
+
+  std::string & lastValue()
+  { return last().columns()[1]; }
+
+public:
+  friend std::ostream & operator << ( std::ostream & str, const PropertyTable & obj )
+  { return str << obj._table; }
+
+private:
+  Table _table;
+};
+
+}
+
+// Local Variables:
+// c-basic-offset: 2
+// End:
+#endif
diff --git a/zypp-tui/application.cc b/zypp-tui/application.cc
new file mode 100644 (file)
index 0000000..466a668
--- /dev/null
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#include "application.h"
+#include <zypp-tui/output/OutNormal.h>
+#include <zypp-core/base/Exception.h>
+
+namespace ztui {
+
+  namespace {
+    Application **getApplicationInstance () {
+      thread_local Application *app = nullptr;
+      return &app;
+    }
+  }
+
+  Application::Application()
+    : _exitCode(ZTUI_EXIT_OK)
+    , _config( new Config() )
+  { init(); }
+
+  Application::Application(std::shared_ptr<Config> &&cfg)
+    : _exitCode(ZTUI_EXIT_OK)
+    , _config( std::move(cfg) )
+  { init(); }
+
+  void Application::init()
+  {
+    // ALWAYS do this FIRST!
+    *getApplicationInstance() = this;
+    _out = std::make_shared<OutNormal>();
+  }
+
+  Application::~Application()
+  {
+    // set the thread local global to null again
+    *getApplicationInstance() = nullptr;
+  }
+
+  Application &Application::instance()
+  {
+    auto instPtr = *getApplicationInstance ();
+    if ( !instPtr )
+      ZYPP_THROW( zypp::Exception("No ztui::Application intance registered, its required to create one manually before using ztui.") );
+    return *instPtr;
+  }
+
+  const Config &Application::config() const
+  {
+    return *_config;
+  }
+
+  Config &Application::mutableConfig()
+  {
+    return *_config;
+  }
+
+  Out &Application::out()
+  {
+    if ( not _out ) {
+      _out.reset(new OutNormal( Out::QUIET ));
+    }
+    return *_out;
+  }
+
+  void Application::setOutputWriter(Out *out)
+  {
+    if ( out == _out.get() )
+      return;
+    _out.reset ( out );
+  }
+
+  void Application::setExitCode(int exit)                      {
+    WAR << "setExitCode " << exit << std::endl;
+    _exitCode = exit;
+  }
+
+}
diff --git a/zypp-tui/application.h b/zypp-tui/application.h
new file mode 100644 (file)
index 0000000..ad0cfdb
--- /dev/null
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_TUIAPPLICATION_INCLUDED
+#define ZYPP_TUI_TUIAPPLICATION_INCLUDED
+
+#include <zypp-core/base/NonCopyable.h>
+#include <zypp-tui/Config>
+#include <memory>
+
+namespace ztui {
+
+  class Out;
+  static constexpr int ZTUI_EXIT_OK = 0;
+
+  class Application : private zypp::base::NonCopyable
+  {
+  public:
+    Application();
+    virtual ~Application();
+
+    /*!
+     * Returns the \ref Application instance for the current thread after it
+     * was created.
+     */
+    static Application & instance();
+
+    const Config &config () const;
+    Config &mutableConfig();
+
+    virtual Out & out();
+    virtual void setOutputWriter( Out * out );
+
+    int exitCode() const { return _exitCode; }
+    void setExitCode( int exit );
+
+  protected:
+    Application ( std::shared_ptr<Config> &&cfg );
+
+  private:
+    void init();
+    int   _exitCode;
+    std::shared_ptr<Config> _config;
+    std::shared_ptr<Out> _out;
+  };
+}
+
+
+
+#endif
diff --git a/zypp-tui/config.cc b/zypp-tui/config.cc
new file mode 100644 (file)
index 0000000..994ab02
--- /dev/null
@@ -0,0 +1,32 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#include "config.h"
+#include <cstdlib>
+#include <cstring>
+#include <unistd.h>
+
+namespace ztui {
+  Config::Config()
+    : do_ttyout         ( mayUseANSIEscapes() )
+    , do_colors         ( hasANSIColor() )
+    , color_result      (ansi::Color::fromString("default"))
+    , color_msgStatus  (ansi::Color::fromString("default"))
+    , color_msgError   (ansi::Color::fromString("red"))
+    , color_msgWarning (ansi::Color::fromString("purple"))
+    , color_prompt      (ansi::Color::fromString("bold"))
+    , color_promptOption(ansi::Color::nocolor())       // follow color_prompt
+    , color_positive   (ansi::Color::fromString("green"))
+    , color_change      (ansi::Color::fromString("brown"))
+    , color_negative   (ansi::Color::fromString("red"))
+    , color_highlight  (ansi::Color::fromString("cyan"))
+    , color_lowlight   (ansi::Color::fromString("brown"))
+    , color_osdebug     (ansi::Color::fromString("default") < ansi::Color::Attr::Reverse)
+  { }
+
+}
diff --git a/zypp-tui/config.h b/zypp-tui/config.h
new file mode 100644 (file)
index 0000000..bbc7f76
--- /dev/null
@@ -0,0 +1,56 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_CONFIG_INCLUDED
+#define ZYPP_TUI_CONFIG_INCLUDED
+
+#include <zypp-tui/utils/ansi.h>
+
+namespace ztui {
+
+  class Config {
+  public:
+
+    Config ();
+
+    /**
+     * True unless output is a dumb tty or file. In this case we should not use
+     * any ANSI Escape sequences (at least those moving the cursor; color may
+     * be explicitly enabled 'zypper --color ..| less'
+     */
+    bool do_ttyout;
+
+    /**
+     * Whether to colorize the output. This is evaluated according to
+     * color_useColors and do_ttyout.
+     */
+    bool do_colors;
+
+    ansi::Color color_result;
+    ansi::Color color_msgStatus;
+    ansi::Color color_msgError;
+    ansi::Color color_msgWarning;
+    ansi::Color color_prompt;
+    ansi::Color color_promptOption;
+    ansi::Color color_positive;
+    ansi::Color color_change;
+    ansi::Color color_negative;
+    ansi::Color color_highlight;
+    ansi::Color color_lowlight;
+    ansi::Color color_osdebug;
+
+  };
+
+}
+
+#endif
diff --git a/zypp-tui/output/AliveCursor.h b/zypp-tui/output/AliveCursor.h
new file mode 100644 (file)
index 0000000..c2674b9
--- /dev/null
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_OUTPUT_ALIVE_CURSOR_H
+#define ZYPP_TUI_OUTPUT_ALIVE_CURSOR_H
+
+#include <iostream>
+
+namespace ztui {
+
+class AliveCursor
+{
+  public:
+  friend std::ostream & operator<<( std::ostream & str, const AliveCursor & obj );
+
+  AliveCursor() : _current('-')
+  {}
+
+  char current() const
+  { return _current; }
+
+  void increase()
+  {
+    switch ( _current )
+    {
+      case '-':
+        _current = '\\';
+      break;
+      case '\\':
+        _current = '|';
+      break;
+      case '|':
+        _current = '/';
+      break;
+      case '/':
+        _current = '-';
+      break;
+    }
+  }
+
+  AliveCursor & operator++()
+  {
+    increase();
+    return *this;
+  }
+
+  AliveCursor & operator++(int)
+  {
+    increase();
+    return *this;
+  }
+
+  AliveCursor & done()
+  {
+    _current = '*';
+    return *this;
+  }
+
+  private:
+  char _current;
+};
+
+/** \relates Date Stream output */
+inline std::ostream & operator<<( std::ostream & str, const AliveCursor & obj )
+{ return str << obj.current(); }
+
+}
+
+#endif
+
diff --git a/zypp-tui/output/Out.cc b/zypp-tui/output/Out.cc
new file mode 100644 (file)
index 0000000..b8c2c29
--- /dev/null
@@ -0,0 +1,169 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <unistd.h>
+
+#include <iostream>
+#include <sstream>
+
+//#include <zypp/AutoDispose.h>
+
+#include "Out.h"
+#include <zypp-tui/Table.h>
+#include <zypp-tui/Application>
+#include "Utf8.h"
+
+namespace ztui {
+
+///////////////////////////////////////////////////////////////////
+namespace out
+{
+  unsigned defaultTermwidth()
+  { return Application::instance().out().termwidth(); }
+} // namespace out
+///////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////
+//     class TermLine
+////////////////////////////////////////////////////////////////////////////////
+
+std::string TermLine::get( unsigned width_r, SplitFlags flags_r, char exp_r ) const
+{
+  utf8::string l(lhs); // utf8::string::size() returns visible chars (ignores ansi SGR)!
+  utf8::string r(rhs);
+
+  if ( width_r == out::termwidthUnlimited )
+    return zypp::str::Str() << l << r; // plain string if zero width
+
+  unsigned llen = l.size();
+  unsigned rlen = r.size();
+  int diff = width_r - llen - rlen;
+
+  //AutoDispose<int> _delay( 1, ::sleep );
+
+  if ( diff > 0 )
+  {
+    // expand...
+    if ( ! ( flags_r.testFlag( SF_EXPAND ) && ::isatty(STDOUT_FILENO) ) )
+      return zypp::str::Str() << l << r;
+
+    if ( percentHint < 0 || percentHint > 100 )
+      return zypp::str::Str() << l << std::string( diff, exp_r ) << r;
+
+    // else:  draw % indicator
+    // -------
+    // <1%>===
+    // .<99%>=
+    // .<100%>
+    if ( percentHint == 0 )
+      return zypp::str::Str() << l << std::string( diff, '-' ) << r;
+
+
+    unsigned pc = diff * percentHint / 100; // diff > 0 && percentHint > 0
+    if ( diff < 6 )    // not enough space for fancy stuff
+      return zypp::str::Str() << l <<  std::string( pc, '.' ) << std::string( diff-pc, '=' ) << r;
+
+    // else: less boring
+    std::string tag( zypp::str::Str() << '<' << percentHint << "%>" );
+    pc = ( pc > tag.size() ? pc - tag.size() : 0 );
+    return zypp::str::Str() << l << std::string( pc, '.' ) << tag << std::string( diff-pc-tag.size(), '=' ) << r;
+  }
+  else if ( diff < 0 )
+  {
+    // truncate...
+    if ( flags_r.testFlag( SF_CRUSH ) )
+    {
+      if ( rlen > width_r )
+        return r.substr( 0, width_r ).str();
+      return zypp::str::Str() << l.substr( 0, width_r - rlen ) << r;
+    }
+    else if ( flags_r.testFlag( SF_SPLIT ) )
+    {
+      zypp::str::Str out;
+      if ( llen > width_r )
+        mbs_write_wrapped( out.stream(), l.str(), 0, width_r );
+      else
+        out << l;
+      return out << "\n" << ( rlen > width_r ? r.substr( 0, width_r ) : std::string( width_r - rlen, ' ' ) + r );
+    }
+    // else:
+    return zypp::str::Str() << l << r;
+  }
+  // else: fits exactly
+  return zypp::str::Str() << l << r;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//     class Out
+////////////////////////////////////////////////////////////////////////////////
+
+constexpr Out::Type Out::TYPE_NONE;
+constexpr Out::Type Out::TYPE_ALL;
+
+Out::~Out()
+{}
+
+bool Out::progressFilter()
+{
+  return verbosity() < Out::NORMAL;
+}
+
+std::string Out::zyppExceptionReport(const zypp::Exception & e)
+{
+  return e.asUserHistory();
+}
+
+void Out::searchResult( const Table & table_r )
+{
+  std::cout << table_r;
+}
+
+void Out::progressEnd( const std::string & id, const std::string & label, ProgressEnd donetag_r )
+{
+  // translator: Shown as result tag in a progress bar: ............[done]
+  static const std::string done      { _("done") };
+  // translator: Shown as result tag in a progress bar: .......[attention]
+  static const std::string attention { MSG_WARNINGString(_("attention")).str() };
+  // translator: Shown as result tag in a progress bar: ...........[error]
+  static const std::string error     { MSG_ERRORString(_("error")).str() };
+
+  const std::string & donetag { donetag_r==ProgressEnd::done ? done : donetag_r==ProgressEnd::error ? error : attention };
+  progressEnd( id, label, donetag, donetag_r==ProgressEnd::error );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//     class Out::Error
+////////////////////////////////////////////////////////////////////////////////
+
+int Out::Error::report( Application & app_r ) const
+{
+  if ( ! ( _msg.empty() && _hint.empty() ) )
+    app_r.out().error( _msg, _hint );
+  if ( _exitcode != ZTUI_EXIT_OK )     // ZTUI_EXIT_OK indicates exitcode is already set.
+    app_r.setExitCode( _exitcode );
+  return app_r.exitCode();
+}
+
+std::string Out::Error::combine( std::string && msg_r, const zypp::Exception & ex_r )
+{
+  if ( msg_r.empty() )
+  {
+    msg_r = combine( ex_r );
+  }
+  else
+  {
+    msg_r += "\n";
+    msg_r += combine( ex_r );
+  }
+  return std::move(msg_r);
+}
+std::string Out::Error::combine( const zypp::Exception & ex_r )
+{ return Application::instance().out().zyppExceptionReport( ex_r ); }
+
+}
diff --git a/zypp-tui/output/Out.h b/zypp-tui/output/Out.h
new file mode 100644 (file)
index 0000000..70f40c5
--- /dev/null
@@ -0,0 +1,1179 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef OUT_H_
+#define OUT_H_
+
+#include <string>
+#include <sstream>
+#include <optional>
+
+#include <zypp-core/base/Xml.h>
+#include <zypp-core/base/NonCopyable.h>
+#include <zypp-core/base/Exception.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Flags.h>
+#include <zypp-core/base/DefaultIntegral>
+#include <zypp-core/base/DtorReset>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/Url.h>
+#include <zypp-core/TriBool.h>
+#include <zypp-core/ui/ProgressData>
+#include <zypp-core/base/LogTools.h>
+
+#include <zypp-tui/utils/text.h>
+#include <zypp-tui/utils/colors.h>
+#include <zypp-tui/utils/richtext.h>
+#include <zypp-tui/Table.h>
+#include <zypp-tui/output/PromptOptions>
+
+namespace ztui {
+
+class Application;
+
+/// ProgressBars default end tags.
+enum class ProgressEnd { done, attention, error };
+
+namespace text
+{
+  // translator: usually followed by a ' ' and some explanatory text
+  inline ColorString tagNote() { return HIGHLIGHTString(_("Note:") ); }
+  // translator: usually followed by a ' ' and some explanatory text
+  inline ColorString tagWarning() { return MSG_WARNINGString(_("Warning:") ); }
+  // translator: usually followed by a ' ' and some explanatory text
+  inline ColorString tagError() { return MSG_ERRORString(_("Error:") ); }
+
+  inline const char * qContinue() { return _("Continue?"); }
+
+
+  /** Simple join of two string types */
+  template <class Tltext, class Trtext>
+  inline std::string join( const Tltext & ltext, const Trtext & rtext, const char * sep = " " )
+  { std::string ret( zypp::str::asString(ltext) ); ret += sep; ret += zypp::str::asString(rtext); return ret; }
+
+  /** Whether the \a str_r ends with a WS. */
+  inline bool endsOnWS( const std::string & str_r )
+  {
+    bool ret = false;
+    if ( !str_r.empty() )
+    { int l = *str_r.rbegin(); if ( ::strchr( " \n\t", l ) ) ret = true; }
+    return ret;
+  }
+
+  inline const char * optBlankAfter( const std::string & str_r )
+  { return( endsOnWS( str_r ) ? "" : " " ); }
+}
+
+namespace out
+{
+  static constexpr unsigned termwidthUnlimited = 0u;
+  unsigned defaultTermwidth(); // Zypper::instance().out().termwidth()
+} // namespace out
+
+namespace out
+{
+  /*!
+   * \class ListLayout
+   * \brief Basic list layout
+   * \todo fix design made in eile
+  */
+  struct ListLayout
+  {
+    template <class TFormater> struct Writer;
+
+    ListLayout( bool singleline_r, bool wrapline_r, bool gaped_r, unsigned indent_r )
+    : _singleline( singleline_r )
+    , _wrapline( wrapline_r )
+    , _gaped( gaped_r )
+    , _indent( indent_r )
+    {}
+    bool       _singleline;    ///< one list element per line
+    bool       _wrapline;      ///< fold lines longer than \c _linewidth
+    bool       _gaped;         ///< add extra NL before element (if singleline)
+    unsigned   _indent;        ///< amount of indent
+  };
+
+  namespace detail
+  {
+    template <bool singleline_, bool wrapline_, bool gaped_, unsigned indent_>
+    struct ListLayoutInit : public ListLayout { ListLayoutInit() : ListLayout( singleline_, wrapline_, gaped_, indent_ ) {} };
+  }
+
+  typedef detail::ListLayoutInit<true, false,false, 0U>        XmlListLayout;
+  typedef detail::ListLayoutInit<true, true, false, 0U>        DefaultListLayout;      ///< one element per line, no indent
+  typedef detail::ListLayoutInit<true, true, true,  0U>        DefaultGapedListLayout; ///< one element per line, no indent, gaped
+  typedef detail::ListLayoutInit<true, true, false, 2U>        IndentedListLayout;     ///< one element per line, indented
+  typedef detail::ListLayoutInit<true, true, true,  2U>        IndentedGapedListLayout;///< one element per line, indented, gaped
+  typedef detail::ListLayoutInit<false,true, false, 2U>        CompressedListLayout;   ///< multiple elements per line, indented
+
+  /*!
+   * \class TableLayout
+   * \brief Basic table layout
+  */
+  struct TableLayout
+  {
+    template <class TFormater> struct Writer;
+  };
+
+  typedef TableLayout  DefaultTableLayout;     ///< Simple Table
+
+  // Either specialize per Type or define a custom Formater:
+
+  /** \relates XmlFormater XML representation of types [no default] */
+  template <class Tp>
+  std::string asXmlListElement( const Tp & val_r );
+  inline std::string asXmlListElement( const std::string & val_r ){ return val_r; }
+  inline std::string asXmlListElement( const char * val_r )    { return val_r; }
+
+  /** \relates ListFormater NORMAL representation of types in lists [no default] */
+  template <class Tp>
+  std::string asListElement( const Tp & val_r );
+  inline std::string asListElement( const std::string & val_r )        { return val_r; }
+  inline std::string asListElement( const char * val_r )       { return val_r; }
+
+  /** \relates TableFormater NORMAL representation of types as TableHeader [no default] */
+  template <class Tp = void>
+  TableHeader asTableHeader();
+
+  template <>
+  inline TableHeader asTableHeader<void>()
+  { return TableHeader(); }
+
+  /** \relates TableFormater NORMAL representation of types as TableRow [no default] */
+  template <class Tp>
+  TableRow asTableRow( const Tp & val_r );
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class XmlFormater
+  /// \brief XML representation of types in container [asXmlListElement]
+  ///////////////////////////////////////////////////////////////////
+  struct XmlFormater
+  {
+    template <class Tp>
+    std::string xmlListElement( const Tp & val_r ) const//< XML representation of element
+    { return asXmlListElement( val_r ); }
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class ListFormater
+  /// \brief Default representation of types in Lists [asListElement]
+  ///////////////////////////////////////////////////////////////////
+  struct ListFormater : public XmlFormater
+  {
+    typedef DefaultListLayout  NormalLayout;           //< ListLayout for NORMAL lists
+
+    template <class Tp>
+    std::string listElement( const Tp & val_r ) const  //< NORMAL representation of list element
+    { return asListElement( val_r ); }
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class TableFormater
+  /// \brief Special list formater writing a Table [asTableHeader|asTableRow]
+  ///////////////////////////////////////////////////////////////////
+  struct TableFormater : public XmlFormater
+  {
+    typedef DefaultTableLayout NormalLayout;           //< NORMAL layout as Table
+
+    TableHeader header() const                         //< TableHeader for TableRow representation
+    { return asTableHeader<>(); }
+
+    template <class Tp>                                        //< Representation as TableRow
+    TableRow row( const Tp & val_r ) const
+    { return asTableRow( val_r ); }
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class XmlFormaterAdaptor
+  /// \brief Adaptor mapping xmlListElement->listElement for container XML output
+  ///////////////////////////////////////////////////////////////////
+   /** Adaptor */
+  template <class TFormater>
+  struct XmlFormaterAdaptor
+  {
+    typedef XmlListLayout      NormalLayout;           //< Layout as XML list
+
+    template <class Tp>
+    std::string listElement( const Tp & val_r ) const  //< use TFormater::asXmlListElement
+    { return _formater.xmlListElement( val_r ); }
+
+    XmlFormaterAdaptor( const TFormater & formater_r )
+    : _formater( formater_r )
+    {}
+  private:
+    const TFormater & _formater;
+  };
+
+} // namespace out
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+namespace out
+{
+  ///////////////////////////////////////////////////////////////////
+  /// \class ListLayout::Writer
+  /// \brief Write out a List according to the layout
+  // TODO: wrap singlelines; support for attributed text;
+  ///////////////////////////////////////////////////////////////////
+  template <class TFormater>
+  struct ListLayout::Writer
+  {
+    NON_COPYABLE( Writer );
+
+    Writer( std::ostream & str_r, const ListLayout & layout_r, const TFormater & formater_r )
+    : _str( str_r )
+    , _layout( layout_r )
+    , _formater( formater_r )
+    , _linewidth( defaultTermwidth() )
+    , _indent( _layout._indent, ' ' )
+    {}
+
+    ~Writer()
+    { if ( !_layout._singleline && _cpos ) _str << std::endl; }
+
+    template <class Tp>
+    void operator<<( Tp && val_r ) const
+    {
+      const std::string & element( _formater.listElement( std::forward<Tp>(val_r) ) );
+
+      if ( _layout._singleline )
+      {
+        if ( _layout._gaped )
+          _str << std::endl;
+        _str << _indent << element << std::endl;
+      }
+      else
+      {
+        if ( _cpos != 0 && ! fitsOnLine( 1/*' '*/ + element.size() ) )
+          endLine();
+
+        if ( _cpos == 0 )
+        {
+          if ( !_indent.empty() )
+            printAndCount( _indent );
+        }
+        else
+          printAndCount( " " );
+
+        printAndCount( element );
+      }
+    }
+
+  private:
+    bool fitsOnLine( unsigned size_r ) const
+    { return( !_layout._wrapline || _linewidth == out::termwidthUnlimited || _cpos + size_r <= _linewidth ); }
+
+    void printAndCount( const std::string & element_r ) const
+    { _cpos += element_r.size(); _str << element_r; }
+
+    void endLine() const
+    { _str << std::endl; _cpos = 0U; }
+
+  private:
+    std::ostream &     _str;
+    const ListLayout & _layout;
+    const TFormater &  _formater;
+    const unsigned     _linewidth;     ///< desired line width
+    const std::string  _indent;
+    mutable unsigned   _cpos = 0U;
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class TableLayout::Writer
+  /// \brief Write out a Table according to the layout
+  ///////////////////////////////////////////////////////////////////
+  template <class TFormater>
+  struct TableLayout::Writer
+  {
+    NON_COPYABLE( Writer );
+
+    Writer( std::ostream & str_r, const TableLayout & layout_r, const TFormater & formater_r )
+    : _str( str_r )
+    , _layout( layout_r )
+    , _formater( formater_r )
+    {}
+
+    ~Writer()
+    {
+      if ( !_t.empty() )
+      {
+        _t.setHeader( _formater.header() );
+        _str << _t;
+      }
+    }
+
+    template <class Tp>
+    void operator<<( Tp && val_r ) const
+    { _t.add( _formater.row( std::forward<Tp>(val_r) ) ); }
+
+  private:
+    std::ostream &     _str;
+    const TableLayout &        _layout;
+    const TFormater &  _formater;
+    mutable Table      _t;
+  };
+
+
+  /** Write formatted container to stream */
+  template <class TContainer, class TFormater, class TLayout = typename TFormater::NormalLayout>
+  void writeContainer( std::ostream & str_r, const TContainer & container_r, const TFormater & formater_r, const TLayout & layout_r = TLayout() )
+  {
+    typedef typename TLayout::template Writer<TFormater> Writer;
+    Writer writer( str_r, layout_r, formater_r );
+    for ( auto && el : container_r )
+      writer << el;
+  }
+
+  /** Write XML formatted container to stream */
+  template <class TContainer, class TFormater>
+  void xmlWriteContainer( std::ostream & str_r, const TContainer & container_r, const TFormater & formater_r )
+  { writeContainer( str_r, container_r, out::XmlFormaterAdaptor<TFormater>(formater_r) ); }
+
+} // namespace out
+///////////////////////////////////////////////////////////////////
+
+// Too simple on small terminals as esc-sequences may get truncated.
+// A table like writer for attributed strings is desirable.
+struct TermLine
+{
+  enum SplitFlag
+  {
+    SF_CRUSH   = 1<<0, //< truncate lhs, then rhs
+    SF_SPLIT   = 1<<1, //< split line across two
+    SF_EXPAND  = 1<<2  //< expand short lines iff stdout is a tty
+  };
+  ZYPP_DECLARE_FLAGS( SplitFlags, SplitFlag );
+
+  TermLine( SplitFlags flags_r, char exp_r ) : flagsHint( flags_r ), expHint( exp_r ) {}
+  TermLine( SplitFlags flags_r ) : flagsHint( flags_r ) {}
+  TermLine( char exp_r ) : expHint( exp_r ) {}
+  TermLine() {}
+
+  SplitFlags flagsHint;                                //< flags to use if not passed to \ref get
+  zypp::DefaultIntegral<char,' '> expHint;     //< expand char to use if not passed to \ref get
+  zypp::DefaultIntegral<int,-1> percentHint;   //< draw progress indicator in expanded space if in [0,100]
+
+  zypp::str::Str lhs;                          //< left side
+  zypp::str::Str rhs;                          //< right side
+
+
+  /** Return plain line made of lhs + rhs */
+  std::string get() const
+  { return std::string(lhs) + std::string(rhs); }
+
+  /** Return line optionally formatted according to \a width_r and \a flags_r.
+   * If \a width_r or \a flags_r is zero a plain line made of lhs + rhs is returned.
+   */
+  std::string get( unsigned width_r, SplitFlags flags_r, char exp_r ) const;
+  /** \overload */
+  std::string get( unsigned width_r, SplitFlags flags_r ) const
+  { return get( width_r, flags_r, expHint ); }
+  /** \overload */
+  std::string get( unsigned width_r, char exp_r ) const
+  { return get( width_r, flagsHint, exp_r ); }
+  /** \overload */
+  std::string get( unsigned width_r ) const
+  { return get( width_r, flagsHint, expHint ); }
+};
+ZYPP_DECLARE_OPERATORS_FOR_FLAGS( TermLine::SplitFlags );
+
+/**
+ * Base class for producing common (for now) zypper output.
+ *
+ * This is an abstract class providing interface for writing output like
+ * info messages, warnings, error messages, user prompts, progress reports,
+ * and download progress reports. See descriptions of the methods for more
+ * details.
+ *
+ * The output is produced using Out derived class instances.
+ *
+ * <code>
+ *
+ * // create output object
+ * SomePointerType<Out> out;
+ * if (options.count("xmlout"))
+ *   out = new OutXML();
+ * else
+ *   out = new OutNormal();
+ *
+ * out->info("output instance ready to use", Out::HIGH);
+ * out->info("Doing foo");
+ * try
+ * {
+ *   foo();
+ *   out->prompt(PROMPT_FOO, "Need your action?", "y/n"); // see output/prompt.h
+ *   if (action())
+ *     out->info("result", Out::QUIET);                // always show the result
+ *   else
+ *     cout << "special result" << endl; // special output must be done
+ *                                       // the usual way for now
+ * }
+ * catch(const Exception & e)
+ * {
+ *   out->error(e, "Problem doing foo", "Do 'bar' to deal with this");
+ * }
+ *
+ * </code>
+ */
+class Out : private zypp::base::NonCopyable
+{
+public:
+  /** Verbosity levels. */
+  typedef enum
+  {
+    QUIET  = 0,                ///< Only important messages (no progress or status, only the result).
+    NORMAL = 1,                ///< Default output verbosity level. Progress for important tasks, moderate
+                        ///< amount of status messages, operation information, result.
+    HIGH   = 2,                ///< More detailed description of the operations.
+    DEBUG  = 3         ///< \todo drop this level in favor of zypper.log?
+  } Verbosity;
+
+  /** Known output types implemented by derived classes. */
+  enum TypeBit
+  {
+    TYPE_NORMAL = 0x01<<0,     ///< plain text output
+    TYPE_XML    = 0x01<<1      ///< xml output
+  };
+  ZYPP_DECLARE_FLAGS(Type,TypeBit);
+
+  static constexpr Type TYPE_NONE       = Type(0x00);
+  static constexpr Type TYPE_ALL       = Type(0xff);
+
+  using PromptId = unsigned;
+
+protected:
+  Out(TypeBit type, Verbosity verbosity = NORMAL)
+    : _verbosity(verbosity), _type(type)
+  {}
+
+public:
+  virtual ~Out();
+
+protected:
+  ///////////////////////////////////////////////////////////////////
+  /// \class ParentOut
+  /// \brief Convenience base class storing the back reference to Out.
+  struct ParentOut
+  {
+    ParentOut( Out & out_r ) : _out( out_r ) {}
+    Out & out() { return _out; }
+  private:
+    Out & _out;
+  };
+
+public:
+  ///////////////////////////////////////////////////////////////////
+  /// \class XmlNode
+  /// \brief XML only: RAII writing a XML nodes start/end tag
+  /// \code
+  /// {
+  ///  XmlNode( "node", { "attr", "val" } ); // <node attr="val">
+  ///  ...
+  /// }                                       // </node>
+  /// \endcode
+  struct XmlNode : protected ParentOut
+  {
+    typedef zypp::xmlout::Node::Attr Attr;
+
+    /** Ctor taking nodename and attribute list. */
+    XmlNode( Out & out_r, const std::string & name_r, const std::initializer_list<Attr> & attrs_r = {} )
+    : ParentOut( out_r )
+    {
+      if ( out().typeXML() && ! name_r.empty() )
+      { _node.reset( new zypp::xmlout::Node( std::cout, name_r, attrs_r ) ); }
+    }
+
+    /** Convenience ctor for one attribute pair */
+    XmlNode( Out & out_r, const std::string & name_r, Attr attr_r )
+    : XmlNode( out_r, name_r, { attr_r } )
+    {}
+
+    /** Move ctor */
+    XmlNode( XmlNode && rhs ) : ParentOut( rhs ) { _node.swap( rhs._node ); }
+
+  private:
+    zypp::scoped_ptr<zypp::xmlout::Node> _node;
+  };
+  ///////////////////////////////////////////////////////////////////
+
+  /** XML only: Write a leaf node without PCDATA
+   * \code
+   * <node attr="val"/>
+   * \endcode
+   */
+  void xmlNode( const std::string & name_r, const std::initializer_list<XmlNode::Attr> & attrs_r = {} )
+  { if ( typeXML() ) { zypp::xmlout::node( std::cout, name_r, attrs_r ); } }
+  /** \overload for one attribute pair */
+  void xmlNode( const std::string & name_r, XmlNode::Attr attr_r )
+  { xmlNode( name_r, { attr_r } ); }
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class TitleNode
+  /// \brief XmlNode with optional normal text headline (NL appended)
+  struct TitleNode : public XmlNode
+  {
+    TitleNode( XmlNode && node_r, const std::string & title_r = "" )
+    : XmlNode( std::move(node_r) )
+    { if ( out().typeNORMAL() && ! title_r.empty() ) std::cout << title_r << std::endl; }
+  };
+
+private:
+  /** Write container creating a TitleNode with \c size="nnn" attribute and
+   * replacing optional \c %1% in \a title_r with size. */
+  template <class TContainer, class TFormater>
+  void container( const std::string & nodeName_r, const std::string & title_r,
+                  const TContainer & container_r, const TFormater & formater_r )
+  {
+    TitleNode guard( XmlNode( *this, nodeName_r, XmlNode::Attr( "size", zypp::str::numstring( container_r.size() ) ) ),
+                     zypp::str::Format( title_r ) % container_r.size() );
+    switch ( type() )
+    {
+      case TYPE_NORMAL:
+        writeContainer( std::cout, container_r, formater_r );
+        break;
+      case TYPE_XML:
+        ztui::out::xmlWriteContainer( std::cout, container_r, formater_r );
+        break;
+    }
+  }
+
+public:
+  /** Write list from container creating a TitleNode with \c size="nnn" attribute and
+   * replacing optional \c %1% in \a title_r with size. */
+  template <class TContainer, class TFormater = out::ListFormater>
+  void list( const std::string & nodeName_r, const std::string & title_r,
+             const TContainer & container_r, const TFormater & formater_r = TFormater() )
+  { container( nodeName_r, title_r, container_r, formater_r ); }
+
+  /** Write table from container creating a TitleNode with \c size="nnn" attribute and
+   * replacing optional \c %1% in \a title_r with size. */
+  template <class TContainer, class TFormater = out::TableFormater>
+  void table( const std::string & nodeName_r, const std::string & title_r,
+              const TContainer & container_r, const TFormater & formater_r = TFormater() )
+  { container( nodeName_r, title_r, container_r, formater_r ); }
+
+public:
+  /** NORMAL: An empty line */
+  void gap() { if ( type() == TYPE_NORMAL ) std::cout << std::endl; }
+
+  void printRichText( std::string text, unsigned indent_r = 0U )
+  { ztui::printRichText( std::cout, text, indent_r, termwidth() ); }
+
+
+  /** Less common Paragraph formats */
+  struct ParFormat     // placeholder until we need it
+  {};
+
+  /** Paragraph of text, optionally indented, or without leading gap */
+  template <class Text>
+  void par( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() )
+  {
+    gap();     // if needed make it optional via ParFormat
+    zypp::str::Str formated;
+    mbs_write_wrapped( formated.stream(), zypp::str::asString(text_r), indent_r, defaultFormatWidth( 100 ) );
+    info( formated );
+  }
+  /** \overload  convenience for unindented */
+  template <class Text>
+  void par( const Text & text_r, ParFormat format_r = ParFormat() )
+  { par( 0, text_r, format_r ); }
+
+
+  /** Paragraph of text preceded by 'tag_r' and a ' ' */
+  template <class TText, class Text>
+  void taggedPar( size_t indent_r, const TText & tag_r, const Text & text_r, ParFormat format_r = ParFormat() )
+  { par( indent_r, text::join( tag_r, text_r ), format_r ); }
+  /** \overload convenience for unindented par */
+  template <class TText, class Text>
+  void taggedPar( const TText & tag_r, const Text & text_r, ParFormat format_r = ParFormat() )
+  { taggedPar( 0, tag_r, text_r, format_r ); }
+
+
+  /** Paragraph tagged with 'Note: ' */
+  template <class Text>
+  void notePar( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() )
+  { taggedPar( indent_r, text::tagNote(), text_r, format_r ); }
+  /** \overload convenience for unindented par */
+  template <class Text>
+  void notePar( const Text & text_r, ParFormat format_r = ParFormat() )
+  { notePar( 0, text_r, format_r ); }
+
+  /** Paragraph tagged with 'Warning: ' */
+  template <class Text>
+  void warningPar( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() )
+  { taggedPar( indent_r, text::tagWarning(), text_r, format_r ); }
+  /** \overload convenience for unindented par */
+  template <class Text>
+  void warningPar( const Text & text_r, ParFormat format_r = ParFormat() )
+  { warningPar( 0, text_r, format_r ); }
+
+  /** Paragraph tagged with 'Error: ' */
+  template <class Text>
+  void errorPar( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() )
+  { taggedPar( indent_r, text::tagError(), text_r, format_r ); }
+  /** \overload convenience for unindented par */
+  template <class Text>
+  void errorPar( const Text & text_r, ParFormat format_r = ParFormat() )
+  { errorPar( 0, text_r, format_r ); }
+
+public:
+  /**
+   * Show an info message.
+   *
+   * \param msg       The message to be displayed.
+   * \param verbosity Minimal level o verbosity in which the message will be
+   *                  shown. Out::QUIET means the message will be always be
+   *                  displayed. Out::HIGH means the message will be displayed
+   *                  only if the current verbosity level is HIGH (-v) or DEBUG
+   *                  (-vv).
+   * \param mask      Determines the types of output for which is this message
+   *                  intended. By default, the message will be shown in all
+   *                  types of output.
+   */
+  virtual void info(const std::string & msg, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL) = 0;
+  /** \overload concatenating 2 strings (e.g. translated and untranslated parts) */
+  void info( std::string msg, const std::string & msg2, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL )
+  { info( (msg+=msg2), verbosity, mask ); }
+
+  /** \ref info taking a \ref TermLine */
+  virtual void infoLine(const TermLine & msg_r, Verbosity verbosity_r = NORMAL, Type mask_r = TYPE_ALL)
+  { info( msg_r.get(), verbosity_r, mask_r ); }
+
+  struct Info : protected ParentOut
+  {
+    NON_COPYABLE( Info );
+
+    Info( Out & out_r )
+      : ParentOut( out_r )
+      , _str( new std::ostringstream )
+    {}
+
+    Info( Out::Info && rhs )
+      : ParentOut( rhs )
+      , _str( std::move(rhs._str) )
+    {}
+
+    ~Info()
+    { out().info( _str->str() ); }
+
+    template<class Tp>
+    std::ostream & operator<<( const Tp & val )
+    { return (*_str) << val; /*return *this;*/ }
+
+   private:
+      std::unique_ptr<std::ostringstream> _str; // work around missing move ctor
+  };
+
+  Info info() { return Info( *this ); }
+
+
+  /** Info message, 2 strings L/R-adjusted. */
+  void infoLR( const std::string & lmsg, const std::string & rmsg, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL )
+  {
+    TermLine outstr( TermLine::SF_SPLIT | TermLine::SF_EXPAND );
+    outstr.lhs << lmsg;
+    outstr.rhs << ' ' << rmsg;
+    infoLine( outstr, verbosity, mask );
+  }
+
+  /** Info message with R-adjusted "(hint)". */
+  void infoLRHint( const std::string & lmsg, const std::string & hint, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL )
+  {
+    TermLine outstr( TermLine::SF_SPLIT | TermLine::SF_EXPAND );
+    outstr.lhs << lmsg;
+    outstr.rhs << " (" << hint << ')';
+    infoLine( outstr, verbosity, mask );
+  }
+
+
+  /**
+   * Show a warning.
+   *
+   * \param msg       The warning message to be displayed.
+   * \param verbosity Minimal level o verbosity in which the message will be
+   *                  shown. Out::QUIET means the message will be always be
+   *                  displayed. Out::HIGH means the message will be displayed
+   *                  only if the current verbosity level is HIGH (-v) or DEBUG
+   *                  (-vv).
+   * \param mask      Determines the types of output for which is this message
+   *                  intended. By default, the message will be shown in all
+   *                  types of output.
+   */
+  virtual void warning(const std::string & msg, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL) = 0;
+
+  /** Convenience class for error reporting. */
+  struct Error;
+
+  /**
+   * Show an error message and an optional hint.
+   *
+   * An error message should be shown regardless of the verbosity level.
+   *
+   * \param problem_desc Problem description (what happened)
+   * \param hint         Hint for the user (what to do, or explanation)
+   */
+  virtual void error(const std::string & problem_desc, const std::string & hint = "") = 0;
+
+  /**
+   * Prints the problem description caused by an exception, its cause and,
+   * optionally, a hint for the user.
+   *
+   * \param e Exception which caused the problem.
+   * \param Problem description for the user.
+   * \param Hint for the user how to cope with the problem.
+   */
+  virtual void error(const zypp::Exception & e,
+                     const std::string & problem_desc,
+                     const std::string & hint = "") = 0;
+
+  //! \todo provide an error() method with a/r/i prompt, more read_action_ari here
+
+  /** \name Progress of an operation. */
+  //@{
+
+  /** Convenience class for progress output. */
+  class ProgressBar;
+
+  /**
+   * Start of an operation with reported progress.
+   *
+   * \param id      Identifier. Any string used to match multiple overlapping
+   *                progress reports (doesn't happen now,
+   *                but probably will in the future).
+   * \param label   Progress description.
+   * \param is_tick <tt>false</tt> for known progress percentage, <tt>true</tt>
+   *                for 'still alive' notifications
+   */
+  virtual void progressStart(const std::string & id,
+                             const std::string & label,
+                             bool is_tick = false) = 0;
+
+  /**
+   * Progress report for an on-going operation.
+   *
+   * \param id      Identifier. Any string used to match multiple overlapping
+   *                progress reports.
+   * \param label   Progress description.
+   * \param value   Percentage value or <tt>-1</tt> if unknown ('still alive'
+   *                notification)
+   */
+  virtual void progress(const std::string & id,
+                        const std::string & label,
+                        int value = -1) = 0;
+
+  /**
+   * End of an operation with reported progress.
+   *
+   * \param id      Identifier. Any string used to match multiple overlapping
+   *                progress reports.
+   * \param label   Progress description.
+   * \param donetag Optional string overwriting the default [done]/[error] tags.
+   * \param error   <tt>false</tt> if the operation finished with success,
+   *                <tt>true</tt> otherwise.
+   */
+  virtual void progressEnd(const std::string & id,
+                           const std::string & label,
+                           const std::string & donetag,
+                           bool error = false) = 0;
+  /** \overload using the default [done]/[attention]/[error] tags in screen output. depending on \a donetag. */
+  void progressEnd( const std::string & id, const std::string & label, ProgressEnd donetag );
+  /** \overload using the default [done]/[error] tags in screen output depending on \a error. */
+  void progressEnd( const std::string & id, const std::string & label, bool error = false )
+  { progressEnd( id, label, error ? ProgressEnd::error : ProgressEnd::done ); }
+  //@}
+
+  /** \name Download progress with download rate */
+  //@{
+  /**
+   * Reoprt start of a download.
+   *
+   * \param uri   Uri of the file to download.
+   */
+  virtual void dwnldProgressStart(const zypp::Url & uri) = 0;
+
+  /**
+   * Reports download progress.
+   *
+   * \param uri   Uri of the file being downloaded.
+   * \param value Value of the progress in percents. -1 if unknown.
+   * \param rate  Current download rate in B/s. -1 if unknown.
+   */
+  virtual void dwnldProgress(const zypp::Url & uri,
+                             int value = -1,
+                             long rate = -1) = 0;
+  /**
+   * Reports end of a download.
+   *
+   * \param uri   Uri of the file to download.
+   * \param rate  Average download rate at the end. -1 if unknown.
+   * \param error Error flag - did the download finish with error? \c indeterminate == 'not found'
+   */
+  virtual void dwnldProgressEnd(const zypp::Url & uri,
+                                long rate = -1,
+                                zypp::TriBool error = false) = 0;
+  //@}
+
+  /**
+   * Print out a search result.
+   *
+   * Default implementation prints \a table_r on \c stdout.
+   *
+   * \param table_r Table containing the search result.
+   *
+   * \todo Using a more generic format than a Table is desired.
+   */
+  virtual void searchResult( const Table & table_r );
+
+  /**
+   * Prompt the user for a decision.
+   *
+   * \param id           Unique prompt identifier for use by machines.
+   * \param prompt       Prompt text.
+   * \param options      A PromptOptions object
+   * \param startdesc    Initial detailed description of the prompt to be
+   *                     prepended to the \a prompt text. Should be used
+   *                     only whe prompting for the first time and left empty
+   *                     when retrying after an invalid answer has been given.
+   * \see prompt.h
+   * \see ../zypper-prompt.h
+   */
+  virtual void prompt(PromptId id,
+                      const std::string & prompt,
+                      const PromptOptions & poptions,
+                      const std::string & startdesc = "") = 0;
+
+  /**
+   * Print help for prompt, if available.
+   * This method should be called after '?' prompt option has been entered.
+   */
+  virtual void promptHelp(const PromptOptions & poptions) = 0;
+
+public:
+  /** Get current verbosity. */
+  Verbosity verbosity() const { return _verbosity; }
+
+  /** Set current verbosity. */
+  void setVerbosity(Verbosity verbosity) { _verbosity = verbosity; }
+
+  /** Convenience macro for exception safe scoped verbosity change
+   * \code
+   *   {
+   *     // shut up zypper
+   *     SCOPED_VERBOSITY( Zypper::instance().out(), Out::QUIET );
+   *     // expands to:
+   *     // const auto & raii __attribute__ ((__unused__))( Zypper::instance().out().scopedVerbosity( Out::QUIET ) );
+   *     ...
+   *     // leaving the block restores previous verbosity
+   *   }
+   * \endcode
+   */
+#define SCOPED_VERBOSITY( OUT, LEVEL ) const auto & raii __attribute__ ((__unused__))( (OUT).scopedVerbosity( LEVEL ))
+
+  /** Return RAII class for exception safe scoped verbosity change. */
+  zypp::DtorReset scopedVerbosity( Verbosity verbosity_r )
+  {
+    std::swap( _verbosity, verbosity_r );
+    return zypp::DtorReset( _verbosity, verbosity_r );
+  }
+
+  /** Hint for a handler whether config would allow to use colors. */
+  virtual void setUseColors( bool yesno ) {}
+
+public:
+  /** Return the type of the instance. */
+  TypeBit type() const { return _type; }
+
+  /** Test for a specific type */
+  bool type( TypeBit type_r ) const { return type() == type_r; }
+  /** \overload test for TYPE_NORMAL */
+  bool typeNORMAL() const { return type( TYPE_NORMAL ); }
+  /** \overload test for TPE_XML */
+  bool typeXML() const { return type( TYPE_XML ); }
+
+  /** Terminal width or 150 if unlimited.
+   * If a \a desired_r value is given, return the
+   * closest width that fits the terminal.
+   */
+  unsigned defaultFormatWidth( unsigned desired_r = 0 ) const
+  {
+    unsigned ret = termwidth();
+    if ( ret == out::termwidthUnlimited )
+      ret = desired_r ? desired_r : 150U;
+    else if ( desired_r < ret )
+      ret = desired_r;
+    return ret;
+  }
+
+  /** Width for formatted output [0==unlimited]. */
+  virtual unsigned termwidth() const { return out::termwidthUnlimited; }
+
+protected:
+
+  /**
+   * Determine whether the output is intended for the particular type.
+   */
+  virtual bool mine(Type type) = 0;
+
+  /**
+   * Determine whether to show progress.
+   *
+   * \return <tt>true</tt> if the progress should be filtered out,
+   *         <tt>false</tt> if it should be shown.
+   */
+  virtual bool progressFilter();
+
+  /**
+   * Return a Exception as a string suitable for output.
+   */
+  virtual std::string zyppExceptionReport(const zypp::Exception & e);
+
+private:
+  Verbosity _verbosity;
+  const TypeBit _type;
+};
+
+ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Out::Type);
+
+///////////////////////////////////////////////////////////////////
+/// \class Out::ProgressBar
+/// \brief Convenience class for progress output.
+///
+/// Progress start and end messages are provided upon object
+/// construction and deletion. Progress data are sent through a
+/// ProgressData object accessible via \ref operator->.
+///
+/// \code
+///    {
+///      Out::ProgressBar report( _zypper.out(), "Prepare action" );
+///      for ( unsigned i = 0; i < 10; ++ i )
+///      {
+///        report->tick();     // turn wheel
+///        sleep(1);
+///      }
+///      report->range( 10 );  // switch to percent mode [0,10]
+///      report.print( "Running action" );
+///      for ( unsigned i = 0; i < 10; ++ i )
+///      {
+///        report->
+///        report->set( i );   // send 0%, 10%, ...
+///        sleep(1);
+///      }
+///      // report.error( "Action failed" );
+///    }
+/// \endcode
+///
+/// If non zero values for \a current_r or \a total_r are passed to
+/// the ctor, the label is prefixed by either "(#C)" or "(#C/#T)"
+///
+/// \todo ProgressData provides NumericId which might be used as
+/// id for_out.progress*().
+///////////////////////////////////////////////////////////////////
+class Out::ProgressBar : private zypp::base::NonCopyable
+{
+public:
+  /** Indicator type for ctor not drawing an initial start bar. */
+  struct NoStartBar {};
+  /** Indicator argument for ctor not drawing an initial start bar.*/
+  static constexpr NoStartBar noStartBar = NoStartBar();
+
+public:
+  /** Ctor not displaying an initial progress bar.
+   * If non zero values for \a current_r or \a total_r are passed,
+   * the label is prefixed by either "(#C)" or "(#C/#T)"
+   */
+  ProgressBar( Out & out_r, NoStartBar, const std::string & progressId_r, const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 )
+    : _out( out_r )
+    , _progressId( progressId_r )
+  {
+    if ( total_r )
+      _labelPrefix = zypp::str::form( "(%*u/%u) ", numDigits( total_r ), current_r, total_r );
+    else if ( current_r )
+      _labelPrefix = zypp::str::form( "(%u) ", current_r );
+    _progress.name( label_r );
+    _progress.sendTo( Print( *this ) );
+  }
+
+  ProgressBar( Out & out_r,NoStartBar,  const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 )
+  : ProgressBar( out_r, noStartBar, "", label_r, current_r, total_r )
+  {}
+
+  /** Ctor displays initial progress bar.
+   * If non zero values for \a current_r or \a total_r are passed,
+   * the label is prefixed by either "(#C)" or "(#C/#T)"
+   */
+  ProgressBar( Out & out_r, const std::string & progressId_r, const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 )
+  : ProgressBar( out_r, noStartBar, progressId_r, label_r, current_r, total_r )
+  {
+    // print the initial progress bar
+    _out.progressStart( _progressId, outLabel( _progress.name() ) );
+  }
+
+  ProgressBar( Out & out_r, const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 )
+  : ProgressBar( out_r, "", label_r, current_r, total_r )
+  {}
+
+  /** Dtor displays final progress bar.
+    * Unless \ref error has explicitly been set, an error is indicated if
+    * a \ref ProgressData range has been set, but 100% were not reached.
+    */
+  ~ProgressBar()
+  {
+    _progress.noSend();        // suppress ~ProgressData final report
+    if ( not _donetag )
+      error( _progress.reportValue() != 100 && _progress.reportPercent() );
+    _out.progressEnd( _progressId, outLabel( _progress.name() ), *_donetag );
+  }
+
+  /** Immediately print the progress bar not waiting for a new trigger. */
+  void print()
+  { _out.progress( _progressId, outLabel( _progress.name() ), _progress.reportValue() ); }
+
+  /** \overload also change the progress bar label. */
+  void print( const std::string & label_r )
+  { _progress.name( label_r ); print(); }
+
+  /** Explicitly indicate the error condition for the final progress bar. */
+  void error( ProgressEnd donetag_r = ProgressEnd::error )
+  { _donetag = donetag_r; }
+
+  /** \overload just done/error.  */
+  void error( bool error_r )
+  { _donetag = error_r ? ProgressEnd::error : ProgressEnd::done; }
+
+  /** Reset any error condition. */
+  void errorreset()
+  { _donetag.reset(); }
+
+  /** \overload also change the progress bar label. */
+  void error( const std::string & label_r )
+  { _progress.name( label_r ); error( true ); }
+
+  /** \overload also change the progress bar label and disambiguate. */
+  void error( const char * label_r )
+  { _progress.name( label_r ); error( true ); }
+
+public:
+  /** \name Access the embedded ProgressData object */
+  //@{
+  zypp::ProgressData * operator->()
+  { return &_progress; }
+
+  const zypp::ProgressData * operator->() const
+  { return &_progress; }
+
+  zypp::ProgressData & operator*()
+  { return _progress; }
+
+  const zypp::ProgressData & operator*() const
+  { return _progress; }
+  //@}
+
+private:
+  /** ProgressData::ReceiverFnc printing to a ProgressBar.
+    *
+    * \note This could also be used to let an external \ref ProgressData object
+    * trigger a \ref ProgressBar. \ref ProgressBar::label and \ref ProgressBar::print
+    * however use the embedded ProgressData object (esp. it's label). So don't mix this.
+    */
+  struct Print
+  {
+    Print( ProgressBar & bar_r ) : _bar( &bar_r ) {}
+    bool operator()( const zypp::ProgressData & progress_r )
+    { _bar->_out.progress( _bar->_progressId, _bar->outLabel( progress_r.name() ), progress_r.reportValue() ); return true; }
+  private:
+    ProgressBar * _bar;
+  };
+
+  std::string outLabel( const std::string & msg_r ) const
+  { return _labelPrefix.empty() ? msg_r : _labelPrefix + msg_r; }
+
+  int numDigits( unsigned num_r ) const
+  { int ret = 1; while ( num_r /= 10 ) ++ret; return ret; }
+
+private:
+  Out & _out;
+  std::optional<ProgressEnd> _donetag;
+  zypp::ProgressData _progress;
+  std::string _progressId;
+  std::string _labelPrefix;
+};
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+/// \class Out::Error
+/// \brief Convenience class Error reporting.
+///
+/// Called action methods may \c throw this as exception. The calling function
+/// should catch and process it (e.g. by calling \ref report).
+///
+/// This allows e.g. active \ref Out::ProgressBar objects to close properly
+/// before the error message is displayed.
+///
+/// \code
+///     try {
+///       Out::ProgressBar report( zypper_r.out(), _("Scanning download directory") );
+///       report->range( todolist.size() );
+///       // now report will indicate an error id closed before reaching 100%
+///       ....
+///       if ( some error )
+///         throw( Out::Error( ZYPPER_EXIT_ERR_BUG,
+///                           _("Failed to read download directory"),
+///                           Errno().asString() ) );
+///
+///     }
+///     catch ( const SourceDownloadImpl::Error & error_r )
+///     {
+///       // Default way of processing a caught Error exception:
+///       // - Write error message and optional hint to screen.
+///       // - Set the ZYPPER_EXIT_ code if necessary.
+///       // - Return the current ZYPPER_EXIT_ code.
+///       return error_r.report( zypper_r );
+///     }
+/// \endcode
+///////////////////////////////////////////////////////////////////
+struct Out::Error
+{
+  Error( int exitcode_r )
+  : _exitcode( exitcode_r ) {}
+
+  // basic: code msg hint
+  Error( int exitcode_r, std::string msg_r, std::string hint_r = std::string() )
+  : _exitcode( exitcode_r ), _msg( std::move(msg_r) ), _hint( std::move(hint_r) ) {}
+
+  // code exception hint
+  Error( int exitcode_r, const zypp::Exception & ex_r, std::string hint_r = std::string() )
+  : _exitcode( exitcode_r ), _msg( combine( ex_r ) ), _hint( std::move(hint_r) ) {}
+
+  // code (msg exception) hint
+  Error( int exitcode_r, std::string msg_r, const zypp::Exception & ex_r, std::string hint_r = std::string() )
+  : _exitcode( exitcode_r ), _msg( combine( std::move(msg_r), ex_r ) ), _hint( std::move(hint_r) ) {}
+
+  /** Default way of processing a caught \ref Error exception.
+   * \li Write error message and optional hint to screen.
+   * \li Set the ZYPPER_EXIT_ code if necessary.
+   * \returns the zypper exitcode.
+   */
+  int report( Application & app_r ) const;
+
+  int _exitcode;       //< ZYPPER_EXIT_OK indicates exitcode is already set.
+  std::string _msg;
+  std::string _hint;
+
+private:
+  static std::string combine( std::string && msg_r, const zypp::Exception & ex_r );
+  static std::string combine( const zypp::Exception & ex_r );
+};
+
+}
+
+#endif /*OUT_H_*/
diff --git a/zypp-tui/output/OutNormal.cc b/zypp-tui/output/OutNormal.cc
new file mode 100644 (file)
index 0000000..e8e8d2f
--- /dev/null
@@ -0,0 +1,463 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include <unistd.h>
+
+#include <zypp-core/Pathname.h>
+#include <zypp-core/ByteCount.h> // for download progress reporting
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/String.h> // for toUpper()
+
+#include <zypp-tui/utils/colors.h>
+#include <zypp-tui/output/AliveCursor.h>
+
+#include "OutNormal.h"
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+namespace ztui {
+
+OutNormal::OutNormal( Verbosity verbosity_r )
+: Out( TYPE_NORMAL, verbosity_r )
+, _use_colors( false )
+, _isatty( do_ttyout() )
+, _newline( true )
+, _oneup( false )
+{}
+
+OutNormal::~OutNormal()
+{}
+
+bool OutNormal::mine( Type type )
+{ return( type & Out::TYPE_NORMAL ); }
+
+bool OutNormal::infoWarningFilter( Verbosity verbosity_r, Type mask )
+{
+  if ( !mine( mask ) )
+    return true;
+  if ( verbosity() < verbosity_r )
+    return true;
+  return false;
+}
+
+void OutNormal::fixupProgressNL()
+{
+  if ( !_newline )  // An active Progress bar is not NL terminated
+    cout << ansi::tty::clearLN; // Wipe it before writing out a normal line to the screen
+    // Alternative : cout << endl; to Keep the progress bar visible.
+}
+
+void OutNormal::info( const std::string & msg_r, Verbosity verbosity_r, Type mask )
+{
+  if ( infoWarningFilter( verbosity_r, mask ) )
+    return;
+
+  fixupProgressNL();
+
+  ColorString msg( msg_r, ColorContext::MSG_STATUS );
+  if ( verbosity_r == Out::QUIET )
+    msg = ColorContext::RESULT;
+  else if ( verbosity_r == Out::DEBUG )
+    msg = ColorContext::OSDEBUG;
+
+  cout << msg << endl;
+  _newline = true;
+}
+
+void OutNormal::infoLine( const TermLine & msg, Verbosity verbosity_r, Type mask )
+{ info( msg.get( termwidth() ), verbosity_r, mask ); }
+
+void OutNormal::warning( const std::string & msg, Verbosity verbosity_r, Type mask )
+{
+  if ( infoWarningFilter( verbosity_r, mask ) )
+    return;
+
+  fixupProgressNL();
+
+  cout << ( ColorContext::MSG_WARNING << _("Warning: ") ) << msg << endl;
+  _newline = true;
+}
+
+void OutNormal::error( const std::string & problem_desc, const std::string & hint )
+{
+  fixupProgressNL();
+
+  cerr << ( ColorContext::MSG_ERROR << problem_desc );
+  if ( !hint.empty() && verbosity() > Out::QUIET )
+    cerr << endl << hint;
+  cerr << endl;
+  _newline = true;
+}
+
+// ----------------------------------------------------------------------------
+
+void OutNormal::error( const zypp::Exception & e, const std::string & problem_desc, const std::string & hint )
+{
+  fixupProgressNL();
+
+  // problem and cause
+  cerr << ( ColorContext::MSG_ERROR << problem_desc << endl << zyppExceptionReport(e) ) << endl;
+
+  // hint
+  if ( !hint.empty() && verbosity() > Out::QUIET )
+    cerr << hint << endl;
+
+  _newline = true;
+}
+
+// ----------------------------------------------------------------------------
+inline std::ostream & PROGRESS_FLUSH( std::ostream & str ) {
+  static const bool dbg = getenv("ZYPPER_PBD"); // every progress bar redraw on a single line
+  return (dbg ? str << std::endl : str << std::flush );
+}
+
+void OutNormal::displayProgress ( const std::string & s, int percent )
+{
+  static AliveCursor cursor;
+
+  if ( _isatty )
+  {
+    TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' );
+    outstr.lhs << s << ' ';
+
+    // dont display percents if invalid
+    if ( percent >= 0 && percent <= 100 )
+    {
+      outstr.percentHint = percent;
+    }
+    ++cursor;
+    outstr.rhs << '[' << cursor.current() << ']';
+
+    if ( _oneup )
+      cout << ansi::tty::clearLN << ansi::tty::cursorUP;
+    cout << ansi::tty::clearLN;
+
+    std::string outline( outstr.get( termwidth() ) );
+    cout << outline << PROGRESS_FLUSH;
+    // no _oneup if CRUSHed // _oneup = ( outline.length() > termwidth() );
+  }
+  else
+    cout << '.' << std::flush;
+}
+
+// ----------------------------------------------------------------------------
+
+void OutNormal::displayTick( const std::string & s )
+{
+  static AliveCursor cursor;
+
+  if ( _isatty )
+  {
+    TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' );
+    ++cursor;
+    outstr.lhs << s << ' ';
+    outstr.rhs << '[' << cursor.current() << ']';
+
+    if( _oneup )
+      cout << ansi::tty::clearLN << ansi::tty::cursorUP;
+    cout << ansi::tty::clearLN;
+
+    std::string outline( outstr.get( termwidth() ) );
+    cout << outline << PROGRESS_FLUSH;
+    // no _oneup if CRUSHed // _oneup = ( outline.length() > termwidth() );
+  }
+  else
+    cout << '.' << std::flush;
+}
+
+// ----------------------------------------------------------------------------
+void OutNormal::progressStart( const std::string & id, const std::string & label, bool is_tick )
+{
+  if ( progressFilter() )
+    return;
+
+  if ( !_isatty )
+    cout << label << " [";
+
+  if ( is_tick )
+    displayTick( label );
+  else
+    displayProgress( label, 0 );
+
+  _newline = false;
+}
+
+void OutNormal::progress( const std::string & id, const std::string & label, int value )
+{
+  if (progressFilter())
+    return;
+
+  if (value)
+    displayProgress(label, value);
+  else
+    displayTick(label);
+
+  _newline = false;
+}
+
+void OutNormal::progressEnd( const std::string & id, const std::string & label, const std::string & donetag, bool error )
+{
+  if ( progressFilter() )
+    return;
+
+  if ( !error && _use_colors )
+    cout << ColorContext::MSG_STATUS;
+
+  TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '.' );
+  if ( _isatty )
+  {
+    if ( _oneup )
+    {
+      cout << ansi::tty::clearLN << ansi::tty::cursorUP;
+      _oneup = false;
+    }
+    cout << ansi::tty::clearLN;
+
+    outstr.lhs << label << ' ';
+    outstr.rhs << '[';
+  }
+  // else: just write the donetag
+
+  outstr.rhs << donetag << ']';
+
+  std::string outline( outstr.get( termwidth() ) );
+  cout << outline << endl << std::flush;
+  _newline = true;
+
+  if ( !error && _use_colors )
+    cout << ColorContext::DEFAULT;
+}
+
+// progress with download rate
+void OutNormal::dwnldProgressStart( const zypp::Url & uri )
+{
+  if ( verbosity() < NORMAL )
+    return;
+
+  if ( _isatty )
+    cout << ansi::tty::clearLN;
+
+  TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' );
+  outstr.lhs << _("Retrieving:") << ' ';
+  if ( verbosity() == DEBUG )
+    outstr.lhs << uri;
+  else
+    outstr.lhs << zypp::Pathname(uri.getPathName()).basename();
+  outstr.lhs << ' ';
+  if (_isatty)
+    outstr.rhs << '[' << _("starting") << ']';
+  else
+    outstr.rhs << '[' ;
+
+  std::string outline( outstr.get( termwidth() ) );
+  cout << (ColorContext::HIGHLIGHT << outline) << PROGRESS_FLUSH;
+  // no _oneup if CRUSHed // _oneup = (outline.length() > termwidth());
+
+  _newline = false;
+}
+
+void OutNormal::dwnldProgress( const zypp::Url & uri, int value, long rate )
+{
+  if ( verbosity() < NORMAL )
+    return;
+
+  if ( !_isatty )
+  {
+    cout << '.' << std::flush;
+    return;
+  }
+
+  if( _oneup )
+    cout << ansi::tty::clearLN << ansi::tty::cursorUP;
+  cout << ansi::tty::clearLN;
+
+  TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' );
+  outstr.lhs << _("Retrieving:") << " ";
+  if ( verbosity() == DEBUG )
+    outstr.lhs << uri;
+  else
+    outstr.lhs << zypp::Pathname(uri.getPathName()).basename();
+   outstr.lhs << ' ';
+
+  // dont display percents if invalid
+  if ( value >= 0 && value <= 100 )
+    outstr.percentHint = value;
+
+  static AliveCursor cursor;
+  ++cursor;
+  outstr.rhs << '[' << cursor.current();
+  if ( rate > 0 )
+    outstr.rhs << " (" << zypp::ByteCount(rate) << "/s)";
+  outstr.rhs << ']';
+
+  std::string outline( outstr.get( termwidth() ) );
+  cout << (ColorContext::HIGHLIGHT << outline) << PROGRESS_FLUSH;
+  // no _oneup if CRUSHed // _oneup = (outline.length() > termwidth());
+  _newline = false;
+}
+
+void OutNormal::dwnldProgressEnd( const zypp::Url & uri, long rate, zypp::TriBool error )
+{
+  if ( verbosity() < NORMAL )
+    return;
+
+  if ( bool(!error) && _use_colors )
+    cout << ColorContext::MSG_STATUS;
+
+  TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '.' );
+  ColorStream lhs { outstr.lhs.stream(), ColorContext::HIGHLIGHT };
+  ColorStream rhs { outstr.rhs.stream(), ColorContext::HIGHLIGHT };
+  if ( _isatty )
+  {
+    if( _oneup )
+      cout << ansi::tty::clearLN << ansi::tty::cursorUP;
+    cout << ansi::tty::clearLN;
+    lhs << _("Retrieving:") << " ";
+    if ( verbosity() == DEBUG )
+      lhs << uri;
+    else
+      lhs << zypp::Pathname(uri.getPathName()).basename();
+    lhs << ' ';
+    rhs << '[';
+    if ( zypp::indeterminate( error ) )
+      // Translator: download progress bar result: "........[not found]"
+      rhs << CHANGEString(_("not found") );
+    else if ( error )
+      // Translator: download progress bar result: "............[error]"
+      rhs << NEGATIVEString(_("error") );
+    else
+      // Translator: download progress bar result: ".............[done]"
+      rhs << _("done");
+  }
+  else
+    rhs << ( zypp::indeterminate( error ) ? _("not found") : ( error ? _("error") : _("done") ) );
+
+  if ( rate > 0 )
+    rhs << " (" << zypp::ByteCount(rate) << "/s)";
+  rhs << ']';
+
+  std::string outline( outstr.get( termwidth() ) );
+  cout << outline << endl << std::flush;
+  _newline = true;
+
+  if ( bool(!error) && _use_colors )
+    cout << ColorContext::DEFAULT;
+}
+
+void OutNormal::prompt( PromptId id, const std::string & prompt, const PromptOptions & poptions, const std::string & startdesc )
+{
+  fixupProgressNL();
+
+  if ( startdesc.empty() )
+  {
+    if ( _isatty )
+      cout << ansi::tty::clearLN;
+  }
+  else
+    cout << startdesc << endl;
+
+  std::ostringstream pstr;
+  ColorStream cout( pstr, ColorContext::PROMPT ); // scoped color on std::cout
+
+  cout << prompt;
+  if ( ! poptions.empty() )
+    cout << text::optBlankAfter(prompt) << ColorString( poptions.optionString() );
+  cout << ": ";
+
+  if ( do_colors() )
+  {
+    // bsc#948566: Terminal is dumb and simply counts the amount of printable
+    // characters. If the number of printable characters within ansi SGR sequences
+    // is not a multiple of 8, tab stops are not computed correctly. We use
+    // superfluous resets ("\033[0m"; 3 printable chars) to fill up.
+    // Better ideas are welcome.
+    size_t invis = 0;
+    bool   insgr = false;
+    for ( char ch : pstr.str() )
+    {
+      if ( insgr )
+      {
+        ++invis;
+        if ( ch == 'm' )
+          insgr = false;
+      }
+      else if (  ch == '\033' )
+        insgr = true;
+    }
+    invis %= 8;
+
+    if ( invis )
+    {
+      // "\033[0m" has 3 printable chars:
+      // ( resets[to fill] * 3 ) % 8 == to fill
+      //                               0 1 2 3 4 5 6 7
+      static const size_t resets[] = { 0,3,6,1,4,7,2,5 };
+      for ( size_t i = resets[8-invis]; i; --i )
+        cout << ansi::Color::SGRReset();
+    }
+  }
+
+  std::cout << pstr.str() << std::flush;
+  // prompt ends with newline (user hits <enter>) unless exited abnormaly
+  _newline = true;
+}
+
+void OutNormal::promptHelp( const PromptOptions & poptions )
+{
+  cout << endl;
+
+  if ( poptions.helpEmpty() )
+    cout << _("No help available for this prompt.") << endl;
+
+  // Nevertheless list all option names and their '#NUM' shortcut
+  unsigned pos = 0;    // Userland counter #NUM  (starts with #1)
+
+  zypp::str::Format fopt { "#%-2d: %-10s" };
+  for ( unsigned idx = 0; idx < poptions.options().size(); ++idx )
+  {
+    if ( poptions.isDisabled(idx) )
+      continue;
+
+    cout << ( fopt % ++pos % poptions.options()[idx] );
+    if ( ! poptions.helpEmpty() )
+    {
+      const std::string & help { poptions.optionHelp(idx) };
+      cout << " - ";
+      if ( help.empty() )
+        cout << ( ColorContext::LOWLIGHT << "(" << _("no help available for this option") << ")" );
+      else
+        cout << help;
+    }
+    cout << endl;
+  }
+
+  ColorStream cout( std::cout, ColorContext::PROMPT ); // scoped color on std::cout
+  cout << endl << ColorString( poptions.optionString() ) << ": " << std::flush;
+  // prompt ends with newline (user hits <enter>) unless exited abnormaly
+  _newline = true;
+}
+
+unsigned OutNormal::termwidth() const
+{
+  if ( _isatty )
+  {
+    struct winsize wns;
+    if ( !ioctl( 1, TIOCGWINSZ, &wns ) )
+      return wns.ws_col;
+  }
+  return Out::termwidth();     // unlimited
+}
+
+}
diff --git a/zypp-tui/output/OutNormal.h b/zypp-tui/output/OutNormal.h
new file mode 100644 (file)
index 0000000..144ea6a
--- /dev/null
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef OUTNORMAL_H_
+#define OUTNORMAL_H_
+
+#include <zypp-tui/output/Out.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+namespace ztui {
+
+class OutNormal : public Out
+{
+public:
+  OutNormal(Verbosity verbosity = NORMAL);
+  ~OutNormal() override;
+
+public:
+  void info( const std::string & msg, Verbosity verbosity, Type mask ) override;
+  void infoLine( const TermLine & msg, Verbosity verbosity, Type mask ) override;
+  void warning( const std::string & msg, Verbosity verbosity, Type mask ) override;
+  void error( const std::string & problem_desc, const std::string & hint ) override;
+  void error( const zypp::Exception & e, const std::string & problem_desc, const std::string & hint ) override;
+
+  // progress
+  void progressStart( const std::string & id, const std::string & label, bool is_tick ) override;
+  void progress( const std::string & id, const std::string & label, int value ) override;
+  void progressEnd( const std::string & id, const std::string & label, const std::string & donetag, bool error) override;
+
+  // progress with download rate
+  void dwnldProgressStart( const zypp::Url & uri ) override;
+  void dwnldProgress( const zypp::Url & uri, int value, long rate ) override;
+  void dwnldProgressEnd( const zypp::Url & uri, long rate, zypp::TriBool error ) override;
+
+  void prompt( PromptId id, const std::string & prompt, const PromptOptions & poptions, const std::string & startdesc ) override;
+
+  void promptHelp( const PromptOptions & poptions ) override;
+
+  void setUseColors( bool value ) override
+  { _use_colors = value; }
+
+protected:
+  bool mine( Type type ) override;
+
+  /* Return current terminal width or 'unsigned(-1)' when failed */
+  unsigned termwidth() const override;
+
+private:
+  bool infoWarningFilter(Verbosity verbosity, Type mask);
+  void fixupProgressNL(); //< Make sure we're at BOL even if a ProgressBar is active
+  void displayProgress(const std::string & s, int percent);
+  void displayTick(const std::string & s);
+
+  bool _use_colors;
+  bool _isatty;
+  /* Newline flag. false if the last output did not end with new line character
+   * (like in a self-overwriting progress line), false otherwise. */
+  bool _newline;
+  /* True if the last output line was longer than the terminal width */
+  bool _oneup;
+};
+
+}
+
+#endif /*OUTNORMAL_H_*/
diff --git a/zypp-tui/output/PromptOptions b/zypp-tui/output/PromptOptions
new file mode 100644 (file)
index 0000000..028b1d8
--- /dev/null
@@ -0,0 +1 @@
+#include "promptoptions.h"
diff --git a/zypp-tui/output/Utf8.h b/zypp-tui/output/Utf8.h
new file mode 100644 (file)
index 0000000..69a65d9
--- /dev/null
@@ -0,0 +1,196 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_OUTPUT_UTF8_H_
+#define ZYPP_TUI_OUTPUT_UTF8_H_
+
+#include <cstdlib>
+#include <cstring>
+#include <wchar.h>
+
+#include <iostream>
+#include <string>
+
+namespace ztui {
+
+///////////////////////////////////////////////////////////////////
+namespace utf8
+{
+  /** Simple utf8 string */
+  class string
+  {
+  public:
+    typedef std::string::size_type size_type;
+    static const size_type npos = std::string::npos;
+
+  public:
+    string() {}
+    string( const char * rhs )         : _str( rhs ) {}
+    string( const std::string & rhs )  : _str( rhs ) {}
+
+  public:
+    const char * c_str() const                 { return _str.c_str(); }
+    const std::string & str() const            { return _str; }
+    std::string & str()                                { return _str; }
+
+  public:
+    /** utf8 size */
+    size_type size() const
+    {
+      // test for locales using dual width fonts:
+      static bool isCJK = []()->bool {
+        const char * lang = ::getenv( "LANG" );
+        return ( lang && ( !strncmp( lang, "zh", 2 )
+                        || !strncmp( lang, "ko", 2 )
+                        || !strncmp( lang, "ja", 2 ) ) );
+      }();
+
+      if ( isCJK )
+      {
+        // this should actually be correct for ALL locales:
+        size_type len = 0;
+        const char *s = _str.c_str();
+        for ( size_type slen = _str.size(); slen > 0; )
+        {
+          if ( *s == '\033' && *(s+1) == '[' ) // skip ansi SGR
+          {
+            slen -= 2; s += 2;
+            while ( slen > 0 && *s != 'm' )
+            { --slen; ++s; }
+            if ( slen > 0 )
+            { --slen; ++s; }
+            continue;
+          }
+
+          wchar_t wc;
+          size_t bytes = mbrtowc( &wc, s, slen, NULL );
+          if ( bytes <= 0 )
+            break;
+          len += wcwidth( wc );
+          slen -= bytes;
+          s += bytes;
+        }
+        return len;
+      }
+
+      // NON CJK: faster and hopefully accurate enough:
+      // simply do not count continuation bytes '10xxxxxx'
+      size_type ret = _str.size();
+      size_type ansi = 0;
+      for ( auto ch : _str )
+      {
+        if ( ansi )
+        {
+          if ( ansi == 1 && ch == '[' )
+          {
+            ansi = 2;
+            continue;
+          }
+          else if ( ansi >= 2 ) // not testing for in [0-9;m]
+          {
+            ++ansi;
+            if ( ch == 'm' ) // SGR end
+            { ret -= ansi; ansi = 0; }
+            continue;
+          }
+        }
+
+        if ( isContinuationByte( ch ) )
+          --ret;
+        else if ( ch == '\033' )
+          ansi = 1;
+      }
+      return ret;
+    }
+
+    /** \overload std::string has both too */
+    size_type length() const
+    { return size(); }
+
+    /** utf8 substring */
+    string substr( size_type pos_r = 0, size_type len_r = npos ) const
+    {
+      size_type p = upos( pos_r );
+      size_type l = upos( len_r, p );
+      return string( _str.substr( p, ( l == npos ? npos : l-p ) ) );
+    }
+
+  private:
+    /** Test for continuation byte \c '10xxxxxx' */
+    bool isContinuationByte( char ch ) const
+    { return( (ch & 0xC0) == 0x80 ); }
+
+    /** Return start of codepoint \a pos_r starting at position \c start_r. */
+    size_type upos( size_type pos_r, size_type start_r = 0 ) const
+    {
+      if ( pos_r == npos || start_r > _str.size() )
+        return npos;
+
+      size_type upos = start_r;
+      for ( const char * chp = _str.c_str() + upos; *chp; ++chp, ++upos )
+      {
+        if ( ! isContinuationByte( *chp ) )
+        {
+           if ( pos_r )
+             --pos_r;
+           else
+             return upos;
+
+           while ( *chp == '\033' && *(chp+1) == '[' ) // skip any ansi SGR
+           {
+             chp += 2;
+             upos += 2;
+             while ( *chp && *chp != 'm' )
+             { ++chp; ++upos; }
+             if ( *chp )
+             { ++chp; ++upos; }
+             else
+               break;  // incomplete ansi SGR
+           }
+           if ( ! *chp )
+             break;    // incomplete ansi SGR
+        }
+      }
+      return( pos_r ? npos : upos );
+    }
+
+  private:
+    std::string _str;
+  };
+
+  /** \relates string concatenation */
+  inline string operator+( const string & lhs, const string & rhs )
+  { return string( lhs.str() + rhs.str() ); }
+  /** \overload */
+  inline string operator+( const string & lhs, const std::string & rhs )
+  { return string( lhs.str() + rhs ); }
+  /** \overload */
+  inline string operator+( const std::string & lhs, const string & rhs )
+  { return string( lhs + rhs.str() ); }
+  /** \overload */
+  inline string operator+( const string & lhs, const char * rhs )
+  { return string( lhs.str() + rhs ); }
+  /** \overload */
+  inline string operator+( const char * lhs, const string & rhs )
+  { return string( lhs + rhs.str() ); }
+
+  /** \relates string Stream output */
+  inline std::ostream & operator<<( std::ostream & str, const string & obj )
+  { return str << obj.str(); }
+
+} // namespace utf8
+///////////////////////////////////////////////////////////////////
+
+}
+
+#endif // ZYPP_TUI_OUTPUT_UTF8_H_
diff --git a/zypp-tui/output/promptoptions.cc b/zypp-tui/output/promptoptions.cc
new file mode 100644 (file)
index 0000000..85af05a
--- /dev/null
@@ -0,0 +1,196 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include "promptoptions.h"
+
+#include <zypp-core/base/Gettext.h>
+#include <zypp/base/Logger.h>
+#include <zypp/base/String.h>
+
+namespace ztui {
+
+  // ----------------------------------------------------------------------------
+
+  PromptOptions::PromptOptions( StrVector options_r, unsigned defaultOpt_r )
+  { setOptions( std::move(options_r), defaultOpt_r ); }
+
+  PromptOptions::PromptOptions( const std::string & optionstr_r, unsigned defaultOpt_r )
+  { setOptions( optionstr_r, defaultOpt_r ); }
+
+  // ----------------------------------------------------------------------------
+
+  PromptOptions::~PromptOptions()
+  {}
+
+  // ----------------------------------------------------------------------------
+
+  void PromptOptions::setOptions( StrVector options_r, unsigned defaultOpt_r )
+  {
+    _options.swap( options_r );
+    if ( _options.size() <= defaultOpt_r )
+    {
+      INT << "Invalid default option index " << defaultOpt_r << std::endl;
+      _default = 0;
+    }
+    else
+      _default = defaultOpt_r;
+  }
+
+  void PromptOptions::setOptions( const std::string & optionstr_r, unsigned defaultOpt_r )
+  {
+    StrVector options;
+    zypp::str::split( optionstr_r, back_inserter(options), "/" );
+    setOptions( std::move(options), defaultOpt_r );
+  }
+
+  ColorString PromptOptions::optionString() const
+  {
+    bool hidden = false;       // have enabled options not shown at the prompt (/...)?
+    unsigned shown = 0;
+    unsigned showmax = ( _shown_count < 0 ? _options.size() : (unsigned)_shown_count );
+
+    std::ostringstream str;
+    str << "[";
+
+    const char * slash = "";   // "/" after the 1st option
+    for ( unsigned idx = 0; idx < _options.size(); ++idx )
+    {
+      if ( isDisabled(idx) )
+        continue;
+
+      if ( shown < showmax )
+      {
+        str << slash << ( ColorContext::PROMPT_OPTION << _options[idx] );
+        if ( !shown ) slash = "/";
+        ++shown;
+      }
+      else
+      {
+        hidden = true;
+        break; // don't mind how many
+      }
+    }
+
+    if ( hidden || !_opt_help.empty() )
+    {
+      str << slash << ( hidden ? "..." : "" ) << ( ColorContext::PROMPT_OPTION << "?" );
+      if ( hidden )
+        // translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):"
+        str << " " << _("shows all options");
+    }
+
+    str << "]";
+
+    if ( !_options.empty() )
+      str << " (" << ( ColorContext::PROMPT_OPTION << _options[_default] ) << ")";
+
+    return ColorString( str.str() );
+  }
+
+
+  void PromptOptions::setOptionHelp( unsigned opt, const std::string & help_str )
+  {
+    if ( help_str.empty() )
+      return;
+
+    if ( opt >= _options.size() )
+    {
+      WAR << "attempt to set option help for non-existing option."
+          << " text: " << help_str << std::endl;
+      return;
+    }
+
+    if ( opt >= _opt_help.capacity() )
+      _opt_help.reserve( _options.size() );
+    if ( opt >= _opt_help.size( ))
+      _opt_help.resize( _options.size() );
+
+    _opt_help[opt] = help_str;
+  }
+
+  std::vector<int> PromptOptions::getReplyMatches( const std::string & reply_r ) const
+  {
+    std::vector<int> ret;
+
+    // #NUM ? (direct index into option vector)
+    if ( reply_r[0] == '#' && reply_r[1] != '\0' )
+    {
+      unsigned num = 0;        // -1 : if no match
+      for ( const char * cp = reply_r.c_str()+1; *cp; ++cp )
+      {
+        if ( '0' <= *cp && *cp <= '9' )
+        {
+          num *= 10;
+          num += (*cp-'0');
+        }
+        else
+        {
+          num = unsigned(-1);
+          break;
+        }
+      }
+
+      if ( num != unsigned(-1) )
+      {
+        // userland counting! #1 is the 1st (enabled) option (#0 will never match)
+        if ( num != 0 )
+        {
+          for ( unsigned i = 0; i < _options.size(); ++i )
+          {
+            if ( isDisabled(i) )
+              continue;
+
+            if ( --num == 0 )
+            {
+              ret.push_back( i );
+              break;
+            }
+          }
+        }
+        return ret;    // a match - good or bad - will be eaten
+      }
+      // no match falls through....
+    }
+
+    const std::string & lreply { zypp::str::toLower( reply_r ) };
+    for ( unsigned i = 0; i < _options.size(); ++i )
+    {
+      if ( isDisabled(i) )
+        continue;
+
+      const std::string & lopt { zypp::str::toLower( _options[i] ) };
+
+      if ( lopt == lreply ) {  // prefer an exact match ("1/11")
+        ret.clear();
+        ret.push_back( i );
+        break;
+      }
+      else if ( zypp::str::hasPrefix( lopt, lreply ) )
+        ret.push_back( i );
+    }
+
+    return ret;
+  }
+
+  std::string PromptOptions::replyMatchesStr( const std::vector<int> & matches_r ) const
+  {
+    zypp::str::Str str;
+    const char * sep = "(";    // "," after the 1st option
+    for ( unsigned idx : matches_r )
+    {
+      str << sep << _options[idx];
+      if ( *sep != ',' ) sep =",";
+    }
+    return str << ")";
+  }
+
+  bool PromptOptions::isYesNoPrompt() const
+  { return _options.size() == 2 && _options[0] == _("yes") && _options[1] == _("no"); }
+
+}
diff --git a/zypp-tui/output/promptoptions.h b/zypp-tui/output/promptoptions.h
new file mode 100644 (file)
index 0000000..464da99
--- /dev/null
@@ -0,0 +1,121 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_OUTPUT_PROMPTOPTIONS_H_INCLUDED
+#define ZYPP_TUI_OUTPUT_PROMPTOPTIONS_H_INCLUDED
+
+#include <vector>
+#include <string>
+#include <set>
+
+#include <zypp-tui/utils/colors.h>
+
+namespace ztui {
+
+  /**
+ * Example:
+ * <code>
+ * PromptOptions popts;
+ * popts.setOptions(_("y/n/p"), 0 / * default reply * /);
+ * popts.setOptionHelp(0, _("Help for option 'y'"));
+ * popts.setOptionHelp(1, _("Help for option 'n'"));
+ * ...
+ * zypper.out().prompt(PROMPT_YN_INST_REMOVE_CONTINUE, prompt_text, popts);
+ * unsigned reply =
+ *   get_prompt_reply(zypper, PROMPT_YN_INST_REMOVE_CONTINUE, popts);
+ * </code>
+ */
+  class PromptOptions
+  {
+  public:
+    typedef std::vector<std::string> StrVector;
+
+    /**
+   * Default c-tor.
+   */
+    PromptOptions() {};
+
+    /** Ctor taking the option values as vector */
+    PromptOptions( StrVector options_r, unsigned defaultOpt_r );
+
+    /**
+   * Constructor.
+   *
+   * \param optionstr_r  translated option string containing one or more
+   *                     options separated by slash '/' character
+   *                     e.g. "yes/no/?" or "1/s/r/c"
+   * \param defaultOpt_r index of the default answer within the \a option_str
+   */
+    PromptOptions( const std::string & optionstr_r, unsigned defaultOpt_r );
+
+    /** D-tor */
+    ~PromptOptions();
+
+    const StrVector & options() const { return _options; }
+    void setOptions( StrVector options_r, unsigned defaultOpt_r );
+    void setOptions( const std::string & optionstr_r, unsigned defaultOpt_r );
+
+    unsigned defaultOpt() const { return _default; }
+    /** Option string (may have embedded color codes) */
+    ColorString optionString() const;
+    bool empty() const { return _options.empty(); }
+    bool isYesNoPrompt() const;
+
+    const std::string & optionHelp(unsigned opt) const
+    { static std::string empty; return opt < _opt_help.size() ? _opt_help[opt] : empty; }
+    //const std::string getOptionHelp(const std::string & opt_str);
+    void setOptionHelp(unsigned opt, const std::string & help_str);
+    bool helpEmpty() const { return _opt_help.empty(); }
+
+    bool isEnabled(unsigned opt) const
+    { return !isDisabled(opt); }
+    bool isDisabled(unsigned opt) const
+    { return _disabled.count(opt); }
+    void disable(unsigned opt)
+    { _disabled.insert(opt); }
+    void enable(unsigned opt)
+    { _disabled.erase(opt); }
+    void enableAll()
+    { _disabled.clear(); }
+
+    unsigned shownCount() const
+    { return _shown_count; }
+    void setShownCount(unsigned count)
+    { _shown_count = count; }
+
+    /** Return the indices of option string matches (lowercase/prefix or #NUM). */
+    std::vector<int> getReplyMatches( const std::string & reply_r ) const;
+    /** The returned reply matches as '(,)' list. */
+    std::string replyMatchesStr( const std::vector<int> & matches_r ) const;
+
+  private:
+    /** option strings */
+    StrVector _options;
+    /** index of the default option */
+    unsigned _default = 0;
+    /** help strings corresponding to options */
+    StrVector _opt_help;
+    /** set of options to ignore */
+    std::set<unsigned> _disabled;
+    /**
+   * Number of options to show (the rest will still be available and visible
+   * through '?' help). If negative, all options will be shown. Zero is allowed.
+   */
+    int _shown_count = -1;
+  };
+
+
+
+}
+
+#endif // ZYPP_TUI_OUTPUT_PROMPTOPTIONS_H_INCLUDED
diff --git a/zypp-tui/utils/ansi.h b/zypp-tui/utils/ansi.h
new file mode 100644 (file)
index 0000000..ab7dcd1
--- /dev/null
@@ -0,0 +1,867 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_UTILS_ANSI_H
+#define ZYPP_TUI_UTILS_ANSI_H
+
+#include <cstdint>
+#include <iostream>
+#include <sstream>
+#include <type_traits>
+#include <memory>
+#include <map>
+#include <string>
+
+#include <zypp/base/String.h>
+
+
+namespace ztui {
+
+/** True unless output is a dumb tty or file.
+ * In this case we should not use any ANSI Escape sequences moving the cursor.
+ */
+bool do_ttyout();      // implemented in colors.cc
+
+/** If output is done in colors (depends on config) */
+bool do_colors();      // implemented in colors.cc
+
+/** Simple check whether stdout is a (not dumb) tty */
+bool mayUseANSIEscapes();
+
+/** Simple check whether stdout can handle colors */
+bool hasANSIColor();
+
+///////////////////////////////////////////////////////////////////
+namespace ansi
+{
+  ///////////////////////////////////////////////////////////////////
+  namespace tty
+  {
+    ///////////////////////////////////////////////////////////////////
+    /// \class EscapeSequence
+    /// \brief ANSI Escape sequences and their fallback if no tty
+    ///////////////////////////////////////////////////////////////////
+    class EscapeSequence
+    {
+    public:
+      EscapeSequence( const char * ansi_r, const char * fallback_r = "" )
+      : _seq( ansi_r )
+      , _fbck( fallback_r )
+      {}
+
+      const char * str() const
+      {
+        if ( _fbck )   // determine _seq<>_fbck on 1st use (dtor is too early as do_ttyout() is not yet ready)
+        {
+          if ( ! do_ttyout() )
+            _seq = _fbck;
+          _fbck = nullptr;
+        }
+        return _seq;
+      }
+
+    private:
+      mutable const char * _seq;
+      mutable const char * _fbck;
+    };
+
+    /** \relates EscapeSequence stream output */
+    inline std::ostream & operator<<( std::ostream & str, const EscapeSequence & obj )
+    { return str << obj.str(); }
+
+
+    // EscapeSequence definitions in colors.cc
+
+    extern const EscapeSequence clearLN;       ///< Clear entire line
+
+    extern const EscapeSequence cursorUP;      ///< Cursor up 1 line
+    extern const EscapeSequence cursorDOWN;    ///< Cursor down 1 line
+    extern const EscapeSequence cursorRIGHT;   ///< Cursor right 1 char
+    extern const EscapeSequence cursorLEFT;    ///< Cursor left 1 char
+
+  } // namespace tty
+  ///////////////////////////////////////////////////////////////////
+
+#define ZYPPER_TRACE_SGR 0
+#undef ESC
+#if ( ZYPPER_TRACE_SGR < 2 )
+#define ESC "\033"
+#else
+#define ESC "@"
+#endif
+  ///////////////////////////////////////////////////////////////////
+  /// \class ColorTraits<Tp_>
+  /// \brief Traits class to enable custom \ref Color construction
+  ///
+  /// This enables using user types (usaually enums) to be used as \ref Color
+  /// with \ref ColorString or \ref ColorStream classes:
+  /// \code
+  ///   enum ColorContext { Red, Green, Blue };
+  ///
+  ///   cout << "default"
+  ///        << ( ColorContext::Green << "green"
+  ///                                 << ColorContext::Red << "switch to red"
+  ///                                 << ( ColorContext::Blue << "blue" )
+  ///                                 << "still red" )
+  ///        << "default" << endl;
+  /// \endcode
+  ///
+  /// You need to define a function <tt>ansi::Color customColorCtor( EnumType enum_r )</tt>
+  /// which associates enum value and \ref Color:
+  /// \code
+  ///  ansi::Color customColorCtor( ColorContext ctxt_r )
+  ///  { return Color associated with each enum value }
+  /// \endcode
+  ///
+  /// Then specailize \ref ColorTraits for your enum to enable using it as \ref ColorStream
+  /// \code
+  ///  namespace ansi
+  ///  {
+  ///    template<>
+  ///    struct ColorTraits<ColorContext>
+  ///    { enum { customColorCtor = true }; };
+  ///  }
+  /// \endcode
+  ///
+  /// This will enable your enum being impicitly converted into ansi::Color, especially
+  /// when used together with \ref ColorString and \ref ColorStream. Printing your enum
+  /// on a stream, will also print the associated colors SGR sequence:
+  /// \code
+  ///  // provided via ColorTraits:
+  ///  std::ostream & operator<<( std::ostream & str, ColorContext obj )
+  ///  { return str << ansi::Color( obj ); }
+  /// \endcode
+  ///////////////////////////////////////////////////////////////////
+  template<class Tp_>
+  struct ColorTraits
+  { enum { customColorCtor = false }; };
+
+  // enabled via ctor Color::Constant -> Color
+  /** \relates ColorTraits<Tp_> SFINAE: hide template signatures unless enum is enabled in \ref ColorTraits */
+  template <typename CCC_>
+  using EnableIfCustomColorCtor = typename std::enable_if< ansi::ColorTraits<typename std::decay<CCC_>::type>::customColorCtor >::type;
+
+  /** \relates ColorTraits<Tp_> SFINAE: hide template signatures unless enum is enabled in \ref ColorTraits */
+  template <typename CCC_>
+  using DisableIfCustomColorCtor = typename std::enable_if< !ansi::ColorTraits<typename std::decay<CCC_>::type>::customColorCtor >::type;
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class Color
+  /// \brief Various ways to define ansi SGR sequences.
+  ///
+  /// Any color component (\ref Attr, \ref Fg, \ref Bg) may have the
+  /// value \c Uchanged, indicating that this component should remain
+  /// unchanged when the terminal color is set. To mimic this use
+  /// \ref operator<<= which updates a color by omitting \c Unchanged
+  /// components.
+  ///nocolor
+  /// \note The function \ref do_colors determines if ansi SGR sequences
+  /// are generated for colors at all.
+  ///
+  ///////////////////////////////////////////////////////////////////
+  class Color
+  {
+  public:
+    /** Color attributes */
+    enum class Attr : std::uint8_t
+    { Unchanged, Normal, Bright, Reverse };
+
+    /** Foreground colors */
+    enum class Fg : std::uint8_t
+    { Unchanged, Default, Black, Red, Green, Yellow, Blue, Magenta, Cyan, White };
+
+    /** Backgroud colors */
+    enum class Bg : std::uint8_t
+    { Unchanged, Default, Black, Red, Green, Yellow, Blue, Magenta, Cyan, White };
+
+    /** Color unique id type */
+    typedef std::uint32_t UidType;
+
+    /** Predefined (foregreound) color contants
+     * Intentionally not an <tt>enum class</tt>, so it can be used as
+     * \c Color::Red, \c Color::Default, etc.
+     */
+    enum Constant : std::uint8_t
+    {
+      Black,   BrightBlack,    // BrightBlack = Darkgray
+      Red,     BrightRed,
+      Green,   BrightGreen,
+      Yellow,  BrightYellow,   // Yellow = Brown on Standard VGA
+      Blue,    BrightBlue,
+      Magenta, BrightMagenta,
+      Cyan,    BrightCyan,
+      White,   BrightWhite,    // White = Gray
+      Default, BrightDefault
+    };
+
+  public:
+    /** Default ctor: terminal default color */
+    Color()
+    : _comp( Attr::Normal, Fg::Default, Bg::Default )
+    {}
+
+    Color( Attr attr_r, Fg fg_r = Fg::Unchanged, Bg bg_r = Bg::Unchanged )
+    : _comp( attr_r, fg_r, bg_r )
+    {}
+
+    Color( Attr attr_r, Bg bg_r )
+    : _comp( attr_r, Fg::Unchanged, bg_r )
+    {}
+
+    Color( Fg fg_r, Bg bg_r = Bg::Unchanged  )
+    : _comp( Attr::Unchanged, fg_r, bg_r )
+    {}
+
+    Color( Bg bg_r )
+    : _comp( Attr::Unchanged, Fg::Unchanged, bg_r )
+    {}
+
+    /** Color constant combined with background (\ref Bg::Default) */
+    Color( Constant color_r, Bg bg_r = Bg::Default )
+    : _comp( ( color_r % 2 ? Attr::Bright : Attr::Normal ), Fg::Default, bg_r )
+    {
+      switch ( color_r )
+      {
+        case Black:
+        case BrightBlack:      _comp.fg = Fg::Black;   break;
+        case Red:
+        case BrightRed:                _comp.fg = Fg::Red;     break;
+        case Green:
+        case BrightGreen:      _comp.fg = Fg::Green;   break;
+        case Yellow:
+        case BrightYellow:     _comp.fg = Fg::Yellow;  break;
+        case Blue:
+        case BrightBlue:       _comp.fg = Fg::Blue;    break;
+        case Magenta:
+        case BrightMagenta:    _comp.fg = Fg::Magenta; break;
+        case Cyan:
+        case BrightCyan:       _comp.fg = Fg::Cyan;    break;
+        case White:
+        case BrightWhite:      _comp.fg = Fg::White;   break;
+        default:
+        case Default:
+        case BrightDefault:    break;
+      }
+    }
+
+    /** Custom ctor from ColorTraits enabled type */
+    template<class CCC_, typename = EnableIfCustomColorCtor<CCC_>>
+    Color( CCC_ && color_r )
+    : Color( customColorCtor( std::forward<CCC_>(color_r) ) )
+    {}
+
+  public:
+    /** Leave everything unchanged */
+    static Color nocolor()
+    { return Color( UidType(0) ); }
+
+    /*!
+     * Returns the Color corresponding to the \a colorName.
+     * If \a colorName does not match a known string this returns the
+     * same as \ref nocolor.
+     *
+     * \code
+     * Color::fromString("bold red");
+     * \endcode
+     *
+     */
+    static Color fromString( const std::string &colorName );
+
+    /** Evaluate in boolean context (not \ref nocolor) */
+    explicit operator bool() const
+    { return uid(); }
+
+    /** ANSI SGR sesquence to reset all attributes
+     * \note Printing this SGR sequence has the same visible effect as setting
+     * \ref Color::Default. Classes supporting re-coloring, like \ref ColorString,
+     * however differ between both. While Color::Default is a color to use,
+     * thus to keep when re-coloring, \ref SGRReset is used as placeholder for
+     * later coloring.
+     */
+    static const std::string & SGRReset()
+    {
+#if ( ZYPPER_TRACE_SGR )
+      static const std::string & _reset( *(new std::string( ESC"[0m[!]" )) );  // live until program ends
+#else
+      static const std::string & _reset( *(new std::string( ESC"[0m" )) );     // live until program ends
+#endif
+      static const std::string & _noreset( *(new std::string( "" )) );         // live until program ends
+      if(!do_colors()) return _noreset;
+      return _reset;
+    }
+
+  public:
+    /** Update Color (assign components which are not \c Unchanged in rhs ) */
+    Color & operator<=( Color rhs )
+    {
+      if ( rhs._comp.attr != Attr::Unchanged ) _comp.attr = rhs._comp.attr;
+      if ( rhs._comp.fg != Fg::Unchanged ) _comp.fg = rhs._comp.fg;
+      if ( rhs._comp.bg != Bg::Unchanged ) _comp.bg = rhs._comp.bg;
+      return *this;
+    }
+    /** \overload */
+    Color & operator<=( Color::Attr rhs )
+    { if ( rhs != Attr::Unchanged ) _comp.attr = rhs; return *this; }
+    /** \overload */
+    Color & operator<=( Color::Fg rhs )
+    { if ( rhs != Fg::Unchanged ) _comp.fg = rhs; return *this; }
+    /** \overload */
+    Color & operator<=( Color::Bg rhs )
+    { if ( rhs != Bg::Unchanged ) _comp.bg = rhs; return *this; }
+    /** \overload */
+    inline Color & operator<=( Color::Constant rhs );
+
+    /** Return updated color */
+    Color operator<( Color rhs ) const
+    { return Color(*this) <= rhs; }
+    /** \overload */
+    Color operator<( Color::Attr rhs ) const
+    { return Color(*this) <= rhs; }
+    /** \overload */
+    Color operator<( Color::Fg rhs ) const
+    { return Color(*this) <= rhs; }
+    /** \overload */
+    Color operator<( Color::Bg rhs ) const
+    { return Color(*this) <= rhs; }
+    /** \overload */
+    inline Color operator<( Color::Constant rhs ) const;
+
+  public:
+    Attr attr() const
+    { return _comp.attr; }
+
+    Color & attr( Attr attr_r )
+    { _comp.attr = attr_r; return *this; }
+
+    Fg fg() const
+    { return _comp.fg; }
+
+    Color & fg( Fg fg_r )
+    { _comp.fg = fg_r; return *this; }
+
+    Bg bg() const
+    { return _comp.bg; }
+
+    Color & bg( Bg bg_r )
+    { _comp.bg = bg_r; return *this; }
+
+    /** Each color has a unique numeric id  */
+    UidType uid() const
+    { return _comp.uid; }
+
+    /** The colors SGRsequence if \ref do_colors is \c true */
+    const std::string & str() const
+    { return genSGR( *this ); }
+
+    /** The colors SGRsequence human readable */
+    std::string debugstr() const
+    { return genSGR( *this ).c_str()+1; }
+
+  public:
+  /** \relates Color */
+  friend inline bool operator==( Color lhs, Color rhs )
+  { return( lhs.uid() == rhs.uid() ); }
+
+  /** \relates Color */
+  friend inline bool operator!=( Color lhs, Color rhs )
+  { return ! ( lhs == rhs ); }
+
+  private:
+    /** Return a colors SGRsequence if \ref do_colors retruns \c true */
+    static std::string & genSGR( Color color_r )
+    {
+      static std::map<UidType,std::string> & _def( *(new std::map<UidType,std::string>) );     // live until program ends
+
+      if ( ! ( color_r && do_colors() ) )      // nocolor, all ::Unchanged, uid 0: return empty string
+      {
+#if ( ZYPPER_TRACE_SGR )
+        std::string & ret( _def[0] );
+        if ( ret.empty() )
+          ret =  "[]";
+        return ret;
+#else
+        return _def[0];
+#endif
+      }
+
+      std::string & ret( _def[color_r._comp.uid] );
+      if ( ret.empty() )
+      {
+        ret += ESC"[";
+        switch ( color_r._comp.attr )
+        {
+          case Attr::Normal:   ret += "22;27;";        break;
+          case Attr::Bright:   ret += "1;";            break;
+          case Attr::Reverse:  ret += "7;";            break;
+          default:
+          case Attr::Unchanged:        break;
+        }
+        switch ( color_r._comp.fg )
+        {
+          case Fg::Black:      ret += "30;";           break;
+          case Fg::Red:                ret += "31;";           break;
+          case Fg::Green:      ret += "32;";           break;
+          case Fg::Yellow:     ret += "33;";           break;
+          case Fg::Blue:       ret += "34;";           break;
+          case Fg::Magenta:    ret += "35;";           break;
+          case Fg::Cyan:       ret += "36;";           break;
+          case Fg::White:      ret += "37;";           break;
+          case Fg::Default:    ret += "39;";           break;
+          default:
+          case Fg::Unchanged:  break;
+        }
+        switch ( color_r._comp.bg )
+        {
+          case Bg::Black:      ret += "40;";           break;
+          case Bg::Red:                ret += "41;";           break;
+          case Bg::Green:      ret += "42;";           break;
+          case Bg::Yellow:     ret += "43;";           break;
+          case Bg::Blue:       ret += "44;";           break;
+          case Bg::Magenta:    ret += "45;";           break;
+          case Bg::Cyan:       ret += "46;";           break;
+          case Bg::White:      ret += "47;";           break;
+          case Bg::Default:    ret += "49;";           break;
+          default:
+          case Bg::Unchanged:  break;
+        }
+        *ret.rbegin() = 'm';   // turn trailing ';' into 'm'
+#if ( ZYPPER_TRACE_SGR )
+        ret += ( color_r == Color() ? "[*]" : "[@]" );
+#endif
+      }
+      return ret;
+    }
+
+  private:
+    /** ctor nocolor, all ::Unchanged, uid 0 */
+    Color ( UidType ) {}
+
+    union Comp {
+      Comp()   // nocolor, all ::Unchanged, uid 0
+      : uid( 0 )
+      {}
+
+      Comp( Attr attr_r, Fg fg_r, Bg bg_r )
+      : attr( attr_r ), fg( fg_r ), bg( bg_r ), _f( 0 )
+      {}
+
+      struct {
+        Color::Attr    attr;   // std::uint8_t
+        Color::Fg      fg;     // std::uint8_t
+        Color::Bg      bg;     // std::uint8_t
+        std::uint8_t   _f;     // std::uint8_t
+      };
+      UidType          uid;    // std::uint32_t
+    } _comp;
+  };
+
+  template<>
+  struct ColorTraits<Color::Constant>
+  { enum { customColorCtor = true }; };        // enabled via ctor Color::Constant -> Color
+
+  // Implememtation after ColorTraits<Color::Constant> instantiation !
+  Color & Color::operator<=( Color::Constant rhs )     { return *this <= Color( rhs, Bg::Unchanged ); }
+  Color Color::operator<( Color::Constant rhs ) const  { return Color(*this) <= rhs; }
+
+  /** \relates Color Print the colors SGRsequence if \ref do_colors is \c true */
+  inline std::ostream & operator<<( std::ostream & str, Color obj )
+  { return str << obj.str(); }
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class ColorString
+  /// \brief Colored string if \ref do_colors
+  ///
+  /// Stores a plain std::string (which may have color codes embedded)
+  /// along with a \ref Color. Retrieving the string will render
+  /// all uncolored (\ref Color::nololor) parts of the string in the
+  /// \ref Color.
+  ///
+  /// In contrary to a \ref ColorStream you can change the basic color
+  /// of the string without losing embedded highlights.
+  ///
+  /// \note Printing a \ref ColorString renderd in \ref Color::noclolor
+  /// on a \ref ColorStream will render the string in the ColorStreams
+  /// color.
+  ///////////////////////////////////////////////////////////////////
+  class ColorString
+  {
+  public:
+    ColorString()
+    : _color( Color::nocolor() )
+    {}
+
+    /** Ctor from color */
+    explicit ColorString( Color color_r )
+    : _color( color_r )
+    {}
+
+    /** Ctor from string */
+    explicit ColorString( const std::string & str_r )
+    : _str( str_r )
+    , _color( Color::nocolor() )
+    {}
+    /** \overload moving */
+    explicit ColorString( std::string && str_r )
+    : _str( std::move(str_r) )
+    , _color( Color::nocolor() )
+    {}
+
+    /** Ctor from string and color */
+    ColorString( const std::string & str_r, Color color_r )
+    : _str( str_r )
+    , _color( color_r )
+    {}
+    /** \overload moving */
+    ColorString( std::string && str_r, Color color_r )
+    : _str( std::move(str_r) )
+    , _color( color_r )
+    {}
+
+    /** Ctor from color and string */
+    ColorString( Color color_r, const std::string & str_r )
+    : _str( str_r )
+    , _color( color_r )
+    {}
+    /** \overload moving */
+    ColorString( Color color_r, std::string && str_r )
+    : _str( std::move(str_r) )
+    , _color( color_r )
+    {}
+
+  public:
+    /** Assign new string */
+    ColorString & operator=( const std::string & str_r )
+    { _str = str_r; return *this; }
+    /** \overload moving */
+    ColorString & operator=( std::string && str_r )
+    { _str = std::move(str_r); return *this; }
+
+    ///////////////////////////////////////////////////////////////////
+    // Append via '<<' (not '+=' '+') because it's
+    // strictly evaluated left-to-right:
+    //
+    //   ColorString sep( "-", Color::Cyan );
+    //   ColorString ver( "version" );
+    //
+    //   ver << sep << "release";    // + prints "-" in cyan :)
+    //
+    //   ver += sep + "release";     // - prints "-release" in cyan :(
+    //   ver += sep += "release";    // - prints "-release" in cyan :(
+    //   (ver += sep) += "release";  // + but ugly syntax
+    //
+    /** Append a \Ref ColorString */
+    ColorString & operator<<( const ColorString & rhs )
+    { _str += rhs.str(); return *this; }
+
+    /** Append a string */
+    ColorString & operator<<( const std::string & str_r )
+    { _str += str_r; return *this; }
+    /** \overload moving */
+    ColorString & operator<<( std::string && str_r )
+    { _str += std::move(str_r); return *this; }
+
+  public:
+    /** Assign \ref Color */
+    ColorString & operator=( Color color_r )
+    { _color = color_r; return *this; }
+
+    /** Update \ref Color */
+    ColorString & operator<=( Color color_r )
+    { _color <= color_r; return *this; }
+
+    /** Return a copy with different color. */
+    ColorString operator()( Color color_r ) const
+    { return ColorString( _str, color_r ); }
+
+  public:
+    /** Return strings \ref Color */
+    Color color() const
+    { return _color; }
+
+  public:
+    /** Whether the underlying string is empty */
+    bool empty() const
+    { return plainstr().empty(); }
+
+    /** Size of the underlying string */
+    std::string::size_type size() const
+    { return plainstr().size(); }
+
+    /** Return the colored string if \ref do_colors */
+    std::string str() const
+    { return str( _color ); }
+    /** \overload */
+    std::string asString() const
+    { return str(); }
+
+    /** Return the string rendered in a differernt color if \ref do_colors */
+    std::string str( Color color_r ) const
+    {
+      std::string ret( plainstr() );
+      if ( do_colors() && color_r )
+      {
+        using zypp::str::replaceAll;
+        replaceAll( ret, Color::SGRReset(), color_r.str() );
+        ret = color_r.str() + ret + Color::SGRReset();
+      }
+#if ( ZYPPER_TRACE_SGR )
+      return "[\"<]" + ret + "[>\"]";
+#endif
+      return ret;
+    }
+
+  public:
+    /** Return the underlying plain string */
+    const std::string & plainstr() const
+    { return _str; }
+
+    /** Return the underlying plain string */
+    std::string & plainstr()
+    { return _str; }
+
+    /** Access the underlying plain string via \c operator* */
+    const std::string & operator*() const
+    { return plainstr(); }
+
+    /** Access the underlying plain string via \c operator* */
+    std::string & operator*()
+    { return plainstr(); }
+
+  private:
+    std::string _str;
+    Color _color;
+  };
+
+  /** \relates ColorString Print colored on ostream */
+  inline std::ostream & operator<<( std::ostream & str, const ColorString & obj )
+  { return str << obj.str(); }
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class ColorStream
+  /// \brief Colored stream output if \ref do_colors
+  ///
+  /// If an \c ostream& is passed to the constructor, we directly print
+  /// to this steam. Otherwise an ostringstream is used as buffer until
+  /// the buffered \ref ColorStream itself is printed. Printing an unbuffered
+  /// steam prints an empty string.
+  ///
+  /// \note Printing directly to a stream, the color is active throughout the
+  /// ColorStreams lifetime (set in ctor, reset in dtor).
+  ///
+  /// \see \ref ColorTraits<Tp_> for how to enable convenient \class ColorStream
+  /// handling via an enum type.
+  /// \code
+  ///   ColorStream cstr( std::move( ColorContext::Red << "Error " << 42 ) );
+  ///
+  ///   cout << "default"
+  ///        << ( ColorContext::Green << "prints green"
+  ///                                 << ColorContext::Red << "switch to red"
+  ///                                 << ( ColorContext::Blue << "prints blue" )
+  ///                                 << "still prints red" )
+  ///        << "default" << endl;
+  /// \endcode
+  ///
+  /// \note This class is not copyable but movable.
+  ///////////////////////////////////////////////////////////////////
+  class ColorStream
+  {
+    struct nullDeleter { void operator() (void const *) const {}; };
+
+  public:
+    /** Default Ctor (\ref Color::Default) */
+    ColorStream()
+    {}
+
+    /** Ctor taking a \ref Color */
+    explicit ColorStream( Color color_r )
+    : _color( color_r )
+    {}
+
+    /** Ctor directly printing to a \ref std::ostream (\ref Color::Default) */
+    explicit ColorStream( std::ostream & direct_r  )
+    : ColorStream( direct_r, Color::Default )
+    {}
+
+    /** Ctor directly printing to a \ref std::ostream in \ref Color */
+    ColorStream( std::ostream & direct_r, Color color_r  )
+    : _directP( &direct_r )
+    , _color( color_r )
+    { (*_directP) << _color; }
+
+    /** non copyable */
+    ColorStream( const ColorStream & ) = delete;
+    ColorStream & operator=( const ColorStream & ) = delete;
+
+    /** movable */
+    ColorStream( ColorStream && ) = default;
+    ColorStream & operator=( ColorStream && ) = default;
+
+    ~ColorStream()
+    { if ( _directP ) (*_directP) << Color::SGRReset(); }
+
+    /** Explicit conversion to \ref std::ostream (creates buffer if not direct) */
+    explicit operator std::ostream &()
+    { return stream(); }
+
+  public:
+    /** Change the streams \ref Color */
+    ColorStream & operator=( Color color_r )
+    {
+      _color = color_r;
+      if ( hasStream() )
+        stream() << _color;
+      return *this;
+    }
+
+    /** Update the streams \ref Color */
+    ColorStream & operator<=( Color color_r )
+    {
+      _color <= color_r;
+      if ( hasStream() )
+        stream() << _color;
+      return *this;
+    }
+
+  public:
+    /** Return streams \ref Color */
+    Color color() const
+    { return _color; }
+
+  public:
+    /** Return a buffered streams content as (colored) string */
+    std::string str() const
+    {
+      std::string ret;
+      if ( hasContent() )
+      {
+        ret = _bufferP->str();
+        ret += Color::SGRReset();
+      }
+      return ret;
+    }
+
+  public:
+    /** Printing a \ref Color (also via enum) updates the streams \ref Color */
+    ColorStream & operator<<( Color color_r )
+    { return operator<=( color_r ); }
+
+    /** Printing a \ref ColorString using his \ref Color
+     * \note \ref ColorString in \ref Color::nocolor is renderd in streams color
+     */
+    ColorStream & operator<<( const ColorString & val_r )
+    { stream() << ( val_r.color() ? val_r.str() : val_r.str(_color) ) << _color; return *this; }
+
+    /** Printing another \ref ColorStream using his \ref Color */
+    ColorStream & operator<<( const ColorStream & val_r )
+#if ( ZYPPER_TRACE_SGR )
+    { if ( val_r.hasContent() ) stream() << "[<<]" << val_r.content() << _color << "[>>]"; return *this; }
+#else
+    { if ( val_r.hasContent() ) stream() << val_r.content() << _color; return *this; }
+#endif
+
+    /** All other types are printed via std::ostream */
+    template<class Tp_, typename = DisableIfCustomColorCtor<Tp_>>
+    ColorStream & operator<<( const Tp_ & val_r )      // ! Universal reference here would be too greedy
+    { stream() << val_r; return *this; }
+
+    /** \overload for omaip */
+    ColorStream & operator<<( std::ostream & (*omanip)( std:: ostream & ) )
+    { stream() << omanip; return *this; }
+
+  public:
+    /** \relates ColorStream Print colored on ostream */
+    friend inline std::ostream & operator<<( std::ostream & str, const ColorStream & obj )
+#if ( ZYPPER_TRACE_SGR )
+    { if ( obj.hasContent() ) str << "[<<]" << obj.content() << Color::SGRReset() << "[>>]"; return str; }
+#else
+    { if ( obj.hasContent() ) str << obj.content() << Color::SGRReset(); return str; }
+#endif
+
+  private:
+    /** Direct or non-empty buffer */
+    bool hasStream() const
+    { return _directP || _bufferP; }
+
+    /** Reference to the underlying ostream (direct or auto-created buffer) */
+    std::ostream & stream() const
+    {
+      if ( _directP )
+        return *_directP;
+
+      if ( !_bufferP )
+      {
+        _bufferP.reset( new std::ostringstream );
+        *_bufferP << _color;
+      }
+      return *_bufferP;
+    }
+
+    /** Non-empty buffer (implies direct) */
+    bool hasContent() const
+    { return !!_bufferP; }
+
+    /** Content of a non-empty buffered stream or empty */
+    std::string content() const
+    {
+      std::string ret;
+      if ( hasContent() )
+        ret = _bufferP->str();
+      return ret;
+    }
+
+  private:
+    std::unique_ptr<std::ostream,nullDeleter> _directP;
+    mutable std::unique_ptr<std::ostringstream> _bufferP;
+    Color _color;
+  };
+  ///////////////////////////////////////////////////////////////////
+
+#undef ZYPPER_TRACE_SGR
+} // namespace ansi
+///////////////////////////////////////////////////////////////////
+
+// Drag them into this namespace:
+using ansi::ColorString;
+using ansi::ColorStream;
+
+/** \relates ColorStream Create \ref ColorStream via \ref Color */
+template<class Tp_>
+inline ansi::ColorStream operator<<( ansi::Color color_r, Tp_ && val_r )
+{ return std::move( ansi::ColorStream( color_r ) << std::forward<Tp_>(val_r) ); }
+/** \overload for omanip */
+inline ansi::ColorStream operator<<( ansi::Color color_r, std::ostream & (*omanip)( std::ostream & ) )
+{ return std::move( ansi::ColorStream( color_r ) << omanip ); }
+
+/** \relates ColorStream Create \ref ColorStream via <tt>enum << expr</tt> */
+template<class CCC_, class Tp_, typename = ansi::EnableIfCustomColorCtor<CCC_> >
+inline ansi::ColorStream operator<<( CCC_ && color_r, Tp_ && val_r )
+{ return std::move( ansi::ColorStream( std::forward<CCC_>(color_r) ) << std::forward<Tp_>(val_r) ); }
+/** \overload for omanip */
+template<class CCC_, typename = ansi::EnableIfCustomColorCtor<CCC_> >
+inline ansi::ColorStream operator<<( CCC_ && color_r, std::ostream & (*omanip)( std:: ostream & ) )
+{ return std::move( ansi::ColorStream( std::forward<CCC_>(color_r) ) << omanip ); }
+
+}
+
+
+namespace std
+{
+/** \relates ansi::Color Stream oputput for ColorTraits enabled types
+   * Defined in namespace 'std' because namespace of 'CCC_' may vary
+   */
+template<class CCC_, typename = ztui::ansi::EnableIfCustomColorCtor<CCC_>>
+inline ostream & operator<<( ostream & str, CCC_ && color_r )
+{ return str << ztui::ansi::Color( forward<CCC_>(color_r) ); }
+} // namespace std
+
+#endif // ZYPP_TUI_UTILS_ANSI_H
diff --git a/zypp-tui/utils/colors.cc b/zypp-tui/utils/colors.cc
new file mode 100644 (file)
index 0000000..869f51d
--- /dev/null
@@ -0,0 +1,149 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <iostream>
+
+#include <zypp/base/Logger.h>
+#include <zypp-tui/Application>
+#include "colors.h"
+
+namespace ztui {
+
+namespace env
+{
+  inline bool NO_COLOR()
+  { return ::getenv("NO_COLOR"); }
+} // namespace env
+
+///////////////////////////////////////////////////////////////////
+// from ansi.h
+
+bool do_ttyout()
+{
+  return Application::instance().config().do_ttyout;
+}
+
+bool do_colors()
+{
+  return Application::instance().config().do_colors;
+}
+
+bool mayUseANSIEscapes()
+{
+  constexpr auto detectAnsiEscapes = [](){
+    if ( ::isatty(STDOUT_FILENO) )
+    {
+      char *term = ::getenv("TERM");
+      if ( term && ::strcmp( term, "dumb" ) )
+        return true;
+    }
+    return false;
+  };
+
+  static bool mayUse = detectAnsiEscapes();
+  return mayUse;
+}
+
+bool hasANSIColor()
+{ return mayUseANSIEscapes() && not env::NO_COLOR(); }
+
+namespace ansi
+{
+  namespace tty
+  {
+    const EscapeSequence clearLN       ( "\033[2K\r", "\n" );
+    const EscapeSequence cursorUP      ( "\033[1A" );
+    const EscapeSequence cursorDOWN    ( "\033[1B" );
+    const EscapeSequence cursorRIGHT   ( "\033[1C" );
+    const EscapeSequence cursorLEFT    ( "\033[1D" );
+  } // namespace tty
+
+
+  Color Color::fromString(const std::string &colorName)
+  {
+    static const std::map<std::string, ansi::Color> _def =  {
+      { "black",       ansi::Color::Black              },
+      { "darkgrey",    ansi::Color::BrightBlack        },
+      { "red",         ansi::Color::Red                },
+      { "green",       ansi::Color::Green              },
+      { "brown",       ansi::Color::Yellow             },
+      { "yellow",      ansi::Color::BrightYellow       },
+      { "blue",                ansi::Color::Blue               },
+      { "magenta",     ansi::Color::Magenta            },
+      { "purple",      ansi::Color::Magenta            },
+      { "cyan",                ansi::Color::Cyan               },
+      { "grey",                ansi::Color::White              },
+      { "white",       ansi::Color::BrightWhite        },
+      { "default",     ansi::Color::Default            },
+      { "",            ansi::Color::Default            },  // matches "bold" "light" "bright" NOT ""
+    };
+
+    ansi::Color ret = ansi::Color::nocolor();
+
+    if ( colorName.empty() )   // "" when undefined in config file
+      return ret;
+
+    std::string name_r = zypp::str::toLower( colorName );
+
+    if ( zypp::str::hasPrefix( name_r, "bold" ) ) {
+      name_r.erase( 0, 4 );
+      ret <= ansi::Color::Attr::Bright;
+
+    } else if ( zypp::str::hasPrefix( name_r, "light" ) ) {
+      name_r.erase( 0, 5 );
+      ret <= ansi::Color::Attr::Bright;
+
+    } else if ( zypp::str::hasPrefix( name_r, "bright" ) ) {
+      name_r.erase( 0, 6 );
+      ret <= ansi::Color::Attr::Bright;
+    }
+
+    auto && it = _def.find( name_r );
+    if ( it == _def.end() )
+    {
+      ERR << "Unknown color name '" << name_r << "'" << std::endl;
+      ret = ansi::Color::Default;
+    }
+    else
+    {
+      ret = ( it->second < ret );
+    }
+    return ret;
+  }
+
+
+} // namespace tty
+// from ansi.h
+///////////////////////////////////////////////////////////////////
+
+ansi::Color customColorCtor( ColorContext ctxt_r )
+{
+  const ztui::Config & conf( Application::instance().config() );
+  switch ( ctxt_r )
+  {
+    case ColorContext::RESULT:         return conf.color_result;
+    case ColorContext::MSG_STATUS:     return conf.color_msgStatus;
+    case ColorContext::MSG_WARNING:    return conf.color_msgWarning;
+    case ColorContext::MSG_ERROR:      return conf.color_msgError;
+    case ColorContext::PROMPT:         return conf.color_prompt;
+    case ColorContext::PROMPT_OPTION:  return conf.color_promptOption;
+    case ColorContext::POSITIVE:       return conf.color_positive;
+    case ColorContext::CHANGE:         return conf.color_change;
+    case ColorContext::NEGATIVE:       return conf.color_negative;
+    case ColorContext::HIGHLIGHT:      return conf.color_highlight;
+    case ColorContext::LOWLIGHT:       return conf.color_lowlight;
+    case ColorContext::OSDEBUG:                return conf.color_osdebug;
+
+    case ColorContext::DEFAULT:
+      break;                   // use default...
+  }
+  return ansi::Color::Default; // default
+}
+
+}
diff --git a/zypp-tui/utils/colors.h b/zypp-tui/utils/colors.h
new file mode 100644 (file)
index 0000000..f2512d1
--- /dev/null
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+#ifndef ZYPP_TUI_UTILS_COLORS_H_
+#define ZYPP_TUI_UTILS_COLORS_H_
+
+#include <iostream>
+#include <string>
+
+#include "ansi.h"
+
+namespace ztui {
+
+/** True unless output is a dumb tty or file.
+ * In this case we should not use any ANSI Escape sequences moving the cursor.
+ */
+bool do_ttyout();
+
+/** If output is done in colors (depends on config) */
+bool do_colors();
+
+///////////////////////////////////////////////////////////////////
+
+enum class ColorContext
+{
+  DEFAULT,
+
+  RESULT,
+  MSG_STATUS,
+  MSG_ERROR,
+  MSG_WARNING,
+  PROMPT,
+  PROMPT_OPTION,
+  POSITIVE,
+  CHANGE,
+  NEGATIVE,
+  HIGHLIGHT,
+  LOWLIGHT,
+
+  OSDEBUG
+};
+
+/** \relates ColorContext map to \ref ansi::Color */
+ansi::Color customColorCtor( ColorContext ctxt_r );
+
+namespace ansi
+{
+  // Enable using ColorContext as ansi::SGRSequence
+  template<>
+  struct ColorTraits<ztui::ColorContext>
+  { enum { customColorCtor = true }; };
+}
+
+// ColorString types
+template <ColorContext _ctxt>
+struct CCString : public ColorString
+{
+  CCString()                                           : ColorString( _ctxt ) {}
+  explicit CCString( const std::string & str_r )       : ColorString( _ctxt, str_r ) {}
+  explicit CCString( std::string && str_r )            : ColorString( _ctxt, std::move(str_r) ) {}
+};
+
+template <ColorContext _ctxt>
+inline ansi::ColorStream & operator<<( ansi::ColorStream & cstr_r, const CCString<_ctxt> & cstring_r )
+{ return cstr_r << (const ColorString &)cstring_r; }
+
+typedef CCString<ColorContext::DEFAULT>                DEFAULTString;
+
+typedef CCString<ColorContext::MSG_STATUS>     MSG_STATUSString;
+typedef CCString<ColorContext::MSG_ERROR>      MSG_ERRORString;
+typedef CCString<ColorContext::MSG_WARNING>    MSG_WARNINGString;
+
+typedef CCString<ColorContext::POSITIVE>       POSITIVEString;
+typedef CCString<ColorContext::CHANGE>         CHANGEString;
+typedef CCString<ColorContext::NEGATIVE>       NEGATIVEString;
+
+typedef CCString<ColorContext::HIGHLIGHT>      HIGHLIGHTString;
+typedef CCString<ColorContext::LOWLIGHT>       LOWLIGHTString;
+
+}
+
+#endif /* ZYPP_TUI_UTILS_COLORS_H_ */
diff --git a/zypp-tui/utils/console.cc b/zypp-tui/utils/console.cc
new file mode 100644 (file)
index 0000000..ae012d7
--- /dev/null
@@ -0,0 +1,82 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+/** \file console.cc
+ * Miscellaneous console utilities.
+ */
+#include <unistd.h>
+#include <cstdlib>
+
+#include <fstream>
+#include <iostream>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+namespace ztui {
+
+// ----------------------------------------------------------------------------
+
+// Read a string. "\004" (^D) on EOF.
+std::string readline_getline()
+{
+  std::string ret;
+
+  //::rl_catch_signals = 0;
+  /* Get a line from the user. */
+  if ( char * line_read = ::readline( "zypper> " ) )
+  {
+    ret = line_read;
+    /* If the line has any text in it, save it on the history. */
+    if ( *line_read )
+      ::add_history( line_read );
+    ::free( line_read );
+  }
+  else
+    ret = "\004";
+
+  return ret;
+}
+
+// ----------------------------------------------------------------------------
+
+unsigned get_screen_width()
+{
+  if ( !::isatty(STDOUT_FILENO) )
+    return -1; // no clipping
+
+  int width = 80;
+
+  const char *cols_env = getenv("COLUMNS");
+  if ( cols_env )
+    width  = ::atoi( cols_env );
+  else
+  {
+    ::rl_initialize();
+    //::rl_reset_screen_size();
+    ::rl_get_screen_size( NULL, &width );
+  }
+
+  // safe default
+  if ( !width )
+    width = 80;
+
+  return width;
+}
+
+// ----------------------------------------------------------------------------
+
+void clear_keyboard_buffer()
+{
+  // note: this will not clear characters typed after the last \n
+  std::ifstream stm( "/dev/tty" );
+  char s[8];
+  while (stm.good() && stm.readsome(s, 8));
+}
+
+}
diff --git a/zypp-tui/utils/console.h b/zypp-tui/utils/console.h
new file mode 100644 (file)
index 0000000..00ac6c4
--- /dev/null
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+/** \file console.h
+ * Miscellaneous console utilities.
+ */
+
+#ifndef ZYPP_TUI_UTILS_CONSOLE_H_
+#define ZYPP_TUI_UTILS_CONSOLE_H_
+
+#include <string>
+
+namespace ztui {
+
+/** Use readline to get line of input. */
+std::string readline_getline();
+
+/**
+ * Reads COLUMNS environment variable or gets the screen width from readline,
+ * in that order. Falls back to 80 if all that fails.
+ *
+ * \NOTE In case stdout is not connected to a terminal max. unsigned
+ * is returned. This should prevent clipping when output is redirected.
+ */
+unsigned get_screen_width();
+
+/**
+ *  Clear the keyboard buffer.
+ *  Useful before showing the user prompt message to catch any unwanted <enter>
+ *  key hits (bnc #649248).
+ *
+ *  \NOTE This will not clear characters typed after the last \n
+ */
+void clear_keyboard_buffer();
+
+}
+
+#endif /* ZYPP_TUI_UTILS_CONSOLE_H_ */
diff --git a/zypp-tui/utils/richtext.cc b/zypp-tui/utils/richtext.cc
new file mode 100644 (file)
index 0000000..08b1cb6
--- /dev/null
@@ -0,0 +1,275 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+#include <sstream>
+#include <map>
+#include <vector>
+#include <string>
+
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/String.h>
+
+namespace ztui {
+
+using std::endl;
+using namespace zypp;
+
+enum tags {
+  PARAGRAPH,
+  PRE,
+  BLOCKQUOTE,
+  BOLD,
+  UNDERLINED,
+  ANCHOR,
+  HEADER1,
+  HEADER2,
+  HEADER3,
+  BREAK_LINE,
+  EM,
+  ITALIC,
+  HR,
+  LI,
+  OL,
+  UL,
+  TT,
+  QT,
+  BIG,
+  CODE,
+  CENTER,
+  //special for unknown tags
+  UNKNOWN
+};
+
+std::map<std::string,tags> _rtTagmap;
+
+bool pre;
+bool ordered;
+unsigned count_list_items;
+
+void fillTagmap()
+{
+  _rtTagmap["p"] = PARAGRAPH;
+  _rtTagmap["a"] = ANCHOR;
+  _rtTagmap["b"] = BOLD;
+  _rtTagmap["u"] = UNDERLINED;
+  _rtTagmap["i"] = ITALIC;
+  _rtTagmap["br"] = BREAK_LINE;
+  _rtTagmap["em"] = EM;
+  _rtTagmap["h1"] = HEADER1;
+  _rtTagmap["h2"] = HEADER2;
+  _rtTagmap["h3"] = HEADER3;
+  _rtTagmap["hr"] = HR;
+  _rtTagmap["li"] = LI;
+  _rtTagmap["ol"] = OL;
+  _rtTagmap["ul"] = UL;
+  _rtTagmap["qt"] = QT;
+  _rtTagmap["tt"] = TT;
+  _rtTagmap["big"] = BIG;
+  _rtTagmap["pre"] = PRE;
+  _rtTagmap["bold"] = BOLD;
+  _rtTagmap["code"] = CODE;
+  _rtTagmap["font"] = UNKNOWN; //not parsed in parser
+  _rtTagmap["large"] = UNKNOWN; //same as ncurses
+  _rtTagmap["small"] = UNKNOWN; // same as necurses
+  _rtTagmap["center"] = CENTER;
+  _rtTagmap["strong"] = BOLD; // same as necurses
+  _rtTagmap["blockquote"] = BLOCKQUOTE; // same as necurses
+
+}
+
+std::string closeTag( std::vector<tags>& tagStack )
+{
+  if( tagStack.empty() )
+  {
+    WAR << "closing tag before any opening" << endl;;
+    return "";
+  }
+  tags t = tagStack.back();
+  tagStack.pop_back();
+  switch ( t )
+  {
+    case PARAGRAPH:
+      return "\n\n";
+    case LI:
+      return "\n";
+    case PRE:
+      pre = false; //fall thrue
+    default:
+      return "";
+  }
+}
+
+std::string openTag( std::vector<tags>& tagStack, std::string & tag )
+{
+  tag = str::trim(tag);
+  std::map<std::string,tags>::const_iterator it = _rtTagmap.find( tag );
+  tags t;
+  if ( it == _rtTagmap.end() )
+  {
+    if ( tag.size() > 3 && tag[0] == '!' && tag[1] == '-' && tag[2] == '-' )
+      return ""; //comment
+    WAR << "unknown rich text tag " << tag << endl;
+    t = UNKNOWN;
+  }
+  else
+  {
+    t = it->second;
+  }
+  tagStack.push_back( t );
+  switch ( t )
+  {
+    case HR:
+      tagStack.pop_back(); //hr haven't closing tag
+      return "--------------------";
+
+    case PARAGRAPH:
+      return "";
+    case BREAK_LINE:
+      tagStack.pop_back(); //br haven't closing tag
+      return "\n";
+    case OL:
+      ordered = true;
+      count_list_items = 0;
+      return "\n";
+    case UL:
+      ordered = false;
+      return "\n";
+    case LI:
+      if ( ordered )
+      {
+        std::ostringstream res;
+        res << ++count_list_items << ") ";
+        return res.str();
+      }
+      else
+      {
+        return "- ";
+      }
+    case PRE:
+      pre = true; //fall thrue
+    default:
+      return "";
+  }
+}
+
+std::map<std::string,std::string> ampersmap;
+
+void fillAmpersmap()
+{
+  ampersmap["gt"]      =">";
+  ampersmap["lt"]      ="<";
+  ampersmap["amp"]     ="&";
+  ampersmap["quot"]    ="\"";
+  ampersmap["nbsp"]    =" "; //TODO REAL NBSP
+  ampersmap["product"] ="product"; //TODO replace with real name
+}
+
+std::string getStringFromAmpr( const std::string & str )
+{
+  if ( ampersmap.empty() )
+    fillAmpersmap();
+
+  std::string::size_type end = str.find( ';' );
+  DBG << "val ampr is: " << str << endl;
+  if ( str[0] == '#' ) //first is value
+  {
+    int res = 0;
+    std::istringstream sstr( str.substr( 1, end ) );
+    sstr >> res;
+    DBG << res << endl;
+    if ( res != 0 )
+    {
+      return std::string( 1,(char)res ); //return char
+    }
+    else
+    {
+      WAR << "unknown number " << str << endl;
+      return "";
+    }
+  }
+
+  DBG << end << " " << str.substr( 0, end ) << endl;
+  return ampersmap[str.substr( 0, end )];
+
+}
+
+std::string processRichText( const std::string& text )
+{
+  if ( _rtTagmap.empty() )
+    fillTagmap();
+  //state machine vars
+  pre = false;
+
+  std::vector<tags> tagStack;
+
+  std::string res;
+  res.reserve( text.size() );
+  std::string::size_type pos = 0;
+  do {
+    switch( text[pos] )
+    {
+      case ' ':
+      case '\n':
+      case '\t':
+      case '\v':
+      case '\r':
+        if ( pre )
+          res.push_back( text[pos] );
+        else
+        {
+          if ( text[pos] == ' ' )
+            res.push_back( ' ' );
+        }
+        break;
+      case '<':
+        if ( pos+1 == text.npos )
+        {
+          WAR << "ended with nonclosed tag."<< endl;
+          return res; //chyba, tohle by se nemelo stavat
+        }
+        if ( text[pos+1] == '/' ) //close tag
+        {
+          pos = text.find( '>', pos );
+          res.append( closeTag( tagStack ) );
+        }
+        else
+        {
+          std::string::size_type tagEndPos = text.find( '>', pos );
+          if ( tagEndPos == text.npos )
+          {
+            WAR << "ended with non-closed tag " << endl;
+            return res;
+          }
+          std::string tagname( text.substr( pos+1, tagEndPos-pos-1 ) );
+          pos = tagEndPos;
+          res.append( openTag( tagStack, tagname ) );
+        }
+        break;
+      case '&':
+      {
+        std::string::size_type semipos = text.find( ';', pos );
+        std::string tmp = getStringFromAmpr( text.substr( pos+1, pos-semipos-1 ) );
+        DBG << "tmp is: " << tmp << endl;
+        res.append( tmp );
+        pos = semipos;
+        break;
+      }
+      default:
+        res.push_back( text[pos] );
+    }
+
+    ++pos;
+  } while ( pos != text.size() );
+  return res;
+}
+
+}
diff --git a/zypp-tui/utils/richtext.h b/zypp-tui/utils/richtext.h
new file mode 100644 (file)
index 0000000..a04c5b3
--- /dev/null
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+#ifndef ZYPP_TUI_UTILS_RICHTEXT_H_
+#define ZYPP_TUI_UTILS_RICHTEXT_H_
+
+#include <iosfwd>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Regex.h>
+
+namespace ztui {
+
+/** Print [Rich]Text optionally indented.
+ * Richtext is introduced by a '<!-- DT:Rich -->'
+ * or '<p>'(bsc#935885) tag.
+ */
+inline std::ostream & printRichText( std::ostream & str, std::string text, unsigned indent_r = 0U, unsigned width_r = 0U )
+{
+  std::string processRichText( const std::string& text );
+
+  if ( text.empty() )
+    return str;
+
+  static const zypp::str::regex rttag("^[ \t\r\n]*<(p|!--[- ]*DT:Rich[ -]*--)>");
+  if( zypp::str::regex_match( text, rttag ) )
+    text = processRichText( text );
+
+  return zypp::str::printIndented( str, text, indent_r, width_r );     // even unindented as it also asserts a trailing '/n'
+}
+
+/** Return [Rich]Text optionally indented as string. */
+inline std::string printRichText( std::string text, unsigned indent_r = 0U, unsigned width_r = 0U )
+{
+  zypp::str::Str s;
+  printRichText( s.stream(), std::move(text), indent_r, width_r );
+  return s.str();
+}
+
+}
+
+#endif
+
diff --git a/zypp-tui/utils/text.cc b/zypp-tui/utils/text.cc
new file mode 100644 (file)
index 0000000..0cc862f
--- /dev/null
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <cstring>
+#include <boost/utility/string_ref.hpp>
+#include "text.h"
+
+namespace ztui {
+
+std::string mbs_substr_by_width( boost::string_ref text_r, std::string::size_type colpos_r, std::string::size_type collen_r )
+{
+  std::string ret;
+  if ( collen_r )
+  {
+    const char * spos  = nullptr;
+    size_t slen                = 0;
+
+    size_t colend = ( collen_r == std::string::npos ? std::string::npos : colpos_r+collen_r ); // will exploit npos == size_t(-1)
+    size_t pos = 0;
+    for( mbs::MbsIterator it( text_r ); ! it.atEnd(); ++it )
+    {
+      // collect sequences [pos,end[ in [colpos_r,colend[
+      // partial overlaps are padded
+      size_t end = pos + it.columns();
+
+      if ( pos < colpos_r )    // starts before range
+      {
+        if ( end > colpos_r )  // pad incomplete sequence at range begin
+          ret += std::string( std::min(end,colend)-colpos_r, ' ' );
+      }
+      else                     // starts inside range (pos < colend by the way we loop)
+      {
+        if ( end <= colend )   // completely inside
+        {
+          if ( !spos )
+            spos = it.pos();
+          slen += it.size();
+        }
+        else                   // partial outside
+        {
+          if ( spos )
+          {
+            ret += std::string( spos, slen );
+            spos = nullptr;
+            slen = 0;          // don't collect it after loop
+          }
+          ret += std::string( colend-pos, ' ' );
+          break;               // done
+        }
+      }
+
+      if ( end >= colend )
+        break;
+      pos = end;
+    }
+    if ( spos )
+      ret += std::string( spos, slen );
+  }
+  return ret;
+}
+
+}
diff --git a/zypp-tui/utils/text.h b/zypp-tui/utils/text.h
new file mode 100644 (file)
index 0000000..57268ab
--- /dev/null
@@ -0,0 +1,659 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* Strictly for internal use!
+*/
+
+
+#ifndef ZYPP_UTILS_TEXT_H_
+#define ZYPP_UTILS_TEXT_H_
+
+#include <iosfwd>
+#include <string>
+
+#include <boost/utility/string_ref.hpp>
+#include <zypp-core/base/DtorReset>
+#include <zypp-core/base/String.h>
+
+namespace ztui {
+
+///////////////////////////////////////////////////////////////////
+namespace mbs
+{
+#define ZYPPER_TRACE_MBS 0
+
+  struct MbToWc
+  {
+    static const char _oooooooo = 0000;
+    static const char _Xooooooo = 0200;
+    static const char _XXoooooo = 0300;
+    static const char _XXXooooo = 0340;
+    static const char _XXXXoooo = 0360;
+    static const char _XXXXXooo = 0370;
+    static const char _ooXXXXXX = 0077;
+
+    MbToWc( char ch )
+    : _wc( ch )
+    , _cont( -1 )
+    {
+      if      ( (_wc & _XXXooooo) == _XXoooooo )       // '110xxxxx'
+      { _wc &= ~_XXXooooo; _cont = 1; }
+      else if ( (_wc & _XXXXoooo) == _XXXooooo )       // '1110xxxx'
+      { _wc &= ~_XXXXoooo; _cont = 2; }
+      else if ( (_wc & _XXXXXooo) == _XXXXoooo )       // '11110xxx'
+      { _wc &= ~_XXXXXooo; _cont = 3; }
+      else if ( (_wc & _Xooooooo) == _oooooooo )       // '0xxxxxxx'
+      { _cont = 0; }
+      else                                             // something broken
+      { _wc = L'?'; }
+    }
+
+    bool add( char ch ) // return whether ch is a continuation char
+    {
+      if ( (ch & _XXoooooo) == _Xooooooo )     // '10xxxxxx'
+      {
+        if ( _cont > 0 )
+        { _wc = (_wc<<6)+(ch & _ooXXXXXX); --_cont; }
+        return true;
+      }
+      if ( _cont > 0 )                         // error, else ignore excess chars
+      { _wc = L'?'; _cont = -1; }
+      return false;
+    }
+
+    wchar_t _wc;
+    char _cont;
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class MbsIterator
+  /// \brief Iterate chars and ANSI SGR in a multi-byte character string
+  ///
+  /// The iterator offers (\ref pos, \ref size) of the current \c wchar
+  /// within the original \a text_r. Also the number of \ref columns the
+  /// current \c wchar occupies on the screen.
+  ///
+  /// \note: The iterator contents fakes all WS to either '\n' or ' '.
+  /// \note: \ref isCH includes SGR sequences
+  ///////////////////////////////////////////////////////////////////
+  struct MbsIterator
+  {
+    MbsIterator( boost::string_ref text_r )
+    : _text( text_r )
+    , _tpos( _text.data() )
+    , _trest( _text.size() )
+    , _tread( 0 )
+    , _cols( size_t(-1) )
+    , _wc( L'\0' )
+    { memset( &_mbstate, 0, sizeof(_mbstate) ); operator++(); }
+
+    /** Use with care; all WS are faked to either '\n' or ' ' */
+    wchar_t & operator*()              { return _wc; }
+    const wchar_t & operator*() const  { return _wc; }
+
+    const char * pos() const           { return _tpos; }
+    size_t       size() const          { return _tread; }
+    size_t       columns() const
+    {
+      if ( _cols == size_t(-1) )
+      {
+        if ( _wc < L' ' )
+          _cols = 0;   // CTRLs
+        else
+        {
+          _cols = ::wcwidth( _wc );
+          if ( _cols == size_t(-1) )
+            _cols = 1; // -1 due to LC_CTYPE?
+        }
+      }
+      return _cols;
+    }
+
+    boost::string_ref ref() const      { return boost::string_ref( _tpos, _tread ); }
+
+    bool atEnd() const                 { return _trest == 0; }
+    bool isNL() const                  { return( _wc == L'\n' ); }
+    bool isWS() const                  { return( _wc == L' ' ); }
+    bool isCH() const                  { return !( atEnd() || isNL() || isWS() ); }
+    bool isSGR() const                 { return not atEnd() && _wc == L'\033'; }
+
+    MbsIterator & operator++()
+    {
+      if ( !atEnd() )
+      {
+        _tpos += _tread;
+        _trest -= _tread;
+
+        //we hit the end
+        if ( _trest == 0 ) {
+          setToEnd();
+          return *this;
+        }
+
+        _tread = ::mbrtowc( &_wc, _tpos, _trest, &_mbstate );
+
+        _cols = size_t(-1);
+
+        if ( _tread >= (size_t)-2 )
+        {
+          // common case is -1 due to LC_CTYPE
+          // skip this and continue with next mb
+          memset( &_mbstate, 0, sizeof(_mbstate) );
+          _tread = 1;
+          MbToWc c( *_tpos );
+          while ( ( _tread < _trest ) && c.add( *(_tpos+_tread) ) )
+            _tread += 1;
+          _wc = c._wc;
+        }
+
+        switch ( _tread )
+        {
+//       case (size_t)-2:
+//       case (size_t)-1:
+//         _tread = 0;
+//         // fall through
+          case 0:
+            setToEnd();
+            break;
+
+          default:
+            if ( ::iswspace(_wc) )
+            {
+              switch ( _wc )
+              {
+                case L'\n':
+                case L' ':
+                  break;
+                default:
+                  _wc = L' ';
+              }
+            }
+            else if ( _wc == L'\033' ) // ansi SGR ?
+            {
+              unsigned asize = ansiSize( _tpos );
+              if ( asize && asize <= _trest )
+                _tread = asize;
+            }
+            break;
+        }
+      }
+      return *this;
+    }
+
+  private:
+    unsigned ansiSize( const char * pos_r )
+    {
+      unsigned ret = 0;
+      const char * p = pos_r;
+      if ( *p == '\033' && *(++p) == '[' )
+      {
+        for ( char ch = *(++p); ( '0' <= ch && ch <= '9' ) || ch ==';'; ch = *(++p) )
+        {;}
+        if ( *p == 'm' )
+          ret = p+1 - pos_r;
+      }
+      return ret;
+    }
+
+    void setToEnd ()
+    {
+      _trest = 0;      // atEnd
+      _wc = L'\0';
+    }
+
+    boost::string_ref  _text;
+    const char *       _tpos;  // start of last ::mbrtowc
+    size_t             _trest; // _tpos to end of string
+    size_t             _tread; // consumed in last ::mbrtowc
+    mutable size_t     _cols;  // number of columns occupied on screen
+
+    wchar_t            _wc;    // result of last ::mbrtowc
+    mbstate_t          _mbstate;
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class MbsIteratorNoSGR
+  /// \brief \ref MbsIterator skipping ANSI SGR
+  ///////////////////////////////////////////////////////////////////
+  struct MbsIteratorNoSGR : public MbsIterator
+  {
+    MbsIteratorNoSGR( boost::string_ref text_r )
+    : MbsIterator( text_r )
+    { skipSGR(); }
+
+    MbsIteratorNoSGR & operator++()
+    {
+      MbsIterator::operator++();
+      skipSGR();
+      return *this;
+    }
+
+  private:
+    void skipSGR()
+    { while ( isSGR() ) MbsIterator::operator++(); }
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class MbsWriteWrapped
+  /// \brief Write MBString optionally wrapped and indented.
+  ///
+  /// The class assumes the output starts at the beginning of a
+  /// new term line. Every '\n' in text starts a new paragraph
+  /// (on an new line with default indent).
+  ///
+  /// WS at par begin increments indent for this par.
+  ///
+  /// Use \ref gotoNextLine to open a new indented line without
+  /// stating a new par.
+  ///
+  /// If MbsWriteWrapped is used in conjunction with plain screen
+  /// output, you can use \ref resetToParBegin to reset housekeeping
+  /// data after plain screen output.
+  ///////////////////////////////////////////////////////////////////
+  struct MbsWriteWrapped
+  {
+    MbsWriteWrapped( std::ostream & out )
+    : MbsWriteWrapped( out, 0, 0 )
+    {}
+
+    MbsWriteWrapped( std::ostream & out, size_t wrap_r )
+    : MbsWriteWrapped( out, 0, wrap_r )
+    {}
+
+    MbsWriteWrapped( std::ostream & out, size_t indent_r, size_t wrap_r, int indentFix_r = 0 )
+    : _out( out )
+    , _defaultWrap( wrap_r )
+    , _defaultIndent( indent_r )
+    , _defaultIndentFix( indentFix_r )
+    , _indent( saneIncrementIndent( 0, _defaultIndent, _defaultWrap ) )
+    , _indentFix( _defaultIndentFix )
+    , _indentGap( 0 )
+    , _lpos( 0 )
+    , _gap( 0 )
+    , _gapForced( 0 )
+    , _gapLines( 0 )
+    , _word( nullptr )
+    , _wSize( 0 )
+    , _wColumns( 0 )
+    {}
+
+    size_t defaultWrap() const         { return _defaultWrap; }
+    size_t defaultIndent() const       { return _defaultIndent; }
+    int    defaultIndentFix() const    { return _defaultIndentFix; }
+
+    size_t indent() const              { return _indent; }
+    size_t lpos() const                        { return _lpos; }
+
+    bool atLineBegin() const           { return( _lpos == 0 ); }
+    bool atParBegin() const            { return( _lpos == 0 && !_gapLines ); }
+
+    /** Reset housekeeping data to the beginning of a paragraph (does not write anything) */
+    void resetToParBegin()
+    {
+      clearGap();
+      clearWord();
+      clearIndent();
+      _lpos = 0;
+    }
+
+
+    /** Write out any pending word and start a new par (NL unconditionally) */
+    void gotoNextPar()
+    {
+      writeout(true);
+      clearIndent();
+#if ( ZYPPER_TRACE_MBS)
+      _out << "<NL>" << std::endl;     // "<NL>"
+#else
+      _out << std::endl;       // "<NL>"
+#endif
+      _lpos = 0;
+    }
+
+    /** Open a new paragraph if not \ref atParBegin */
+    void gotoParBegin()
+    { if ( ! atParBegin() ) gotoNextPar(); }
+
+
+    /** Add \a count_r (1) new lines in this par (BR unconditionally) */
+    void gotoNextLine( size_t count_r = 1 )
+    {
+      if ( count_r )
+      {
+        writeout(true);        // but keep indent
+        _gapLines += count_r;
+#if ( ZYPPER_TRACE_MBS )
+        while ( count_r-- )
+          _out << "<BR>" << std::endl; // "<BR>"
+#else
+        _out << std::string( count_r, '\n' );
+#endif
+        _lpos = 0;
+      }
+    }
+
+    /** Open a new line in this paragraph if not \ref atLineBegin */
+    void gotoLineBegin()
+    { if ( ! atLineBegin() ) gotoNextLine(); }
+
+
+    /** Temporarily increase indent */
+    struct ScopedIndentIncrement : private zypp::DtorReset
+    {
+      ScopedIndentIncrement( MbsWriteWrapped & mww_r, size_t increment_r )
+      : DtorReset( mww_r._indent )
+      { mww_r._indent = mww_r.saneIncrementIndent( increment_r ); }
+    };
+    /** \relates ScopedIndentIncrement Temporarily increase indent. */
+    ScopedIndentIncrement scopedIndentIncrement( size_t increment_r )
+    { return ScopedIndentIncrement( *this, increment_r ); }
+
+
+    /** Write \a text_r; starting a new paragraph. */
+    void startPar( boost::string_ref text_r )
+    {
+      gotoParBegin();
+      write( text_r );
+    }
+    /** \overload Indented */
+    void startPar( boost::string_ref text_r, size_t increment_r )
+    { ScopedIndentIncrement s1( *this, increment_r ); startPar( text_r ); }
+
+
+    /** Continue writing text at the current position. */
+    void addString( boost::string_ref text_r )
+    {
+      write( text_r );
+    }
+    /** \overload Indented */
+    void addString( boost::string_ref text_r, size_t increment_r )
+    { ScopedIndentIncrement s1( *this, increment_r ); addString( text_r ); }
+
+
+    /** Continue writing text (separated by WS if not \ref atLineBegin). */
+    void writeText( boost::string_ref text_r )
+    {
+      _gapForced = 1;
+      write( text_r );
+    }
+    /** \overload Indented */
+    void writeText( boost::string_ref text_r, size_t increment_r )
+    { ScopedIndentIncrement s1( *this, increment_r ); writeText( text_r ); }
+
+
+    /** Write \a text_r; starting a new paragraph and ending it after the text was written. */
+    void writePar( boost::string_ref text_r )
+    {
+      gotoParBegin();
+      write( text_r );
+      gotoParBegin();
+    }
+    /** \overload Indented */
+    void writePar( boost::string_ref text_r, size_t increment_r )
+    { ScopedIndentIncrement s1( *this, increment_r ); writePar( text_r ); }
+
+
+    /** Write a \a tag_r with indented definition \a text_r.
+     * Optional \a tagincr_r (0) and \a textincr_r (28) are counted on
+     * top of the base increment.
+     */
+    void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r, size_t tagincr_r, size_t textincr_r )
+    {
+      gotoParBegin();
+      {
+        ScopedIndentIncrement s1( *this, tagincr_r );
+        write( tag_r, /*leadingWSindents_r*/false );
+      }
+      {
+        ScopedIndentIncrement s1( *this, textincr_r );
+        if ( _lpos < _indent )
+          _gapForced = _indent - _lpos;
+        else
+          gotoNextLine();
+        write( text_r );
+      }
+      gotoParBegin();
+    }
+    /** \overload Use default tag/text increment */
+    void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r )
+    { writeDefinition( tag_r, text_r, 0, 28 ); }
+    /** \overload Indented */
+    void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r, size_t tagincr_r, size_t textincr_r, size_t increment_r )
+    { ScopedIndentIncrement s1( *this, increment_r ); writeDefinition( tag_r, text_r, tagincr_r, textincr_r ); }
+    /** \overload Indented using default tag/text increment */
+    void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r, size_t increment_r )
+    { ScopedIndentIncrement s1( *this, increment_r ); writeDefinition( tag_r, text_r ); }
+
+
+  private:
+    /** Append \a text_r indented and wrapped at the current position.
+     * All words and NL are written, only trailing WS is remembered.
+     */
+    void write( boost::string_ref text_r, bool leadingWSindents_r = true )
+    {
+      for( MbsIterator it( text_r ); ! it.atEnd(); ++it )
+      {
+        if ( it.isNL() )
+        {
+          gotoNextPar();       // write out any pending word and start new par
+        }
+        else if ( it.isWS() )
+        {
+          if ( _word )         // write out pending word and start new gap
+          {
+            writeout();
+            ++_gap;
+          }
+          else
+          {
+            if ( atParBegin() && leadingWSindents_r )  // ws at par begin may increment indent
+              ++_indentGap;
+            else
+              ++_gap;
+          }
+        }
+        else // non WS         // remember in word
+        {
+          if ( !_word )
+            _word = it.pos();
+          _wSize += it.size();
+          _wColumns += it.columns();
+        }
+      }
+      writeout();              // write out any pending word; gaps are remembered for next text
+    }
+
+    /** Write any pending "indent/gap+word" and reset for next word.
+     * If \a force_r, gap is cleared even if no word is pending. This
+     * is used before writing a '\n'.
+     */
+    void writeout( bool force_r = false )
+    {
+      if ( _word )
+      {
+        _writeoutPending();
+        // reset gaps and word
+        clearGap();
+        clearWord();
+      }
+      else if ( force_r )
+        clearGap();
+    }
+
+    void _writeoutPending()
+    {
+      // NOTE: we are either atLineBegin or in a _gap between words
+      if ( !atLineBegin() )
+      {
+        if ( _gap < _gapForced )
+          _gap = _gapForced;
+        if ( !_defaultWrap || _lpos+_gap+_wColumns <= _defaultWrap )
+        {
+          _out << std::string( _gap, ' ' ) <<  boost::string_ref( _word, _wSize );
+          _lpos += _gap + _wColumns;
+          return;
+        }
+        // Here: did not fit on this line
+        // suppress gap and write indented on next line
+        clearGap();
+        _out << std::endl;
+        _lpos = 0;
+      }
+
+      // Here: atLineBegin
+      unsigned useIndent = fixIndent( _indent + _indentGap + _gap );
+
+      if ( _defaultWrap ) // fix large indent
+      { while ( useIndent >= _defaultWrap ) useIndent -= _defaultWrap; }
+
+      // Try writing the whole word
+      if ( !_defaultWrap || useIndent+_wColumns <= _defaultWrap )
+      {
+        _out << std::string( useIndent, ' ' ) <<  boost::string_ref( _word, _wSize );
+        _lpos += useIndent + _wColumns;
+        return;
+      }
+
+      // Still here: word is too big, we need to split it :(
+      for( MbsIterator it( boost::string_ref( _word, _wSize ) ); ! it.atEnd(); ++it )
+      {
+        if ( atLineBegin() )
+        {
+          _out << std::string( useIndent, ' ' );
+          _lpos += useIndent;
+        }
+        _out << it.ref();
+        ++_lpos;
+        if ( _lpos >= _defaultWrap )
+        {
+          _out << std::endl;
+          _lpos = 0;
+        }
+      }
+    }
+
+    /** Return fixed indent_r */
+    static size_t fixIndent( size_t indent_r, int indentFix_r )
+    {
+      if ( indentFix_r )
+      {
+        if ( indentFix_r < 0 && ( size_t(-indentFix_r) >= indent_r ) )
+          indent_r = 0;
+        else
+          indent_r += indentFix_r;
+      }
+     return indent_r;
+    }
+
+    /** Return fixed indent_r (unsets _indentFix) */
+    size_t fixIndent( size_t indent_r )
+    {
+      indent_r = fixIndent( indent_r, _indentFix );
+      _indentFix = 0;
+      return indent_r;
+    }
+
+    /** Return incremented indent, but not to more than 50% of the remaining line size if wrapped.  */
+    static size_t saneIncrementIndent( size_t current_r, size_t increment_r, size_t wrap_r )
+    {
+      if ( ! increment_r )
+        return current_r;
+
+      increment_r += current_r;
+      if ( wrap_r && current_r < wrap_r )
+      {
+        size_t limit = current_r + ( (wrap_r-current_r)/2 );
+        if ( limit < increment_r )
+          increment_r = limit;
+      }
+      return increment_r;
+    }
+
+    /** Return incremented \c _indent, but not more than 50% of the remaining line size if wrapped.  */
+    size_t saneIncrementIndent( size_t increment_r )
+    { return saneIncrementIndent( _indent, increment_r, _defaultWrap ); }
+
+    /** Set default indent at par start (reloads \c _indentFix) */
+    void clearIndent()
+    { _indentFix = _defaultIndentFix; _indentGap = 0; }
+
+    /** Set no gaps */
+    void clearGap()
+    { _gap = 0; _gapForced = 0; _gapLines = 0; }
+
+    /** Set no word pending */
+    void clearWord()
+    { _word = nullptr; _wSize = 0; _wColumns = 0; }
+
+    std::ostream &     _out;
+    const size_t       _defaultWrap;
+    const size_t       _defaultIndent;
+    const int          _defaultIndentFix;
+
+    size_t _indent;    // base indent for par
+    int    _indentFix; // indent correction for a pars 1st line
+    size_t _indentGap; // additional indent for current par
+
+    size_t _lpos;      // cursor pos on current line
+
+    size_t _gap;       // amount of WS before next word
+    size_t _gapForced; // forced WS before next word
+    size_t _gapLines;  // forced NL before next word/par
+
+    const char * _word;        // current word start in text
+    size_t _wSize;     // current word size in byte
+    size_t _wColumns;  // current word screen columns
+  };
+#undef ZYPPER_TRACE_MBS
+} // namespace mbs
+///////////////////////////////////////////////////////////////////
+
+/**
+ * Wrap and indent given \a text and write it to the output stream \a out.
+ *
+ * TODO
+ * - delete whitespace at the end of lines
+ * - keep one-letter words with the next
+ *
+ * \param out       output stream to write to
+ * \param test      text to wrap
+ * \param indent    number of columns by which to indent the whole text
+ * \param wrap      number of columns the text should be wrapped into
+ * \param indentFix additional indent/outdent for the first line (default: \c 0)
+ */
+inline void mbs_write_wrapped( std::ostream & out, boost::string_ref text_r, size_t indent_r, size_t wrap_r, int indentFix_r = 0 )
+{
+  mbs::MbsWriteWrapped mww( out, indent_r, wrap_r, indentFix_r );
+  mww.addString( text_r );
+}
+/** \overload for str::Str */
+inline void mbs_write_wrapped( std::ostream & out, const zypp::str::Str & text_r, size_t indent_r, size_t wrap_r, int indentFix_r = 0 )
+{ mbs_write_wrapped( out, text_r.str(), indent_r, wrap_r, indentFix_r ); }
+
+/** Returns the column width of a multi-byte character string \a text_r */
+inline size_t mbs_width( boost::string_ref text_r )
+{
+  size_t ret = 0;
+  for( mbs::MbsIterator it( text_r ); ! it.atEnd(); ++it )
+    ret += it.columns();
+  return ret;
+}
+
+/**
+ * Returns a substring of a multi-byte character string \a text_r starting
+ * at screen column \a cpos_r and being at most \a clen_r columns wide.
+ * The string is ' ' padded if multicolumn characters are clipped at start
+ * or end.
+ */
+std::string mbs_substr_by_width( boost::string_ref text_r, std::string::size_type colpos_r = 0, std::string::size_type collen_r = std::string::npos );
+
+}
+
+#endif /* ZYPP_UTILS_TEXT_H_ */
index 0ab64a0..69b45f2 100644 (file)
--- a/zypp.conf
+++ b/zypp.conf
@@ -97,7 +97,7 @@
 ## affected, but reset to their default values.
 ##
 ## A custom repo variable is defined by creating a file inside the
-## directory. The variable name equals the file name. The files fist
+## directory. The variable name equals the file name. The file's first
 ## line (up to but not including the newline character) defines the
 ## variables value.
 ##
 # download.max_silent_tries = 5
 
 ##
+## Maximum time in seconds that you allow the connection phase to the server to take.
+##
+## This only limits the connection phase, it has no impact once it has connected.
+## (see also CURLOPT_CONNECTTIMEOUT)
+##
+## Valid values:  Integer
+## Default value: 60
+##
+# download.connect_timeout = 60
+
+##
 ## Maximum time in seconds that you allow a transfer operation to take.
 ##
 ## This is useful for preventing your batch jobs from hanging for hours due
 ## download.media_mountdir = /var/adm/mount
 
 ##
+## Whether to use the geoip feature of download.opensuse.org
+##
+## Valid values: boolean
+## Default value: true
+##
+## The media backend can rewrite download requests to the geographically closest availble mirror.
+## Which exact mirror is used will be determined by requesting a "geoip" file from download.opensuse.org
+## via a HTTP GET request to https://download.opensuse.org/geoip , the server will use the clients IP to
+## determine the closest mirror if available.
+## Some specific files are however excluded from this redirection due to security reasons, especially the
+## repo metdata index and it's key and checksum files: repomd.xml, repomd.xml.key and repomd.xml.asc
+##
+## download.use_geoip_mirror = true
+
+##
 ## Signature checking (repo metadata and downloaded rpm packages)
 ##
 ##   boolean   gpgcheck        (default: on)
index 7030211..e77633f 100644 (file)
@@ -161,6 +161,9 @@ namespace zypp
   DEF_BUILTIN( i686 );
   DEF_BUILTIN( athlon );
   DEF_BUILTIN( x86_64 );
+  DEF_BUILTIN( x86_64_v2 );
+  DEF_BUILTIN( x86_64_v3 );
+  DEF_BUILTIN( x86_64_v4 );
 
   DEF_BUILTIN( pentium3 );
   DEF_BUILTIN( pentium4 );
@@ -310,6 +313,9 @@ namespace zypp
         defCompatibleWith( a_i686(),           a_noarch(),a_i386(),a_i486(),a_i586() );
         defCompatibleWith( a_athlon(),         a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() );
         defCompatibleWith( a_x86_64(),         a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon() );
+        defCompatibleWith( a_x86_64_v2(),      a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64() );
+        defCompatibleWith( a_x86_64_v3(),      a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64(),a_x86_64_v2() );
+        defCompatibleWith( a_x86_64_v4(),      a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64(),a_x86_64_v2(),a_x86_64_v3() );
 
         defCompatibleWith( a_pentium3(),       a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() );
         defCompatibleWith( a_pentium4(),       a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_pentium3() );
index a063ea0..9cc7c7c 100644 (file)
@@ -134,8 +134,11 @@ namespace zypp
     /** */
     static std::string asString( const CompatSet & cset )
     {
-      return str::join( make_transform_iterator( cset.begin(), std::mem_fn(&Arch::asString) ),
-                        make_transform_iterator( cset.end(), std::mem_fn(&Arch::asString) ) );
+      // Explicitely select the overload we want, clang seems to choke if there is a static overload for the
+      // member function we want to capture in std::mem_fn (fixes GH-478)
+      const std::string & (Arch::*memfn)( ) const = &Arch::asString;
+      return str::join( make_transform_iterator( cset.begin(), std::mem_fn( memfn ) ),
+                        make_transform_iterator( cset.end(), std::mem_fn( memfn ) ) );
     }
 
   public:
@@ -170,6 +173,12 @@ namespace zypp
   extern const Arch Arch_pentium3;
 
   /** \relates Arch */
+  extern const Arch Arch_x86_64_v4;
+  /** \relates Arch */
+  extern const Arch Arch_x86_64_v3;
+  /** \relates Arch */
+  extern const Arch Arch_x86_64_v2;
+  /** \relates Arch */
   extern const Arch Arch_x86_64;
   /** \relates Arch */
   extern const Arch Arch_athlon;
index 75bff59..1537ea3 100644 (file)
@@ -78,7 +78,6 @@ SET( zypp_SRCS
   ServiceInfo.cc
   Signature.cc
   SrcPackage.cc
-  ShutdownLock.cc
   SysContent.cc
   Target.cc
   TmpPath.cc
@@ -248,7 +247,8 @@ SET( zypp_media_SRCS
   media/MediaDIR.cc
   media/MediaDISK.cc
   media/MediaCIFS.cc
-  media/MediaNetworkCommonHandler.h
+  media/MediaNetworkCommonHandler.cc
+  media/MediaNetwork.cc
   media/MediaCurl.cc
   media/MediaMultiCurl.cc
   media/MediaISO.cc
@@ -256,7 +256,6 @@ SET( zypp_media_SRCS
   media/MediaSource.cc
   media/MediaManager.cc
   media/MediaPriority.cc
-  media/ZsyncParser.cc
   media/UrlResolverPlugin.cc
 )
 
@@ -265,6 +264,8 @@ SET( zypp_media_HEADERS
   media/MediaCIFS.h
   media/MediaCurl.h
   media/MediaMultiCurl.h
+  media/MediaNetworkCommonHandler.h
+  media/MediaNetwork.h
   media/MediaDIR.h
   media/MediaDISK.h
   media/MediaException.h
@@ -276,7 +277,6 @@ SET( zypp_media_HEADERS
   media/MediaNFS.h
   media/MediaSource.h
   media/MediaPriority.h
-  media/ZsyncParser.h
   media/UrlResolverPlugin.h
 )
 
@@ -910,9 +910,8 @@ macro( ADDZYPPLIB LIBNAME )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${LibSolv_LIBRARIES} )
   #TARGET_LINK_LIBRARIES(${LIBNAME} ${SIGNALS_LIBRARY})
   TARGET_LINK_LIBRARIES(${LIBNAME} ${Boost_THREAD_LIBRARY})
-  TARGET_LINK_LIBRARIES(${LIBNAME} ${GPGME_PTHREAD_LIBRARIES})
+  TARGET_LINK_LIBRARIES(${LIBNAME} ${GPGME_LIBRARIES})
   target_link_libraries(${LIBNAME} ${YAML_CPP_LIBRARIES})
-  target_link_libraries(${LIBNAME} ${PROTOBUF_LITE_LIBRARIES})
   TARGET_LINK_LIBRARIES(${LIBNAME} pthread )
 
   IF ( UDEV_FOUND )
index 1a3fcb0..dddb200 100644 (file)
@@ -23,6 +23,7 @@
 #include <zypp/Capability.h>
 
 #include <zypp/sat/detail/PoolImpl.h>
+#include <zypp/sat/detail/PoolMember.h>
 #include <zypp/sat/Pool.h>
 #include <zypp/ResPool.h>
 
@@ -235,6 +236,18 @@ namespace zypp
       return relFromStr( pool_r, arch_r, name, op, ed, kind_r );
     }
 
+    /** Parse richdeps from string, otherwise fall back to the traditional parser. */
+    sat::detail::IdType richOrRelFromStr( sat::detail::CPool * pool_r, const std::string & str_r, const ResKind & prefix_r, Capability::CtorFlag flag_r )
+    {
+      if ( str_r[0] == '(' ) {
+        sat::detail::IdType res { sat::detail::PoolMember::myPool().parserpmrichdep( str_r.c_str() ) };
+        if ( res ) return res;
+        // else: no richdep, so fall back to the ordinary parser which in
+        // case of doubt turns the string into a NAMED cap.
+      }
+      return relFromStr( pool_r, Arch_empty, str_r, prefix_r, flag_r );
+    }
+
     /////////////////////////////////////////////////////////////////
   } // namespace
   ///////////////////////////////////////////////////////////////////
@@ -245,11 +258,11 @@ namespace zypp
   /////////////////////////////////////////////////////////////////
 
   Capability::Capability( const char * str_r, const ResKind & prefix_r, CtorFlag flag_r )
-  : _id( relFromStr( myPool().getPool(), Arch_empty, str_r, prefix_r, flag_r ) )
+  : _id( richOrRelFromStr( myPool().getPool(), str_r, prefix_r, flag_r ) )
   {}
 
   Capability::Capability( const std::string & str_r, const ResKind & prefix_r, CtorFlag flag_r )
-  : _id( relFromStr( myPool().getPool(), Arch_empty, str_r.c_str(), prefix_r, flag_r ) )
+  : _id( richOrRelFromStr( myPool().getPool(), str_r, prefix_r, flag_r ) )
   {}
 
   Capability::Capability( const Arch & arch_r, const char * str_r, const ResKind & prefix_r, CtorFlag flag_r )
@@ -257,7 +270,7 @@ namespace zypp
   {}
 
   Capability::Capability( const Arch & arch_r, const std::string & str_r, const ResKind & prefix_r, CtorFlag flag_r )
-  : _id( relFromStr( myPool().getPool(), arch_r, str_r.c_str(), prefix_r, flag_r ) )
+  : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) )
   {}
 
   Capability::Capability( const char * str_r, CtorFlag flag_r, const ResKind & prefix_r )
index 020a13a..a78f636 100644 (file)
@@ -40,10 +40,10 @@ namespace zypp
   //
   /** A sat capability.
    *
-   * A Capability: <tt>"name[.arch] [op edition]"</tt>
+   * A Capability: <tt>"name[.arch] [op edition]"</tt> or a \c richdep[1]
    *
    * If a certain \ref ResKind is specified upon construction, the
-   * capabilities name part is prefixed, unless it already conatins a
+   * capabilities name part is prefixed, unless it already contains a
    * well known kind spec. If no \ref ResKind is specified, it's assumed
    * you refer to a package or the name is already prefixed:
    * \code
@@ -55,6 +55,9 @@ namespace zypp
    * Capability( "pattern:foo", ResKind::package ) ==> 'pattern:foo'
    * Capability( "package:foo", ResKind::pattern ) ==> 'foo'
    * \endcode
+   *
+   * [1] https://rpm-software-management.github.io/rpm/manual/boolean_dependencies.html
+   * \see \ref CapDetail
    */
   class Capability: protected sat::detail::PoolMember
   {
@@ -72,10 +75,17 @@ namespace zypp
       */
       //@{
       /** Ctor from string.
+       * \a str_r is parsed to see if it forms a richdep. Subsequent arguments are meaningless
+       * in that case. If it's no richdep we continue as described below.
+       *
        * \a str_r is parsed to check whether it contains an <tt>[op edition]</tt> part,
        * unless the \ref PARSED flag is passed to the ctor. In that case <tt>"name[.arch]"</tt>
        * is assumed.
-      */
+       *
+       * \ref Capability legacy is to parse everything unknown into a \ref NAMED
+       * cap. This is often used to turn user supplied search strings with an optional
+       * edition range restriction into \ref PoolQuery arguments ('/gcc[0-9]+/ >= 8').
+       */
       explicit Capability( const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
       /** \overload */
       explicit Capability( const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
@@ -291,9 +301,10 @@ namespace zypp
    * \endcode
    * or formed by some \c EXPRESSION:
    * \code
-   *   left_cap op right_cap
-   *   with op := AND|OR|WITH|NAMESPACE
+   *   ( left_cap op right_cap )
+   *   with op := and|or|if|unless|else|with|without
    * \endcode
+   *
    */
   class CapDetail: protected sat::detail::PoolMember
   {
@@ -350,7 +361,7 @@ namespace zypp
       bool     hasArch()  const { return _archIfSimple; }
       IdString arch()     const { return _archIfSimple ? IdString( _archIfSimple ) : IdString(); }
       IdString name()     const { return isSimple()    ? IdString( _lhs ) : IdString(); }
-      Rel      op()       const { return isVersioned() ? Rel( _flag )     : Rel::ANY; }
+      Rel      op()       const { return isVersioned() ? Rel( _flag )     : isSimple() ? Rel::ANY : Rel::NONE; }
       Edition  ed()       const { return isVersioned() ? Edition( _rhs )  : Edition(); }
       //@}
 
index 17adea2..e044ba7 100644 (file)
@@ -168,7 +168,9 @@ namespace zypp
     if ( _refcnt )
       closeLog();
 
-    _fname = rootdir / ZConfig::instance().historyLogFile();
+    _fname = ZConfig::instance().historyLogFile();
+    if ( _fname != "/dev/null" )  // no need to redirect /dev/null into the target
+      _fname = rootdir / _fname;
     filesystem::assert_dir( _fname.dirname() );
     MIL << "installation log file " << _fname << endl;
 
index b7faf25..aeac875 100644 (file)
@@ -183,8 +183,7 @@ IMPL_PTR_TYPE(MediaSetAccess);
   {
     try
     {
-      if ( doesFileExist( file, media_nr ) )
-        return provideFile( OnMediaLocation( file, media_nr ), PROVIDE_NON_INTERACTIVE );
+      return provideFile( OnMediaLocation( file, media_nr ).setOptional( true ), PROVIDE_NON_INTERACTIVE );
     }
     catch ( const media::MediaFileNotFoundException & excpt_r )
     { ZYPP_CAUGHT( excpt_r ); }
@@ -205,7 +204,8 @@ IMPL_PTR_TYPE(MediaSetAccess);
 
     ManagedFile tmpFile = filesystem::TmpFile::asManagedFile();
 
-    Pathname file = access.provideFile( OnMediaLocation(path, 1), options );
+    bool optional = options & PROVIDE_NON_INTERACTIVE;
+    Pathname file = access.provideFile( OnMediaLocation(path, 1).setOptional( optional ), options );
 
     //prevent the file from being deleted when MediaSetAccess gets out of scope
     if ( filesystem::hardlinkCopy(file, tmpFile) != 0 )
@@ -293,20 +293,6 @@ IMPL_PTR_TYPE(MediaSetAccess);
 
         do
         {
-          if (user != media::MediaChangeReport::EJECT) // no use in calling this again
-          {
-            DBG << "Media couldn't provide file " << file << " , releasing." << endl;
-            try
-            {
-              media_mgr.release(media);
-            }
-            catch (const Exception & excpt_r)
-            {
-                ZYPP_CAUGHT(excpt_r);
-                MIL << "Failed to release media " << media << endl;
-            }
-          }
-
           // set up the reason
           media::MediaChangeReport::Error reason = media::MediaChangeReport::INVALID;
 
index 30398bf..bb7d16a 100644 (file)
@@ -28,6 +28,7 @@
 #include <sys/utsname.h>
 #include <functional>
 #include <array>
+#include <climits>
 
 #undef ZYPP_BASE_LOGGER_LOGGROUP
 #define ZYPP_BASE_LOGGER_LOGGROUP "PurgeKernels"
index 648e30b..d32e8b5 100644 (file)
@@ -27,6 +27,7 @@
 #include <zypp/Pathname.h>
 #include <zypp/ZConfig.h>
 #include <zypp/repo/RepoMirrorList.h>
+#include <zypp/repo/SUSEMediaVerifier.h>
 #include <zypp/ExternalProgram.h>
 
 #include <zypp/base/IOStream.h>
@@ -1047,6 +1048,28 @@ namespace zypp
     return str << "GpgCheck::UNKNOWN";
   }
 
+  bool RepoInfo::requireStatusWithMediaFile () const
+  {
+    // We skip the check for downloading media unless a local copy of the
+    // media file exists and states that there is more than one medium.
+    bool canSkipMediaCheck = std::all_of( baseUrlsBegin(), baseUrlsEnd(), []( const zypp::Url &url ) { return url.schemeIsDownloading(); });
+    if ( canSkipMediaCheck ) {
+      const auto &mDataPath = metadataPath();
+      if ( not mDataPath.empty() ) {
+        PathInfo mediafile { mDataPath/"media.1/media" };
+        if ( mediafile.isExist() ) {
+          repo::SUSEMediaVerifier lverifier { mediafile.path() };
+          if ( lverifier && lverifier.totalMedia() > 1 ) {
+            canSkipMediaCheck = false;
+          }
+        }
+      }
+    }
+    if ( canSkipMediaCheck )
+      DBG << "Can SKIP media.1/media check for status calc of repo " << alias() << endl;
+    return not canSkipMediaCheck;
+  }
+
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////
index df5b0df..003034e 100644 (file)
@@ -521,6 +521,12 @@ namespace zypp
       LocaleSet getLicenseLocales( const std::string & name_r ) const;
      //@}
 
+      /**
+       * Returns true if this repository requires the media.1/media file to be included
+       * in the metadata status and repo status calculations.
+       */
+      bool requireStatusWithMediaFile () const;
+
     public:
       /**
        * Write a human-readable representation of this RepoInfo object
index 4aee804..ad971da 100644 (file)
@@ -17,6 +17,7 @@
 #include <list>
 #include <map>
 #include <algorithm>
+#include <chrono>
 
 #include <solv/solvversion.h>
 
@@ -42,6 +43,7 @@
 
 #include <zypp/parser/RepoFileReader.h>
 #include <zypp/parser/ServiceFileReader.h>
+#include <zypp/parser/xml/Reader.h>
 #include <zypp/repo/ServiceRepos.h>
 #include <zypp/repo/yum/Downloader.h>
 #include <zypp/repo/susetags/Downloader.h>
@@ -55,6 +57,7 @@
 #include <zypp/ZYppCallbacks.h>
 
 #include "sat/Pool.h"
+#include <zypp/base/Algorithm.h>
 
 using std::endl;
 using std::string;
@@ -65,6 +68,9 @@ using namespace zypp::repo;
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 {
+  namespace zypp_readonly_hack {
+    bool IGotIt(); // in readonly-mode
+  }
 
   ///////////////////////////////////////////////////////////////////
   namespace env
@@ -453,6 +459,10 @@ namespace zypp
     };
     ////////////////////////////////////////////////////////////////////////////
 
+    /** bsc#1204956: Tweak to prevent auto pruning package caches. */
+    inline bool autoPruneInDir( const Pathname & path_r )
+    { return not PathInfo(path_r/".no_auto_prune").isExist(); }
+
   } // namespace
   ///////////////////////////////////////////////////////////////////
 
@@ -604,7 +614,7 @@ namespace zypp
 
     void cleanMetadata( const RepoInfo & info, OPT_PROGRESS );
 
-    void cleanPackages( const RepoInfo & info, OPT_PROGRESS );
+    void cleanPackages( const RepoInfo & info, OPT_PROGRESS, bool isAutoClean = false );
 
     void buildCache( const RepoInfo & info, CacheBuildPolicy policy, OPT_PROGRESS );
 
@@ -668,6 +678,8 @@ namespace zypp
 
     repo::ServiceType probeService( const Url & url ) const;
 
+    void refreshGeoIPData ( const RepoInfo::url_set &urls );
+
   private:
     void saveService( ServiceInfo & service ) const;
 
@@ -804,11 +816,15 @@ namespace zypp
      * \note bnc#891515: Auto-cleanup only zypp.conf default locations. Otherwise
      * we'd need some magic file to identify zypp cache directories. Without this
      * we may easily remove user data (zypper --pkg-cache-dir . download ...)
+     * \note bsc#1210740: Don't cleanup if read-only mode was promised.
      */
     inline void cleanupNonRepoMetadtaFolders( const Pathname & cachePath_r,
                                               const Pathname & defaultCachePath_r,
                                               const std::list<std::string> & repoEscAliases_r )
     {
+      if ( zypp_readonly_hack::IGotIt() )
+        return;
+
       if ( cachePath_r != defaultCachePath_r )
         return;
 
@@ -889,21 +905,26 @@ namespace zypp
         }
       }
 
-      // delete metadata folders without corresponding repo (e.g. old tmp directories)
-      //
-      // bnc#891515: Auto-cleanup only zypp.conf default locations. Otherwise
-      // we'd need somemagic file to identify zypp cache directories. Without this
-      // we may easily remove user data (zypper --pkg-cache-dir . download ...)
-      repoEscAliases.sort();
-      cleanupNonRepoMetadtaFolders( _options.repoRawCachePath,
-                                    Pathname::assertprefix( _options.rootDir, ZConfig::instance().builtinRepoMetadataPath() ),
-                                    repoEscAliases );
-      cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath,
-                                    Pathname::assertprefix( _options.rootDir, ZConfig::instance().builtinRepoSolvfilesPath() ),
-                                    repoEscAliases );
-      cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath,
-                                    Pathname::assertprefix( _options.rootDir, ZConfig::instance().builtinRepoPackagesPath() ),
-                                    repoEscAliases );
+      // bsc#1210740: Don't cleanup if read-only mode was promised.
+      if ( not zypp_readonly_hack::IGotIt() ) {
+        // delete metadata folders without corresponding repo (e.g. old tmp directories)
+        //
+        // bnc#891515: Auto-cleanup only zypp.conf default locations. Otherwise
+        // we'd need somemagic file to identify zypp cache directories. Without this
+        // we may easily remove user data (zypper --pkg-cache-dir . download ...)
+        repoEscAliases.sort();
+        cleanupNonRepoMetadtaFolders( _options.repoRawCachePath,
+                                      Pathname::assertprefix( _options.rootDir, ZConfig::instance().builtinRepoMetadataPath() ),
+                                      repoEscAliases );
+        cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath,
+                                      Pathname::assertprefix( _options.rootDir, ZConfig::instance().builtinRepoSolvfilesPath() ),
+                                      repoEscAliases );
+        // bsc#1204956: Tweak to prevent auto pruning package caches
+        if ( autoPruneInDir( _options.repoPackagesCachePath ) )
+          cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath,
+                                        Pathname::assertprefix( _options.rootDir, ZConfig::instance().builtinRepoPackagesPath() ),
+                                        repoEscAliases );
+      }
     }
     MIL << "end construct known repos" << endl;
   }
@@ -928,7 +949,9 @@ namespace zypp
     switch ( repokind.toEnum() )
     {
       case RepoType::RPMMD_e :
-        status = RepoStatus( productdatapath/"repodata/repomd.xml") && RepoStatus( mediarootpath/"media.1/media" );
+        status = RepoStatus( productdatapath/"repodata/repomd.xml");
+        if ( info.requireStatusWithMediaFile() )
+          status = status && RepoStatus( mediarootpath/"media.1/media" );
         break;
 
       case RepoType::YAST2_e :
@@ -997,6 +1020,8 @@ namespace zypp
     {
       MIL << "Check if to refresh repo " << info.alias() << " at " << url << " (" << info.type() << ")" << endl;
 
+      refreshGeoIPData( { url } );
+
       // first check old (cached) metadata
       Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
       filesystem::assert_dir( mediarootpath );
@@ -1120,6 +1145,9 @@ namespace zypp
     assert_alias(info);
     assert_urls(info);
 
+    // make sure geoIP data is up 2 date
+    refreshGeoIPData( info.baseUrls() );
+
     // we will throw this later if no URL checks out fine
     RepoException rexception( info, PL_("Valid metadata not found at specified URL",
                                         "Valid metadata not found at specified URLs",
@@ -1265,18 +1293,21 @@ namespace zypp
   {
     ProgressData progress(100);
     progress.sendTo(progressfnc);
-
-    filesystem::recursive_rmdir(rawcache_path_for_repoinfo(_options, info));
+    filesystem::recursive_rmdir( ZConfig::instance().geoipCachePath() );
+    filesystem::recursive_rmdir( rawcache_path_for_repoinfo(_options, info) );
     progress.toMax();
   }
 
 
-  void RepoManager::Impl::cleanPackages( const RepoInfo & info, const ProgressData::ReceiverFnc & progressfnc )
+  void RepoManager::Impl::cleanPackages( const RepoInfo & info, const ProgressData::ReceiverFnc & progressfnc, bool isAutoClean_r )
   {
     ProgressData progress(100);
     progress.sendTo(progressfnc);
 
-    filesystem::recursive_rmdir(packagescache_path_for_repoinfo(_options, info));
+    // bsc#1204956: Tweak to prevent auto pruning package caches
+    const Pathname & rpc { packagescache_path_for_repoinfo(_options, info) };
+    if ( not isAutoClean_r || autoPruneInDir( rpc.dirname() ) )
+      filesystem::recursive_rmdir( rpc );
     progress.toMax();
   }
 
@@ -1850,7 +1881,7 @@ namespace zypp
           cleanCache( todelete, cSubprogrcv);
         // now delete metadata (#301037)
         cleanMetadata( todelete, mSubprogrcv );
-        cleanPackages( todelete, pSubprogrcv );
+        cleanPackages( todelete, pSubprogrcv, true/*isAutoClean*/ );
         reposManip().erase(todelete);
         MIL << todelete.alias() << " successfully deleted." << endl;
         HistoryLog(_options.rootDir).removeRepository(todelete);
@@ -2538,6 +2569,137 @@ namespace zypp
     return repo::ServiceType::NONE;
   }
 
+  void RepoManager::Impl::refreshGeoIPData ( const RepoInfo::url_set &urls )
+  {
+    try  {
+
+      if ( !ZConfig::instance().geoipEnabled() ) {
+        MIL << "GeoIp disabled via ZConfig, not refreshing the GeoIP information." << std::endl;
+        return;
+      }
+
+      std::vector<std::string> hosts;
+      for ( const auto &baseUrl : urls ) {
+        const auto &host = baseUrl.getHost();
+        if ( zypp::any_of( ZConfig::instance().geoipHostnames(), [&host]( const auto &elem ){ return ( zypp::str::compareCI( host, elem ) == 0 ); } ) ) {
+          hosts.push_back( host );
+          break;
+        }
+      }
+
+      if ( hosts.empty() ) {
+        MIL << "No configured geoip URL found, not updating geoip data" << std::endl;
+        return;
+      }
+
+      const auto &geoIPCache = ZConfig::instance().geoipCachePath();
+
+      if ( filesystem::assert_dir( geoIPCache ) != 0 ) {
+        MIL << "Unable to create cache directory for GeoIP." << std::endl;
+        return;
+      }
+
+      if ( !PathInfo(geoIPCache).userMayRWX() ) {
+        MIL << "No access rights for the GeoIP cache directory." << std::endl;
+        return;
+      }
+
+      // remove all older cache entries
+      filesystem::dirForEachExt( geoIPCache, []( const Pathname &dir, const filesystem::DirEntry &entry ){
+        if ( entry.type != filesystem::FT_FILE )
+          return true;
+
+        PathInfo pi( dir/entry.name );
+        auto age = std::chrono::system_clock::now() - std::chrono::system_clock::from_time_t( pi.mtime() );
+        if ( age < std::chrono::hours(24) )
+          return true;
+
+        MIL << "Removing GeoIP file for " << entry.name << " since it's older than 24hrs." << std::endl;
+        filesystem::unlink( dir/entry.name );
+        return true;
+      });
+
+      // go over all found hostnames
+      std::for_each( hosts.begin(), hosts.end(), [ & ]( const std::string &hostname ) {
+
+        // do not query files that are still there
+        if ( zypp::PathInfo( geoIPCache / hostname ).isExist() )  {
+          MIL << "Skipping GeoIP request for " << hostname << " since a valid cache entry exists." << std::endl;
+          return;
+        }
+
+        MIL << "Query GeoIP for " << hostname << std::endl;
+
+        zypp::Url url;
+        try
+        {
+          url.setHost(hostname);
+          url.setScheme("https");
+        }
+        catch(const zypp::Exception &e )
+        {
+          ZYPP_CAUGHT(e);
+          MIL << "Ignoring invalid GeoIP hostname: " << hostname << std::endl;
+          return;
+        }
+
+        MediaSetAccess acc( url );
+        zypp::ManagedFile file;
+        try {
+          // query the file from the server
+          file = zypp::ManagedFile (acc.provideOptionalFile("/geoip"), filesystem::unlink );
+
+        } catch ( const zypp::Exception &e  ) {
+          ZYPP_CAUGHT(e);
+          MIL << "Failed to query GeoIP from hostname: " << hostname << std::endl;
+          return;
+        }
+        if ( !file->empty() ) {
+
+          constexpr auto writeHostToFile = []( const Pathname &fName, const std::string &host ){
+            std::ofstream out;
+            out.open( fName.asString(), std::ios_base::trunc );
+            if ( out.is_open() ) {
+              out << host << std::endl;
+            } else {
+              MIL << "Failed to create/open GeoIP cache file " << fName << std::endl;
+            }
+          };
+
+          std::string geoipMirror;
+          try {
+            xml::Reader reader( *file );
+            if ( reader.seekToNode( 1, "host" ) ) {
+              const auto &str = reader.nodeText().asString();
+
+              // make a dummy URL to ensure the hostname is valid
+              zypp::Url testUrl;
+              testUrl.setHost(str);
+              testUrl.setScheme("https");
+
+              if ( testUrl.isValid() ) {
+                MIL << "Storing geoIP redirection: " << hostname << " -> " << str << std::endl;
+                geoipMirror = str;
+              }
+
+            } else {
+              MIL << "No host entry or empty file returned for GeoIP, remembering for 24hrs" << std::endl;
+            }
+          } catch ( const zypp::Exception &e ) {
+            ZYPP_CAUGHT(e);
+            MIL << "Empty or invalid GeoIP file, not requesting again for 24hrs" << std::endl;
+          }
+
+          writeHostToFile( geoIPCache / hostname, geoipMirror );
+        }
+      });
+
+    } catch ( const zypp::Exception &e ) {
+      ZYPP_CAUGHT(e);
+      MIL << "Failed to query GeoIP data." << std::endl;
+    }
+  }
+
   ///////////////////////////////////////////////////////////////////
   //
   //   CLASS NAME : RepoManager
@@ -2697,6 +2859,9 @@ namespace zypp
   void RepoManager::modifyService( const std::string & oldAlias, const ServiceInfo & service )
   { return _pimpl->modifyService( oldAlias, service ); }
 
+  void RepoManager::refreshGeoIp (const RepoInfo::url_set &urls)
+  { return _pimpl->refreshGeoIPData( urls ); }
+
   ////////////////////////////////////////////////////////////////////////////
 
   std::ostream & operator<<( std::ostream & str, const RepoManager & obj )
index 774b53d..6a6bb30 100644 (file)
@@ -634,6 +634,12 @@ namespace zypp
     void modifyService( const ServiceInfo & service )
     { modifyService( service.alias(), service ); }
 
+    /*!
+     * Checks for any of the given \a urls if there is no geoip data available, caches the results
+     * in the metadata cache for 24hrs. The given urls need to be configured as valid geoIP targets ( usually download.opensuse.org )
+     */
+    void refreshGeoIp ( const RepoInfo::url_set &urls );
+
   private:
     /**
      * Functor thats filter RepoInfo by service which it belongs to.
diff --git a/zypp/ShutdownLock.cc b/zypp/ShutdownLock.cc
deleted file mode 100644 (file)
index ffb63f8..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "ShutdownLock_p.h"
-
-#include <zypp/ExternalProgram.h>
-#include <iostream>
-
-zypp::ShutdownLock::ShutdownLock(const std::string &reason)
-{
-  try {
-
-    std::string whyStr = str::form("--why=%s", reason.c_str());
-
-    const char* argv[] =
-    {
-      "/usr/bin/systemd-inhibit",
-      "--what=sleep:shutdown:idle",
-      "--who=zypp",
-      "--mode=block",
-      whyStr.c_str(),
-      "/usr/bin/cat",
-      NULL
-    };
-    _prog = shared_ptr<ExternalProgramWithSeperatePgid>( new ExternalProgramWithSeperatePgid( argv, ExternalProgram::Discard_Stderr ) );
-  } catch (...) {
-  }
-}
-
-zypp::ShutdownLock::~ShutdownLock()
-{
-  if (_prog) {
-    _prog->kill();
-  }
-}
index 5fd3265..f1d330a 100644 (file)
@@ -61,6 +61,76 @@ namespace zypp
   namespace
   { /////////////////////////////////////////////////////////////////
 
+    ///////////////////////////////////////////////////////////////////
+    // From rpm's lib/rpmrc.c
+#   if defined(__linux__) && defined(__x86_64__)
+    static inline void cpuid(uint32_t op, uint32_t op2, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
+    {
+        asm volatile (
+            "cpuid\n"
+        : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
+        : "a" (op), "c" (op2));
+    }
+
+    /* From gcc's gcc/config/i386/cpuid.h */
+    /* Features (%eax == 1) */
+    /* %ecx */
+    #define bit_SSE3        (1 << 0)
+    #define bit_SSSE3       (1 << 9)
+    #define bit_FMA         (1 << 12)
+    #define bit_CMPXCHG16B  (1 << 13)
+    #define bit_SSE4_1      (1 << 19)
+    #define bit_SSE4_2      (1 << 20)
+    #define bit_MOVBE       (1 << 22)
+    #define bit_POPCNT      (1 << 23)
+    #define bit_OSXSAVE     (1 << 27)
+    #define bit_AVX         (1 << 28)
+    #define bit_F16C        (1 << 29)
+
+    /* Extended Features (%eax == 0x80000001) */
+    /* %ecx */
+    #define bit_LAHF_LM     (1 << 0)
+    #define bit_LZCNT       (1 << 5)
+
+    /* Extended Features (%eax == 7) */
+    /* %ebx */
+    #define bit_BMI         (1 << 3)
+    #define bit_AVX2        (1 << 5)
+    #define bit_BMI2        (1 << 8)
+    #define bit_AVX512F     (1 << 16)
+    #define bit_AVX512DQ    (1 << 17)
+    #define bit_AVX512CD    (1 << 28)
+    #define bit_AVX512BW    (1 << 30)
+    #define bit_AVX512VL    (1u << 31)
+
+    static int get_x86_64_level(void)
+    {
+        int level = 1;
+
+        unsigned int op_1_ecx = 0, op_80000001_ecx = 0, op_7_ebx = 0, unused;
+        cpuid(1, 0, &unused, &unused, &op_1_ecx, &unused);
+        cpuid(0x80000001, 0, &unused, &unused, &op_80000001_ecx, &unused);
+        cpuid(7, 0, &unused, &op_7_ebx, &unused, &unused);
+
+        const unsigned int op_1_ecx_lv2 = bit_SSE3 | bit_SSSE3 | bit_CMPXCHG16B | bit_SSE4_1 | bit_SSE4_2 | bit_POPCNT;
+        if ((op_1_ecx & op_1_ecx_lv2) == op_1_ecx_lv2 && (op_80000001_ecx & bit_LAHF_LM))
+            level = 2;
+
+        const unsigned int op_1_ecx_lv3 = bit_FMA | bit_MOVBE | bit_OSXSAVE | bit_AVX | bit_F16C;
+        const unsigned int op_7_ebx_lv3 = bit_BMI | bit_AVX2 | bit_BMI2;
+        if (level == 2 && (op_1_ecx & op_1_ecx_lv3) == op_1_ecx_lv3 && (op_7_ebx & op_7_ebx_lv3) == op_7_ebx_lv3
+            && (op_80000001_ecx & bit_LZCNT))
+            level = 3;
+
+        const unsigned int op_7_ebx_lv4 = bit_AVX512F | bit_AVX512DQ | bit_AVX512CD | bit_AVX512BW | bit_AVX512VL;
+        if (level == 3 && (op_7_ebx & op_7_ebx_lv4) == op_7_ebx_lv4)
+            level = 4;
+
+        return level;
+    }
+#   endif
+    ///////////////////////////////////////////////////////////////////
+
     /** Determine system architecture evaluating \c uname and \c /proc/cpuinfo.
     */
     Arch _autodetectSystemArchitecture()
@@ -75,7 +145,27 @@ namespace zypp
       Arch architecture( buf.machine );
       MIL << "Uname architecture is '" << buf.machine << "'" << endl;
 
-      if ( architecture == Arch_i686 )
+      if ( architecture == Arch_x86_64 )
+      {
+#if     defined(__linux__) && defined(__x86_64__)
+        switch ( get_x86_64_level() )
+        {
+          case 2:
+            architecture = Arch_x86_64_v2;
+            WAR << "CPU has 'x86_64': architecture upgraded to '" << architecture << "'" << endl;
+            break;
+          case 3:
+            architecture = Arch_x86_64_v3;
+            WAR << "CPU has 'x86_64': architecture upgraded to '" << architecture << "'" << endl;
+            break;
+          case 4:
+            architecture = Arch_x86_64_v4;
+            WAR << "CPU has 'x86_64': architecture upgraded to '" << architecture << "'" << endl;
+            break;
+        }
+#       endif
+      }
+      else if ( architecture == Arch_i686 )
       {
         // some CPUs report i686 but dont implement cx8 and cmov
         // check for both flags in /proc/cpuinfo and downgrade
@@ -415,6 +505,8 @@ namespace zypp
         , pkgGpgCheck                  ( indeterminate )
         , apply_locks_file             ( true )
         , pluginsPath                  ( "/usr/lib/zypp/plugins" )
+        , geoipEnabled ( true )
+        , geoipHosts { "download.opensuse.org" }
       {
         MIL << "libzypp: " LIBZYPP_VERSION_STRING << endl;
         if ( PathInfo(_parsedZyppConf).isExist() )
@@ -518,6 +610,9 @@ namespace zypp
                 {
                   download_mediaMountdir.restoreToDefault( Pathname(value) );
                 }
+                else if ( entry == "download.use_geoip_mirror") {
+                  geoipEnabled = str::strToBool( value, geoipEnabled );
+                }
                 else if ( entry == "commit.downloadMode" )
                 {
                   commit_downloadMode.set( deserializeDownloadMode( value ) );
@@ -712,6 +807,10 @@ namespace zypp
 
     Option<Pathname> pluginsPath;
 
+    bool geoipEnabled;
+
+    std::vector<std::string> geoipHosts;
+
     /* Other config singleton instances */
     MediaConfig &_mediaConf = MediaConfig::instance();
 
@@ -1024,6 +1123,18 @@ namespace zypp
   Pathname ZConfig::needrebootPath() const
   { return configPath()/"needreboot.d"; }
 
+  void ZConfig::setGeoipEnabled( bool enable )
+  { _pimpl->geoipEnabled = enable; }
+
+  bool ZConfig::geoipEnabled () const
+  { return _pimpl->geoipEnabled; }
+
+  Pathname ZConfig::geoipCachePath() const
+  { return builtinRepoCachePath()/"geoip.d"; }
+
+  const std::vector<std::string> ZConfig::geoipHostnames () const
+  { return _pimpl->geoipHosts; }
+
   Pathname ZConfig::varsPath() const
   {
     return ( _pimpl->cfg_vars_path.empty()
index f26f500..002be55 100644 (file)
@@ -224,6 +224,28 @@ namespace zypp
       Pathname needrebootPath() const;
 
       /**
+       * Enables or disables the use of the geoip feature of download.opensuse.org
+       */
+      void setGeoipEnabled( bool enable = true );
+
+      /**
+       * Returns true if zypp should use the geoip feature of download.opensuse.org
+       */
+      bool geoipEnabled () const;
+
+      /**
+       * Path where the geoip caches are kept (/var/cache/zypp/geoip)
+       */
+      Pathname geoipCachePath() const;
+
+      /**
+       * All hostnames we want to rewrite using the geoip feature. The \ref RepoManager
+       * will try to query each hostname via: https://hostname/geoip to receive a redirection
+       * target for requests to the given hostname. The geoip targets are cached in \ref geoipCachePath.
+       */
+      const std::vector<std::string> geoipHostnames () const;
+
+      /**
        * Path containing custom repo variable definitions (configPath()/vars.d).
        * \see \ref zypp::repo::RepoVarExpand Repo variable expander
        * \ingroup g_ZC_CONFIGFILES
index 264a0de..112a754 100644 (file)
@@ -153,7 +153,7 @@ namespace zypp
     explicit ZYpp( const Impl_Ptr & impl_r );
   private:
     /** Deleted via shared_ptr */
-    friend void ::boost::checked_delete<ZYpp>(ZYpp*);  // template<class T> inline void checked_delete(T * x)
+    friend void ::boost::checked_delete<ZYpp>(ZYpp*) BOOST_NOEXCEPT;   // template<class T> inline void checked_delete(T * x)
     /** Dtor */
     ~ZYpp();
   private:
index a362b54..de4350b 100644 (file)
@@ -59,13 +59,17 @@ namespace zypp
   struct ProgressReportAdaptor
   {
 
+    ProgressReportAdaptor( callback::SendReport<ProgressReport> &report )
+      : _report(report)
+      , _first(true)
+    {}
+
     ProgressReportAdaptor( const ProgressData::ReceiverFnc &fnc,
                            callback::SendReport<ProgressReport> &report )
       : _fnc(fnc)
       , _report(report)
       , _first(true)
-    {
-    }
+    {}
 
     bool operator()( const ProgressData &progress )
     {
index ac923ca..004232e 100644 (file)
@@ -104,8 +104,8 @@ namespace zypp
   class ZYppGlobalLock
   {
   public:
-    ZYppGlobalLock()
-    : _zyppLockFilePath( env::ZYPP_LOCKFILE_ROOT() / "/run/zypp.pid" )
+    ZYppGlobalLock( Pathname &&lFilePath )
+      : _zyppLockFilePath( std::move(lFilePath) )
     , _zyppLockFile( NULL )
     , _lockerPid( 0 )
     , _cleanLock( false )
@@ -246,8 +246,43 @@ namespace zypp
       MIL << "write: Lockfile " << _zyppLockFilePath << " got pid " <<  getpid() << std::endl;
     }
 
+    /*!
+     * Expects the calling function to lock the access lock
+     */
+    bool safeCheckIsLocked()
+    {
+      _lockerPid = readLockFile();
+      if ( _lockerPid == 0 ) {
+        // no or empty lock file
+        return false;
+      } else if ( _lockerPid == getpid() ) {
+        // keep my own lock
+        return false;
+      } else {
+        // a foreign pid in lock
+        if ( isProcessRunning( _lockerPid ) ) {
+          WAR << _lockerPid << " is running and has a ZYpp lock. Sorry." << std::endl;
+          return true;
+        } else {
+          MIL << _lockerPid << " is dead. Ignoring the existing lock file." << std::endl;
+          return false;
+        }
+      }
+    }
+
   public:
 
+    bool isZyppLocked()
+    {
+      if ( geteuid() != 0 )
+        return false;  // no lock as non-root
+
+      // Exception safe access to the lockfile.
+      ScopedGuard closeOnReturn( accessLockFile() );
+      scoped_lock<file_lock> flock( _zyppLockFileLock );       // aquire write lock
+      return safeCheckIsLocked ();
+    }
+
     /** Try to aquire a lock.
      * \return \c true if zypp is already locked by another process.
      */
@@ -258,38 +293,11 @@ namespace zypp
 
       // Exception safe access to the lockfile.
       ScopedGuard closeOnReturn( accessLockFile() );
-      {
-        scoped_lock<file_lock> flock( _zyppLockFileLock );     // aquire write lock
-
-        _lockerPid = readLockFile();
-        if ( _lockerPid == 0 )
-        {
-          // no or empty lock file
-          writeLockFile();
-          return false;
-        }
-        else if ( _lockerPid == getpid() )
-        {
-          // keep my own lock
-          return false;
-        }
-        else
-        {
-          // a foreign pid in lock
-          if ( isProcessRunning( _lockerPid ) )
-          {
-            WAR << _lockerPid << " is running and has a ZYpp lock. Sorry." << std::endl;
-            return true;
-          }
-          else
-          {
-            MIL << _lockerPid << " is dead. Taking the lock file." << std::endl;
-            writeLockFile();
-            return false;
-          }
-        }
+      scoped_lock<file_lock> flock( _zyppLockFileLock );       // aquire write lock
+      if ( !safeCheckIsLocked() ) {
+        writeLockFile();
+        return false;
       }
-      INT << "Oops! We should not be here!" << std::endl;
       return true;
     }
 
@@ -304,7 +312,7 @@ namespace zypp
     ZYppGlobalLock & globalLock()
     {
       if ( !_theGlobalLock )
-        _theGlobalLock.reset( new ZYppGlobalLock );
+        _theGlobalLock.reset( new ZYppGlobalLock( ZYppFactory::lockfileDir() / "zypp.pid" ) );
       return *_theGlobalLock;
     }
   } //namespace
@@ -363,6 +371,13 @@ namespace zypp
   //
   ZYpp::Ptr ZYppFactory::getZYpp() const
   {
+
+    const auto &makeLockedError = []( pid_t pid, const std::string &lockerName ){
+      const std::string &t = str::form(_("System management is locked by the application with pid %d (%s).\n"
+                                           "Close this application before trying again."), pid, lockerName.c_str() );
+      return ZYppFactoryException(t, pid, lockerName );
+    };
+
     ZYpp::Ptr _instance = _theZYppInstance.lock();
     if ( ! _instance )
     {
@@ -377,44 +392,58 @@ namespace zypp
       else if ( globalLock().zyppLocked() )
       {
         bool failed = true;
+        // bsc#1184399,1213231: A negative ZYPP_LOCK_TIMEOUT will wait forever.
         const long LOCK_TIMEOUT = str::strtonum<long>( getenv( "ZYPP_LOCK_TIMEOUT" ) );
-        if ( LOCK_TIMEOUT > 0 )
+        if ( LOCK_TIMEOUT != 0 )
         {
-          MIL << "Waiting whether pid " << globalLock().lockerPid() << " ends within $LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec." << endl;
-          unsigned delay = 1;
-          Pathname procdir( Pathname("/proc")/str::numstring(globalLock().lockerPid()) );
-          for ( long i = 0; i < LOCK_TIMEOUT; i += delay )
-          {
-            if ( PathInfo( procdir ).isDir() ) // wait for /proc/pid to disapear
-              sleep( delay );
-            else
+          Date logwait = Date::now();
+          Date giveup; /* 0 = forever */
+          if ( LOCK_TIMEOUT > 0 ) {
+            giveup = logwait+LOCK_TIMEOUT;
+            MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Waiting for the zypp lock until " << giveup << endl;
+          }
+          else
+            MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Waiting for the zypp lock..." << endl;
+
+          unsigned delay = 0;
+          do {
+            if ( delay < 60 )
+              delay += 1;
+            else {
+              Date now { Date::now() };
+              if ( now - logwait > Date::day ) {
+                WAR << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Another day has passed waiting for the zypp lock..." << endl;
+                logwait = now;
+              }
+            }
+            sleep( delay );
             {
-              MIL << "Retry after " << i << " sec." << endl;
+              zypp::base::LogControl::TmpLineWriter shutUp;     // be quiet
               failed = globalLock().zyppLocked();
-              if ( failed )
-              {
-                // another proc locked faster. maybe it ends fast as well....
-                MIL << "Waiting whether pid " << globalLock().lockerPid() << " ends within " << (LOCK_TIMEOUT-i) << " sec." << endl;
-                procdir = Pathname( Pathname("/proc")/str::numstring(globalLock().lockerPid()) );
-              }
-              else
-              {
-                MIL << "Finally got the lock!" << endl;
-                break; // gotcha
-              }
             }
+          } while ( failed && ( not giveup || Date::now() <= giveup ) );
+
+          if ( failed ) {
+            MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Gave up waiting for the zypp lock." << endl;
+          }
+          else {
+            MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Finally got the zypp lock." << endl;
           }
         }
         if ( failed )
+          ZYPP_THROW( makeLockedError( globalLock().lockerPid(), globalLock().lockerName() ));
+
+        // we got the global lock, now make sure zypp-rpm is not still running
         {
-          std::string t = str::form(_("System management is locked by the application with pid %d (%s).\n"
-                                      "Close this application before trying again."),
-                                      globalLock().lockerPid(),
-                                      globalLock().lockerName().c_str()
-                                    );
-          ZYPP_THROW(ZYppFactoryException(t, globalLock().lockerPid(), globalLock().lockerName() ));
+          ZYppGlobalLock zyppRpmLock( ZYppFactory::lockfileDir() / "zypp-rpm.pid" );
+          if ( zyppRpmLock.isZyppLocked () ) {
+            // release global lock, we will exit now
+            _theGlobalLock.reset();
+            ZYPP_THROW( makeLockedError( zyppRpmLock.lockerPid(), zyppRpmLock.lockerName() ));
+          }
         }
       }
+
       // Here we go...
       static ZYpp::Impl_Ptr _theImplInstance;  // for now created once
       if ( !_theImplInstance )
@@ -431,6 +460,11 @@ namespace zypp
   bool ZYppFactory::haveZYpp() const
   { return !_theZYppInstance.expired(); }
 
+  zypp::Pathname ZYppFactory::lockfileDir()
+  {
+    return env::ZYPP_LOCKFILE_ROOT() / "run";
+  }
+
   /******************************************************************
   **
   **   FUNCTION NAME : operator<<
index bb8e3b5..e43f669 100644 (file)
@@ -59,6 +59,8 @@ namespace zypp
     /** Whether the ZYpp instance is already created.*/
     bool haveZYpp() const;
 
+    static zypp::Pathname lockfileDir ();
+
   private:
     /** Default ctor. */
     ZYppFactory();
index 3144994..f5fb661 100644 (file)
@@ -66,6 +66,18 @@ namespace zypp
       return cnt;
     }
 
+    template <class Container, class Elem>
+    bool contains ( const Container &c, const Elem &elem )
+    {
+      return ( std::find( c.begin(), c.end(), elem ) != c.end() );
+    }
+
+    template <class Container, class Fnc >
+    bool any_of ( const Container &c, Fnc &&cb )
+    {
+      return std::any_of( c.begin(), c.end(), std::forward<Fnc>(cb) );
+    }
+
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////
index 9693d29..e5cfebe 100644 (file)
@@ -11,6 +11,7 @@
 */
 
 #include <iostream>
+#include <chrono>
 #include <list>
 
 #include <zypp/base/Logger.h>
@@ -42,19 +43,129 @@ using std::endl;
 
 namespace internal {
   using namespace zypp;
+  /// \brief Bottleneck filtering all DownloadProgressReport issued from Media[Muli]Curl.
+  /// - Optional files will send no report until data are actually received (we know it exists).
+  /// - Control the progress report frequency passed along to the application.
+  struct OptionalDownloadProgressReport : public callback::ReceiveReport<media::DownloadProgressReport>
+  {
+    using TimePoint = std::chrono::steady_clock::time_point;
+
+    OptionalDownloadProgressReport( bool isOptional=false )
+    : _oldRec { Distributor::instance().getReceiver() }
+    , _isOptional { isOptional }
+    { connect(); }
+
+    ~OptionalDownloadProgressReport()
+    { if ( _oldRec ) Distributor::instance().setReceiver( *_oldRec ); else Distributor::instance().noReceiver(); }
+
+    void reportbegin() override
+    { if ( _oldRec ) _oldRec->reportbegin(); }
+
+    void reportend() override
+    { if ( _oldRec ) _oldRec->reportend(); }
+
+    void report( const UserData & userData_r = UserData() ) override
+    { if ( _oldRec ) _oldRec->report( userData_r ); }
+
+
+    void start( const Url & file_r, Pathname localfile_r ) override
+    {
+      if ( not _oldRec ) return;
+      if ( _isOptional ) {
+        // delay start until first data are received.
+        _startFile      = file_r;
+        _startLocalfile = std::move(localfile_r);
+        return;
+      }
+      _oldRec->start( file_r, localfile_r );
+    }
+
+    bool progress( int value_r, const Url & file_r, double dbps_avg_r = -1, double dbps_current_r = -1 ) override
+    {
+      if ( not _oldRec ) return true;
+      if ( notStarted() ) {
+        if ( not ( value_r || dbps_avg_r || dbps_current_r ) )
+          return true;
+        sendStart();
+      }
+
+      //static constexpr std::chrono::milliseconds minfequency { 1000 }; only needed if we'd avoid sending reports without change
+      static constexpr std::chrono::milliseconds maxfequency { 100 };
+      TimePoint now { TimePoint::clock::now() };
+      TimePoint::duration elapsed { now - _lastProgressSent };
+      if ( elapsed < maxfequency )
+        return true;  // continue
+      _lastProgressSent = now;
+      return _oldRec->progress( value_r, file_r, dbps_avg_r, dbps_current_r );
+    }
+
+    Action problem( const Url & file_r, Error error_r, const std::string & description_r ) override
+    {
+      if ( not _oldRec || notStarted() ) return ABORT;
+      return _oldRec->problem( file_r, error_r, description_r );
+    }
+
+    void finish( const Url & file_r, Error error_r, const std::string & reason_r ) override
+    {
+      if ( not _oldRec || notStarted() ) return;
+      _oldRec->finish( file_r, error_r, reason_r );
+    }
+
+  private:
+    // _isOptional also indicates the delayed start
+    bool notStarted() const
+    { return _isOptional; }
+
+    void sendStart()
+    {
+      if ( _isOptional ) {
+        // we know _oldRec is valid...
+        _oldRec->start( std::move(_startFile), std::move(_startLocalfile) );
+        _isOptional = false;
+      }
+    }
+
+  private:
+    Receiver *const _oldRec;
+    bool     _isOptional;
+    Url      _startFile;
+    Pathname _startLocalfile;
+    TimePoint _lastProgressSent;
+  };
+
   struct ProgressData
   {
-    ProgressData( CURL *_curl, time_t _timeout = 0, const zypp::Url & _url = zypp::Url(),
-      zypp::ByteCount expectedFileSize_r = 0,
-      zypp::callback::SendReport<zypp::media::DownloadProgressReport> *_report = nullptr );
-
-    CURL       *curl;
-    zypp::Url  url;
-    time_t     timeout;
-    bool       reached;
-    bool      fileSizeExceeded;
+    ProgressData( CURL *curl, time_t timeout = 0, const zypp::Url & url = zypp::Url(),
+                  zypp::ByteCount expectedFileSize_r = 0,
+                  zypp::callback::SendReport<zypp::media::DownloadProgressReport> *_report = nullptr );
+
+    void updateStats( double dltotal = 0.0, double dlnow = 0.0 );
+
+    int reportProgress() const;
+
+    CURL * curl()
+    { return _curl; }
+
+    bool timeoutReached() const
+    { return _timeoutReached; }
+
+    bool fileSizeExceeded() const
+    { return _fileSizeExceeded; }
+
+    ByteCount expectedFileSize() const
+    { return _expectedFileSize; }
+
+    void expectedFileSize( ByteCount newval_r )
+    { _expectedFileSize = newval_r; }
+
+  private:
+    CURL *      _curl;
+    zypp::Url  _url;
+    time_t     _timeout;
+    bool       _timeoutReached;
+    bool        _fileSizeExceeded;
+    ByteCount   _expectedFileSize;
     zypp::callback::SendReport<zypp::media::DownloadProgressReport> *report;
-    zypp::ByteCount _expectedFileSize;
 
     time_t _timeStart  = 0;    ///< Start total stats
     time_t _timeLast   = 0;    ///< Start last period(~1sec)
@@ -69,38 +180,18 @@ namespace internal {
 
     double _drateTotal= 0.0;   ///< Download rate so far
     double _drateLast  = 0.0;  ///< Download rate in last period
-
-    void updateStats( double dltotal = 0.0, double dlnow = 0.0 );
-
-    int reportProgress() const;
-
-
-    // download rate of the last period (cca 1 sec)
-    double                                        drate_period;
-    // bytes downloaded at the start of the last period
-    double                                        dload_period;
-    // seconds from the start of the download
-    long                                          secs;
-    // average download rate
-    double                                        drate_avg;
-    // last time the progress was reported
-    time_t                                        ltime;
-    // bytes downloaded at the moment the progress was last reported
-    double                                        dload;
-    // bytes uploaded at the moment the progress was last reported
-    double                                        uload;
   };
 
 
 
-  ProgressData::ProgressData(CURL *_curl, time_t _timeout, const Url &_url, ByteCount expectedFileSize_r, zypp::callback::SendReport< zypp::media::DownloadProgressReport> *_report)
-    : curl( _curl )
-    , url( _url )
-    , timeout( _timeout )
-    , reached( false )
-    , fileSizeExceeded ( false )
-    , report( _report )
+  ProgressData::ProgressData(CURL *curl, time_t timeout, const Url &url, ByteCount expectedFileSize_r, zypp::callback::SendReport< zypp::media::DownloadProgressReport> *_report)
+    : _curl( curl )
+    , _url( url )
+    , _timeout( timeout )
+    , _timeoutReached( false )
+    , _fileSizeExceeded ( false )
     , _expectedFileSize( expectedFileSize_r )
+    , report( _report )
   {}
 
   void ProgressData::updateStats(double dltotal, double dlnow)
@@ -122,11 +213,11 @@ namespace internal {
       _timeStart = _timeLast = _timeRcv = now;
 
     // timeout condition
-    if ( timeout )
-      reached = ( (now - _timeRcv) > timeout );
+    if ( _timeout )
+      _timeoutReached = ( (now - _timeRcv) > _timeout );
 
     // check if the downloaded data is already bigger than what we expected
-    fileSizeExceeded = _expectedFileSize > 0 && _expectedFileSize < static_cast<ByteCount::SizeType>(_dnlNow);
+    _fileSizeExceeded = _expectedFileSize > 0 && _expectedFileSize < static_cast<ByteCount::SizeType>(_dnlNow);
 
     // percentage:
     if ( _dnlTotal )
@@ -148,11 +239,11 @@ namespace internal {
 
   int ProgressData::reportProgress() const
   {
-    if ( fileSizeExceeded )
+    if ( _fileSizeExceeded )
       return 1;
-    if ( reached )
+    if ( _timeoutReached )
       return 1;        // no-data timeout
-    if ( report && !(*report)->progress( _dnlPercent, url, _drateTotal, _drateLast ) )
+    if ( report && !(*report)->progress( _dnlPercent, _url, _drateTotal, _drateLast ) )
       return 1;        // user requested abort
     return 0;
   }
@@ -163,11 +254,11 @@ namespace internal {
     // agent string.
     // The target could be not initialized, and then this information
     // is guessed.
-    static const std::string _value(
-      str::trim( str::form(
-        "X-ZYpp-AnonymousId: %s",
-        Target::anonymousUniqueId( Pathname()/*guess root*/ ).c_str() ) )
-      );
+    // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space
+    static const std::string _value( str::trim( str::form(
+      "X-ZYpp-AnonymousId: %s",
+      Target::anonymousUniqueId( Pathname()/*guess root*/ ).c_str()
+    )));
     return _value.c_str();
   }
 
@@ -177,11 +268,11 @@ namespace internal {
     // agent string.
     // The target could be not initialized, and then this information
     // is guessed.
-    static const std::string _value(
-      str::trim( str::form(
-        "X-ZYpp-DistributionFlavor: %s",
-        Target::distributionFlavor( Pathname()/*guess root*/ ).c_str() ) )
-      );
+    // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space
+    static const std::string _value( str::trim( str::form(
+      "X-ZYpp-DistributionFlavor: %s",
+      Target::distributionFlavor( Pathname()/*guess root*/ ).c_str()
+    )));
     return _value.c_str();
   }
 
@@ -191,15 +282,29 @@ namespace internal {
     // agent string.
     // The target could be not initialized, and then this information
     // is guessed.
-    static const std::string _value(
-      str::form(
-        "ZYpp " LIBZYPP_VERSION_STRING " (curl %s) %s"
-        , curl_version_info(CURLVERSION_NOW)->version
-        , Target::targetDistribution( Pathname()/*guess root*/ ).c_str()
-        )
-      );
+    // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space
+    static const std::string _value( str::trim( str::form(
+      "ZYpp " LIBZYPP_VERSION_STRING " (curl %s) %s"
+      , curl_version_info(CURLVERSION_NOW)->version
+      , Target::targetDistribution( Pathname()/*guess root*/ ).c_str()
+    )));
     return _value.c_str();
   }
+
+  /// Attempt to work around certain issues by autoretry in MediaCurl::getFileCopy
+  /// E.g. curl error: 92: HTTP/2 PROTOCOL_ERROR as in bsc#1205843, zypper/issues/457,...
+  /// ma: These errors were caused by a space terminated user agent string (bsc#1212187)
+  class MediaCurlExceptionMayRetryInternaly : public media::MediaCurlException
+  {
+  public:
+    MediaCurlExceptionMayRetryInternaly( const Url & url_r,
+                                         const std::string & err_r,
+                                         const std::string & msg_r )
+    : media::MediaCurlException( url_r, err_r, msg_r )
+    {}
+    //~MediaCurlExceptionMayRetryInternaly() noexcept {}
+  };
+
 }
 
 
@@ -235,7 +340,6 @@ MediaCurl::MediaCurl( const Url &      url_r,
       _customHeaders(0L)
 {
   _curlError[0] = '\0';
-  _curlDebug = 0L;
 
   MIL << "MediaCurl::MediaCurl(" << url_r << ", " << attach_point_hint_r << ")" << endl;
 
@@ -301,15 +405,7 @@ void MediaCurl::checkProtocol(const Url &url) const
 
 void MediaCurl::setupEasy()
 {
-  {
-    _curlDebug = env::ZYPP_MEDIA_CURL_DEBUG();
-    if( _curlDebug > 0)
-    {
-      curl_easy_setopt( _curl, CURLOPT_VERBOSE, 1L);
-      curl_easy_setopt( _curl, CURLOPT_DEBUGFUNCTION, log_curl);
-      curl_easy_setopt( _curl, CURLOPT_DEBUGDATA, &_curlDebug);
-    }
-  }
+  ::internal::setupZYPP_MEDIA_CURL_DEBUG( _curl );
 
   curl_easy_setopt(_curl, CURLOPT_HEADERFUNCTION, log_redirects_curl);
   curl_easy_setopt(_curl, CURLOPT_HEADERDATA, &_lastRedirect);
@@ -333,9 +429,6 @@ void MediaCurl::setupEasy()
   }
   vol_settings.addHeader("Pragma:");
 
-  _settings.setTimeout(ZConfig::instance().download_transfer_timeout());
-  _settings.setConnectTimeout(CONNECT_TIMEOUT);
-
   _settings.setUserAgentString(agentString());
 
   // fill some settings from url query parameters
@@ -542,18 +635,15 @@ void MediaCurl::setupEasy()
 
 #if CURLVERSION_AT_LEAST(7,18,0)
   // bnc #306272
-    SET_OPTION(CURLOPT_PROXY_TRANSFER_MODE, 1L );
+  SET_OPTION(CURLOPT_PROXY_TRANSFER_MODE, 1L );
 #endif
-  // append settings custom headers to curl
-  for ( const auto &header : vol_settings.headers() )
-  {
-    // MIL << "HEADER " << *it << std::endl;
-
-      _customHeaders = curl_slist_append(_customHeaders, header.c_str());
-      if ( !_customHeaders )
-          ZYPP_THROW(MediaCurlInitException(_url));
+  // Append settings custom headers to curl.
+  // TransferSettings assert strings are trimmed (HTTP/2 RFC 9113)
+  for ( const auto &header : vol_settings.headers() ) {
+    _customHeaders = curl_slist_append(_customHeaders, header.c_str());
+    if ( !_customHeaders )
+      ZYPP_THROW(MediaCurlInitException(_url));
   }
-
   SET_OPTION(CURLOPT_HTTPHEADER, _customHeaders);
 }
 
@@ -626,20 +716,6 @@ void MediaCurl::releaseFrom( const std::string & ejectDev )
   disconnect();
 }
 
-Url MediaCurl::getFileUrl( const Pathname & filename_r ) const
-{
-  // Simply extend the URLs pathname. An 'absolute' URL path
-  // is achieved by encoding the leading '/' in an URL path:
-  //   URL: ftp://user@server          -> ~user
-  //   URL: ftp://user@server/         -> ~user
-  //   URL: ftp://user@server//                -> ~user
-  //   URL: ftp://user@server/%2F      -> /
-  //                         ^- this '/' is just a separator
-  Url newurl( _url );
-  newurl.setPathName( ( Pathname("./"+_url.getPathName()) / filename_r ).asString().substr(1) );
-  return newurl;
-}
-
 ///////////////////////////////////////////////////////////////////
 
 void MediaCurl::getFile( const OnMediaLocation &file ) const
@@ -656,33 +732,47 @@ void MediaCurl::getFileCopy( const OnMediaLocation & srcFile , const Pathname &
 
   const auto &filename = srcFile.filename();
 
+  // Optional files will send no report until data are actually received (we know it exists).
+  OptionalDownloadProgressReport reportfilter( srcFile.optional() );
   callback::SendReport<DownloadProgressReport> report;
 
   Url fileurl(getFileUrl(filename));
 
-  bool retry = false;
+  bool firstAuth = true;  // bsc#1210870: authenticate must not return stored credentials more than once.
+  unsigned internalTry = 0;
+  static constexpr unsigned maxInternalTry = 3;
 
   do
   {
     try
     {
       doGetFileCopy( srcFile, target, report );
-      retry = false;
+      break;  // success!
     }
     // retry with proper authentication data
     catch (MediaUnauthorizedException & ex_r)
     {
-      if(authenticate(ex_r.hint(), !retry))
-        retry = true;
-      else
-      {
-        report->finish(fileurl, zypp::media::DownloadProgressReport::ACCESS_DENIED, ex_r.asUserHistory());
-        ZYPP_RETHROW(ex_r);
+      if ( authenticate(ex_r.hint(), firstAuth) ) {
+        firstAuth = false;  // must not return stored credentials again
+        continue; // retry
       }
+
+      report->finish(fileurl, zypp::media::DownloadProgressReport::ACCESS_DENIED, ex_r.asUserHistory());
+      ZYPP_RETHROW(ex_r);
     }
     // unexpected exception
     catch (MediaException & excpt_r)
     {
+      if ( typeid(excpt_r) == typeid( MediaCurlExceptionMayRetryInternaly ) ) {
+        ++internalTry;
+        if ( internalTry < maxInternalTry ) {
+          // just report (NO_ERROR); no interactive request to the user
+          report->problem(fileurl, media::DownloadProgressReport::NO_ERROR, excpt_r.asUserHistory()+_("Will try again..."));
+          continue; // retry
+        }
+        excpt_r.addHistory( str::Format(_("Giving up after %1% attempts.")) % maxInternalTry );
+      }
+
       media::DownloadProgressReport::Error reason = media::DownloadProgressReport::ERROR;
       if( typeid(excpt_r) == typeid( media::MediaFileNotFoundException )  ||
           typeid(excpt_r) == typeid( media::MediaNotAFileException ) )
@@ -693,8 +783,7 @@ void MediaCurl::getFileCopy( const OnMediaLocation & srcFile , const Pathname &
       ZYPP_RETHROW(excpt_r);
     }
   }
-  while (retry);
-
+  while ( true );
   report->finish(fileurl, zypp::media::DownloadProgressReport::NO_ERROR, "");
 }
 
@@ -854,7 +943,14 @@ void MediaCurl::evaluateCurlCode(const Pathname &filename,
           err = "User abort";
         }
         break;
-      case CURLE_SSL_PEER_CERTIFICATE:
+
+      // Attempt to work around certain issues by autoretry in MediaCurl::getFileCopy
+      case CURLE_HTTP2:
+      case CURLE_HTTP2_STREAM:
+        err = "Curl error " + str::numstring( code );
+        ZYPP_THROW(MediaCurlExceptionMayRetryInternaly(url, err, _curlError));
+        break;
+
       default:
         err = "Curl error " + str::numstring( code );
         break;
@@ -907,94 +1003,58 @@ bool MediaCurl::doGetDoesFileExist( const Pathname & filename ) const
     ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
   }
 
-  // instead of returning no data with NOBODY, we return
+  // If no head requests allowed (?head_requests=no):
+  // Instead of returning no data with NOBODY, we return
   // little data, that works with broken servers, and
   // works for ftp as well, because retrieving only headers
   // ftp will return always OK code ?
   // See http://curl.haxx.se/docs/knownbugs.html #58
-  if (  (_url.getScheme() == "http" ||  _url.getScheme() == "https") &&
-        _settings.headRequestsAllowed() )
-    ret = curl_easy_setopt( _curl, CURLOPT_NOBODY, 1L );
-  else
-    ret = curl_easy_setopt( _curl, CURLOPT_RANGE, "0-1" );
+  /// RAII Handler for temp. setting a head/range request
+  struct TempSetHeadRequest
+  {
+    TempSetHeadRequest( CURL * curl_r, bool doHttpHeadRequest_r )
+    : _curl { curl_r }
+    , _doHttpHeadRequest { doHttpHeadRequest_r }
+    {
+      if ( _doHttpHeadRequest ) {
+        curl_easy_setopt( _curl, CURLOPT_NOBODY, 1L );
+      } else {
+        curl_easy_setopt( _curl, CURLOPT_RANGE, "0-1" );
+      }
+    }
+    ~TempSetHeadRequest() {
+      if ( _doHttpHeadRequest ) {
+        curl_easy_setopt( _curl, CURLOPT_NOBODY, 0L);
+        /* yes, this is why we never got to get NOBODY working before,
+         because setting it changes this option too, and we also*
+         need to reset it
+         See: http://curl.haxx.se/mail/archive-2005-07/0073.html
+         */
+        curl_easy_setopt( _curl, CURLOPT_HTTPGET, 1L );
+      } else {
+        curl_easy_setopt( _curl, CURLOPT_RANGE, NULL );
+      }
+    }
+  private:
+    CURL * _curl;
+    bool   _doHttpHeadRequest;
+  } _guard( _curl, (_url.getScheme() == "http" || _url.getScheme() == "https") && _settings.headRequestsAllowed() );
 
-  if ( ret != 0 ) {
-    curl_easy_setopt( _curl, CURLOPT_NOBODY, 0L);
-    curl_easy_setopt( _curl, CURLOPT_RANGE, NULL );
-    /* yes, this is why we never got to get NOBODY working before,
-       because setting it changes this option too, and we also
-       need to reset it
-       See: http://curl.haxx.se/mail/archive-2005-07/0073.html
-    */
-    curl_easy_setopt( _curl, CURLOPT_HTTPGET, 1L );
-    ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
-  }
 
   AutoFILE file { ::fopen( "/dev/null", "w" ) };
   if ( !file ) {
       ERR << "fopen failed for /dev/null" << endl;
-      curl_easy_setopt( _curl, CURLOPT_NOBODY, 0L);
-      curl_easy_setopt( _curl, CURLOPT_RANGE, NULL );
-      /* yes, this is why we never got to get NOBODY working before,
-       because setting it changes this option too, and we also
-       need to reset it
-       See: http://curl.haxx.se/mail/archive-2005-07/0073.html
-      */
-      curl_easy_setopt( _curl, CURLOPT_HTTPGET, 1L );
-      if ( ret != 0 ) {
-          ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
-      }
       ZYPP_THROW(MediaWriteException("/dev/null"));
   }
 
   ret = curl_easy_setopt( _curl, CURLOPT_WRITEDATA, (*file) );
   if ( ret != 0 ) {
-      std::string err( _curlError);
-      curl_easy_setopt( _curl, CURLOPT_RANGE, NULL );
-      curl_easy_setopt( _curl, CURLOPT_NOBODY, 0L);
-      /* yes, this is why we never got to get NOBODY working before,
-       because setting it changes this option too, and we also
-       need to reset it
-       See: http://curl.haxx.se/mail/archive-2005-07/0073.html
-      */
-      curl_easy_setopt( _curl, CURLOPT_HTTPGET, 1L );
-      if ( ret != 0 ) {
-          ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
-      }
-      ZYPP_THROW(MediaCurlSetOptException(url, err));
+    ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
   }
 
   CURLcode ok = curl_easy_perform( _curl );
   MIL << "perform code: " << ok << " [ " << curl_easy_strerror(ok) << " ]" << endl;
 
-  // reset curl settings
-  if (  _url.getScheme() == "http" ||  _url.getScheme() == "https" )
-  {
-    curl_easy_setopt( _curl, CURLOPT_NOBODY, 0L);
-    if ( ret != 0 ) {
-      ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
-    }
-
-    /* yes, this is why we never got to get NOBODY working before,
-       because setting it changes this option too, and we also
-       need to reset it
-       See: http://curl.haxx.se/mail/archive-2005-07/0073.html
-    */
-    curl_easy_setopt( _curl, CURLOPT_HTTPGET, 1L);
-    if ( ret != 0 ) {
-      ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
-    }
-
-  }
-  else
-  {
-    // for FTP we set different options
-    curl_easy_setopt( _curl, CURLOPT_RANGE, NULL);
-    if ( ret != 0 ) {
-      ZYPP_THROW(MediaCurlSetOptException(url, _curlError));
-    }
-  }
-
   // as we are not having user interaction, the user can't cancel
   // the file existence checking, a callback or timeout return code
   // will be always a timeout.
@@ -1015,49 +1075,6 @@ bool MediaCurl::doGetDoesFileExist( const Pathname & filename ) const
 
 ///////////////////////////////////////////////////////////////////
 
-
-#if DETECT_DIR_INDEX
-bool MediaCurl::detectDirIndex() const
-{
-  if(_url.getScheme() != "http" && _url.getScheme() != "https")
-    return false;
-  //
-  // try to check the effective url and set the not_a_file flag
-  // if the url path ends with a "/", what usually means, that
-  // we've received a directory index (index.html content).
-  //
-  // Note: This may be dangerous and break file retrieving in
-  //       case of some server redirections ... ?
-  //
-  bool      not_a_file = false;
-  char     *ptr = NULL;
-  CURLcode  ret = curl_easy_getinfo( _curl,
-                                     CURLINFO_EFFECTIVE_URL,
-                                     &ptr);
-  if ( ret == CURLE_OK && ptr != NULL)
-  {
-    try
-    {
-      Url         eurl( ptr);
-      std::string path( eurl.getPathName());
-      if( !path.empty() && path != "/" && *path.rbegin() == '/')
-      {
-        DBG << "Effective url ("
-            << eurl
-            << ") seems to provide the index of a directory"
-            << endl;
-        not_a_file = true;
-      }
-    }
-    catch( ... )
-    {}
-  }
-  return not_a_file;
-}
-#endif
-
-///////////////////////////////////////////////////////////////////
-
 void MediaCurl::doGetFileCopy( const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport<DownloadProgressReport> & report, RequestOptions options ) const
 {
     Pathname dest = target.absolutename();
@@ -1254,23 +1271,16 @@ void MediaCurl::doGetFileCopyFile( const OnMediaLocation & srcFile, const Pathna
       // otherwise it would be a user cancel
       try {
 
-        if ( progressData.fileSizeExceeded )
-          ZYPP_THROW(MediaFileSizeExceededException(url, progressData._expectedFileSize));
+        if ( progressData.fileSizeExceeded() )
+          ZYPP_THROW(MediaFileSizeExceededException(url, progressData.expectedFileSize()));
 
-        evaluateCurlCode( srcFile.filename(), ret, progressData.reached );
+        evaluateCurlCode( srcFile.filename(), ret, progressData.timeoutReached() );
       }
       catch ( const MediaException &e ) {
         // some error, we are not sure about file existence, rethrw
         ZYPP_RETHROW(e);
       }
     }
-
-#if DETECT_DIR_INDEX
-    if (!ret && detectDirIndex())
-      {
-        ZYPP_THROW(MediaNotAFileException(_url, filename));
-      }
-#endif // DETECT_DIR_INDEX
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -1345,7 +1355,7 @@ int MediaCurl::progressCallback( void *clientp, double dltotal, double dlnow, do
   {
     // work around curl bug that gives us old data
     long httpReturnCode = 0;
-    if ( curl_easy_getinfo( pdata->curl, CURLINFO_RESPONSE_CODE, &httpReturnCode ) != CURLE_OK || httpReturnCode == 0 )
+    if ( curl_easy_getinfo( pdata->curl(), CURLINFO_RESPONSE_CODE, &httpReturnCode ) != CURLE_OK || httpReturnCode == 0 )
       return aliveCallback( clientp, dltotal, dlnow, ultotal, ulnow );
 
     pdata->updateStats( dltotal, dlnow );
@@ -1357,7 +1367,7 @@ int MediaCurl::progressCallback( void *clientp, double dltotal, double dlnow, do
 CURL *MediaCurl::progressCallback_getcurl( void *clientp )
 {
   internal::ProgressData *pdata = reinterpret_cast<internal::ProgressData *>(clientp);
-  return pdata ? pdata->curl : 0;
+  return pdata ? pdata->curl() : 0;
 }
 
 ///////////////////////////////////////////////////////////////////
@@ -1385,7 +1395,7 @@ void MediaCurl::resetExpectedFileSize(void *clientp, const ByteCount &expectedFi
 {
   internal::ProgressData *data = reinterpret_cast<internal::ProgressData *>(clientp);
   if ( data ) {
-    data->_expectedFileSize = expectedFileSize;
+    data->expectedFileSize( expectedFileSize );
   }
 }
 
index cde3ec9..6b44292 100644 (file)
@@ -110,7 +110,7 @@ class MediaCurl : public MediaNetworkCommonHandler
     };
 
   protected:
-//     /** Callback sending just an alive trigger to the UI, without stats (e.g. during metalink download). */
+    /** Callback sending just an alive trigger to the UI, without stats (e.g. during metalink download). */
     static int aliveCallback( void *clientp, double dltotal, double dlnow, double ultotal, double ulnow );
     /** Callback reporting download progress. */
     static int progressCallback( void *clientp, double dltotal, double dlnow, double ultotal, double ulnow );
@@ -126,11 +126,6 @@ class MediaCurl : public MediaNetworkCommonHandler
      * \throws MediaCurlSetOptException if there is a problem
      **/
     virtual void setupEasy();
-    /**
-     * concatenate the attach url and the filename to a complete
-     * download url
-     **/
-    Url getFileUrl(const Pathname & filename) const;
 
     /**
      * Evaluates a curl return code and throws the right MediaException
@@ -162,8 +157,6 @@ class MediaCurl : public MediaNetworkCommonHandler
     bool detectDirIndex() const;
 
   private:
-    long _curlDebug;
-
     std::string _currentCookieFile;
     static Pathname _cookieFile;
 
index 1618df2..d4a5ee0 100644 (file)
@@ -427,7 +427,7 @@ class MediaHandler {
          * \throws MediaException
          *
          **/
-        virtual bool getDoesFileExist( const Pathname & filename ) const = 0;
+        virtual bool getDoesFileExist( const Pathname & filename ) const =   0;
 
   protected:
 
@@ -717,5 +717,3 @@ class MediaHandler {
 
 
 #endif // ZYPP_MEDIA_MEDIAHANDLERL_H
-
-
index 2b89276..e94c922 100644 (file)
@@ -13,6 +13,7 @@
 #include <zypp/media/MediaCIFS.h>
 #include <zypp/media/MediaCurl.h>
 #include <zypp/media/MediaMultiCurl.h>
+#include <zypp/media/MediaNetwork.h>
 #include <zypp/media/MediaISO.h>
 #include <zypp/media/MediaPlugin.h>
 #include <zypp/media/UrlResolverPlugin.h>
@@ -57,12 +58,12 @@ namespace zypp::media {
       _handler = std::make_unique<MediaCIFS> (url,preferred_attach_point);
     else if (scheme == "ftp" || scheme == "tftp" || scheme == "http" || scheme == "https")
     {
-      enum WhichHandler { choose, curl, multicurl };
+      enum WhichHandler { choose, curl, multicurl, network };
       WhichHandler which = choose;
       // Leagcy: choose handler in UUrl query
       if ( const std::string & queryparam = url.getQueryParam("mediahandler"); ! queryparam.empty() ) {
         if ( queryparam == "network" )
-          which = multicurl;
+          which = network;
         else if ( queryparam == "multicurl" )
           which = multicurl;
         else if ( queryparam == "curl" )
@@ -78,8 +79,8 @@ namespace zypp::media {
         };
 
         if ( getenvIs( "ZYPP_MEDIANETWORK", "1" ) ) {
-          WAR << "network backend preview was removed, defaulting to multicurl." << std::endl;
-          which = multicurl;
+          WAR << "MediaNetwork backend enabled" << std::endl;
+          which = network;
         }
         else if ( getenvIs( "ZYPP_MULTICURL", "0" ) ) {
           WAR << "multicurl manually disabled." << std::endl;
@@ -96,6 +97,10 @@ namespace zypp::media {
           handler = std::make_unique<MediaMultiCurl>( url, preferred_attach_point );
           break;
 
+        case network:
+          handler = std::make_unique<MediaNetwork>( url, preferred_attach_point );
+          break;
+
         case curl:
           handler = std::make_unique<MediaCurl>( url, preferred_attach_point );
           break;
index f598644..3fced28 100644 (file)
@@ -121,6 +121,9 @@ public:
   void run(std::vector<Url> &urllist);
 
 protected:
+
+  static size_t makeBlksize ( size_t filesize );
+
   friend class multifetchworker;
 
   const MediaMultiCurl *_context;
@@ -139,6 +142,7 @@ protected:
   bool _havenewjob;
 
   size_t _blkno;
+  size_t _defaultBlksize = 0; //< The blocksize to use if the metalink file does not specify one
   off_t _blkoff;
   size_t _activeworkers;
   size_t _lookupworkers;
@@ -164,7 +168,6 @@ public:
 };
 
 constexpr auto MIN_REQ_MIRRS = 4;
-constexpr auto BLKSIZE       = 131072;
 constexpr auto MAXURLS       = 10;
 
 //////////////////////////////////////////////////////////////////////
@@ -707,18 +710,19 @@ multifetchworker::nextjob()
   MediaBlockList *blklist = _request->_blklist;
   if (!blklist)
     {
-      _blksize = BLKSIZE;
+      _blksize = _request->_defaultBlksize;
       if (_request->_filesize != off_t(-1))
-        {
-          if (_request->_blkoff >= _request->_filesize)
-            {
-              stealjob();
-              return;
-            }
-          _blksize = _request->_filesize - _request->_blkoff;
-          if (_blksize > BLKSIZE)
-            _blksize = BLKSIZE;
-        }
+      {
+        if (_request->_blkoff >= _request->_filesize)
+          {
+            stealjob();
+            return;
+          }
+        _blksize = _request->_filesize - _request->_blkoff;
+        if (_blksize > _request->_defaultBlksize)
+          _blksize = _request->_defaultBlksize;
+      }
+      DBG << "No BLOCKLIST falling back to chunk size: " <<  _request->_defaultBlksize << std::endl;
     }
   else
     {
@@ -734,8 +738,10 @@ multifetchworker::nextjob()
           _request->_blkoff = blk.off;
         }
       _blksize = blk.off + blk.size - _request->_blkoff;
-      if (_blksize > BLKSIZE && !blklist->haveChecksum(_request->_blkno))
-        _blksize = BLKSIZE;
+      if (_blksize > _request->_defaultBlksize && !blklist->haveChecksum(_request->_blkno)) {
+        DBG << "Block: "<< _request->_blkno << " has no checksum falling back to default blocksize: " <<  _request->_defaultBlksize << std::endl;
+        _blksize = _request->_defaultBlksize;
+      }
     }
   _blkno = _request->_blkno;
   _blkstart = _request->_blkoff;
@@ -791,6 +797,7 @@ multifetchrequest::multifetchrequest(const MediaMultiCurl *context, const Pathna
   _report = report;
   _blklist = blklist;
   _filesize = filesize;
+  _defaultBlksize = makeBlksize( filesize );
   _multi = multi;
   _stealing = false;
   _havenewjob = false;
@@ -1156,6 +1163,15 @@ multifetchrequest::run(std::vector<Url> &urllist)
     }
 }
 
+inline size_t multifetchrequest::makeBlksize ( size_t filesize )
+{
+  // this case should never happen because we never start a multi download if we do not know the filesize beforehand
+  if ( filesize == 0 )  return 2 * 1024 * 1024;
+  else if ( filesize < 2*256*1024 ) return filesize;
+  else if ( filesize < 8*1024*1024 ) return 256*1024;
+  else if ( filesize < 256*1024*1024 ) return 1024*1024;
+  return 4*1024*1024;
+}
 
 //////////////////////////////////////////////////////////////////////
 
@@ -1486,6 +1502,9 @@ void MediaMultiCurl::doGetFileCopy( const OnMediaLocation &srcFile , const Pathn
           file = fopen((*destNew).c_str(), "w+e");
           if (!file)
             ZYPP_THROW(MediaWriteException(destNew));
+
+          // use the default progressCallback
+          curl_easy_setopt(_curl, CURLOPT_PROGRESSFUNCTION, &MediaCurl::progressCallback);
           MediaCurl::doGetFileCopyFile(srcFile, dest, file, report, options | OPTION_NO_REPORT_START);
         }
     }
@@ -1610,4 +1629,3 @@ void MediaMultiCurl::toEasyPool(const std::string &host, CURL *easy) const
 
   } // namespace media
 } // namespace zypp
-
diff --git a/zypp/media/MediaNetwork.cc b/zypp/media/MediaNetwork.cc
new file mode 100644 (file)
index 0000000..65fa134
--- /dev/null
@@ -0,0 +1,624 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/media/MediaCurl.cc
+ *
+*/
+
+#include <iostream>
+#include <list>
+#include <chrono>
+
+#include <zypp/base/Logger.h>
+#include <zypp/base/String.h>
+#include <zypp/base/Gettext.h>
+
+#include <zypp-core/base/Regex.h>
+#include <zypp-core/fs/TmpPath.h>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/private/threaddata_p.h>
+
+#include <zypp-curl/ng/network/Downloader>
+#include <zypp-curl/ng/network/NetworkRequestDispatcher>
+#include <zypp-curl/ng/network/DownloadSpec>
+
+#include <zypp-media/MediaConfig>
+#include <zypp/media/MediaNetwork.h>
+#include <zypp-media/auth/CredentialManager>
+
+#include <zypp/Target.h>
+#include <zypp/ZConfig.h>
+
+
+using std::endl;
+
+namespace internal {
+
+
+    constexpr std::string_view MEDIACACHE_REGEX("^\\/media\\.[1-9][0-9]*\\/media$");
+
+    struct ProgressTracker {
+
+      using clock = std::chrono::steady_clock;
+
+      std::optional<clock::time_point> _timeStart; ///< Start total stats
+      std::optional<clock::time_point> _timeLast;       ///< Start last period(~1sec)
+
+      double _dnlTotal = 0.0;  ///< Bytes to download or 0 if unknown
+      double _dnlLast  = 0.0;    ///< Bytes downloaded at period start
+      double _dnlNow   = 0.0;    ///< Bytes downloaded now
+
+      int    _dnlPercent= 0;   ///< Percent completed or 0 if _dnlTotal is unknown
+
+      double _drateTotal= 0.0; ///< Download rate so far
+      double _drateLast        = 0.0;  ///< Download rate in last period
+
+      void updateStats( double dltotal = 0.0, double dlnow = 0.0 )
+      {
+        clock::time_point now = clock::now();
+
+        if ( !_timeStart )
+          _timeStart = _timeLast = now;
+
+        // If called without args (0.0), recompute based on the last values seen
+        if ( dltotal && dltotal != _dnlTotal )
+          _dnlTotal = dltotal;
+
+        if ( dlnow && dlnow != _dnlNow ) {
+          _dnlNow = dlnow;
+        }
+
+        // percentage:
+        if ( _dnlTotal )
+          _dnlPercent = int(_dnlNow * 100 / _dnlTotal);
+
+        // download rates:
+        _drateTotal = _dnlNow / std::max( std::chrono::duration_cast<std::chrono::seconds>(now - *_timeStart).count(), int64_t(1) );
+
+        if ( _timeLast < now )
+        {
+          _drateLast = (_dnlNow - _dnlLast) / int( std::chrono::duration_cast<std::chrono::seconds>(now - *_timeLast).count() );
+          // start new period
+          _timeLast  = now;
+          _dnlLast   = _dnlNow;
+        }
+        else if ( _timeStart == _timeLast )
+          _drateLast = _drateTotal;
+      }
+    };
+
+
+  // All media handler instances share the same EventDispatcher and Downloader
+  // This is released at application shutdown.
+  struct SharedData {
+
+    ~SharedData() {
+      MIL << "Releasing internal::SharedData for MediaNetwork." << std::endl;
+    }
+
+    static std::shared_ptr<SharedData> instance ()  {
+      static std::shared_ptr<SharedData> data = std::shared_ptr<SharedData>( new SharedData() );
+      return data;
+    }
+
+    static const zypp::str::regex &mediaRegex () {
+      static zypp::str::regex reg( MEDIACACHE_REGEX.data() );
+      return reg;
+    }
+
+    // we need to keep a reference
+    zyppng::EventDispatcherRef _dispatcher;
+    zyppng::DownloaderRef _downloader;
+
+    struct MediaFileCacheEntry {
+
+      MediaFileCacheEntry( zypp::ManagedFile &&file ) : _file( std::move(file) ) { }
+
+      std::chrono::steady_clock::time_point _creationTime = std::chrono::steady_clock::now();
+      zypp::ManagedFile _file;
+    };
+
+    auto findInCache( const std::string &mediaCacheKey ) {
+      auto i = _mediaCacheEntries.find( mediaCacheKey );
+      if ( i != _mediaCacheEntries.end() ) {
+        auto age = std::chrono::steady_clock::now() - i->second._creationTime;
+        if ( age > std::chrono::minutes( 30 ) ) {
+          MIL << "Found cached media file, but it's older than 30 mins, requesting a new one" << std::endl;
+          _mediaCacheEntries.erase(i);
+        } else {
+          return i;
+        }
+      }
+      return _mediaCacheEntries.end();
+    }
+
+    zypp::filesystem::TmpDir _mediaCacheDir{zypp::filesystem::TmpDir::defaultLocation(), "ZyppMediaCache."};
+    std::unordered_map<std::string, MediaFileCacheEntry> _mediaCacheEntries;
+
+    private:
+      SharedData() {
+        MIL << "Initializing internal::SharedData for MediaNetwork" << std::endl;
+        _dispatcher = zyppng::ThreadData::current().ensureDispatcher();
+        _downloader = std::make_shared<zyppng::Downloader>();
+        _downloader->requestDispatcher()->setMaximumConcurrentConnections( zypp::MediaConfig::instance().download_max_concurrent_connections() );
+      }
+  };
+
+}
+
+using namespace internal;
+using namespace zypp::base;
+
+namespace zypp {
+
+  namespace media {
+
+  MediaNetwork::MediaNetwork( const Url &      url_r,
+                              const Pathname & attach_point_hint_r )
+      : MediaNetworkCommonHandler( url_r, attach_point_hint_r,
+                                  "/",   // urlpath at attachpoint
+                                  true ) // does_download
+  {
+    MIL << "MediaNetwork::MediaNetwork(" << url_r << ", " << attach_point_hint_r << ")" << endl;
+
+    // make sure there is a event loop and downloader instance
+    _shared = internal::SharedData::instance();
+
+    if( !attachPoint().empty())
+    {
+      PathInfo ainfo(attachPoint());
+      Pathname apath(attachPoint() + "XXXXXX");
+      char    *atemp = ::strdup( apath.asString().c_str());
+      char    *atest = NULL;
+      if( !ainfo.isDir() || !ainfo.userMayRWX() ||
+          atemp == NULL || (atest=::mkdtemp(atemp)) == NULL)
+      {
+        WAR << "attach point " << ainfo.path()
+            << " is not useable for " << url_r.getScheme() << endl;
+        setAttachPoint("", true);
+      }
+      else if( atest != NULL)
+        ::rmdir(atest);
+
+      if( atemp != NULL)
+        ::free(atemp);
+    }
+  }
+
+  void MediaNetwork::attachTo (bool next)
+  {
+    if ( next )
+      ZYPP_THROW(MediaNotSupportedException(_url));
+
+    if ( !_url.isValid() )
+      ZYPP_THROW(MediaBadUrlException(_url));
+
+    // use networkdispatcher check if the scheme is supported
+    if ( !_shared->_downloader->requestDispatcher()->supportsProtocol( _url ) ) {
+      std::string msg("Unsupported protocol '");
+      msg += _url.getScheme();
+      msg += "'";
+      ZYPP_THROW(MediaBadUrlException(_url, msg));
+    }
+
+    if( !isUseableAttachPoint( attachPoint() ) )
+    {
+      setAttachPoint( createAttachPoint(), true );
+    }
+
+    disconnectFrom();
+
+    MediaSourceRef media( new MediaSource(_url.getScheme(), _url.asString()));
+    setMediaSource(media);
+  }
+
+  bool
+  MediaNetwork::checkAttachPoint(const Pathname &apoint) const
+  {
+    return MediaHandler::checkAttachPoint( apoint, true, true);
+  }
+
+  void MediaNetwork::disconnectFrom()
+  {
+  }
+
+  void MediaNetwork::releaseFrom( const std::string & ejectDev )
+  {
+    disconnect();
+  }
+
+  void MediaNetwork::runRequest ( const zyppng::DownloadSpec &spec, callback::SendReport<DownloadProgressReport> *report ) const
+  {
+    bool retry = true;
+    unsigned internalTry = 0;
+    static constexpr unsigned maxInternalTry = 3;
+
+    while ( retry ) {
+      retry = false;
+      auto ev = zyppng::EventLoop::create();
+      std::vector<zyppng::connection> signalConnections;
+      OnScopeExit deferred([&](){
+        while( signalConnections.size() ) {
+          signalConnections.back().disconnect();
+          signalConnections.pop_back();
+        }
+      });
+
+      zyppng::DownloadRef dl = _shared->_downloader->downloadFile( spec );
+      std::optional<internal::ProgressTracker> progTracker;
+
+      const auto &startedSlot = [&]( zyppng::Download &req ){
+        if ( !report) return;
+        (*report)->start( spec.url(), spec.targetPath());
+      };
+
+      const auto &aliveSlot = [&]( zyppng::Download &req, off_t dlNow ){
+        if ( !report || !progTracker )
+          return;
+        progTracker->updateStats( 0.0, dlNow );
+        if ( !(*report)->progress( progTracker->_dnlPercent, spec.url(), progTracker-> _drateTotal, progTracker->_drateLast ) )
+          req.cancel();
+      };
+
+      const auto &progressSlot = [&]( zyppng::Download &req, off_t dlTotal, off_t dlNow ) {
+        if ( !report || !progTracker )
+          return;
+
+        progTracker->updateStats( dlTotal, dlNow );
+        if ( !(*report)->progress( progTracker->_dnlPercent, spec.url(), progTracker-> _drateTotal, progTracker->_drateLast ) )
+          req.cancel();
+      };
+
+      const auto &finishedSlot = [&]( zyppng::Download & ){
+        ev->quit();
+      };
+
+      bool firstTry = true;
+      const auto &authRequiredSlot = [&]( zyppng::Download &req, zyppng::NetworkAuthData &auth, const std::string &availAuth ){
+
+        //! \todo need a way to pass different CredManagerOptions here
+        CredentialManager cm(CredManagerOptions(ZConfig::instance().repoManagerRoot()));
+        CurlAuthData_Ptr credentials;
+
+        // get stored credentials
+        AuthData_Ptr cmcred = cm.getCred(_url);
+        if ( cmcred && auth.lastDatabaseUpdate() < cmcred->lastDatabaseUpdate() ) {
+          credentials.reset(new CurlAuthData(*cmcred));
+          DBG << "got stored credentials:" << endl << *credentials << endl;
+
+        } else {
+          // if not found, ask user
+          CurlAuthData_Ptr curlcred;
+          curlcred.reset(new CurlAuthData());
+          callback::SendReport<AuthenticationReport> auth_report;
+
+          // preset the username if present in current url
+          if (!_url.getUsername().empty() && firstTry)
+            curlcred->setUsername(_url.getUsername());
+          // if CM has found some credentials, preset the username from there
+          else if (cmcred)
+            curlcred->setUsername(cmcred->username());
+
+          // indicate we have no good credentials from CM
+          cmcred.reset();
+
+          std::string prompt_msg = str::Format(_("Authentication required for '%s'")) % _url.asString();
+
+          // set available authentication types from the signal
+          // might be needed in prompt
+          curlcred->setAuthType( availAuth );
+
+          // ask user
+          if (auth_report->prompt(_url, prompt_msg, *curlcred))
+          {
+            DBG << "callback answer: retry" << endl
+                << "CurlAuthData: " << *curlcred << endl;
+
+            if (curlcred->valid())
+            {
+              credentials = curlcred;
+                // if (credentials->username() != _url.getUsername())
+                //   _url.setUsername(credentials->username());
+                /**
+                 *  \todo find a way to save the url with changed username
+                 *  back to repoinfo or dont store urls with username
+                 *  (and either forbid more repos with the same url and different
+                 *  user, or return a set of credentials from CM and try them one
+                 *  by one)
+                 */
+            }
+          }
+          else
+          {
+            DBG << "callback answer: cancel" << endl;
+          }
+        }
+
+        if ( !credentials  ) {
+          auth = zyppng::NetworkAuthData();
+          return;
+        }
+
+        auth = *credentials;
+        if (!cmcred) {
+          credentials->setUrl(_url);
+          cm.addCred(*credentials);
+          cm.save();
+        }
+      };
+
+      signalConnections.insert( signalConnections.end(), {
+        dl->connectFunc( &zyppng::Download::sigStarted, startedSlot),
+        dl->connectFunc( &zyppng::Download::sigFinished, finishedSlot ),
+        dl->connectFunc( &zyppng::Download::sigAuthRequired, authRequiredSlot )
+      });
+
+      if ( report ) {
+        progTracker = internal::ProgressTracker();
+        signalConnections.insert( signalConnections.end(), {
+          dl->connectFunc( &zyppng::Download::sigAlive, aliveSlot ),
+          dl->connectFunc( &zyppng::Download::sigProgress, progressSlot ),
+        });
+      }
+
+      dl->start();
+      ev->run();
+
+      std::for_each( signalConnections.begin(), signalConnections.end(), []( auto &conn ) { conn.disconnect(); });
+
+      if ( dl->hasError() ) {
+        auto errCode = zypp::media::DownloadProgressReport::ERROR;
+        std::exception_ptr excp;
+        const auto &error = dl->lastRequestError();
+        switch ( error.type() ) {
+          case zyppng::NetworkRequestError::InternalError:
+          case zyppng::NetworkRequestError::InvalidChecksum:
+          case zyppng::NetworkRequestError::UnsupportedProtocol:
+          case zyppng::NetworkRequestError::MalformedURL:
+          case zyppng::NetworkRequestError::PeerCertificateInvalid:
+          case zyppng::NetworkRequestError::ConnectionFailed:
+          case zyppng::NetworkRequestError::ServerReturnedError:
+          case zyppng::NetworkRequestError::MissingData:
+          case zyppng::NetworkRequestError::RangeFail: {
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaCurlException( spec.url(), error.toString(), error.nativeErrorString() ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::Cancelled: {
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaRequestCancelledException( error.toString() ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::ExceededMaxLen: {
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaFileSizeExceededException( spec.url(), spec.expectedFileSize() ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::TemporaryProblem: {
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaTemporaryProblemException( spec.url(), error.toString() ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::Timeout: {
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaTimeoutException( spec.url(), error.toString() ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::Forbidden: {
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaForbiddenException( spec.url(), error.toString() ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::NotFound: {
+            errCode = zypp::media::DownloadProgressReport::NOT_FOUND;
+
+            //@BUG using getPathName() can result in wrong error messages
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaFileNotFoundException( _url, spec.url().getPathName() ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::Unauthorized:
+          case zyppng::NetworkRequestError::AuthFailed: {
+            errCode = zypp::media::DownloadProgressReport::ACCESS_DENIED;
+            excp = ZYPP_EXCPT_PTR( zypp::media::MediaUnauthorizedException( spec.url(), error.toString(), error.nativeErrorString(), "" ) );
+            break;
+          }
+          case zyppng::NetworkRequestError::NoError:
+            // should never happen
+            DBG << "BUG: Download error flag is set , but Error code is NoError" << std::endl;
+            break;
+          case zyppng::NetworkRequestError::Http2Error:
+          case zyppng::NetworkRequestError::Http2StreamError: {
+            ++internalTry;
+            if ( internalTry < maxInternalTry ) {
+              retry = true;
+              // just report (NO_ERROR); no interactive request to the user
+              (*report)->problem( spec.url(), media::DownloadProgressReport::NO_ERROR, error.toString()+" "+_("Will try again..."));
+              continue;
+            } else {
+              excp = ZYPP_EXCPT_PTR( zypp::media::MediaCurlException( spec.url(), error.toString(), error.nativeErrorString() ) );
+            }
+
+            break;
+          }
+        }
+
+        if ( excp && !retry ) {
+          if ( report ) (*report)->finish( spec.url(), errCode, error.toString() );
+          std::rethrow_exception( excp );
+        }
+      }
+    }
+    if ( report ) (*report)->finish( spec.url(), zypp::media::DownloadProgressReport::NO_ERROR, "" );
+  }
+
+  void MediaNetwork::getFile( const OnMediaLocation &file ) const
+  {
+    // Use absolute file name to prevent access of files outside of the
+    // hierarchy below the attach point.
+    getFileCopy( file, localPath(file.filename()).absolutename() );
+  }
+
+  void MediaNetwork::getFileCopy( const OnMediaLocation & file, const Pathname & targetFilename ) const
+  {
+    const auto &filename = file.filename();
+    Url fileurl(getFileUrl(filename));
+
+    const bool requestedMediaFile = _shared->mediaRegex().matches( filename.asString() );
+    auto &mediaFileCache = _shared->_mediaCacheEntries;
+    const auto &mediaCacheKey = fileurl.asCompleteString();
+
+    DBG << "FILEURL IS: " << fileurl << std::endl;
+    DBG << "Downloading to: " << targetFilename << std::endl;
+
+    if( assert_dir( targetFilename.dirname() ) ) {
+      DBG << "assert_dir " << targetFilename.dirname() << " failed" << endl;
+      ZYPP_THROW( MediaSystemException(getFileUrl(file.filename()), "System error on " + targetFilename.dirname().asString()) );
+    }
+
+    if ( requestedMediaFile ) {
+      MIL << "Requested " << filename << " trying media cache first" << std::endl;
+
+      auto i = _shared->findInCache( mediaCacheKey );
+      if ( i != mediaFileCache.end() ) {
+        MIL << "Found cached media file, returning a copy to the file" << std::endl;
+        if ( zypp::filesystem::hardlinkCopy( i->second._file, targetFilename ) == 0 )
+          return;
+
+        mediaFileCache.erase(i);
+        MIL << "Failed to copy the requested file, proceeding with download" << std::endl;
+      }
+
+      MIL << "Nothing in the file cache, requesting the file from the server." << std::endl;
+    }
+
+    zyppng::DownloadSpec spec = zyppng::DownloadSpec( fileurl, targetFilename, file.downloadSize() )
+      .setDeltaFile( file.deltafile() )
+      .setHeaderSize( file.headerSize())
+      .setHeaderChecksum( file.headerChecksum() )
+      .setTransferSettings( this->_settings );
+
+    callback::SendReport<DownloadProgressReport> report;
+
+    try {
+      runRequest( spec, &report );
+    } catch ( const zypp::media::MediaFileNotFoundException &ex ) {
+      if ( requestedMediaFile ) {
+        MIL << "Media file was not found, remembering in the cache" << std::endl;
+        mediaFileCache.insert_or_assign( mediaCacheKey, internal::SharedData::MediaFileCacheEntry( zypp::ManagedFile() ) );
+      }
+      std::rethrow_exception( std::current_exception() );
+    }
+
+    // the request was successful
+    if ( requestedMediaFile ) {
+      const auto &cacheFileName = (_shared->_mediaCacheDir.path() / zypp::CheckSum::md5FromString( mediaCacheKey).asString() ).extend(".cache");
+      zypp::ManagedFile file( cacheFileName, zypp::filesystem::unlink );
+      if ( zypp::filesystem::hardlinkCopy( targetFilename, cacheFileName ) == 0 ) {
+        mediaFileCache.insert_or_assign( mediaCacheKey, internal::SharedData::MediaFileCacheEntry( std::move(file) ) );
+        MIL << "Saved requested media file in media cache for future use" << std::endl;
+      } else {
+        MIL << "Failed to save requested media file in cache, requesting again next time." << std::endl;
+      }
+    }
+  }
+
+  bool MediaNetwork::getDoesFileExist( const Pathname & filename ) const
+  {
+    MIL << "Checking if file " << filename << " does exist" << std::endl;
+    Url fileurl(getFileUrl(filename));
+    const bool requestMediaFile = _shared->mediaRegex().matches( filename.asString() );
+    auto &mediaFileCache = _shared->_mediaCacheEntries;
+    const auto &mediaCacheKey = fileurl.asCompleteString();
+
+    if ( requestMediaFile ) {
+      MIL << "Request for " << filename << " is a media file, trying the cache first" << std::endl;
+      auto i = _shared->findInCache( mediaCacheKey );
+      if ( i != mediaFileCache.end() ) {
+        MIL << "Found a cache entry for requested media file, returning right away" << std::endl;
+        if ( i->second._file->empty() ) {
+          return false;
+        } else {
+          return true;
+        }
+      }
+    }
+
+    bool result = false; //we are pessimists
+    try
+    {
+      const auto &targetFilePath = localPath(filename).absolutename();
+
+      zyppng::DownloadSpec spec = zyppng::DownloadSpec( fileurl, targetFilePath )
+        .setCheckExistsOnly( true )
+        .setTransferSettings( this->_settings );
+
+      runRequest( spec );
+      // if we get to here the request worked.
+      result = true;
+    }
+    catch ( const MediaFileNotFoundException &e ) {
+      // if the file did not exist then we can return false
+      ZYPP_CAUGHT(e);
+      result = false;
+    }
+    // unexpected exception
+    catch (MediaException & excpt_r)
+    {
+      ZYPP_RETHROW(excpt_r);
+    }
+
+    // if the file does not exist remember it right away in our cache
+    if ( !result && requestMediaFile ) {
+      MIL << filename << " does not exist on medium, remembering in the cache" << std::endl;
+      mediaFileCache.insert_or_assign( mediaCacheKey, internal::SharedData::MediaFileCacheEntry( zypp::ManagedFile() ) );
+    }
+
+    return result;
+  }
+
+  void MediaNetwork::getDir( const Pathname & dirname, bool recurse_r ) const
+  {
+    filesystem::DirContent content;
+    getDirInfo( content, dirname, /*dots*/false );
+
+    for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) {
+        Pathname filename = dirname + it->name;
+        int res = 0;
+
+        switch ( it->type ) {
+        case filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all
+        case filesystem::FT_FILE:
+          getFile( OnMediaLocation( filename ) );
+          break;
+        case filesystem::FT_DIR: // newer directory.yast contain at least directory info
+          if ( recurse_r ) {
+            getDir( filename, recurse_r );
+          } else {
+            res = assert_dir( localPath( filename ) );
+            if ( res ) {
+              WAR << "Ignore error (" << res <<  ") on creating local directory '" << localPath( filename ) << "'" << endl;
+            }
+          }
+          break;
+        default:
+          // don't provide devices, sockets, etc.
+          break;
+        }
+    }
+  }
+
+  void MediaNetwork::getDirInfo( std::list<std::string> & retlist,
+                                const Pathname & dirname, bool dots ) const
+  {
+    getDirectoryYast( retlist, dirname, dots );
+  }
+
+  void MediaNetwork::getDirInfo( filesystem::DirContent & retlist,
+                              const Pathname & dirname, bool dots ) const
+  {
+    getDirectoryYast( retlist, dirname, dots );
+  }
+
+  } // namespace media
+} // namespace zypp
+//
diff --git a/zypp/media/MediaNetwork.h b/zypp/media/MediaNetwork.h
new file mode 100644 (file)
index 0000000..6a37c46
--- /dev/null
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/media/MediaNetwork.h
+ *
+*/
+#ifndef ZYPP_MEDIA_MEDIANETWORK_H
+#define ZYPP_MEDIA_MEDIANETWORK_H
+
+#include <zypp/base/Flags.h>
+#include <zypp/ZYppCallbacks.h>
+#include <zypp/media/MediaNetworkCommonHandler.h>
+
+namespace internal {
+  struct SharedData;
+}
+
+namespace zyppng {
+  class DownloadSpec;
+}
+
+namespace zypp {
+  namespace media {
+    //
+    // CLASS NAME : MediaNetwork
+    /**
+     * @short Implementation class for FTP, HTTP and HTTPS MediaHandler
+     * @see MediaHandler
+     **/
+    class MediaNetwork : public MediaNetworkCommonHandler
+    {
+      protected:
+
+        void attachTo (bool next = false) override;
+        void releaseFrom( const std::string & ejectDev ) override;
+        void getFile( const OnMediaLocation & file ) const override;
+        void getFileCopy( const OnMediaLocation & file, const Pathname & targetFilename ) const override;
+        void getDir( const Pathname & dirname, bool recurse_r ) const override;
+        void getDirInfo( std::list<std::string> & retlist,
+                         const Pathname & dirname, bool dots = true ) const override;
+        void getDirInfo( filesystem::DirContent & retlist,
+                         const Pathname & dirname, bool dots = true ) const override;
+        /**
+         *
+         * \throws MediaException
+         *
+         */
+        void disconnectFrom() override;
+
+        /**
+         *
+         * \throws MediaException
+         *
+         */
+        bool getDoesFileExist( const Pathname & filename ) const override;
+
+        bool checkAttachPoint(const Pathname &apoint) const override;
+
+
+      public:
+
+        MediaNetwork( const Url &      url_r,
+                  const Pathname & attach_point_hint_r );
+
+        ~MediaNetwork() override { try { release(); } catch(...) {} }
+
+      private:
+
+        void runRequest ( const zyppng::DownloadSpec &spec, callback::SendReport<DownloadProgressReport> *report = nullptr ) const;
+
+      private:
+        mutable std::shared_ptr<::internal::SharedData> _shared;
+    };
+
+  } // namespace media
+} // namespace zypp
+
+#endif // ZYPP_MEDIA_MEDIANETWORK_H
diff --git a/zypp/media/MediaNetworkCommonHandler.cc b/zypp/media/MediaNetworkCommonHandler.cc
new file mode 100644 (file)
index 0000000..25a3240
--- /dev/null
@@ -0,0 +1,96 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/media/MediaNetworkCommonHandler.cc
+ *
+*/
+
+#include "MediaNetworkCommonHandler.h"
+
+#include <zypp/ZConfig.h>
+#include <zypp-core/fs/PathInfo.h>
+#include <zypp/base/Logger.h>
+#include <zypp-core/base/Regex.h>
+
+#include <fstream>
+
+namespace zypp::media
+{
+  zypp::Url MediaNetworkCommonHandler::findGeoIPRedirect ( const zypp::Url &url )
+  {
+    try {
+      const auto &conf = ZConfig::instance();
+      if ( !conf.geoipEnabled() ) {
+        MIL << "GeoIp rewrites disabled via ZConfig." << std::endl;
+        return Url();
+      }
+
+      if ( !( url.getQueryParam("COUNTRY").empty() && url.getQueryParam("AVOID_COUNTRY").empty() )) {
+        MIL << "GeoIp rewrites disabled since the baseurl " << url << " uses an explicit country setting." << std::endl;
+        return Url();
+      }
+
+      const auto &hostname = url.getHost();
+      auto geoipFile = conf.geoipCachePath() / hostname ;
+      if ( PathInfo( geoipFile ).isFile() ) {
+
+        MIL << "Found GeoIP file for host: " << hostname << std::endl;
+
+        std::ifstream in( geoipFile.asString() );
+        if (!in.is_open()) {
+          MIL << "Failed to open GeoIP for host: " << hostname << std::endl;
+          return Url();
+        }
+
+        try {
+          std::string newHost;
+          in >> newHost;
+
+          Url newUrl = url;
+          newUrl.setHost( newHost );
+
+          MIL << "Found GeoIP rewrite: " << hostname << " -> " << newHost << std::endl;
+
+          return newUrl;
+
+        } catch ( const zypp::Exception &e ) {
+          ZYPP_CAUGHT(e);
+          MIL << "No valid GeoIP rewrite target found for " << url << std::endl;
+        }
+      }
+    } catch ( const zypp::Exception &e ) {
+      ZYPP_CAUGHT(e);
+      MIL << "Failed to query GeoIP data, url rewriting disabled." << std::endl;
+    }
+
+    // no rewrite
+    return Url();
+  }
+
+  Url MediaNetworkCommonHandler::getFileUrl( const Pathname & filename_r ) const
+  {
+    static const zypp::str::regex invalidRewrites("^.*\\/repomd.xml(.asc|.key)?$|^\\/geoip$");
+
+    const bool canRedir = _redirTarget.isValid() && !invalidRewrites.matches(filename_r.asString());
+    const auto &baseUrl = ( canRedir ) ? _redirTarget : _url;
+
+    if ( canRedir )
+      MIL << "Redirecting " << filename_r << " request to geoip location." << std::endl;
+
+    // Simply extend the URLs pathname. An 'absolute' URL path
+    // is achieved by encoding the leading '/' in an URL path:2
+    //   URL: ftp://user@server                -> ~user
+    //   URL: ftp://user@server/               -> ~user
+    //   URL: ftp://user@server//              -> ~user
+    //   URL: ftp://user@server/%2F    -> /
+    //                         ^- this '/' is just a separator
+    Url newurl( baseUrl );
+    newurl.setPathName( ( Pathname("./"+baseUrl.getPathName()) / filename_r ).asString().substr(1) );
+    return newurl;
+  }
+}
index 73e10e8..514e59c 100644 (file)
@@ -35,6 +35,8 @@ namespace zypp
                                  const Pathname & urlpath_below_attachpoint_r,
                                  const bool       does_download_r )
       : MediaHandler( url_r, attach_point_r, urlpath_below_attachpoint_r, does_download_r )
+      , _redirTarget( findGeoIPRedirect(url_r) )
+
       {}
 
     public:
@@ -42,7 +44,23 @@ namespace zypp
       { return _settings; }
 
     protected:
+
+      /**
+       * concatenate the attach url and the filename to a complete
+       * download url
+       **/
+      Url getFileUrl(const Pathname & filename) const;
+
+
+      /**
+       * Rewrites the baseURL to the geoIP target if one is found in the metadata cache,
+       * otherwise simply returns the url again.
+       */
+      static zypp::Url findGeoIPRedirect ( const zypp::Url &url );
+
+    protected:
       mutable TransferSettings _settings;
+      Url _redirTarget;
     };
 
   } // namespace media
index 45df656..7fd94e1 100644 (file)
@@ -532,7 +532,11 @@ namespace zypp
 
   std::string CheckAccessDeleted::ProcInfo::service() const
   {
-    static const str::regex rx( "(0::|[0-9]+:name=systemd:)/system.slice/(.*/)?(.*).service$" );
+    // cgroup entries like:
+    // 1:name=systemd:/system.slice/systemd-udevd.service
+    // 0::/system.slice/systemd-udevd.service
+    // 0::/system.slice/systemd-udevd.service/udev
+    static const str::regex rx( "(0::|[0-9]+:name=systemd:)/system.slice/(.*/)?(.*).service(/.*)?$" );
     str::smatch what;
     std::string ret;
     iostr::simpleParseFile( InputStream( Pathname("/proc")/pid/"cgroup" ),
index a5a00a4..751a9df 100644 (file)
@@ -36,6 +36,9 @@ namespace zypp
 
     void defaultLoadSystem( const Pathname & sysRoot_r, LoadSystemFlags flags_r )
     {
+      if ( not flags_r && geteuid() != 0 ) {
+        flags_r |= LS_NOREFRESH;
+      }
       MIL << str::form( "*** Load system at '%s' (%lx)", sysRoot_r.c_str(), (unsigned long)flags_r ) << endl;
 
       if ( ! PathInfo( sysRoot_r ).isDir() )
@@ -57,7 +60,7 @@ namespace zypp
         MIL << satpool.systemRepo() << endl;
       }
 
-      if ( 1 )
+      if ( not flags_r.testFlag( LS_NOREPOS ) )
       {
         RepoManager repoManager( sysRoot_r );
         RepoInfoList repos = repoManager.knownRepositories();
index 523c02f..faa3b0f 100644 (file)
@@ -33,7 +33,8 @@ namespace zypp
     enum LoadSystemFlag
     {
       LS_READONLY      = (1 << 0),     //!< // Create readonly ZYpp instance.
-      LS_NOREFRESH     = (1 << 1)      //!< // Don't refresh existing repos.
+      LS_NOREFRESH     = (1 << 1),     //!< // Don't refresh existing repos.
+      LS_NOREPOS       = (1 << 2),     //!< // Don't loag existing repos (just Target).
     };
 
     /** \relates LoadSystemFlag Type-safe way of storing OR-combinations. */
index 6182552..8880b04 100644 (file)
@@ -221,6 +221,3 @@ void Downloader::defaultDownloadMasterIndex( MediaSetAccess & media_r, const Pat
 
 }// ns repo
 } // ns zypp
-
-
-
index 23e5928..c9756ec 100644 (file)
@@ -163,6 +163,12 @@ namespace zypp
       SEC << smvData << endl;
       SEC << ref.protocol() << " " <<  Url::schemeIsVolatile( ref.protocol() ) << endl;
 
+      // if we have a downloading URL and can do relaxed verification we do not check the media file again
+      if ( relaxed && Url::schemeIsDownloading( ref.protocol() ) )  {
+        DBG << "Skipping verification due to downloading medium" << std::endl;
+        return ret;
+      }
+
       Pathname mediaFile { _pimpl->mediaFilePath() };
       try {
         ref.provideFile( OnMediaLocation(mediaFile) );
@@ -201,4 +207,3 @@ namespace zypp
 
   } // namespace repo
 } // namespace zypp
-
index 4b495a8..3ff090b 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "Downloader.h"
 #include <zypp/repo/MediaInfoDownloader.h>
+#include <zypp/repo/SUSEMediaVerifier.h>
 #include <zypp-core/base/UserRequestException>
 #include <zypp/parser/xml/Reader.h>
 #include <zypp/parser/yum/RepomdFileReader.h>
@@ -62,6 +63,9 @@ namespace yum
             deltafile = fn;
         }
       }
+      if ( !deltafile.empty() )
+        return dir/deltafile;
+
       return deltafile;
     }
   } // namespace
@@ -200,8 +204,9 @@ namespace yum
 
   RepoStatus Downloader::status( MediaSetAccess & media_r )
   {
-    RepoStatus ret { media_r.provideOptionalFile( repoInfo().path() / "/repodata/repomd.xml" ) };
-    if ( !ret.empty() )        // else: mandatory master index is missing
+    const auto & ri = repoInfo();
+    RepoStatus ret { media_r.provideOptionalFile( ri.path() / "/repodata/repomd.xml" ) };
+    if ( !ret.empty() && ri.requireStatusWithMediaFile() )     // else: mandatory master index is missing
       ret = ret && RepoStatus( media_r.provideOptionalFile( "/media.1/media" ) );
     // else: mandatory master index is missing -> stay empty
     return ret;
@@ -209,6 +214,3 @@ namespace yum
 } // namespace yum
 } // namespace repo
 } // namespace zypp
-
-
-
index 3652c16..3047d8b 100644 (file)
@@ -60,7 +60,14 @@ namespace sat
       static const SolvAttr provides;
       static const SolvAttr obsoletes;
       static const SolvAttr conflicts;
+#if __GNUC__ >= 10
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++20-compat"
+#endif
       static const SolvAttr requires;
+#if __GNUC__ >= 10
+#pragma GCC diagnostic pop
+#endif
       static const SolvAttr recommends;
       static const SolvAttr suggests;
       static const SolvAttr supplements;
index e941314..20f58e1 100644 (file)
@@ -132,6 +132,14 @@ namespace zypp
     /** \relates WhatProvides Stream output */
     std::ostream & operator<<( std::ostream & str, const WhatProvides & obj );
 
+    ///////////////////////////////////////////////////////////////////
+    /// \brief Container of packages providing `ptf()`
+    class AllPTFs : public WhatProvides
+    {
+    public:
+      AllPTFs() : WhatProvides( Capability(Solvable::ptfMasterToken.id()) ) {};
+    };
+
     namespace detail
     {
     ///////////////////////////////////////////////////////////////////
index 4810f17..5b8e5da 100644 (file)
@@ -64,9 +64,7 @@ std::ostream & Resolver::dumpOn( std::ostream & os ) const
   OUTS( _upgradeMode );
   OUTS( _updateMode );
   OUTS( _verifying );
-  OUTS( _onlyRequires );
   OUTS( _solveSrcPackages );
-  OUTS( _cleandepsOnRemove );
   OUTS( _ignoreAlreadyRecommended );
   #undef OUT
   return os << "<resolver/>";
@@ -82,9 +80,7 @@ Resolver::Resolver (const ResPool & pool)
     , _upgradeMode              ( false )
     , _updateMode               ( false )
     , _verifying                ( false )
-    , _onlyRequires             ( ZConfig::instance().solver_onlyRequires() )
     , _solveSrcPackages         ( false )
-    , _cleandepsOnRemove        ( ZConfig::instance().solver_cleandepsOnRemove() )
     , _ignoreAlreadyRecommended ( true )
     , _applyDefault_focus                ( true )
     , _applyDefault_forceResolve         ( true )
@@ -156,18 +152,14 @@ ResolverFocus Resolver::focus() const                     { return _satResolver->_focus; }
     { return ZVARNAME; }                                                               \
 
 // Flags stored here follow the naming convention,...
-// TODO: But why do we need them here? Probably too many layers and they can
-// go to _satResolver too.
-#define ZOLV_FLAG_LOCALTB( ZSETTER, ZGETTER, ZVARDEFAULT )                             \
-    ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARDEFAULT, _##ZGETTER )
-// Flags down in _satResolver don't (yet).
+// Flags down in _satResolver don't. Could match `_satResolver->_##ZGETTER`
 #define ZOLV_FLAG_SATSOLV( ZSETTER, ZGETTER, ZVARDEFAULT, ZVARNAME )                   \
     ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARDEFAULT, _satResolver->ZVARNAME )
 
 // NOTE: ZVARDEFAULT must be in sync with SATResolver ctor
 ZOLV_FLAG_SATSOLV( setForceResolve         ,forceResolve         ,false                                             ,_allowuninstall        )
-ZOLV_FLAG_LOCALTB( setCleandepsOnRemove    ,cleandepsOnRemove    ,ZConfig::instance().solver_cleandepsOnRemove()    )
-ZOLV_FLAG_LOCALTB( setOnlyRequires         ,onlyRequires         ,ZConfig::instance().solver_onlyRequires()         )
+ZOLV_FLAG_SATSOLV( setCleandepsOnRemove    ,cleandepsOnRemove    ,ZConfig::instance().solver_cleandepsOnRemove()    ,_cleandepsOnRemove     )
+ZOLV_FLAG_SATSOLV( setOnlyRequires         ,onlyRequires         ,ZConfig::instance().solver_onlyRequires()         ,_onlyRequires          )
 ZOLV_FLAG_SATSOLV( setAllowDowngrade       ,allowDowngrade       ,false                                             ,_allowdowngrade        )
 ZOLV_FLAG_SATSOLV( setAllowNameChange      ,allowNameChange      ,true /*bsc#1071466*/                              ,_allownamechange       )
 ZOLV_FLAG_SATSOLV( setAllowArchChange      ,allowArchChange      ,false                                             ,_allowarchchange       )
@@ -177,7 +169,6 @@ ZOLV_FLAG_SATSOLV( dupSetAllowNameChange   ,dupAllowNameChange   ,ZConfig::insta
 ZOLV_FLAG_SATSOLV( dupSetAllowArchChange   ,dupAllowArchChange   ,ZConfig::instance().solver_dupAllowArchChange()   ,_dup_allowarchchange   )
 ZOLV_FLAG_SATSOLV( dupSetAllowVendorChange ,dupAllowVendorChange ,ZConfig::instance().solver_dupAllowVendorChange() ,_dup_allowvendorchange )
 #undef ZOLV_FLAG_SATSOLV
-#undef ZOLV_FLAG_LOCALTB
 #undef ZOLV_FLAG_TRIBOOL
 //---------------------------------------------------------------------------
 
@@ -199,19 +190,6 @@ void Resolver::reset( bool keepExtras )
     _installedSatisfied.clear();
 }
 
-bool Resolver::doUpgrade()
-{
-  // Setting Resolver to upgrade mode. SAT solver will do the update
-  _upgradeMode = true;
-  return resolvePool();
-}
-
-void Resolver::doUpdate()
-{
-    _updateMode = true;
-    return _satResolver->doUpdate();
-}
-
 PoolItemList Resolver::problematicUpdateItems() const
 { return _satResolver->problematicUpdateItems(); }
 
@@ -295,23 +273,6 @@ struct DoTransact
     }
 };
 
-
-bool Resolver::verifySystem()
-{
-    UndoTransact resetting (ResStatus::APPL_HIGH);
-
-    DBG << "Resolver::verifySystem()" << endl;
-
-    _verifying = true;
-
-    invokeOnEach ( _pool.begin(), _pool.end(),
-                   resfilter::ByTransact( ),                   // Resetting all transcations
-                   std::ref(resetting) );
-
-    return resolvePool();
-}
-
-
 //----------------------------------------------------------------------------
 // undo
 void Resolver::undo()
@@ -346,14 +307,13 @@ void Resolver::solverInit()
         }
     }
 
-    _satResolver->setFixsystem                 ( isVerifyingMode() );
-    _satResolver->setIgnorealreadyrecommended  ( ignoreAlreadyRecommended() );
-    _satResolver->setOnlyRequires              ( onlyRequires() );
+    // update solver mode flags
+    _satResolver->setDistupgrade               (_upgradeMode);
     _satResolver->setUpdatesystem              (_updateMode);
+    _satResolver->setFixsystem                 ( isVerifyingMode() );
     _satResolver->setSolveSrcPackages          ( solveSrcPackages() );
-    _satResolver->setCleandepsOnRemove         ( cleandepsOnRemove() );
+    _satResolver->setIgnorealreadyrecommended  ( ignoreAlreadyRecommended() );
 
-    _satResolver->setDistupgrade               (_upgradeMode);
     if (_upgradeMode) {
       // may overwrite some settings
       _satResolver->setDistupgrade_removeunsupported   (false);
@@ -366,10 +326,36 @@ void Resolver::solverInit()
     _installedSatisfied.clear();
 }
 
+bool Resolver::verifySystem()
+{
+  DBG << "Resolver::verifySystem()" << endl;
+  _verifying = true;
+  UndoTransact resetting (ResStatus::APPL_HIGH);
+  invokeOnEach ( _pool.begin(), _pool.end(),
+                 resfilter::ByTransact( ),                     // Resetting all transcations
+                 std::ref(resetting) );
+  return resolvePool();
+}
+
+
+bool Resolver::doUpgrade()
+{
+  // Setting Resolver to upgrade mode. SAT solver will do the update
+  _upgradeMode = true;
+  return resolvePool();
+}
+
 bool Resolver::resolvePool()
 {
-    solverInit();
-    return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos );
+  solverInit();
+  return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos );
+}
+
+void Resolver::doUpdate()
+{
+  _updateMode = true;
+  solverInit();
+  return _satResolver->doUpdate();
 }
 
 bool Resolver::resolveQueue( solver::detail::SolverQueueItemList & queue )
index 61179b2..091716f 100644 (file)
@@ -80,9 +80,7 @@ class Resolver : private base::NonCopyable
     bool _upgradeMode:1;              // Resolver has been called with doUpgrade
     bool _updateMode:1;               // Resolver has been called with doUpdate
     bool _verifying:1;                // The system will be checked
-    bool _onlyRequires:1;             // do install required resolvables only
     bool _solveSrcPackages:1;         // whether to generate solver jobs for selected source packges.
-    bool _cleandepsOnRemove:1;        // whether removing a package should also remove no longer needed requirements
     bool _ignoreAlreadyRecommended:1; // ignore recommended packages that have already been recommended by the installed packages
     //@}
 
index bcc374e..1235913 100644 (file)
@@ -52,7 +52,6 @@ extern "C"
 #include <zypp/solver/detail/SystemCheck.h>
 #include <zypp/solver/detail/SolutionAction.h>
 #include <zypp/solver/detail/SolverQueueItem.h>
-
 using std::endl;
 
 #define XDEBUG(x) do { if (base::logger::isExcessive()) XXX << x << std::endl;} while (0)
@@ -189,20 +188,21 @@ void establish( sat::Queue & pseudoItems_r, sat::Queue & pseudoFlags_r )
   pseudoItems_r = collectPseudoInstalled( ResPool::instance() );
   if ( ! pseudoItems_r.empty() )
   {
+    auto satPool = sat::Pool::instance();
     MIL << "Establish..." << endl;
-    sat::detail::CPool * cPool { sat::Pool::instance().get() };
+    sat::detail::CPool * cPool { satPool.get() };
     ::pool_set_custom_vendorcheck( cPool, &vendorCheck );
 
     sat::Queue jobQueue;
     // Add rules for parallel installable resolvables with different versions
-    for ( const sat::Solvable & solv : sat::Pool::instance().multiversion() )
+    for ( const sat::Solvable & solv : satPool.multiversion() )
     {
       jobQueue.push( SOLVER_NOOBSOLETES | SOLVER_SOLVABLE );
       jobQueue.push( solv.id() );
     }
 
     AutoDispose<sat::detail::CSolver*> cSolver { ::solver_create( cPool ), ::solver_free };
-    sat::Pool::instance().prepare();
+    satPool.prepare();
     if ( ::solver_solve( cSolver, jobQueue ) != 0 )
       INT << "How can establish fail?" << endl;
 
@@ -256,7 +256,7 @@ SATResolver::dumpOn( std::ostream & os ) const
         OUTS( ALLOW_UNINSTALL );
         OUTS( NO_UPDATEPROVIDE );
         OUTS( SPLITPROVIDES );
-        OUTS( IGNORE_RECOMMENDED );
+        OUTS( ONLY_NAMESPACE_RECOMMENDED );
         OUTS( ADD_ALREADY_RECOMMENDED );
         OUTS( NO_INFARCHCHECK );
         OUTS( KEEP_EXPLICIT_OBSOLETES );
@@ -359,7 +359,7 @@ SATSolutionToPool (PoolItem item, const ResStatus & status, const ResStatus::Tra
 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
-// resolvePool
+// solverInit
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 /////////////////////////////////////////////////////////////////////////
@@ -428,45 +428,200 @@ private:
 };
 /////////////////////////////////////////////////////////////////////////
 
+void
+SATResolver::solverEnd()
+{
+  // cleanup
+  if ( _satSolver )
+  {
+    solver_free(_satSolver);
+    _satSolver = NULL;
+    queue_free( &(_jobQueue) );
+  }
+}
 
-//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
-// solving.....
-//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
+void
+SATResolver::solverInit(const PoolItemList & weakItems)
+{
+    MIL << "SATResolver::solverInit()" << endl;
 
+    // Remove old stuff and create a new jobqueue
+    solverEnd();
+    _satSolver = solver_create( _satPool );
+    queue_init( &_jobQueue );
 
-class CheckIfUpdate
+    {
+      // bsc#1182629: in dup allow an available -release package providing 'dup-vendor-relax(suse)'
+      // to let (suse/opensuse) vendor being treated as being equivalent.
+      bool toRelax = false;
+      if ( _distupgrade ) {
+        for ( sat::Solvable solv : sat::WhatProvides( Capability("dup-vendor-relax(suse)") ) ) {
+          if ( ! solv.isSystem() ) {
+            MIL << "Relaxed vendor check requested by " << solv << endl;
+            toRelax = true;
+            break;
+          }
+        }
+      }
+      ::pool_set_custom_vendorcheck( _satPool, toRelax ? &relaxedVendorCheck : &vendorCheck );
+    }
+
+    // Add rules for user/auto installed packages
+    ::pool_add_userinstalled_jobs(_satPool, sat::Pool::instance().autoInstalled(), &(_jobQueue), GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED);
+
+    // Collect PoolItem's tasks and cleanup Pool for solving.
+    // Todos are kept in _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep
+    {
+      SATCollectTransact collector( _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep, solveSrcPackages() );
+      invokeOnEach ( _pool.begin(), _pool.end(), std::ref( collector ) );
+    }
+
+    // Add rules for previous ProblemSolutions "break %s by ignoring some of its dependencies"
+    for (PoolItemList::const_iterator iter = weakItems.begin(); iter != weakItems.end(); iter++) {
+        Id id = iter->id();
+        if (id == ID_NULL) {
+            ERR << "Weaken: " << *iter << " not found" << endl;
+        }
+        MIL << "Weaken dependencies of " << *iter << endl;
+        queue_push( &(_jobQueue), SOLVER_WEAKENDEPS | SOLVER_SOLVABLE );
+        queue_push( &(_jobQueue), id );
+    }
+
+    // Add rules for retracted patches and packages
+    {
+      queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
+      queue_push( &(_jobQueue), sat::Solvable::retractedToken.id() );
+      queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
+      queue_push( &(_jobQueue), sat::Solvable::ptfMasterToken.id() );
+      // bsc#1186503: ptfPackageToken should not be blacklisted
+    }
+
+    // Add rules for changed requestedLocales
+    {
+      const auto & trackedLocaleIds( myPool().trackedLocaleIds() );
+
+      // just track changed locakes
+      for ( const auto & locale : trackedLocaleIds.added() )
+      {
+        queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
+        queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
+      }
+
+      for ( const auto & locale : trackedLocaleIds.removed() )
+      {
+        queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | SOLVER_CLEANDEPS );        // needs uncond. SOLVER_CLEANDEPS!
+        queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
+      }
+    }
+
+    // Add rules for parallel installable resolvables with different versions
+    for ( const sat::Solvable & solv : myPool().multiversionList() )
+    {
+      queue_push( &(_jobQueue), SOLVER_NOOBSOLETES | SOLVER_SOLVABLE );
+      queue_push( &(_jobQueue), solv.id() );
+    }
+
+    // Add rules to protect PTF removal without repos (bsc#1203248)
+    // Removing a PTF its packages should be replaced by the official
+    // versions again. If just the system repo is present, they'd get
+    // removed instead.
+    {
+      _protectPTFs = sat::Pool::instance().reposSize() == 1;
+      if ( _protectPTFs ) {
+        for ( const auto & solv : sat::AllPTFs() ) {
+          if ( solv.isSystem() ) {
+            queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
+            queue_push( &(_jobQueue), solv.id() );
+          }
+        }
+      }
+    }
+
+    // set requirements for a running system
+    solverInitSetSystemRequirements();
+
+    // set locks for the solver
+    solverInitSetLocks();
+
+    // set mode (verify,up,dup) specific jobs and solver flags
+    solverInitSetModeJobsAndFlags();
+}
+
+void SATResolver::solverInitSetSystemRequirements()
 {
-  public:
-    bool is_updated;
-    sat::Solvable _installed;
+    CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap();
+    CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap();
 
-    CheckIfUpdate( const sat::Solvable & installed_r )
-    : is_updated( false )
-    , _installed( installed_r )
-    {}
+    for (CapabilitySet::const_iterator iter = system_requires.begin(); iter != system_requires.end(); ++iter) {
+        queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
+        queue_push( &(_jobQueue), iter->id() );
+        MIL << "SYSTEM Requires " << *iter << endl;
+    }
 
-    // check this item will be updated
+    for (CapabilitySet::const_iterator iter = system_conflicts.begin(); iter != system_conflicts.end(); ++iter) {
+        queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | MAYBE_CLEANDEPS );
+        queue_push( &(_jobQueue), iter->id() );
+        MIL << "SYSTEM Conflicts " << *iter << endl;
+    }
 
-    bool operator()( const PoolItem & item )
+    // Lock the architecture of the running systems rpm
+    // package on distupgrade.
+    if ( _distupgrade && ZConfig::instance().systemRoot() == "/" )
     {
-        if ( item.status().isToBeInstalled() )
+      ResPool pool( ResPool::instance() );
+      IdString rpm( "rpm" );
+      for_( it, pool.byIdentBegin(rpm), pool.byIdentEnd(rpm) )
+      {
+        if ( (*it)->isSystem() )
         {
-          if ( ! item.multiversionInstall() || sameNVRA( _installed, item ) )
-          {
-            is_updated = true;
-            return false;
-          }
+          Capability archrule( (*it)->arch(), rpm.c_str(), Capability::PARSED );
+          queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_NAME | SOLVER_ESSENTIAL );
+          queue_push( &(_jobQueue), archrule.id() );
+
         }
-        return true;
+      }
     }
-};
+}
 
+void SATResolver::solverInitSetLocks()
+{
+    unsigned icnt = 0;
+    unsigned acnt = 0;
 
-bool
-SATResolver::solving(const CapabilitySet & requires_caps,
-                     const CapabilitySet & conflict_caps)
+    for (PoolItemList::const_iterator iter = _items_to_lock.begin(); iter != _items_to_lock.end(); ++iter) {
+        sat::detail::SolvableIdType id( iter->id() );
+        if (iter->status().isInstalled()) {
+            ++icnt;
+            queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
+            queue_push( &(_jobQueue), id );
+        } else {
+            ++acnt;
+            queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE | MAYBE_CLEANDEPS );
+            queue_push( &(_jobQueue), id );
+        }
+    }
+    MIL << "Locked " << icnt << " installed items and " << acnt << " NOT installed items." << endl;
+
+    ///////////////////////////////////////////////////////////////////
+    // Weak locks: Ignore if an item with this name is already installed.
+    // If it's not installed try to keep it this way using a weak delete
+    ///////////////////////////////////////////////////////////////////
+    std::set<IdString> unifiedByName;
+    for (PoolItemList::const_iterator iter = _items_to_keep.begin(); iter != _items_to_keep.end(); ++iter) {
+      IdString ident( iter->ident() );
+      if ( unifiedByName.insert( ident ).second )
+      {
+        if ( ! ui::Selectable::get( *iter )->hasInstalledObj() )
+        {
+          MIL << "Keep NOT installed name " << ident << " (" << *iter << ")" << endl;
+          queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | SOLVER_WEAK | MAYBE_CLEANDEPS );
+          queue_push( &(_jobQueue), ident.id() );
+        }
+      }
+    }
+}
+
+void SATResolver::solverInitSetModeJobsAndFlags()
 {
     if (_fixsystem) {
         queue_push( &(_jobQueue), SOLVER_VERIFY|SOLVER_SOLVABLE_ALL);
@@ -484,6 +639,7 @@ SATResolver::solving(const CapabilitySet & requires_caps,
         queue_push( &(_jobQueue), SOLVER_DROP_ORPHANED|SOLVER_SOLVABLE_ALL);
         queue_push( &(_jobQueue), 0 );
     }
+
     solverSetFocus( *_satSolver, _focus );
     solver_set_flag(_satSolver, SOLVER_FLAG_ADD_ALREADY_RECOMMENDED, !_ignorealreadyrecommended);
     solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_DOWNGRADE,           _allowdowngrade);
@@ -499,7 +655,46 @@ SATResolver::solving(const CapabilitySet & requires_caps,
     solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_NAMECHANGE,      _dup_allownamechange );
     solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE,      _dup_allowarchchange );
     solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE,    _dup_allowvendorchange );
+}
 
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// solving.....
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+class CheckIfUpdate
+{
+  public:
+    bool is_updated;
+    sat::Solvable _installed;
+
+    CheckIfUpdate( const sat::Solvable & installed_r )
+    : is_updated( false )
+    , _installed( installed_r )
+    {}
+
+    // check this item will be updated
+
+    bool operator()( const PoolItem & item )
+    {
+        if ( item.status().isToBeInstalled() )
+        {
+          if ( ! item.multiversionInstall() || sameNVRA( _installed, item ) )
+          {
+            is_updated = true;
+            return false;
+          }
+        }
+        return true;
+    }
+};
+
+
+bool
+SATResolver::solving(const CapabilitySet & requires_caps,
+                     const CapabilitySet & conflict_caps)
+{
     sat::Pool::instance().prepare();
 
     // Solve !
@@ -658,99 +853,45 @@ SATResolver::solving(const CapabilitySet & requires_caps,
     return true;
 }
 
-
-void
-SATResolver::solverInit(const PoolItemList & weakItems)
+void SATResolver::solverAddJobsFromPool()
 {
-
-    MIL << "SATResolver::solverInit()" << endl;
-
-    // remove old stuff
-    solverEnd();
-    _satSolver = solver_create( _satPool );
-    {
-      // bsc#1182629: in dup allow an available -release package providing 'dup-vendor-relax(suse)'
-      // to let (suse/opensuse) vendor being treated as being equivalent.
-      bool toRelax = false;
-      if ( _distupgrade ) {
-        for ( sat::Solvable solv : sat::WhatProvides( Capability("dup-vendor-relax(suse)") ) ) {
-          if ( ! solv.isSystem() ) {
-            MIL << "Relaxed vendor check requested by " << solv << endl;
-            toRelax = true;
-            break;
-          }
-        }
-      }
-      ::pool_set_custom_vendorcheck( _satPool, toRelax ? &relaxedVendorCheck : &vendorCheck );
-    }
-
-    queue_init( &_jobQueue );
-
-    // clear and rebuild: _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep
-    {
-      SATCollectTransact collector( _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep, solveSrcPackages() );
-      invokeOnEach ( _pool.begin(), _pool.end(), std::ref( collector ) );
-    }
-
-    for (PoolItemList::const_iterator iter = weakItems.begin(); iter != weakItems.end(); iter++) {
-        Id id = iter->id();
-        if (id == ID_NULL) {
-            ERR << "Weaken: " << *iter << " not found" << endl;
-        }
-        MIL << "Weaken dependencies of " << *iter << endl;
-        queue_push( &(_jobQueue), SOLVER_WEAKENDEPS | SOLVER_SOLVABLE );
-        queue_push( &(_jobQueue), id );
-    }
-
-    // Ad rules for retracted patches and packages
-    {
-      queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
-      queue_push( &(_jobQueue), sat::Solvable::retractedToken.id() );
-      queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
-      queue_push( &(_jobQueue), sat::Solvable::ptfMasterToken.id() );
-      // bsc#1186503: ptfPackageToken should not be blacklisted
-    }
-
-    // Ad rules for changed requestedLocales
-    {
-      const auto & trackedLocaleIds( myPool().trackedLocaleIds() );
-
-      // just track changed locakes
-      for ( const auto & locale : trackedLocaleIds.added() )
-      {
-        queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
-        queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
-      }
-
-      for ( const auto & locale : trackedLocaleIds.removed() )
-      {
-        queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | SOLVER_CLEANDEPS );        // needs uncond. SOLVER_CLEANDEPS!
-        queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() );
-      }
+  for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) {
+    Id id = iter->id();
+    if (id == ID_NULL) {
+      ERR << "Install: " << *iter << " not found" << endl;
+    } else {
+      MIL << "Install " << *iter << endl;
+      queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
+      queue_push( &(_jobQueue), id );
     }
+  }
 
-    // Add rules for parallel installable resolvables with different versions
-    for ( const sat::Solvable & solv : myPool().multiversionList() )
-    {
-      queue_push( &(_jobQueue), SOLVER_NOOBSOLETES | SOLVER_SOLVABLE );
-      queue_push( &(_jobQueue), solv.id() );
+  for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) {
+    Id id = iter->id();
+    if (id == ID_NULL) {
+      ERR << "Delete: " << *iter << " not found" << endl;
+    } else {
+      MIL << "Delete " << *iter << endl;
+      queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE | MAYBE_CLEANDEPS );
+      queue_push( &(_jobQueue), id);
     }
-
-    ::pool_add_userinstalled_jobs(_satPool, sat::Pool::instance().autoInstalled(), &(_jobQueue), GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED);
+  }
 }
 
-void
-SATResolver::solverEnd()
+void SATResolver::solverAddJobsFromExtraQueues( const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps )
 {
-  // cleanup
-  if ( _satSolver )
-  {
-    solver_free(_satSolver);
-    _satSolver = NULL;
-    queue_free( &(_jobQueue) );
+  for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) {
+    queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
+    queue_push( &(_jobQueue), iter->id() );
+    MIL << "Requires " << *iter << endl;
   }
-}
 
+  for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) {
+    queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | MAYBE_CLEANDEPS );
+    queue_push( &(_jobQueue), iter->id() );
+    MIL << "Conflicts " << *iter << endl;
+  }
+}
 
 bool
 SATResolver::resolvePool(const CapabilitySet & requires_caps,
@@ -760,31 +901,13 @@ SATResolver::resolvePool(const CapabilitySet & requires_caps,
 {
     MIL << "SATResolver::resolvePool()" << endl;
 
-    // initialize
+    // Initialize
     solverInit(weakItems);
 
-    for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) {
-        Id id = iter->id();
-        if (id == ID_NULL) {
-            ERR << "Install: " << *iter << " not found" << endl;
-        } else {
-            MIL << "Install " << *iter << endl;
-            queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
-            queue_push( &(_jobQueue), id );
-        }
-    }
-
-    for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) {
-        Id id = iter->id();
-        if (id == ID_NULL) {
-            ERR << "Delete: " << *iter << " not found" << endl;
-        } else {
-            MIL << "Delete " << *iter << endl;
-            queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE | MAYBE_CLEANDEPS );
-            queue_push( &(_jobQueue), id);
-        }
-    }
-
+    // Add pool and extra jobs.
+    solverAddJobsFromPool();
+    solverAddJobsFromExtraQueues( requires_caps, conflict_caps );
+    // 'dup --from' jobs
     for_( iter, upgradeRepos.begin(), upgradeRepos.end() )
     {
         queue_push( &(_jobQueue), SOLVER_DISTUPGRADE | SOLVER_SOLVABLE_REPO );
@@ -792,25 +915,7 @@ SATResolver::resolvePool(const CapabilitySet & requires_caps,
         MIL << "Upgrade repo " << *iter << endl;
     }
 
-    for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) {
-        queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
-        queue_push( &(_jobQueue), iter->id() );
-        MIL << "Requires " << *iter << endl;
-    }
-
-    for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) {
-        queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | MAYBE_CLEANDEPS );
-        queue_push( &(_jobQueue), iter->id() );
-        MIL << "Conflicts " << *iter << endl;
-    }
-
-    // set requirements for a running system
-    setSystemRequirements();
-
-    // set locks for the solver
-    setLocks();
-
-    // solving
+    // Solve!
     bool ret = solving(requires_caps, conflict_caps);
 
     (ret?MIL:WAR) << "SATResolver::resolvePool() done. Ret:" << ret <<  endl;
@@ -824,90 +929,40 @@ SATResolver::resolveQueue(const SolverQueueItemList &requestQueue,
 {
     MIL << "SATResolver::resolvQueue()" << endl;
 
-    // initialize
+    // Initialize
     solverInit(weakItems);
 
-    // generate solver queue
+    // Add request queue's jobs.
     for (SolverQueueItemList::const_iterator iter = requestQueue.begin(); iter != requestQueue.end(); iter++) {
         (*iter)->addRule(_jobQueue);
     }
 
-    // Add addition item status to the resolve-queue cause these can be set by problem resolutions
-    for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) {
-        Id id = iter->id();
-        if (id == ID_NULL) {
-            ERR << "Install: " << *iter << " not found" << endl;
-        } else {
-            MIL << "Install " << *iter << endl;
-            queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
-            queue_push( &(_jobQueue), id );
-        }
-    }
-    for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) {
-        sat::detail::IdType ident( iter->ident().id() );
-        MIL << "Delete " << *iter << ident << endl;
-        queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | MAYBE_CLEANDEPS );
-        queue_push( &(_jobQueue), ident);
-    }
-
-    // set requirements for a running system
-    setSystemRequirements();
-
-    // set locks for the solver
-    setLocks();
+    // Add pool jobs; they do contain any problem resolutions.
+    solverAddJobsFromPool();
 
-    // solving
+    // Solve!
     bool ret = solving();
 
-    MIL << "SATResolver::resolveQueue() done. Ret:" << ret <<  endl;
+    (ret?MIL:WAR) << "SATResolver::resolveQueue() done. Ret:" << ret <<  endl;
     return ret;
 }
 
-/** \todo duplicate code to be joined with \ref solving. */
+
 void SATResolver::doUpdate()
 {
     MIL << "SATResolver::doUpdate()" << endl;
 
-    // initialize
+    // Initialize
     solverInit(PoolItemList());
 
-    // set requirements for a running system
-    setSystemRequirements();
-
-    // set locks for the solver
-    setLocks();
-
-    if (_fixsystem) {
-        queue_push( &(_jobQueue), SOLVER_VERIFY|SOLVER_SOLVABLE_ALL);
-        queue_push( &(_jobQueue), 0 );
-    }
-    if (1) {
-        queue_push( &(_jobQueue), SOLVER_UPDATE|SOLVER_SOLVABLE_ALL);
-        queue_push( &(_jobQueue), 0 );
-    }
-    if (_distupgrade) {
-        queue_push( &(_jobQueue), SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_ALL);
-        queue_push( &(_jobQueue), 0 );
-    }
-    if (_distupgrade_removeunsupported) {
-        queue_push( &(_jobQueue), SOLVER_DROP_ORPHANED|SOLVER_SOLVABLE_ALL);
-        queue_push( &(_jobQueue), 0 );
-    }
-    solverSetFocus( *_satSolver, _focus );
-    solver_set_flag(_satSolver, SOLVER_FLAG_ADD_ALREADY_RECOMMENDED, !_ignorealreadyrecommended);
-    solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_DOWNGRADE,           _allowdowngrade);
-    solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_NAMECHANGE,          _allownamechange);
-    solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_ARCHCHANGE,          _allowarchchange);
-    solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_VENDORCHANGE,                _allowvendorchange);
-    solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_UNINSTALL,           _allowuninstall);
-    solver_set_flag(_satSolver, SOLVER_FLAG_NO_UPDATEPROVIDE,          _noupdateprovide);
-    solver_set_flag(_satSolver, SOLVER_FLAG_SPLITPROVIDES,             _dosplitprovides);
-    solver_set_flag(_satSolver, SOLVER_FLAG_IGNORE_RECOMMENDED,        false);         // resolve recommended namespaces
-    solver_set_flag(_satSolver, SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED,        _onlyRequires); //
+    // By now, doUpdate has no additional jobs.
+    // It does not include any pool jobs, and so it does not create an conflicts.
+    // Combinations like patch_with_update are driven by resolvePool + _updatesystem.
 
+    // TODO: Try to join the following with solving()
     sat::Pool::instance().prepare();
 
-    // Solve !
+    // Solve!
     MIL << "Starting solving for update...." << endl;
     MIL << *this;
     solver_solve( _satSolver, &(_jobQueue) );
@@ -1237,11 +1292,11 @@ namespace {
   /// bsc#1194848 hint on ptf<>patch conflicts or common ptf conflicts
   struct PtfPatchHint
   {
-    void notInstallPatch( sat::Solvable slv_r, unsigned solution_r )
+    void notInstallPatch( sat::Solvable slv_r )
     { _patch.push_back( slv_r.ident() ); }
 
-    void removePtf(  sat::Solvable slv_r, unsigned solution_r )
-    { _ptf.push_back( slv_r.ident() ); }
+    void removePtf(  sat::Solvable slv_r, bool showremoveProtectHint_r = false )
+    { _ptf.push_back( slv_r.ident() ); if ( showremoveProtectHint_r ) _showremoveProtectHint = true; }
 
     bool applies() const
     { return not _ptf.empty(); }
@@ -1254,6 +1309,16 @@ namespace {
         << _("Typically you want to keep the PTF and choose to not install the maintenance patches.");
       }
       //else: a common problem due to an installed ptf
+
+      if ( _showremoveProtectHint ) { // bsc#1203248
+        const std::string & removeptfCommand { str::Format("zypper removeptf %1%") % printlist(_ptf) };
+        return str::Str()
+        // translator: %1% is the name of a PTF.
+        << (str::Format( _("Removing the installed %1% in this context will remove (not replace!) the included PTF-packages too." ) ) % printlist(_ptf)) << endl
+        << (str::Format( _("The PTF should be removed by calling '%1%'. This will update the included PTF-packages rather than removing them." ) ) % removeptfCommand) << endl
+        << _("Typically you want to keep the PTF or choose to cancel the action."); // ma: When translated, it should replace the '..and choose..' below too
+      }
+
       return str::Str()
       // translator: %1% is the name of a PTF.
       << (str::Format( _("The installed %1% blocks the desired action.") ) % printlist(_ptf)) << endl
@@ -1266,6 +1331,7 @@ namespace {
 
     std::vector<StoreType> _ptf;
     std::vector<StoreType> _patch;
+    bool _showremoveProtectHint = false;
   };
 }
 /////////////////////////////////////////////////////////////////////////
@@ -1316,13 +1382,15 @@ SATResolver::problems ()
                                         std::string description = str::Format(_("remove lock to allow removal of %1%") ) % s.asString();
                                         MIL << description << endl;
                                         problemSolution->addDescription (description);
+                                        if ( _protectPTFs && s.isPtfMaster() )
+                                          ptfPatchHint.removePtf( s, _protectPTFs ); // bsc#1203248
                                     } else {
                                         problemSolution->addSingleAction (poolItem, KEEP);
                                         std::string description = str::Format(_("do not install %1%") ) % s.asString();
                                         MIL << description << endl;
                                         problemSolution->addDescription (description);
                                         if ( s.isKind<Patch>() )
-                                          ptfPatchHint.notInstallPatch( s, resolverProblem->solutions().size() );
+                                          ptfPatchHint.notInstallPatch( s );
                                     }
                                 } else {
                                     ERR << "SOLVER_INSTALL_SOLVABLE: No item found for " << s.asString() << endl;
@@ -1560,7 +1628,7 @@ SATResolver::problems ()
                                 problemSolution->addDescription (description);
                                 problemSolution->addSingleAction (itemFrom, REMOVE);
                                 if ( s.isPtfMaster() )
-                                  ptfPatchHint.removePtf( s, resolverProblem->solutions().size() );
+                                  ptfPatchHint.removePtf( s );
                             }
                         }
                     }
@@ -1599,80 +1667,6 @@ SATResolver::problems ()
 void SATResolver::applySolutions( const ProblemSolutionList & solutions )
 { Resolver( _pool ).applySolutions( solutions ); }
 
-void SATResolver::setLocks()
-{
-    unsigned icnt = 0;
-    unsigned acnt = 0;
-
-    for (PoolItemList::const_iterator iter = _items_to_lock.begin(); iter != _items_to_lock.end(); ++iter) {
-        sat::detail::SolvableIdType id( iter->id() );
-        if (iter->status().isInstalled()) {
-            ++icnt;
-            queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
-            queue_push( &(_jobQueue), id );
-        } else {
-            ++acnt;
-            queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE | MAYBE_CLEANDEPS );
-            queue_push( &(_jobQueue), id );
-        }
-    }
-    MIL << "Locked " << icnt << " installed items and " << acnt << " NOT installed items." << endl;
-
-    ///////////////////////////////////////////////////////////////////
-    // Weak locks: Ignore if an item with this name is already installed.
-    // If it's not installed try to keep it this way using a weak delete
-    ///////////////////////////////////////////////////////////////////
-    std::set<IdString> unifiedByName;
-    for (PoolItemList::const_iterator iter = _items_to_keep.begin(); iter != _items_to_keep.end(); ++iter) {
-      IdString ident( iter->ident() );
-      if ( unifiedByName.insert( ident ).second )
-      {
-        if ( ! ui::Selectable::get( *iter )->hasInstalledObj() )
-        {
-          MIL << "Keep NOT installed name " << ident << " (" << *iter << ")" << endl;
-          queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | SOLVER_WEAK | MAYBE_CLEANDEPS );
-          queue_push( &(_jobQueue), ident.id() );
-        }
-      }
-    }
-}
-
-void SATResolver::setSystemRequirements()
-{
-    CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap();
-    CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap();
-
-    for (CapabilitySet::const_iterator iter = system_requires.begin(); iter != system_requires.end(); ++iter) {
-        queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
-        queue_push( &(_jobQueue), iter->id() );
-        MIL << "SYSTEM Requires " << *iter << endl;
-    }
-
-    for (CapabilitySet::const_iterator iter = system_conflicts.begin(); iter != system_conflicts.end(); ++iter) {
-        queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | MAYBE_CLEANDEPS );
-        queue_push( &(_jobQueue), iter->id() );
-        MIL << "SYSTEM Conflicts " << *iter << endl;
-    }
-
-    // Lock the architecture of the running systems rpm
-    // package on distupgrade.
-    if ( _distupgrade && ZConfig::instance().systemRoot() == "/" )
-    {
-      ResPool pool( ResPool::instance() );
-      IdString rpm( "rpm" );
-      for_( it, pool.byIdentBegin(rpm), pool.byIdentEnd(rpm) )
-      {
-        if ( (*it)->isSystem() )
-        {
-          Capability archrule( (*it)->arch(), rpm.c_str(), Capability::PARSED );
-          queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_NAME | SOLVER_ESSENTIAL );
-          queue_push( &(_jobQueue), archrule.id() );
-
-        }
-      }
-    }
-}
-
 sat::StringQueue SATResolver::autoInstalled() const
 {
   sat::StringQueue ret;
index 6c27f49..03af247 100644 (file)
@@ -83,6 +83,7 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable, pr
     // solve results
     PoolItemList _result_items_to_install;
     PoolItemList _result_items_to_remove;
+
   public:
     ResolverFocus _focus;              // The resolver's general attitude
 
@@ -107,23 +108,28 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable, pr
     bool _cleandepsOnRemove:1;         // whether removing a package should also remove no longer needed requirements
 
   private:
+    bool _protectPTFs:1;               // protect from accidental removal of PTFs if only @System is present (bsc#1203248)
+
     // ---------------------------------- methods
     std::string SATprobleminfoString (Id problem, std::string &detail, Id &ignoreId);
     std::string SATproblemRuleInfoString (Id rule, std::string &detail, Id &ignoreId);
     std::vector<std::string> SATgetCompleteProblemInfoStrings ( Id problem );
     void resetItemTransaction (PoolItem item);
 
-    // Create a SAT solver and reset solver selection in the pool (Collecting
+    // Create a SAT solver and
     void solverInit(const PoolItemList & weakItems);
+    void solverInitSetLocks();
+    void solverInitSetSystemRequirements();
+    void solverInitSetModeJobsAndFlags();
+
+    void solverAddJobsFromPool();
+    void solverAddJobsFromExtraQueues( const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps );
+
     // common solver run with the _jobQueue; Save results back to pool
     bool solving(const CapabilitySet & requires_caps = CapabilitySet(),
                  const CapabilitySet & conflict_caps = CapabilitySet());
     // cleanup solver
     void solverEnd();
-    // set locks for the solver
-    void setLocks();
-    // set requirements for a running system
-    void setSystemRequirements();
 
    // Checking if this solvable/item has a buddy which reflect the real
    // user visible description of an item
index a1fdafb..a6f729b 100644 (file)
  */
 #include <iostream>
 #include <fstream>
+#include <optional>
 #include <zypp/base/LogTools.h>
 #include <zypp/base/NonCopyable.h>
 #include <zypp/base/Gettext.h>
+#include <zypp/base/Regex.h>
+#include <zypp/base/IOStream.h>
+#include <zypp/base/InputStream.h>
 #include <zypp/target/RpmPostTransCollector.h>
 
 #include <zypp/TmpPath.h>
@@ -20,7 +24,7 @@
 #include <zypp/HistoryLog.h>
 #include <zypp/ZYppCallbacks.h>
 #include <zypp/ExternalProgram.h>
-#include <zypp/target/rpm/RpmHeader.h>
+#include <zypp/target/rpm/RpmDb.h>
 #include <zypp/target/rpm/librpmDb.h>
 #include <zypp/ZConfig.h>
 #include <zypp/ZYppCallbacks.h>
@@ -35,7 +39,6 @@ namespace zypp
   ///////////////////////////////////////////////////////////////////
   namespace target
   {
-
     ///////////////////////////////////////////////////////////////////
     /// \class RpmPostTransCollector::Impl
     /// \brief RpmPostTransCollector implementation.
@@ -44,6 +47,22 @@ namespace zypp
     {
       friend std::ostream & operator<<( std::ostream & str, const Impl & obj );
       friend std::ostream & dumpOn( std::ostream & str, const Impl & obj );
+
+      /// <%posttrans script basename, pkgname> pairs.
+      using ScriptList = std::list< std::pair<std::string,std::string> >;
+
+      /// Data regarding the dumpfile used if `rpm --runposttrans` is supported
+      struct Dumpfile
+      {
+        Dumpfile( Pathname dumpfile_r )
+        : _dumpfile { std::move(dumpfile_r) }
+        {}
+
+        Pathname _dumpfile;         ///< The file holding the collected dump_posttrans: lines.
+        size_t _numscripts = 0;     ///< Number of scripts we collected (roughly estimated)
+        bool _runposttrans = true;  ///< Set to false if rpm lost --runposttrans support during transaction.
+      };
+
       public:
         Impl( const Pathname & root_r )
         : _root( root_r )
@@ -51,154 +70,262 @@ namespace zypp
         {}
 
         ~Impl()
-        { if ( !_scripts.empty() ) discardScripts(); }
+        {}
+
+        bool hasPosttransScript( const Pathname & rpmPackage_r )
+        { return bool(getHeaderIfPosttrans( rpmPackage_r )); }
+
+        void collectPosttransInfo( const Pathname & rpmPackage_r, const std::vector<std::string> & runposttrans_r )
+        { if ( not collectDumpPosttransLines( runposttrans_r ) ) collectScriptForPackage( rpmPackage_r ); }
 
-        /** Extract and remember a packages %posttrans script for later execution. */
-        bool collectScriptFromPackage( ManagedFile rpmPackage_r )
+        void collectPosttransInfo( const std::vector<std::string> & runposttrans_r )
+        { collectDumpPosttransLines( runposttrans_r ); }
+
+        void collectScriptFromHeader( rpm::RpmHeader::constPtr pkg )
         {
-          rpm::RpmHeader::constPtr pkg( rpm::RpmHeader::readPackage( rpmPackage_r, rpm::RpmHeader::NOVERIFY ) );
-          if ( ! pkg )
-          {
-            WAR << "Unexpectedly this is no package: " << rpmPackage_r << endl;
-            return false;
+          if ( pkg ) {
+            if ( not _scripts ) {
+              _scripts = ScriptList();
+            }
+
+            filesystem::TmpFile script( tmpDir(), pkg->ident() );
+            filesystem::addmod( script.path(), 0500 );  // script must be executable
+            script.autoCleanup( false );                // no autodelete; within a tmpdir
+            {
+              std::ofstream out( script.path().c_str() );
+              out << "#! " << pkg->tag_posttransprog() << endl
+                  << pkg->tag_posttrans() << endl;
+            }
+
+            _scripts->push_back( std::make_pair( script.path().basename(), pkg->tag_name() ) );
+            MIL << "COLLECT posttrans: '" << PathInfo( script.path() ) << "' for package: '" << pkg->tag_name() << "'" << endl;
           }
+        }
+
+        void collectScriptForPackage( const Pathname & rpmPackage_r )
+        { collectScriptFromHeader( getHeaderIfPosttrans( rpmPackage_r ) ); }
 
-          std::string prog( pkg->tag_posttransprog() );
-          if ( prog.empty() || prog == "<lua>" )       // by now leave lua to rpm
+        /** Return whether runposttrans lines were collected.
+         * If runposttrans is supported, rpm issues at least one 'dump_posttrans: enabled' line with
+         * every install/remove. If no line is issued, rpm does not support --runposttrans. Interesting
+         * for \ref executeScripts is whether the final call to rpm supported it.
+         */
+        bool collectDumpPosttransLines( const std::vector<std::string> & runposttrans_r )
+        {
+          if ( runposttrans_r.empty()  ) {
+            if ( _dumpfile and _dumpfile->_runposttrans ) {
+              MIL << "LOST dump_posttrans support" <<  endl;
+              _dumpfile->_runposttrans = false;  // rpm was downgraded to a version not supporing --runposttrans
+            }
             return false;
+          }
+
+          if ( not _dumpfile ) {
+            filesystem::TmpFile dumpfile( tmpDir(), "dumpfile" );
+            filesystem::addmod( dumpfile.path(), 0400 );  // dumpfile must be readable
+            dumpfile.autoCleanup( false );     // no autodelete; within a tmpdir
+            _dumpfile = Dumpfile( dumpfile.path() );
+            MIL << "COLLECT dump_posttrans to '" << _dumpfile->_dumpfile << endl;
+          }
 
-          filesystem::TmpFile script( tmpDir(), rpmPackage_r->basename() );
-          filesystem::addmod( script.path(), 0500 );
-          script.autoCleanup( false ); // no autodelete; within a tmpdir
-          {
-            std::ofstream out( script.path().c_str() );
-            out << "#! " << pkg->tag_posttransprog() << endl
-                << pkg->tag_posttrans() << endl;
+          std::ofstream out( _dumpfile->_dumpfile.c_str(), std::ios_base::app );
+          for ( const auto & s : runposttrans_r ) {
+            out << s << endl;
           }
-          _scripts.push_back( std::make_pair( script.path().basename(), pkg->tag_name() ) );
-          MIL << "COLLECT posttrans: '" << PathInfo( script.path() ) << "' for package: '" << pkg->tag_name() << "'" << endl;
-          //DBG << "PROG:  " << pkg->tag_posttransprog() << endl;
-          //DBG << "SCRPT: " << pkg->tag_posttrans() << endl;
+          _dumpfile->_numscripts += runposttrans_r.size();
+          MIL << "COLLECT " << runposttrans_r.size() << " dump_posttrans lines" << endl;
           return true;
         }
 
-        /** Execute the remembered scripts. */
-        bool executeScripts()
+        /** Execute the remembered scripts.
+         * Crucial is the mixed case, where scripts and dumpfile are present at the end.
+         * If rpm was updated in the transaction to a version supporting --runposttrans,
+         * run scripts and then the dumpfile.
+         * If rpm was downgraded in the transaction to a version no longer supporting
+         * --runposttrans, we need to extract missing %posttrans scripts from the dumpfile
+         * and execute them before the collected scripts.
+         */
+        void executeScripts( rpm::RpmDb & rpm_r )
         {
-          if ( _scripts.empty() )
-            return true;
+          if ( _dumpfile && not _dumpfile->_runposttrans ) {
+            // Here a downgraded rpm lost the ability to --runposttrans. Extract at least any
+            // missing %posttrans scripts collected in _dumpfile and prepend them to the _scripts.
+            MIL << "Extract missing %posttrans scripts and prepend them to the scripts." << endl;
+
+            // collectScriptFromHeader appends to _scripts, so we save here and append again later
+            std::optional<ScriptList> savedscripts;
+            if ( _scripts ) {
+              savedscripts = std::move(*_scripts);
+              _scripts = std::nullopt;
+            }
 
-          HistoryLog historylog;
+            rpm::librpmDb::db_const_iterator it;
+            recallFromDumpfile( _dumpfile->_dumpfile, [&]( std::string n_r, std::string v_r, std::string r_r, std::string a_r ) -> void {
+              if ( it.findPackage( n_r, Edition( v_r, r_r ) ) && headerHasPosttrans( *it ) )
+                collectScriptFromHeader( *it );
+            } );
+
+            // append any savedscripts
+            if ( savedscripts ) {
+              if ( _scripts ) {
+                _scripts->splice( _scripts->end(), *savedscripts );
+              } else {
+                _scripts = std::move(*savedscripts);
+              }
+            }
+            _dumpfile = std::nullopt;
+          }
 
-          Pathname noRootScriptDir( ZConfig::instance().update_scriptsPath() / tmpDir().basename() );
+          if ( not ( _scripts || _dumpfile ) )
+            return;  // Nothing todo
 
+          // ProgressReport counting the scripts ( 0:preparation, 1->n:for n scripts, n+1: indicate success)
           callback::SendReport<ProgressReport> report;
-          ProgressData scriptProgress( static_cast<ProgressData::value_type>(_scripts.size()) );
+          ProgressData scriptProgress( [&]() -> ProgressData::value_type {
+            ProgressData::value_type ret = 1;
+            if ( _scripts )
+              ret += _scripts->size();
+            if ( _dumpfile )
+              ret += _dumpfile->_numscripts;
+            return ret;
+          }() );
           scriptProgress.sendTo( ProgressReportAdaptor( ProgressData::ReceiverFnc(), report ) );
-          str::Format fmtScriptProgress { _("Executing %%posttrans script '%1%'") };
-
-          bool firstScript = true;
-          str::Format fmtScriptFailedMsg { "warning: %%posttrans(%1%) scriptlet failed, exit status %2%\n" }; // like rpm would report it (intentionally not translated and NL-terminated)
-          while ( ! _scripts.empty() )
-          {
-            const auto &scriptPair = _scripts.front();
-            const std::string & script = scriptPair.first;
-            const std::string & pkgident( script.substr( 0, script.size()-6 ) );       // strip tmp file suffix
-
-            scriptProgress.name( fmtScriptProgress % pkgident );
-
-            bool canContinue = true;
-            if (firstScript)  {
-              firstScript = false;
-              canContinue = scriptProgress.toMin();
-            } else {
-              canContinue = scriptProgress.incr();
-            }
+          // Translator: progress bar label
+          std::string scriptProgressName { _("Running post-transaction scripts") };
+          // Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+          str::Format fmtScriptProgressRun { _("Running %1% script") };
+          // Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)'
+          str::Format fmtRipoff { _("%1% script output:") };
+          std::string sendRipoff;
 
-            if (!canContinue) {
-              str::Str msg;
-              msg << "Execution of %posttrans scripts cancelled";
-              WAR << msg << endl;
-              historylog.comment( msg, true /*timestamp*/);
-              _myJobReport.warning( msg );
-              return false;
-            }
+          HistoryLog historylog;
 
-            int npkgs = 0;
-            rpm::librpmDb::db_const_iterator it;
-            for ( it.findByName( scriptPair.second ); *it; ++it )
-              npkgs++;
-
-            MIL << "EXECUTE posttrans: " << script << " with argument: " << npkgs << endl;
-            ExternalProgram::Arguments cmd {
-              "/bin/sh",
-              (noRootScriptDir/script).asString(),
-              str::numstring( npkgs )
-            };
-            ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout, false, -1, true, _root );
-
-            // For now we continue to collect the lines and write the history file at the end.
-            // But JobReport lines are now sent immediately as they occur.
-            str::Str collect;
-            for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
-            {
-              DBG << line;
-              collect << line;
-              _myJobReport.info( line );
+          // lambda to prepare reports for a new script
+          auto startNewScript = [&] ( const std::string & scriptident_r ) -> void {
+            // scriptident_r : script identifier like "%transfiletriggerpostun(istrigger-2-0.noarch)"
+            sendRipoff = fmtRipoff % scriptident_r;
+            scriptProgress.name( fmtScriptProgressRun % scriptident_r );
+            scriptProgress.incr();
+          };
+
+          // lambda to send script output to reports
+          auto sendScriptOutput = [&] ( const std::string & line_r ) -> void {
+            OnScopeExit cleanup;  // in case we need it
+            if ( not sendRipoff.empty() ) {
+              historylog.comment( sendRipoff, true /*timestamp*/);
+              _myJobReport.set( "ripoff", std::cref(sendRipoff) );
+              cleanup.setDispose( [&]() -> void {
+                _myJobReport.erase( "ripoff" );
+                sendRipoff.clear();
+              } );
             }
-
-            //script was executed, remove it from the list
-            _scripts.pop_front();
-
-            int ret = prog.close();
-            if ( ret != 0 )
+            historylog.comment( line_r );
+            _myJobReport.info( line_r );
+          };
+
+          // send the initial progress report
+          scriptProgress.name( scriptProgressName );
+          scriptProgress.toMin();
+
+          // Scripts first...
+          if ( _scripts ) {
+            Pathname noRootScriptDir( ZConfig::instance().update_scriptsPath() / tmpDir().basename() );
+            // like rpm would report it (intentionally not translated and NL-terminated):
+            str::Format fmtScriptFailedMsg { "warning: %%posttrans(%1%) scriptlet failed, exit status %2%\n" };
+            str::Format fmtPosttrans { "%%posttrans(%1%)" };
+
+            while ( ! _scripts->empty() )
             {
-              const std::string & msg { fmtScriptFailedMsg % pkgident % ret };
-              WAR << msg;
-              collect << msg;
-              _myJobReport.info( msg ); // info!, as rpm would have reported it.
+              const auto &scriptPair = _scripts->front();
+              const std::string & script = scriptPair.first;
+              const std::string & pkgident( script.substr( 0, script.size()-6 ) ); // strip tmp file suffix[6]
+              startNewScript( fmtPosttrans % pkgident );
+
+              int npkgs = 0;
+              rpm::librpmDb::db_const_iterator it;
+              for ( it.findByName( scriptPair.second ); *it; ++it )
+                npkgs++;
+
+              MIL << "EXECUTE posttrans: " << script << " with argument: " << npkgs << endl;
+              ExternalProgram::Arguments cmd {
+                "/bin/sh",
+                (noRootScriptDir/script).asString(),
+                str::numstring( npkgs )
+              };
+              ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout, false, -1, true, _root );
+
+              for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) {
+                sendScriptOutput( line );
+              }
+              //script was executed, remove it from the list
+              _scripts->pop_front();
+
+              int ret = prog.close();
+              if ( ret != 0 )
+              {
+                std::string msg { fmtScriptFailedMsg % pkgident % ret };
+                WAR << msg;
+                sendScriptOutput( msg ); // info!, as rpm would have reported it.
+              }
             }
+            _scripts = std::nullopt;
+          }
 
-            const std::string & scriptmsg( collect );
-            if ( ! scriptmsg.empty() )
-            {
-              str::Str msg;
-              msg << "Output of " << pkgident << " %posttrans script:\n" << scriptmsg;
-              historylog.comment( msg, true /*timestamp*/);
-            }
+          // ...then 'rpm --runposttrans'
+          int res = 0;  // Indicate a failed call to rpm itself! (a failed script is just a warning)
+          if ( _dumpfile ) {
+            res = rpm_r.runposttrans( _dumpfile->_dumpfile, [&] ( const std::string & line_r ) ->void {
+              if ( str::startsWith( line_r, "RIPOFF:" ) )
+                startNewScript( line_r.substr( 7 ) ); // new scripts ident sent by rpm
+              else
+                sendScriptOutput( line_r );
+            } );
+            if ( res != 0 )
+              _myJobReport.error( str::Format("rpm --runposttrans returned %1%.") % res );
+
+            _dumpfile = std::nullopt;
           }
 
-          //show a final message
-          scriptProgress.name( _("Executing %posttrans scripts") );
-          scriptProgress.toMax();
-          _scripts.clear();
-          return true;
+          // send a final progress report
+          scriptProgress.name( scriptProgressName );
+          if ( res == 0 )
+            scriptProgress.toMax(); // Indicate 100%, in case Dumpfile::_numscripts estimation was off
+          return;
         }
 
-        /** Discard all remembered scrips. */
+        /** Discard all remembered scrips.
+         * As we are just logging the omitted actions, we don't pay further attention
+         * to the mixed case, where scripts and dumpfile are present (see executeScripts).
+         */
         void discardScripts()
         {
-          if ( _scripts.empty() )
-            return;
-
-          HistoryLog historylog;
+          if ( not ( _scripts || _dumpfile ) )
+            return;  // Nothing todo
 
           str::Str msg;
-          msg << "%posttrans scripts skipped while aborting:\n";
-          for ( const auto & script : _scripts )
-          {
-            const std::string & pkgident( script.first.substr( 0, script.first.size()-6 ) );   // strip tmp file suffix
-            WAR << "UNEXECUTED posttrans: " << script.first << endl;
-            msg << "    " << pkgident << "\n";
+
+          if ( _scripts ) {
+            // Legacy format logs all collected %posttrans
+            msg << "%posttrans scripts skipped while aborting:" << endl;
+            for ( const auto & script : *_scripts )
+            {
+              WAR << "UNEXECUTED posttrans: " << script.first << endl;
+              const std::string & pkgident( script.first.substr( 0, script.first.size()-6 ) ); // strip tmp file suffix[6]
+              msg << "    " << pkgident << "\n";
+            }
+            _scripts = std::nullopt;
           }
 
+          if ( _dumpfile ) {
+            msg << "%posttrans and %transfiletrigger scripts are not executed when aborting!" << endl;
+            _dumpfile = std::nullopt;
+          }
+
+          HistoryLog historylog;
           historylog.comment( msg, true /*timestamp*/);
           _myJobReport.warning( msg );
-
-          _scripts.clear();
         }
 
-
       private:
         /** Lazy create tmpdir on demand. */
         Pathname tmpDir()
@@ -208,12 +335,59 @@ namespace zypp
           return _ptrTmpdir->path();
         }
 
+        /** Return whether RpmHeader has a  %posttrans. */
+        bool headerHasPosttrans( rpm::RpmHeader::constPtr pkg_r ) const
+        {
+          bool ret = false;
+          if ( pkg_r ) {
+            std::string prog( pkg_r->tag_posttransprog() );
+            if ( not prog.empty() && prog != "<lua>" )  // by now leave lua to rpm
+              ret = true;
+          }
+          return ret;
+        }
+
+        /** Cache RpmHeader for consecutive hasPosttransScript / collectScriptForPackage calls.
+         * @return RpmHeader::constPtr IFF \a rpmPackage_r has a %posttrans
+         */
+        rpm::RpmHeader::constPtr getHeaderIfPosttrans( const Pathname & rpmPackage_r )
+        {
+          if ( _headercache.first == rpmPackage_r )
+            return _headercache.second;
+
+          rpm::RpmHeader::constPtr ret { rpm::RpmHeader::readPackage( rpmPackage_r, rpm::RpmHeader::NOVERIFY ) };
+          if ( ret ) {
+            if ( not headerHasPosttrans( ret ) )
+              ret = nullptr;
+          } else {
+            WAR << "Unexpectedly this is no package: " << rpmPackage_r << endl;
+          }
+          _headercache = std::make_pair( rpmPackage_r, ret );
+          return ret;
+        }
+
+        /** Retrieve "dump_posttrans: install" lines from \a dumpfile_r and pass n,v,r,a to the \a consumer_r. */
+        void recallFromDumpfile( const Pathname & dumpfile_r, std::function<void(std::string,std::string,std::string,std::string)> consume_r )
+        {
+          // dump_posttrans: install 10 terminfo-base-6.4.20230819-19.1.x86_64
+          static const str::regex rxInstalled { "^dump_posttrans: +install +[0-9]+ +(.+)-([^-]+)-([^-]+)\\.([^.]+)" };
+          str::smatch what;
+          iostr::forEachLine( InputStream( dumpfile_r ), [&]( int num_r, std::string line_r ) -> bool {
+            if( str::regex_match( line_r, what, rxInstalled ) )
+              consume_r( what[1], what[2], what[3], what[4] );
+            return true; // continue iostr::forEachLine
+          } );
+        }
+
       private:
         Pathname _root;
-        std::list< std::pair< std::string, std::string > > _scripts;
+        std::optional<ScriptList> _scripts;
+        std::optional<Dumpfile> _dumpfile;
         boost::scoped_ptr<filesystem::TmpDir> _ptrTmpdir;
 
-        UserDataJobReport _myJobReport; ///< JobReport with ContentType "cmdout/%posttrans"
+        UserDataJobReport _myJobReport;       ///< JobReport with ContentType "cmdout/%posttrans"
+
+        std::pair<Pathname,rpm::RpmHeader::constPtr> _headercache;
     };
 
     /** \relates RpmPostTransCollector::Impl Stream output */
@@ -237,11 +411,17 @@ namespace zypp
     RpmPostTransCollector::~RpmPostTransCollector()
     {}
 
-    bool RpmPostTransCollector::collectScriptFromPackage( ManagedFile rpmPackage_r )
-    { return _pimpl->collectScriptFromPackage( rpmPackage_r ); }
+    bool RpmPostTransCollector::hasPosttransScript( const Pathname & rpmPackage_r )
+    { return _pimpl->hasPosttransScript( rpmPackage_r ); }
+
+    void RpmPostTransCollector::collectPosttransInfo( const Pathname & rpmPackage_r, const std::vector<std::string> & runposttrans_r )
+    { _pimpl->collectPosttransInfo( rpmPackage_r, runposttrans_r ); }
+
+    void RpmPostTransCollector::collectPosttransInfo( const std::vector<std::string> & runposttrans_r )
+    { _pimpl->collectPosttransInfo( runposttrans_r ); }
 
-    bool RpmPostTransCollector::executeScripts()
-    { return _pimpl->executeScripts(); }
+    void RpmPostTransCollector::executeScripts( rpm::RpmDb & rpm_r )
+    { _pimpl->executeScripts( rpm_r ); }
 
     void RpmPostTransCollector::discardScripts()
     { return _pimpl->discardScripts(); }
index 0d1fa65..a0b8f17 100644 (file)
@@ -14,7 +14,6 @@
 #include <iosfwd>
 
 #include <zypp/base/PtrTypes.h>
-#include <zypp/ManagedFile.h>
 #include <zypp/Pathname.h>
 
 ///////////////////////////////////////////////////////////////////
@@ -23,10 +22,19 @@ namespace zypp
   ///////////////////////////////////////////////////////////////////
   namespace target
   {
+    namespace rpm { class RpmDb; }
+
     ///////////////////////////////////////////////////////////////////
     /// \class RpmPostTransCollector
     /// \brief Extract and remember %posttrans scripts for later execution
-    /// \todo Maybe embedd this into the TransactionSteps.
+    ///
+    /// bsc#1041742: Attempt to delay also %transfiletrigger(postun|in) execution
+    /// iff rpm supports it. Rpm versions supporting --runposttrans will inject
+    /// "dump_posttrans:..." lines into the output if macro "_dump_posttrans" is
+    /// defined during execution. Those lines are collected and later fed into
+    /// "rpm --runposttrans".
+    /// If rpm does not support it, those lines are not injected. In this case we
+    /// collect and later execute the %posttrans script on our own.
     ///////////////////////////////////////////////////////////////////
     class RpmPostTransCollector
     {
@@ -41,17 +49,18 @@ namespace zypp
         ~RpmPostTransCollector();
 
       public:
-        /** Extract and remember a packages %posttrans script for later execution.
-         * \return whether a script was collected.
-         */
-        bool collectScriptFromPackage( ManagedFile rpmPackage_r );
+        /** Test whether a package defines a %posttrans script. */
+        bool hasPosttransScript( const Pathname & rpmPackage_r );
+
+        /** Extract and remember a packages %posttrans script or dump_posttrans lines for later execution. */
+        void collectPosttransInfo( const Pathname & rpmPackage_r, const std::vector<std::string> & runposttrans_r );
+        /** \overload 'remove' does not trigger a %posttrans, but it may trigger %transfiletriggers. */
+        void collectPosttransInfo( const std::vector<std::string> & runposttrans_r );
 
-        /** Execute the remembered scripts.
-         * \return false if execution was aborted by a user callback
-         */
-        bool executeScripts();
+        /** Execute the remembered scripts and/or or dump_posttrans lines. */
+        void executeScripts( rpm::RpmDb & rpm_r );
 
-        /** Discard all remembered scrips. */
+        /** Discard all remembered scripts and/or or dump_posttrans lines. */
         void discardScripts();
 
       public:
index f94f9e3..5c8b957 100644 (file)
@@ -39,7 +39,7 @@
 #include <zypp/RepoStatus.h>
 #include <zypp/ExternalProgram.h>
 #include <zypp/Repository.h>
-#include <zypp/ShutdownLock_p.h>
+#include <zypp-core/ShutdownLock_p.h>
 
 #include <zypp/ResFilters.h>
 #include <zypp/HistoryLog.h>
 #include <zypp-core/base/String.h>
 #include <zypp-core/base/StringV.h>
 #include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/UnixSignalSource>
 #include <zypp-core/zyppng/io/AsyncDataSource>
 #include <zypp-core/zyppng/io/Process>
 #include <zypp-core/base/IOTools.h>
 #include <zypp-core/zyppng/rpc/rpc.h>
 #include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 #include <zypp-core/zyppng/base/EventDispatcher>
-#include <zypp-proto/commit.pb.h>
-#include <zypp-proto/envelope.pb.h>
+#include <zypp-proto/target/commit.pb.h>
+#include <zypp-proto/core/envelope.pb.h>
 #include <zypp-core/zyppng/rpc/zerocopystreams.h>
 
 #include <zypp/target/rpm/RpmException.h>
@@ -232,50 +233,82 @@ namespace zypp
     ///////////////////////////////////////////////////////////////////
     namespace
     {
+      class AssertMountedBase
+      {
+        NON_COPYABLE(AssertMountedBase);
+        NON_MOVABLE(AssertMountedBase);
+      protected:
+        AssertMountedBase()
+        {}
+
+        ~AssertMountedBase()
+        {
+          if ( ! _mountpoint.empty() ) {
+            // we mounted it so we unmount...
+            MIL << "We mounted " << _mountpoint << " so we unmount it" << endl;
+            execute({ "umount", "-R", "-l", _mountpoint.asString() });
+          }
+        }
+
+      protected:
+        int execute( ExternalProgram::Arguments && cmd_r ) const
+        {
+          ExternalProgram prog( cmd_r, ExternalProgram::Stderr_To_Stdout );
+          for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
+          { DBG << line; }
+          return prog.close();
+        }
+
+      protected:
+        Pathname _mountpoint;
+
+      };
+
       /// \brief Try to provide /proc fs if not present.
       /// bsc#1181328: Some systemd tools require /proc to be mounted
-      class AssertProcMounted
+      class AssertProcMounted : private AssertMountedBase
       {
-        NON_COPYABLE(AssertProcMounted);
-        NON_MOVABLE(AssertProcMounted);
       public:
-
         AssertProcMounted( Pathname root_r )
         {
           root_r /= "/proc";
           if ( ! PathInfo(root_r/"self").isDir() ) {
-            MIL << "Try to make sure proc is mounted at" << _mountpoint << endl;
+            MIL << "Try to make sure proc is mounted at" << root_r << endl;
             if ( filesystem::assert_dir(root_r) == 0
-              && execute({ "mount", "-t", "proc", "proc", root_r.asString() }) == 0 ) {
+              && execute({ "mount", "-t", "proc", "/proc", root_r.asString() }) == 0 ) {
               _mountpoint = std::move(root_r); // so we'll later unmount it
             }
             else {
-              WAR << "Mounting proc at " << _mountpoint << " failed" << endl;
+              WAR << "Mounting proc at " << root_r << " failed" << endl;
             }
           }
         }
+      };
 
-        ~AssertProcMounted( )
+      /// \brief Try to provide /dev fs if not present.
+      /// #444: Some packages expect /dev to be mounted
+      class AssertDevMounted : private AssertMountedBase
+      {
+      public:
+        AssertDevMounted( Pathname root_r )
         {
-          if ( ! _mountpoint.empty() ) {
-            // we mounted it so we unmount...
-            MIL << "We mounted " << _mountpoint << " so we unmount it" << endl;
-            execute({ "umount", "-l", _mountpoint.asString() });
+          root_r /= "/dev";
+          if ( ! PathInfo(root_r/"null").isChr() ) {
+            MIL << "Try to make sure dev is mounted at" << root_r << endl;
+            // https://unix.stackexchange.com/questions/263972/unmount-a-rbind-mount-without-affecting-the-original-mount
+            // Without --make-rslave unmounting <sandbox-root>/dev/pts
+            // may unmount /dev/pts and you're out of ptys.
+            if ( filesystem::assert_dir(root_r) == 0
+              && execute({ "mount", "--rbind", "--make-rslave", "/dev", root_r.asString() }) == 0 ) {
+              _mountpoint = std::move(root_r); // so we'll later unmount it
+            }
+            else {
+              WAR << "Mounting dev at " << root_r << " failed" << endl;
+            }
           }
         }
-
-      private:
-        int execute( ExternalProgram::Arguments && cmd_r ) const
-        {
-          ExternalProgram prog( cmd_r, ExternalProgram::Stderr_To_Stdout );
-          for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
-          { DBG << line; }
-          return prog.close();
-        }
-
-      private:
-        Pathname _mountpoint;
       };
+
     } // namespace
     ///////////////////////////////////////////////////////////////////
 
@@ -946,7 +979,7 @@ namespace zypp
     {
       _rpm.closeDatabase();
       sigMultiversionSpecChanged();    // HACK: see sigMultiversionSpecChanged
-      MIL << "Targets closed" << endl;
+      MIL << "Closed target on " << _root << endl;
     }
 
     ///////////////////////////////////////////////////////////////////
@@ -1265,7 +1298,7 @@ namespace zypp
       ZYppCommitPolicy policy_r( policy_rX );
       bool explicitDryRun = policy_r.dryRun(); // explicit dry run will trigger a fileconflict check, implicit (download-only) not.
 
-      ShutdownLock lck("Zypp commit running.");
+      ShutdownLock lck("zypp", "Zypp commit running.");
 
       // Fake outstanding YCP fix: Honour restriction to media 1
       // at installation, but install all remaining packages if post-boot.
@@ -1582,6 +1615,7 @@ namespace zypp
 
       // bsc#1181328: Some systemd tools require /proc to be mounted
       AssertProcMounted assertProcMounted( _root );
+      AssertDevMounted assertDevMounted( _root ); // also /dev
 
       RpmPostTransCollector postTransCollector( _root );
       std::vector<sat::Solvable> successfullyInstalledPackages;
@@ -1660,9 +1694,7 @@ namespace zypp
             try
             {
               progress.tryLevel( target::rpm::InstallResolvableReport::RPM_NODEPS_FORCE );
-              if ( postTransCollector.collectScriptFromPackage( localfile ) )
-                flags |= rpm::RPMINST_NOPOSTTRANS;
-              rpm().installPackage( localfile, flags );
+              rpm().installPackage( localfile, flags, &postTransCollector );
               HistoryLog().install(citem);
 
               if ( progress.aborted() )
@@ -1730,7 +1762,7 @@ namespace zypp
             attemptToModify();
             try
             {
-              rpm().removePackage( p, flags );
+              rpm().removePackage( p, flags, &postTransCollector );
               HistoryLog().remove(citem);
 
               if ( progress.aborted() )
@@ -1821,9 +1853,11 @@ namespace zypp
 
       } // for
 
-      // process all remembered posttrans scripts. If aborting,
-      // at least log omitted scripts.
-      if ( abort || (abort = !postTransCollector.executeScripts()) )
+      // Process any remembered %posttrans and/or %transfiletrigger(postun|in)
+      // scripts. If aborting, at least log if scripts were omitted.
+      if ( not abort )
+        postTransCollector.executeScripts( rpm() );
+      else
         postTransCollector.discardScripts();
 
       // Check presence of update scripts/messages. If aborting,
@@ -1929,6 +1963,7 @@ namespace zypp
 
       // bsc#1181328: Some systemd tools require /proc to be mounted
       AssertProcMounted assertProcMounted( _root );
+      AssertDevMounted assertDevMounted( _root ); // also /dev
 
       // Why nodeps?
       //
@@ -1948,6 +1983,7 @@ namespace zypp
       commit.set_arch( ZConfig::instance().systemArchitecture().asString() );
       commit.set_dbpath( rpm().dbPath().asString() );
       commit.set_root( rpm().root().asString() );
+      commit.set_lockfilepath( ZYppFactory::lockfileDir().asString() );
 
       bool abort = false;
       zypp::AutoDispose<std::unordered_map<int, ManagedFile>> locCache([]( std::unordered_map<int, ManagedFile> &data ){
@@ -2053,6 +2089,25 @@ namespace zypp
 
         attemptToModify();
 
+        const std::vector<int> interceptedSignals {
+          SIGINT,
+          SIGTERM,
+          SIGHUP,
+          SIGQUIT
+        };
+
+        auto unixSignals = loop->eventDispatcher()->unixSignalSource();
+        unixSignals->sigReceived ().connect ([]( int signum ){
+          // translator: %1% is the received unix signal name, %2% is the numerical value of the received signal
+          JobReport::error ( str::Format(_("Received signal :\"%1% (%2%)\", to ensure the consistency of the system it is not possible to cancel a running rpm transaction.") ) % strsignal(signum) % signum );
+        });
+        for( const auto &sig : interceptedSignals )
+          unixSignals->addSignal ( sig );
+
+        Deferred cleanupSigs([&](){
+          for( const auto &sig : interceptedSignals )
+            unixSignals->removeSignal ( sig );
+        });
 
         // transaction related variables:
         //
@@ -2712,6 +2767,9 @@ namespace zypp
           case zypprpm::RpmOrderFailed:
             ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm failed to order the transaction, check the logs for more information.") );
             break;
+          case zypprpm::FailedToCreateLock:
+            ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm failed to create its lockfile, check the logs for more information.") );
+            break;
         }
 
         for ( int stepId = 0; (ZYppCommitResult::TransactionStepList::size_type)stepId < steps.size() && !abort; ++stepId ) {
index 4097515..b8581cc 100644 (file)
@@ -44,6 +44,7 @@ extern "C"
 
 #include <zypp/target/rpm/RpmDb.h>
 #include <zypp/target/rpm/RpmCallbacks.h>
+#include <zypp/target/RpmPostTransCollector.h>
 
 #include <zypp/HistoryLog.h>
 #include <zypp/target/rpm/librpmDb.h>
@@ -64,6 +65,10 @@ using namespace zypp::filesystem;
 
 #define WORKAROUNDRPMPWDBUG
 
+// bsc#1216091 indicates that 'rpm --runposttrans' does not execute the
+// scripts chroot if --root is used. We disable it if --root is not /.
+#define WORKAROUNDDUMPPOSTTRANSBUG
+
 #undef ZYPP_BASE_LOGGER_LOGGROUP
 #define ZYPP_BASE_LOGGER_LOGGROUP "librpmDb"
 
@@ -365,7 +370,7 @@ void RpmDb::closeDatabase()
   ///////////////////////////////////////////////////////////////////
   // Block further database access
   ///////////////////////////////////////////////////////////////////
-  librpmDb::blockAccess();
+  librpmDb::blockAccess( root(), dbPath() );
 
   ///////////////////////////////////////////////////////////////////
   // Uninit
@@ -1648,12 +1653,16 @@ void RpmDb::processConfigFiles(const std::string& line, const std::string& name,
 
 ///////////////////////////////////////////////////////////////////
 //
-//
 //     METHOD NAME : RpmDb::installPackage
-//     METHOD TYPE : PMError
 //
 void RpmDb::installPackage( const Pathname & filename, RpmInstFlags flags )
+{ installPackage( filename, flags, nullptr ); }
+
+void RpmDb::installPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r )
 {
+  if ( postTransCollector_r && postTransCollector_r->hasPosttransScript( filename ) )
+    flags |= rpm::RPMINST_NOPOSTTRANS;  // Just set the flag here. In \ref doInstallPackage we collect what else is needed.
+
   callback::SendReport<RpmInstallReport> report;
 
   report->start(filename);
@@ -1661,7 +1670,7 @@ void RpmDb::installPackage( const Pathname & filename, RpmInstFlags flags )
   do
     try
     {
-      doInstallPackage(filename, flags, report);
+      doInstallPackage( filename, flags, postTransCollector_r, report );
       report->finish();
       break;
     }
@@ -1682,7 +1691,7 @@ void RpmDb::installPackage( const Pathname & filename, RpmInstFlags flags )
   while (true);
 }
 
-void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, callback::SendReport<RpmInstallReport> & report )
+void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport<RpmInstallReport> & report )
 {
   FAILIFNOTINITIALIZED;
   HistoryLog historylog;
@@ -1703,6 +1712,14 @@ void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, cal
 
   // run rpm
   RpmArgVec opts;
+#if defined(WORKAROUNDDUMPPOSTTRANSBUG)
+  if ( postTransCollector_r && _root == "/" ) {
+#else
+  if ( postTransCollector_r ) {
+#endif
+    opts.push_back("--define");           // bsc#1041742: Attempt to delay %transfiletrigger(postun|in) execution iff rpm supports it.
+    opts.push_back("_dump_posttrans 1");  // Old rpm ignores the --define, new rpm injects 'dump_posttrans:' lines to collect and execute later.
+  }
   if (flags & RPMINST_NOUPGRADE)
     opts.push_back("-i");
   else
@@ -1754,6 +1771,7 @@ void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, cal
   // LEGACY: collect and forward additional rpm output in finish
   std::string rpmmsg;
   std::vector<std::string> configwarnings;     // TODO: immediately process lines rather than collecting
+  std::vector<std::string> runposttrans;       // bsc#1041742: If rpm supports --runposttrans it injects 'dump_posttrans:' lines we do collect
 
   while ( systemReadLine( line ) )
   {
@@ -1764,6 +1782,10 @@ void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, cal
       report->progress( percent );
       continue;
     }
+    if ( str::hasPrefix( line, "dump_posttrans:" ) ) {
+      runposttrans.push_back( line );
+      continue;
+    }
     ++lineno;
     cmdout.set( "lineno", lineno );
     report->report( cmdout );
@@ -1782,6 +1804,10 @@ void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, cal
     rpmmsg += "[truncated]\n";
 
   int rpm_status = systemStatus();
+  if ( postTransCollector_r && rpm_status == 0 ) {
+    // Before doing anything else, handle any pending %posttrans script or dump_posttrans lines.
+    postTransCollector_r->collectPosttransInfo( filename, runposttrans );
+  }
 
   // evaluate result
   for (std::vector<std::string>::iterator it = configwarnings.begin();
@@ -1830,26 +1856,23 @@ void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, cal
 
 ///////////////////////////////////////////////////////////////////
 //
-//
 //     METHOD NAME : RpmDb::removePackage
-//     METHOD TYPE : PMError
 //
 void RpmDb::removePackage( Package::constPtr package, RpmInstFlags flags )
-{
-  // 'rpm -e' does not like epochs
-  return removePackage( package->name()
-                        + "-" + package->edition().version()
-                        + "-" + package->edition().release()
-                        + "." + package->arch().asString(), flags );
-}
+{ removePackage( package, flags, nullptr ); }
 
-///////////////////////////////////////////////////////////////////
-//
-//
-//     METHOD NAME : RpmDb::removePackage
-//     METHOD TYPE : PMError
-//
 void RpmDb::removePackage( const std::string & name_r, RpmInstFlags flags )
+{ removePackage( name_r, flags, nullptr ); }
+
+void RpmDb::removePackage( Package::constPtr package, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r )
+{ // 'rpm -e' does not like epochs
+  removePackage( package->name()
+                 + "-" + package->edition().version()
+                 + "-" + package->edition().release()
+                 + "." + package->arch().asString(), flags, postTransCollector_r );
+}
+
+void RpmDb::removePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r )
 {
   callback::SendReport<RpmRemoveReport> report;
 
@@ -1858,7 +1881,7 @@ void RpmDb::removePackage( const std::string & name_r, RpmInstFlags flags )
   do
     try
     {
-      doRemovePackage(name_r, flags, report);
+      doRemovePackage( name_r, flags, postTransCollector_r, report );
       report->finish();
       break;
     }
@@ -1879,8 +1902,7 @@ void RpmDb::removePackage( const std::string & name_r, RpmInstFlags flags )
   while (true);
 }
 
-
-void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, callback::SendReport<RpmRemoveReport> & report )
+void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport<RpmRemoveReport> & report )
 {
   FAILIFNOTINITIALIZED;
   HistoryLog historylog;
@@ -1905,6 +1927,14 @@ void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, cal
 
   // run rpm
   RpmArgVec opts;
+#if defined(WORKAROUNDDUMPPOSTTRANSBUG)
+  if ( postTransCollector_r && _root == "/" ) {
+#else
+  if ( postTransCollector_r ) {
+#endif
+    opts.push_back("--define");           // bsc#1041742: Attempt to delay %transfiletrigger(postun|in) execution iff rpm supports it.
+    opts.push_back("_dump_posttrans 1");  // Old rpm ignores the --define, new rpm injects 'dump_posttrans:' lines to collect and execute later.
+  }
   opts.push_back("-e");
   opts.push_back("--allmatches");
 
@@ -1936,6 +1966,7 @@ void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, cal
 
   // LEGACY: collect and forward additional rpm output in finish
   std::string rpmmsg;
+  std::vector<std::string> runposttrans;       // bsc#1041742: If rpm supports --runposttrans it injects 'dump_posttrans:' lines we do collect
 
   // got no progress from command, so we fake it:
   // 5  - command started
@@ -1944,6 +1975,10 @@ void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, cal
   report->progress( 5 );
   while (systemReadLine(line))
   {
+    if ( str::hasPrefix( line, "dump_posttrans:" ) ) {
+      runposttrans.push_back( line );
+      continue;
+    }
     ++lineno;
     cmdout.set( "lineno", lineno );
     report->report( cmdout );
@@ -1958,6 +1993,11 @@ void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, cal
     rpmmsg += "[truncated]\n";
   report->progress( 50 );
   int rpm_status = systemStatus();
+  if ( postTransCollector_r && rpm_status == 0 ) {
+    // Before doing anything else, handle any pending %posttrans script or dump_posttrans lines.
+    // 'remove' does not trigger %posttrans, but it may trigger %transfiletriggers.
+    postTransCollector_r->collectPosttransInfo( runposttrans );
+  }
 
   if ( rpm_status != 0 )
   {
@@ -1989,6 +2029,62 @@ void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, cal
 
 ///////////////////////////////////////////////////////////////////
 //
+//     METHOD NAME : RpmDb::runposttrans
+//
+int RpmDb::runposttrans( const Pathname & filename_r, std::function<void(const std::string&)> output_r )
+{
+  FAILIFNOTINITIALIZED;
+  HistoryLog historylog;
+
+  MIL << "RpmDb::runposttrans(" << filename_r << ")" << endl;
+
+  RpmArgVec opts;
+  opts.push_back("-vv");  // want vverbose output to see scriptlet execution in the log
+  opts.push_back("--runposttrans");
+  opts.push_back(filename_r.c_str());
+  run_rpm (opts, ExternalProgram::Stderr_To_Stdout);
+
+  // Tailored to suit RpmPostTransCollector.
+  // It's a pity, but we need all those verbose debug lines just
+  // to figure out which script is currently executed. Otherwise we
+  // can't tell which output belongs to which script.
+  static const str::regex rx( "^D: (%.*): scriptlet start$" );
+  str::smatch what;
+  std::string line;
+  bool silent = true; // discard everything before 1st scriptlet
+  while ( systemReadLine(line) )
+  {
+    if ( not output_r )
+      continue;
+
+    if ( str::startsWith( line, "D:" ) ) {  // rpm debug output
+      if ( str::regex_match( line, what, rx ) ) {
+        // forward ripoff header
+        output_r( "RIPOFF:"+what[1] );
+        if ( silent )
+          silent = false;
+      }
+      continue;
+    }
+    if ( silent ) {
+      continue;
+    }
+    if ( str::startsWith( line, "+ " ) ) {  // shell -x debug output
+      continue;
+    }
+    // forward output line
+    output_r( line );
+  }
+
+  int rpm_status = systemStatus();
+  if ( rpm_status != 0 ) {
+    WAR << "rpm --runposttrans returned " << rpm_status << endl;
+  }
+  return rpm_status;
+}
+
+///////////////////////////////////////////////////////////////////
+//
 //
 //     METHOD NAME : RpmDb::backupPackage
 //     METHOD TYPE : bool
index 5fed956..13011c6 100644 (file)
@@ -19,6 +19,7 @@
 #include <list>
 #include <vector>
 #include <string>
+#include <functional>
 
 #include <zypp/Pathname.h>
 #include <zypp/ExternalProgram.h>
@@ -35,6 +36,7 @@ namespace zypp
 {
 namespace target
 {
+class RpmPostTransCollector;
 namespace rpm
 {
 
@@ -403,6 +405,8 @@ public:
    *
    * */
   void installPackage ( const Pathname & filename, RpmInstFlags flags = RPMINST_NONE );
+  /** \overload For delayed %posttrans %transfiletrigger(postun|in) execution if driven by Target::commit. */
+  void installPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r );
 
   /** remove rpm package
    *
@@ -416,6 +420,15 @@ public:
    * */
   void removePackage( const std::string & name_r, RpmInstFlags flags = RPMINST_NONE );
   void removePackage( Package::constPtr package, RpmInstFlags flags = RPMINST_NONE );
+  /** \overload For delayed %posttrans %transfiletrigger(postun|in) execution if driven by Target::commit. */
+  void removePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r );
+  void removePackage( Package::constPtr package, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r );
+
+  /** Run collected %posttrans and %transfiletrigger(postun|in) if `rpm --runposttrans` is supported.
+   * Output-function receives a "RIPOFF:%scriptident(packageident)" line for every script
+   * that is executed followed by lines the script outputs to stout/stderr.
+   */
+  int runposttrans( const Pathname & filename_r, std::function<void(const std::string&)> output_r );
 
   /**
    * get backup dir for rpm config files
@@ -481,8 +494,8 @@ public:
   virtual std::ostream & dumpOn( std::ostream & str ) const;
 
 protected:
-  void doRemovePackage( const std::string & name_r, RpmInstFlags flags, callback::SendReport<RpmRemoveReport> & report );
-  void doInstallPackage( const Pathname & filename, RpmInstFlags flags, callback::SendReport<RpmInstallReport> & report );
+  void doRemovePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport<RpmRemoveReport> & report );
+  void doInstallPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport<RpmInstallReport> & report );
   void doRebuildDatabase(callback::SendReport<RebuildDBReport> & report);
 };
 
index 7d3d0f3..5e0c071 100644 (file)
@@ -11,6 +11,8 @@
 */
 #include "librpm.h"
 
+#include <cstring>
+
 #include <zypp/AutoDispose.h>
 
 ////////////////////////////////////////////////////////////////////
@@ -294,6 +296,15 @@ bool RpmHeader::isNosrc() const
   return has_tag( RPMTAG_SOURCEPACKAGE ) && ( has_tag( RPMTAG_NOSOURCE ) || has_tag( RPMTAG_NOPATCH ) );
 }
 
+std::string RpmHeader::ident() const
+{
+  static str::Format fmt { "%1%-%2%-%3%.%4%" };
+  std::string ret;
+  if ( not empty() )
+    ret = fmt % tag_name() % tag_version() % tag_release() % tag_arch();
+  return ret;
+}
+
 ///////////////////////////////////////////////////////////////////
 //
 //
index 7620eef..e98ec9d 100644 (file)
@@ -83,8 +83,10 @@ public:
 
   virtual ~RpmHeader();
 
-  bool isSrc() const;  //< Either 'src' or 'nosrc'
-  bool isNosrc() const;        //< Only 'nosrc'
+  bool isSrc() const;  ///< Either 'src' or 'nosrc'
+  bool isNosrc() const;        ///< Only 'nosrc'
+
+  std::string ident() const; ///< N-V-R.A or empty
 
 public:
 
index 5616e43..eef77d1 100644 (file)
@@ -211,6 +211,14 @@ public:
   static unsigned blockAccess();
 
   /**
+   * @overload Blocks access iff the database is located at root_r/dbPath_r.
+   **/
+  static unsigned blockAccess( const Pathname & root_r, const Pathname & dbPath_r )
+  {
+    return ( root_r == _defaultRoot && dbPath_r == _defaultDbPath ) ? blockAccess() : 0;
+  }
+
+  /**
    * Allow access to rpmdb e.g. after @ref blockAccess. Subsequent calls to
    * @ref dbAccess will perform.
    *
index 9e749ad..5f8f759 100644 (file)
@@ -120,6 +120,8 @@ namespace zypp
 
     void ZYppImpl::changeTargetTo( Target_Ptr newtarget_r )
     {
+      if ( _target && newtarget_r ) // bsc#1203760: Make sure the old target is deleted before a new one is created!
+        INT << "2 active targets at the same time must not happen!" << endl;
       _target = newtarget_r;
       ZConfig::instance().notifyTargetChanged();
       resolver()->setDefaultSolverFlags( /*all_r*/false );  // just changed defaults
@@ -134,6 +136,7 @@ namespace zypp
               return;
           }
           _target->unload();
+          _target = nullptr;  // bsc#1203760: Make sure the old target is deleted before a new one is created!
       }
       changeTargetTo( new Target( root, doRebuild_r ) );
       _target->buildCache();